osb is the command-line interface for OpenSandbox. It is built for the common day-to-day flows:
- create and manage sandboxes
- run commands inside a sandbox
- read and modify sandbox files
- inspect runtime egress policy
- collect low-level diagnostics
- install OpenSandbox-specific skills for coding agents
It uses the OpenSandbox Python SDK under the hood and is intended to be the shortest path from a terminal to a working sandbox workflow.
Choose one:
pip install opensandbox-cliuv tool install opensandbox-clipipx install opensandbox-cliConfirm the install:
osb --help
osb --versionMake sure an OpenSandbox server is reachable. If you are running locally, start the server first and then point the CLI at it.
opensandbox-serverosb config init
osb config set connection.domain localhost:8080
osb config set connection.protocol http
osb config show -o jsonIf you want a non-default config file, choose it at the root command level for the whole invocation:
osb --config /tmp/dev.toml config init
osb --config /tmp/dev.toml config set connection.domain localhost:8080
osb --config /tmp/dev.toml config show -o jsonosb sandbox create --image python:3.12 --timeout 30m -o jsonIf you set defaults first, later create commands can be shorter:
osb config set defaults.image python:3.12
osb config set defaults.timeout 30m
osb sandbox create -o jsonosb sandbox get <sandbox-id> -o json
osb sandbox health <sandbox-id> -o jsonUse -- before the sandbox command payload.
osb command run <sandbox-id> -o raw -- python -c "print(1 + 1)"osb file write <sandbox-id> /workspace/hello.txt -c "hello" -o json
osb file cat <sandbox-id> /workspace/hello.txt -o rawosb sandbox kill <sandbox-id> -o jsonBasic:
osb sandbox create --image python:3.12Private image:
osb sandbox create \
--image my-registry.example.com/team/app:latest \
--image-auth-username alice \
--image-auth-password <token>Manual cleanup mode:
osb sandbox create --image python:3.12 --timeout noneExplicit entrypoint argv:
osb sandbox create \
--image python:3.12 \
--entrypoint python \
--entrypoint -m \
--entrypoint http.serverCreate with network policy and volumes:
osb sandbox create \
--image python:3.12 \
--network-policy-file network-policy.json \
--volumes-file volumes.jsonosb sandbox list
osb sandbox list -o json
osb sandbox list --state running --state paused
osb sandbox get <sandbox-id> -o json
osb sandbox metrics <sandbox-id>
osb sandbox metrics <sandbox-id> --watch -o rawosb sandbox endpoint <sandbox-id> --port 8080 -o jsonForeground streaming:
osb command run <sandbox-id> -o raw -- sh -lc 'echo ready'Tracked background execution:
osb command run <sandbox-id> --background -o json -- sh -c "sleep 10; echo done"
osb command status <sandbox-id> <execution-id> -o json
osb command logs <sandbox-id> <execution-id> -o jsonPersistent shell session:
osb command session create <sandbox-id> --workdir /workspace -o json
osb command session run <sandbox-id> <session-id> -o raw -- pwd
osb command session run <sandbox-id> <session-id> -o raw -- export FOO=bar
osb command session run <sandbox-id> <session-id> -o raw -- sh -c 'echo $FOO'
osb command session delete <sandbox-id> <session-id> -o jsonosb file upload <sandbox-id> ./local.txt /workspace/local.txt -o json
osb file download <sandbox-id> /workspace/result.json ./result.json -o json
osb file search <sandbox-id> /workspace --pattern "*.py" -o json
osb file info <sandbox-id> /workspace/main.py -o json
osb file replace <sandbox-id> /workspace/app.py --old old --new new -o json
osb file chmod <sandbox-id> /workspace/script.sh --mode 755 -o jsonInspect current policy:
osb egress get <sandbox-id> -o jsonPatch specific rules:
osb egress patch <sandbox-id> --rule allow=pypi.org --rule deny=internal.example.com -o jsonIf you are debugging connectivity, verify behavior with an actual command:
osb command run <sandbox-id> -o raw -- curl -I https://pypi.orgThese commands are experimental and return plain text.
osb devops summary <sandbox-id> -o raw
osb devops inspect <sandbox-id> -o raw
osb devops events <sandbox-id> --limit 100 -o raw
osb devops logs <sandbox-id> --tail 500 -o raw
osb devops logs <sandbox-id> --since 30m -o rawOutput selection is command-scoped, not global.
table: human-readable tables and panelsjson: machine-readable JSONyaml: machine-readable YAMLraw: unformatted text or streaming output
Examples:
osb sandbox list -o json
osb sandbox list -o yaml
osb file cat <sandbox-id> /workspace/hello.txt -o rawNot every command supports every format. Use --help on the specific command when in doubt.
The main command groups are:
osb sandbox: lifecycle managementosb command: command execution and persistent sessionsosb file: file and directory operationsosb egress: runtime egress policyosb devops: experimental diagnosticsosb config: local CLI configurationosb skills: bundled skills for AI tools
Explore them directly:
osb sandbox --help
osb command --help
osb file --help
osb skills --helpThe CLI ships with built-in OpenSandbox skills for coding agents and agent-oriented tools.
Bundled skills:
sandbox-lifecyclecommand-executionfile-operationsnetwork-egresssandbox-troubleshooting
Supported targets:
| Target | Install location |
|---|---|
claude |
./.claude/skills/ or ~/.claude/skills/ |
cursor |
./.cursor/rules/ or ~/.cursor/rules/ |
codex |
./.codex/skills/<name>/SKILL.md or ~/.codex/skills/<name>/SKILL.md |
copilot |
./.github/copilot-instructions.md or ~/.github/copilot-instructions.md |
windsurf |
./.windsurfrules or ~/.windsurfrules |
cline |
./.clinerules or ~/.clinerules |
opencode |
./.agents/skills/<name>/SKILL.md or ~/.agents/skills/<name>/SKILL.md |
Common flows:
osb skills list
osb skills show sandbox-lifecycle
osb skills install sandbox-lifecycle --target codex --scope project
osb skills install --all-builtins --target codex --scope global
osb skills uninstall sandbox-troubleshooting --target claude --scope globalFor scripts or agents, use structured output:
osb skills install sandbox-lifecycle --target codex --scope project -o jsonThe CLI resolves configuration in this order:
- root CLI flags such as
--api-key,--domain,--protocol,--request-timeout,--config - environment variables such as
OPEN_SANDBOX_API_KEYandOPEN_SANDBOX_DOMAIN - config file, defaulting to
~/.opensandbox/config.toml - SDK defaults
Config commands:
osb config init
osb config show
osb config set connection.domain localhost:8080
osb config set connection.protocol http
osb config set defaults.image python:3.12
osb config set defaults.timeout 30mExample config file:
[connection]
api_key = "your-api-key"
domain = "localhost:8080"
protocol = "http"
request_timeout = 30
use_server_proxy = false
[output]
color = true
[defaults]
image = "python:3.12"
timeout = "30m"For local development in this monorepo:
cd cli
uv sync
uv run osb --help
uv run pytestThis repository uses a local uv source override for the OpenSandbox Python SDK, so running from cli/ will resolve against the checked-out SDK in the monorepo.