The daemon is alive but not ready
/healthz checks the daemon process. /readyz also checks Xvfb, the input backend, the window manager, screenshots, and noVNC when enabled.
Read the per-check failure list from /readyz. Modal’s TCP probe can pass before desktop readiness passes.
Use computer.processes.logs("xvfb") when Xvfb fails. Confirm that DISPLAY matches the configured display. The default is :99.
If the error names placement, compare the requested Function selector, observed Function region,
and target region. Both resources must declare the same supported selector. Public narrow
selectors such as us-west can produce provider-native runtime values such as us-west-2,
us-west1, or westus3. A granted granular selector such as us-west-2 requires an exact match.
If the error names computer-step-envelope-v1, install a daemon that supports the Step
protocol. Keep the failed operation stopped until the compatibility check passes.
A screenshot is black or empty
Wait for/readyz. Confirm that the target application has a mapped window.
Use computer.windows.wait_for(...) after you launch an application. An immediate screenshot can arrive before the window manager draws the first frame.
X11-SHM fails readiness
MSS is the default. Choose X11-SHM only when the managed Image contains the native extension and worker. Confirm that Xvfb uses 24-bit TrueColor and that the native module imports inside the Sandbox.auto can use MSS after an ordinary native failure. Explicit x11-shm fails closed when its source
is unavailable. A display reply timeout also fails closed because MSS and file-capture tools depend
on the same unresponsive display.
A display restart closes generation-bound X11 clients before it relaunches dependents and proves
readiness. Keep the source opt-in after recovery.
Keyboard input does not appear
Activate the target window before you send input. Confirm that the daemon uses the intendedDISPLAY.
Set COMPUTER_USE_INPUT_BACKEND=xtest to test the native path. Set it to xdotool to test the compatibility path.
For Unicode text, use method="auto". The daemon uses native keystrokes when the active layout can represent the text. It uses clipboard paste for long or unmapped text and then restores the prior clipboard.
Do not replay an input action after input_may_be_partial. The first attempt might have changed the desktop.
Identify the active backend
Read these response headers for one successful direct request:
Use
/v1/capabilities for process configuration and readiness. Use per-response headers to
attribute concurrent requests.
Provider actions click the wrong place
The provider image and desktop use different coordinate spaces. PassCoordinateSpace to the adapter. Use the dimensions of the exact screenshot that you sent to the model.
A recording is empty or damaged
Stop the recording withcomputer.recordings.stop(...) before you terminate the Sandbox. This lets ffmpeg write its trailer.
Inspect the sanitized Recording.error value when stop fails.
Persisted artifacts are missing
Ephemeral artifacts disappear when the Sandbox ends. For Modal Volume v2, mount the Volume over the artifact path. SetStorageConfig(persist_artifacts=True). Call computer.artifacts.sync() before termination.
Reload an already-mounted reader before you check for committed data. Use a run-specific path. Do not let two writers replace the same file.
Immediate sync requires Modal Volume v2.
Browser prewarm did not help
Confirm that/v1/capabilities reports browser or browser-gpu as the image profile. Prewarm
moves browser startup into desktop startup. Page network, authentication, and rendering time remain
in the first navigation.
For GPU tests, read /v1/browser/status. A Modal GPU allocation alone does not prove hardware browser rendering.
A warm-pool candidate expired
Setmin_remaining_seconds to cover the expected task. The claim path rejects a candidate without enough lifetime.
Always check /readyz after attach. A listed Sandbox can be stopping or recovering.

