Blaxel sandbox runner
Roder's first-party blaxel remote-runner provider executes shell and file tools inside an isolated Blaxel sandbox. A selected sandbox can outlive one turn or one local Roder process: pause it toward standby, detach from it, then rejoin the same filesystem and running processes from persisted thread state.
Set up a destination
Create a Blaxel API key and note the workspace name from the Blaxel console. Roder reads credentials from the environment and does not write the API key into thread metadata, runner session state, logs, or errors.
export BLAXEL_API_KEY=...
export BL_WORKSPACE=...
# BL_API_KEY also works for the API key.[remote_runners]
enabled = true
default_destination = "blaxel-dev"
[remote_runners.destinations.blaxel-dev]
provider = "blaxel"
secret_env = { BLAXEL_API_KEY = "BLAXEL_API_KEY", BL_WORKSPACE = "BL_WORKSPACE" }
config = { image = "blaxel/base-image:latest", memory = 4096, region = "eu-lon-1", working_dir = "/home/user/roder", cleanup = "detach-on-close" }New sandboxes default to blaxel/base-image:latest, 4096 MB of memory, and /home/user/roder as the working directory. Choose the destination at startup with default_destination, or select it from the TUI command palette. New threads then auto-bind to the sandbox workspace.
Choose the cleanup behavior
delete-on-closepermanently deletes a fresh sandbox when the runner session closes. This is the default for newly created sandboxes.detach-on-closereleases the local session but leaves the sandbox available for rejoin. This is the default when configuration names an existing sandbox.keepexplicitly preserves the sandbox instead of deleting it on close.
Optional destination settings include sandbox_name for an existing sandbox, sandbox_name_prefix, external_id, image,memory, region, ttl, andworking_dir. A Blaxel volume can provide durability beyond the sandbox's preserved standby state.
Pause, resume, detach, and rejoin
Runner-bound threads initialize lazily. Roder creates or resumes the Blaxel session only when an approved native workspace tool first executes, then reuses that live session across later tools and turns. Text-only turns and host-executed MCP work do not wake the sandbox.
- Pause marks standby intent so the sandbox can scale to zero; a later command can wake it.
- Resume wakes a standby sandbox immediately.
- Detach persists the sandbox identity on the thread and releases the local runner session without deleting the sandbox.
- Rejoin restores the same sandbox from thread state, including after restarting Roder, without provisioning an orphan replacement.
roder runners list
roder runners pause <thread-id>
roder runners resume <thread-id>
roder runners detach <thread-id>
roder runners rejoin <thread-id>
roder runners rejoin <thread-id> --sandbox <name>roder runners list reports provider capabilities so clients can show lifecycle actions only when the active provider supports them. Existing Docker, Sprites, and local runners keep their current behavior because lifecycle support is optional in the remote-runner contract.
App-server and SDK control
Product clients and automation can call the thread-scopedrunners/pause, runners/resume,runners/detach, and runners/rejoin methods. These methods are registered in the app-server manifest and included in the JSON schema and generated TypeScript and Python client types.
Ports and previews
Exposing a sandbox port returns a Blaxel preview URL. Bind the service to0.0.0.0 inside the sandbox so the preview can reach it. Blaxel preview connections currently have a 15-minute timeout.
Command cancellation
Remote commands run as uniquely named Blaxel processes with finite leases. Tool timeouts, turn interruption, or dropped transports request force-kill through the Blaxel process API, while the server-side lease is the backstop if Roder cannot deliver the cancellation request.