Skip to main content
Create and control a microVM sandbox: boot it from an image, run commands, stream logs and metrics, then shut it down. See Overview for configuration examples and Lifecycle for state management.

Typical flow

Static methods

Sandbox.create()

Create and boot a sandbox. Keyword arguments provide individual config fields; see SandboxConfig for the full set. Pulls the image if needed, boots the VM, starts the guest agent, and waits until it is ready to accept commands. Sandbox names must be non-empty and no longer than 128 UTF-8 bytes. The returned Sandbox is an async context manager. Use async with to guarantee cleanup; on exit the sandbox is killed and its persisted state removed.

Parameters

namestr
Sandbox name, up to 128 UTF-8 bytes.
Configuration fields: image, cpus, memory, volumes, ports, network, secrets, detached, and more.

Returns

Running sandbox, usable as an async context manager.

Sandbox.create_with_progress()

Same parameters as create() but returns a PullSession that lets you track image pull progress before the sandbox is ready. This method is synchronous (not awaitable); the async work happens through the PullSession.

Parameters

namestr
Sandbox name, up to 128 UTF-8 bytes.
Same configuration fields as create().

Returns

Session for tracking pull progress and obtaining the final sandbox.

Sandbox.start()

Restart a previously stopped sandbox. The VM reboots using the persisted configuration.

Parameters

namestr
Name of a stopped sandbox, up to 128 UTF-8 bytes.
detachedbool
When True, the sandbox survives after your process exits. Default False.

Returns

Running sandbox.

Sandbox.get()

Get a handle to an existing sandbox (running or stopped). The handle provides status, configuration, and lifecycle control without requiring a full connection to the guest agent.

Parameters

namestr
Sandbox name, up to 128 UTF-8 bytes.

Returns

Handle with status and lifecycle control.

Sandbox.list()

Return the first page of sandboxes (running, stopped, and crashed), ordered newest first. The default page size is 20.

Returns

SandboxPage
Handles in this page and an optional cursor for the next page.

Sandbox.list_with()

Return a configured page of sandboxes. Label filters are applied before pagination and match every supplied key/value pair.

Parameters

cursorstr | None
Opaque next_cursor from the preceding page.
limitint | None
Page size from 1 through 100. Defaults to 20.
labelsMapping[str, str] | None
Label key/value pairs to match. None returns every sandbox, like list().

Returns

SandboxPage
Matching handles and an optional cursor for the next page.

Sandbox.remove()

Delete a stopped sandbox and all its state from disk (configuration, logs, runtime directory). Fails if the sandbox is still running; stop it first.

Parameters

namestr
Sandbox name, up to 128 UTF-8 bytes.

Instance properties

sb.name

The sandbox name. This is an async method; call await sb.name().

Returns

str
Sandbox name, up to 128 UTF-8 bytes.

sb.owns_lifecycle

Whether this handle owns the sandbox lifecycle. A sandbox returned directly by create() or start() owns lifecycle, including when created with detached=True, until you call detach(). Handles upgraded via SandboxHandle.connect() do not own lifecycle. This is an async property; use await sb.owns_lifecycle.

Returns

bool
True if this handle owns the lifecycle.

sb.fs

Get a filesystem handle for reading and writing files inside the running sandbox. This is a synchronous property; use sb.fs (no await). See Filesystem for API details.

Returns

Filesystem handle.

Instance methods

Command execution (exec, exec_stream, shell, shell_stream) is documented on the Execution page; SSH (ssh) on the SSH page. The lifecycle, attach, metrics, and logs methods follow.

sb.attach()

Bridge your terminal directly to a process inside the sandbox for a fully interactive PTY session. Returns the process exit code once the session ends.

Parameters

cmdstr
Command to run.
argslist[str] | None
Command arguments.
cwdstr | None
Working directory.
userstr | None
Guest user.
envMapping[str, str] | None
Environment variables.
detach_keysstr | None
Custom detach key sequence.

Returns

int
Exit code of the process.

sb.attach_shell()

Attach your terminal to the sandbox’s default shell for an interactive session.

Returns

int
Exit code.

sb.ping()

Check that the running sandbox’s guest agent is reachable without refreshing idle activity. This sends core.ping and waits for core.pong; it does not start stopped sandboxes and raises an error if the sandbox is not running or agentd cannot respond. After upgrading from a runtime that predates protocol generation 6, restart already-running sandboxes so the guest agent understands the message.

Returns

Sandbox name and agent round-trip latency.

sb.touch()

Explicitly refresh the running sandbox’s idle activity. This sends core.touch, receives core.touched, and advances the guest activity sequence used by the runtime idle-timeout monitor. It does not start stopped sandboxes and it does not bypass max_duration.

Returns

Sandbox name and updated activity sequence.

sb.modify()

Plan or apply a configuration change. The returned plan labels each change "live", "next start", "requires restart", or "unsupported", and apply is all-or-nothing. cpus and memory resize live within the max_cpus / max_memory ceilings; raising a ceiling requires a restart. Env and workdir changes affect future execs only. On a stopped sandbox, changes are saved for the next boot. Secret changes are Rust-SDK and CLI only for now. The CLI equivalent is msb modify. The returned plan dict mirrors the canonical JSON shape: A live CPU or memory resize can take a moment to settle. The new limits are enforced immediately, and resize_status reports when the sandbox has finished adjusting.

Parameters

cpusint | None
Desired effective vCPU count. Live when within the booted max_cpus.
max_cpusint | None
Boot-time maximum possible vCPUs (restart-backed).
memoryint | None
Desired effective guest memory in MiB. Live when within the booted max_memory.
max_memoryint | None
Boot-time maximum hotpluggable memory in MiB (restart-backed).
envMapping[str, str] | None
Environment variables to set for future execs.
env_rmlist[str] | None
Environment variable keys to remove.
labelsMapping[str, str] | None
Labels to set.
labels_rmlist[str] | None
Label keys to remove.
workdirstr | None
Working directory for future execs.
policystr | None
”no_restart” (default) applies only changes that can complete without restarting; “next_start” persists changes for the next start without mutating a running VM; “restart” restarts if needed so restart-required changes become active now.
dry_runbool
When True, compute the plan without applying anything. Default False.

Returns

dict[str, Any]
The modification plan, applied unless dry_run=True.

sb.metrics()

Get a point-in-time snapshot of the sandbox’s resource usage: CPU, memory, disk I/O, network I/O, optional upper disk usage, and uptime.

Returns

Resource metrics.

sb.metrics_stream()

Stream resource metrics at a regular interval. The returned MetricsStream supports both recv() and async for.

Parameters

intervalfloat
Seconds between metric snapshots. Default 1.0.

Returns

Async stream yielding a snapshot each interval.

sb.logs()

Read captured output from the sandbox’s exec.log. Backed by an on-disk JSON Lines file the runtime writes via the relay tap. Works on running and stopped sandboxes alike; there is no protocol traffic. The same method is available on SandboxHandle for callers that don’t want to start the sandbox first. The default sources are "stdout", "stderr", and "output" (PTY-merged). Pass "system" to also include synthetic lifecycle markers and runtime/kernel diagnostic lines, or "all" as shorthand for all four. Timestamps are exposed as float ms since the Unix epoch (UTC) for parity with SandboxMetrics.timestamp_ms.

Parameters

tailint | None
Show only the last N entries after other filters apply.
since_msfloat | None
Inclusive lower bound on entry timestamp (ms since epoch).
until_msfloat | None
Exclusive upper bound on entry timestamp (ms since epoch).
Sources to include. None = [“stdout”, “stderr”, “output”]. Add “system” to merge runtime/kernel diagnostics, or use “all” for all four.

Returns

Matching entries in chronological order.

sb.log_stream()

Stream captured log entries as a LogStream. With follow=True the stream stays open and yields new entries as they are written, like tail -f. Resume an earlier stream by passing the cursor of the last entry you saw as from_cursor. Also available on SandboxHandle.

Parameters

Sources to include. Same semantics as logs().
since_msfloat | None
Inclusive lower bound on entry timestamp (ms since epoch).
from_cursorstr | None
Resume after this opaque cursor (from a prior LogEntry.cursor).
until_msfloat | None
Exclusive upper bound on entry timestamp (ms since epoch).
followbool
When True, keep the stream open and yield new entries as they arrive. Default False.

Returns

Async stream of log entries.

sb.stop()

Gracefully shut down the sandbox and wait until stopped state is observed. Lets the sandbox finish writing any pending data to disk before it exits, so files written inside the sandbox aren’t lost across a later restart. Waits up to ten seconds by default; pass timeout to override the graceful shutdown window before force-kill escalation.

Parameters

timeoutfloat | None
Seconds to wait for graceful exit before force-kill. None uses the ten-second default.

sb.request_stop()

Request graceful shutdown and return once the request is sent, without waiting for stopped state. Pair with wait_until_stopped() when the caller needs to observe the terminal state.

sb.kill()

Force-terminate the sandbox and wait until stopped state is observed. No graceful shutdown; use when the sandbox is unresponsive. Pending writes that the workload hasn’t fsync’d may be lost, same durability semantics as a sudden power loss on a physical machine. Prefer stop() for graceful shutdown that gives the workload a chance to flush.

Parameters

timeoutfloat | None
Seconds to wait for the stopped state to be observed.

sb.request_kill()

Request force termination and return once the signal is sent, without waiting for stopped state.

sb.request_drain()

Request a graceful drain and return once the request is sent. Existing commands run to completion, but new exec calls are rejected; the sandbox transitions to stopped when all in-flight commands finish. Useful for zero-downtime rotation of worker sandboxes. Use wait_until_stopped() when the caller needs stopped-state observation.

sb.wait_until_stopped()

Block until the sandbox is observed in a terminal non-running state, without triggering a stop or kill request.

Returns

Terminal status and optional observed exit code.

sb.detach()

Release the handle without stopping the sandbox. The sandbox continues running as a background process. Reconnect later with Sandbox.get().

Patch

Factory class for rootfs patches passed to Sandbox.create(..., patches=[...]). Each static method returns a PatchConfig. By default a patch that targets a path already present in the image errors at boot; pass replace=True on the operation to allow overwriting. mkdir and remove are idempotent. See Patches for conceptual context.

Patch.text()

Write UTF-8 text content at path.

Parameters

pathstr
Absolute path inside the guest.
contentstr
Text content.
modeint | None
File mode, e.g. 0o644.
replacebool
When True, overwrite an existing path.

Patch.append()

Append content to an existing file at path. If the file lives in a lower image layer, it’s copied up first.

Parameters

pathstr
Absolute path inside the guest.
contentstr
Text to append.

Patch.mkdir()

Create a directory at path. Idempotent: a no-op if the directory already exists.

Parameters

pathstr
Absolute path inside the guest.
modeint | None
Directory mode, e.g. 0o755.

Patch.remove()

Delete a file or directory at path. Idempotent: a no-op if the path doesn’t exist.

Parameters

pathstr
Absolute path inside the guest.

Patch.copy_file()

Copy a single host file at src into the guest rootfs at dst.

Parameters

srcstr
Host source file.
dststr
Absolute destination path inside the guest.
modeint | None
File mode, e.g. 0o644. None keeps the source mode.
replacebool
When True, overwrite an existing path at dst.

Patch.copy_dir()

Recursively copy a host directory at src into the guest rootfs at dst.

Parameters

srcstr
Host source directory.
dststr
Absolute destination path inside the guest.
replacebool
When True, overwrite an existing path at dst.
Create a symlink at link pointing to target.

Parameters

targetstr
What the symlink points to (literal symlink target text).
linkstr
Absolute path of the symlink itself.
replacebool
When True, overwrite an existing path at link.

Types

SandboxConfig

Used by create() · create_with_progress()

The keyword arguments accepted by create() and create_with_progress(). There is no SandboxConfig object you construct directly; these are passed as **kwargs.

InitConfig

Used by create(init=…)

Custom init specification. Pass it (or one of the equivalent shorthand shapes) as the init= kwarg to create() to hand PID 1 inside the guest off to your own init binary after agentd’s setup. Frozen dataclass. See Custom init system for image picks, shutdown semantics, and tradeoffs. The init= kwarg follows the same shape as other structured create kwargs: a bare scalar for the simple case, or a dataclass / dict for the rich case.

SecurityProfile

Used by create(security=…)

Sandbox-wide in-guest security profile. A StrEnum, so the string values are accepted directly.

SandboxPage

One stable, newest-first page returned by Sandbox.list() or Sandbox.list_with().

SandboxHandle

Returned by Sandbox.get() · Sandbox.list() · Sandbox.list_with()

A lightweight handle to an existing sandbox (running or stopped). Provides status, configuration, and lifecycle control without an active connection to the guest agent. You cannot exec or fs on a handle; call .start() or .connect() to upgrade to a full Sandbox.

SandboxPingResult

Returned by ping()

Agent reachability result.

SandboxTouchResult

Returned by touch()

Explicit idle-refresh result.

SandboxStopResult

Returned by wait_until_stopped()

Observed terminal sandbox state returned by wait_until_stopped().

SandboxStatus

Used by SandboxHandle.status · SandboxStopResult.status

The string status values a sandbox can report. A StrEnum, exposed as plain strings on status fields.

SandboxMetrics

Returned by metrics() · metrics_stream()

Point-in-time resource usage snapshot.

MetricsStream

Returned by metrics_stream()

Async stream for receiving periodic metrics snapshots.

LogEntry

Returned by logs() · iterated from LogStream

A single captured log entry returned by logs() or iterated from a LogStream.

LogStream

Returned by log_stream()

Async stream of LogEntry values, returned by log_stream().

LogSource

Used by LogEntry.source · logs(sources=…)

The string values the source field on a LogEntry can take, also accepted by logs(sources=[...]) and log_stream(sources=[...]). The read form additionally accepts "all".

LogLevel

Used by create(log_level=…)

Sandbox process log verbosity. A StrEnum, so the string values are accepted directly.

PullPolicy

Used by create(pull_policy=…)

Controls when the SDK fetches an OCI image from the registry. A StrEnum, so the string values are accepted directly.

RegistryAuth

Used by create(registry_auth=…)

Credentials for authenticating to a private container registry. Frozen dataclass; construct directly or via RegistryAuth.basic(username, password).

PatchConfig

Returned by Patch.* factory methods · used by create(patches=…)

A single rootfs patch. Produced by the Patch factory; you’d normally not construct one directly. Frozen dataclass.

PullSession

Returned by create_with_progress()

Returned by create_with_progress(). The factory itself is synchronous; use the returned session as an async context manager to track image pull progress.

PullEvent

Iterated from PullSession.progress

Native event object emitted by PullSession.progress. Inspect event_type and the fields relevant to that event; fields that do not apply to a particular event are None.