Sandbox Command Reference
All commands are under createos sandbox (alias: createos sb). Arguments in [brackets] are optional; those without brackets are required. Many commands prompt interactively when a required argument is omitted and stdin is a terminal.
At a glance
- Binary:
createos, with sandbox commands aliased tosb - Install:
curl -sfL https://raw.githubusercontent.com/NodeOps-app/createos-cli/main/install.sh | sh - - Auth:
createos login(browser) orcreateos login --token <token> - Sandbox API:
https://api.sb.createos.sh
Lifecycle
sandbox create
Create a new sandbox VM.
Alias: createos sb c
Bash1createos sandbox create --shape s-1vcpu-1gb --name my-box
| Flag | Description |
|---|---|
--shape <id> | VM size (run createos sandbox shapes to list). Required unless using interactive mode. |
--name <name> | Friendly name (auto-generated if omitted). |
--rootfs <image> | Base OS image or template name (run createos sandbox rootfs to list built-ins). |
--disk-mib <n> | Root disk size in MiB (defaults to the shape's standard size). |
--ssh-key <path> | Path to an SSH public key file to authorize (repeatable). |
--env KEY=VALUE | Environment variable available to every exec inside the sandbox (repeatable). |
--ingress | Give the sandbox a public HTTPS URL for HTTP services. |
--network <name|id> | Join a private network at creation (repeatable). |
--disk <name|id>:/mount/path | Mount an S3 disk at creation (repeatable). |
--egress <host> | Outbound allowlist entry (repeatable). Empty = allow all. |
--auto-pause <duration> | Auto-pause after inactivity, e.g. 10m, 1h. Omit to disable. |
Bash1# Smallest sandbox2createos sandbox create --shape s-1vcpu-256mb34# With SSH key and public HTTPS URL5createos sandbox create --shape s-1vcpu-1gb \6 --name demo --ssh-key ~/.ssh/id_ed25519.pub --ingress78# Attach an S3 disk and join a private network9createos sandbox create --shape s-1vcpu-1gb \10 --disk my-bucket:/mnt/data --network my-net1112# Auto-pause after 30 minutes of inactivity13createos sandbox create --shape s-1vcpu-1gb --auto-pause 30m
sandbox list
List sandboxes. Shows running sandboxes by default.
Alias: createos sb list
Bash1createos sandbox list2createos sandbox list --all3createos sandbox list --status paused
| Flag | Description |
|---|---|
--all | Show every sandbox regardless of status. |
--status <state> | Filter to a specific state: running, creating, paused, failed, destroyed. |
--limit <n> | Maximum number of results (default: 50). |
--offset <n> | Skip the first N results (for paging). |
--quiet | Print IDs only (one per line). Useful for scripting with xargs. |
sandbox get
Show details for a single sandbox.
Bash1createos sandbox get my-box2createos sandbox get sb-01k...
Pass a sandbox name or ID. Runs interactively (picker) when no argument is given on a terminal.
sandbox edit
Change a running sandbox's settings.
Bash1createos sandbox edit my-box --ingress on2createos sandbox edit my-box --add-ssh-key ~/.ssh/id_ed25519.pub3createos sandbox edit my-box --auto-pause 30m4createos sandbox edit my-box --auto-pause off
| Flag | Description |
|---|---|
--ingress on|off | Enable or disable the public HTTPS URL. |
--add-ssh-key <path> | Path to a public key file to add (repeatable). |
--auto-pause <duration|off> | Set or disable the auto-pause timeout (e.g. 10m, 1h, off). |
Run with no flags on a terminal for an interactive settings menu.
sandbox pause
Snapshot and pause a running sandbox.
Bash1createos sandbox pause my-box
Pass a sandbox name or ID. Prompts interactively when no argument is given on a terminal. The sandbox can be resumed or forked from its paused snapshot.
sandbox resume
Resume a paused sandbox.
Bash1createos sandbox resume my-box
sandbox fork
Clone a paused sandbox into a new sandbox.
Bash1createos sandbox fork my-box2createos sandbox fork my-box --paused
| Flag | Description |
|---|---|
--paused | Leave the new sandbox paused instead of auto-resuming. |
--ssh-key <path> | Override SSH public key file for the fork (repeatable). |
--egress <host> | Override the egress allowlist for the fork (repeatable). |
The source sandbox must be paused. Run with no argument on a terminal to pick from your paused sandboxes.
sandbox rm
Delete one or more sandboxes. Irreversible.
Bash1createos sandbox rm my-box2createos sandbox rm sb-01k... sb-02k...3createos sandbox rm my-box --force
| Flag | Description |
|---|---|
--force, -y | Skip the confirmation prompt. Required in non-interactive mode. |
Bash1# Delete all failed sandboxes non-interactively2createos sandbox list --status failed --quiet | xargs createos sandbox rm --force
Run
sandbox exec
Run a one-shot command inside a sandbox.
Bash1createos sandbox exec <sandbox> -- <cmd> [args...]
The literal -- separator is required. The command's exit code is forwarded to the CLI process.
Use sandbox exec for quick non-interactive commands. For reconnectable output, background jobs, later input, signals, wait/stop controls, or PTY terminal behavior, use sandbox process.
Buffered exec output is capped at 1 MiB. Use --stream for larger output.
| Flag | Description |
|---|---|
--stream, -s | Stream stdout/stderr live as the command runs. Default is buffered (output arrives when the command finishes). |
--env KEY=VALUE | Override an environment variable for this exec (repeatable). The key must have been declared at create time with --env. |
Bash1createos sandbox exec my-box -- uname -a2createos sandbox exec my-box --stream -- pip install requests3createos sandbox exec my-box -- python3 -c 'print("hello")'
sandbox shell
Open an interactive shell inside a sandbox.
Alias: createos sb sh
Bash1createos sandbox shell [<sandbox>]
By default opens a keyless PTY through the control plane. Your API token is the only authentication needed.
| Flag | Description |
|---|---|
--ssh | Use the SSH path instead of the keyless PTY (also implied by -i). Requires an SSH key in the sandbox. |
-i <path> | Path to your SSH private key. Implies --ssh. |
--user <name> | Username to log in as (default: root). |
Bash1createos sandbox shell my-box # keyless PTY (default)2createos sandbox shell my-box --ssh # SSH path, auto-detect ~/.ssh key3createos sandbox shell my-box -i ~/.ssh/id_ed255194createos sandbox shell my-box --user app
sandbox process
Manage long-running and reconnectable sandbox processes.
Alias: createos sandbox proc
Use this when a command should keep running independently of your CLI, or when you want to list it, reconnect to output, send input, wait for it, signal it, or stop it later.
Use sandbox exec for quick non-interactive one-shot commands. Use sandbox shell for an immediate interactive terminal that does not need to be listed or reattached. Use --pty (--tty, -t) when the managed command needs terminal behavior instead of plain stdout/stderr pipes.
Retained process output is bounded to 1 MiB per managed process and 32 MiB total per sandbox. When the retained window is exceeded, oldest output is discarded first; attaching from an expired sequence reports that the output offset has expired.
| Need | Command |
|---|---|
| Run a managed command, stream output, and return its exit code | createos sandbox process run <sandbox> -- <cmd> [args...] |
| Start a managed command and print its process ID | createos sandbox process start <sandbox> -- <cmd> [args...] |
| Start a persistent shell session and attach to it | createos sandbox process shell <sandbox> |
| Reconnect to process output or a shell session | createos sandbox process attach <sandbox> <process-id> |
| Pick a running process or shell session interactively | createos sandbox process attach <sandbox> |
| List managed processes and shell sessions | createos sandbox process list <sandbox> |
| Show details for one managed process | createos sandbox process get <sandbox> <process-id> |
| Write input to a process or shell session | createos sandbox process input <sandbox> <process-id> |
| Close stdin for a pipe process | createos sandbox process close-stdin <sandbox> <process-id> |
| Resize a managed PTY shell/session | createos sandbox process resize <sandbox> <process-id> |
Send a signal such as SIGINT or SIGTERM | createos sandbox process signal <sandbox> <process-id> <signal> |
| Wait for a managed process to exit | createos sandbox process wait <sandbox> <process-id> |
| Stop a process and anything it started | createos sandbox process stop <sandbox> <process-id> |
sandbox process run
Run a command as a managed process, attach to output, wait for it to exit, and return its exit code.
Bash1createos sandbox process run my-box -- npm test2createos sandbox process run my-box -- bash -lc 'npm install && npm test'3createos sandbox process run --pty my-box -- python3
| Flag | Description |
|---|---|
--cwd <path> | Working directory inside the sandbox. |
--env KEY=VALUE | Environment variable override (repeatable). |
--pty, --tty, -t | Create a managed PTY instead of separate stdout/stderr pipes. |
--rows <n> | Initial PTY rows. |
--cols <n> | Initial PTY columns. |
--after <seq> | When following output, replay after this sequence number. |
--no-follow | Do not attach to output after creating. |
--all | Wait for the command and anything it started. |
--timeout <duration> | Stop waiting after this long. |
sandbox process start
Start a managed command without attaching by default.
Bash1createos sandbox process start my-box -- python -m http.server 80002createos sandbox process start --follow my-box -- npm run dev
Use this for background work you want to inspect later with process list, process attach, process wait, process signal, or process stop.
| Flag | Description |
|---|---|
--cwd <path> | Working directory inside the sandbox. |
--env KEY=VALUE | Environment variable override (repeatable). |
--pty, --tty, -t | Create a managed PTY instead of separate stdout/stderr pipes. |
--rows <n> | Initial PTY rows. |
--cols <n> | Initial PTY columns. |
--after <seq> | When following output, replay after this sequence number. |
--follow | Attach to output after starting. |
sandbox process shell
Start a managed PTY shell session.
Bash1createos sandbox process shell my-box2createos sandbox process shell my-box --no-attach
This does not replace sandbox shell. Use process shell when the shell should survive detach and be reattached later. It creates a process ID, appears in process list, and supports switching between running shell sessions from attach.
| Flag | Description |
|---|---|
--cwd <path> | Working directory inside the sandbox. |
--env KEY=VALUE | Environment variable override (repeatable). |
--rows <n> | Initial PTY rows. |
--cols <n> | Initial PTY columns. |
--cmd <path> | Explicit shell executable. The backend picks a default shell when omitted. |
--no-attach | Create the shell session and print the process ID without attaching. |
sandbox process attach
Reconnect to a managed process or shell session.
Bash1createos sandbox process attach my-box proc_abc1232createos sandbox process attach my-box
For PTY shell sessions, attach is interactive. For pipe processes, attach follows retained stdout/stderr output. If you omit the process ID in an interactive terminal, attach shows a picker of running managed processes.
Inside a managed PTY shell session:
| Shortcut | Action |
|---|---|
Ctrl-] | Detach from the local attach session. |
Ctrl-N | Create a new shell and switch to it. |
Ctrl-P | Open the process picker. |
| Flag | Description |
|---|---|
--after <seq> | Replay output after this sequence number. |
--no-follow | Replay retained output and exit. |
--stdin | Send local stdin to the process. Default for PTYs. |
--raw | Print raw output bytes. |
Other process controls
Bash1createos sandbox process list my-box2createos sandbox process get my-box proc_abc1233createos sandbox process input my-box proc_abc123 --text "hello\n"4createos sandbox process close-stdin my-box proc_abc1235createos sandbox process resize my-box proc_abc123 --rows 40 --cols 1206createos sandbox process signal my-box proc_abc123 SIGINT7createos sandbox process wait my-box proc_abc123 --all8createos sandbox process stop my-box proc_abc123 --grace 1s
process input accepts exactly one of --text, --file <path|->, or --base64 <bytes>. process close-stdin only applies to pipe processes; PTYs do not have a separate stdin-close operation. process resize only applies to PTYs. process wait --all waits for the command and anything it started. process stop sends SIGTERM, waits for the grace period, then force-kills remaining descendants.
sandbox editor
Connect a remote editor (Zed, Cursor, or VS Code) to a sandbox over SSH.
Bash1createos sandbox editor [<sandbox>]
In one command this registers your local SSH key on the sandbox, starts sshd inside it, writes a ~/.ssh/config entry so plain ssh <sandbox-id> works, and launches your editor with the remote pre-selected. Each sandbox gets a dedicated throwaway keypair stored under ~/.config/createos/keys; the command never touches your ~/.ssh/ keys.
Requirements:
- The sandbox must be
running. - The sandbox image must ship
sshd(thedevbox:1rootfs does). - The shape needs more than 2 GiB of memory (e.g.
s-4vcpu-4gb). Remote editor language servers OOM on 1 GiB shapes.
Transports (--via):
| Mode | Description |
|---|---|
tunnel | SSH through the gateway using OpenSSH ProxyJump. Works anywhere. Default when the VPN is down. |
vpn | Direct connection to the sandbox's overlay IP via the CreateOS VPN. Full network access. Default when the VPN is already up. Requires createos sandbox vpn up and a shared network. |
| Flag | Description |
|---|---|
--via <tunnel|vpn> | Transport to use. Auto-picks based on VPN state when omitted. |
--editor <name> | Editor to launch after connect: zed, cursor, code (VS Code), or none (write SSH config only). Auto-detects an installed editor when omitted. |
--user <name>, -u | Username inside the sandbox (default: root). |
--yes, -y | Skip prompts; accept smart defaults. Required in non-interactive mode. |
--no-launch | Wire up the SSH config but don't launch the editor. |
--remove | Remove this sandbox's ~/.ssh/config entry and local key, then exit. |
--no-sweep | Skip auto-cleanup of ~/.ssh/config entries for sandboxes that no longer exist. |
Interactive by default (prompts for sandbox, transport, and editor). Pass a sandbox plus --via, --editor, and --yes to run without prompts.
Flag options must appear before the sandbox positional argument.
Bash1# Interactive: pick sandbox, transport, and editor2createos sandbox editor34# Non-interactive: Zed over the gateway tunnel5createos sandbox editor my-box --via tunnel --editor zed --yes67# Write the SSH config entry without launching an editor8createos sandbox editor my-box --editor none910# Remove the SSH config entry and dedicated key11createos sandbox editor --remove my-box
After connecting, you can also reach the sandbox with any SSH-based tool:
Bash1ssh my-box2zed ssh://my-box/root3code --remote ssh-remote+my-box /root4cursor --folder-uri vscode-remote://ssh-remote+my-box/root
Files
sandbox push
Copy a local file into a sandbox.
Aliases: upload, cp-up
Bash1createos sandbox push <sandbox> <local-path> <remote-path>
The remote path must be absolute. Parent directories are created automatically. Max 500 MB per file.
Bash1# Upload a single file2createos sandbox push my-box ./main.py /workspace/main.py34# Stream a tarball from stdin5tar -c mydir | createos sandbox push my-box - /tmp/bundle.tar
Pass - as <local-path> to read from stdin.
sandbox pull
Copy a file out of a sandbox.
Aliases: download, cp-down
Bash1createos sandbox pull <sandbox> <remote-path> <local-path|->
The remote path must be absolute. Pass - as <local-path> to stream to stdout.
Bash1# Download to a file2createos sandbox pull my-box /workspace/result.csv ./result.csv34# Stream to stdout5createos sandbox pull my-box /workspace/result.csv - | head -5
sandbox sync
Two-way file sync between your local machine and a sandbox. Runs in the foreground; press Ctrl+C to stop.
Bash1createos sandbox sync [<sandbox>]
Built on Mutagen. Downloads Mutagen on first use. Uses the SSH path (requires an SSH key in the sandbox).
| Flag | Description |
|---|---|
--local <path> | Local directory to sync (prompts interactively if omitted on a terminal; defaults to current directory). |
--remote <path> | Absolute path inside the sandbox to sync to/from. |
-i <path>, --identity <path> | Path to your SSH private key (auto-detected from ~/.ssh/ if omitted). |
--user <name>, -u | Username inside the sandbox (default: root). |
--exclude <pattern> | Glob pattern to skip; repeatable (e.g. --exclude '*.log' --exclude node_modules). |
--mode <mode> | Sync direction: two-way (default), one-way (laptop wins, keeps extra files on the sandbox), or mirror (one-way and deletes extra files on the sandbox). |
--quiet, -q | Don't print status; run silently until Ctrl+C. |
--no-ignore-vcs | Sync VCS directories too (.git, .hg, …); skipped by default. |
--force | Bypass the local path safety check (syncing from $HOME, /, .ssh, .aws, etc. is refused by default). The remote check is always enforced. |
Bash1createos sandbox sync my-box --local ~/work/project --remote /root/work2createos sandbox sync my-box -i ~/.ssh/id_ed25519 --local . --remote /app34# Skip files you don't want synced (repeatable)5createos sandbox sync my-box --exclude '*.log' --exclude node_modules67# Push-only: laptop wins, never pull changes back8createos sandbox sync my-box --mode one-way910# Mirror: make the sandbox identical, deleting extra files there11createos sandbox sync my-box --mode mirror1213# Run silently until Ctrl+C14createos sandbox sync my-box --quiet
Networking
sandbox tunnel
Forward a local TCP port to a port inside the sandbox. No SSH key required.
Alias: tun
Bash1createos sandbox tunnel [<sandbox>]
Press Ctrl+C to stop.
| Flag | Description |
|---|---|
--remote <port> | Port inside the sandbox to forward to. |
--local <port> | Local port to listen on (defaults to --remote value). |
--bind <addr> | Local bind address (default: 127.0.0.1). Use 0.0.0.0 to expose to your network. |
Bash1# Forward localhost:8080 → sandbox:80002createos sandbox tunnel my-box --local 8080 --remote 800034# Mirror the remote port (local = remote = 5432)5createos sandbox tunnel my-box --remote 543267# Expose to the local network8createos sandbox tunnel my-box --remote 80 --bind 0.0.0.0
sandbox network
Manage private overlay networks that let sandboxes reach each other by IP.
Aliases: net, networks
| Subcommand | Description |
|---|---|
network create <name> | Create a new private network. |
network ls | List your networks. |
network show <name|id> | Show a network and its attached sandboxes. |
network attach <sandbox> <network> | Add a sandbox to a network. |
network detach <sandbox> <network> | Remove a sandbox from a network. |
network rm <name|id> | Delete a network. |
Bash1createos sandbox network create prod-net2createos sandbox network ls3createos sandbox network attach my-box prod-net4createos sandbox network show prod-net5createos sandbox network detach my-box prod-net6createos sandbox network rm prod-net
Firewall (egress)
sandbox firewall
Control what a sandbox can reach on the internet (egress allowlist). Rules update live without restarting the sandbox.
Alias: fw
| Subcommand | Description |
|---|---|
firewall show <sandbox> | Show the current egress allowlist. |
firewall set <sandbox> <host> [<host>...] | Replace the allowlist with the given hosts/IPs. |
firewall clear <sandbox> | Remove all restrictions (sandbox can reach anything). |
Bash1# See what the sandbox is allowed to reach2createos sandbox firewall show my-box34# Lock down to specific destinations5createos sandbox firewall set my-box api.github.com pypi.org67# Open the firewall completely8createos sandbox firewall clear my-box
firewall set accepts hostnames, IP addresses, and CIDR ranges. An empty list or firewall clear allows all outbound traffic.
Disks
sandbox disk
Manage S3-compatible buckets registered as mountable disks.
Alias: disks
| Subcommand | Description |
|---|---|
disk create [<name>] | Register an S3 bucket as a disk. |
disk ls | List your registered disks. |
disk show <name|id> | Show details for one disk. |
disk attach <sandbox> <disk> <mount-path> | Mount a disk into a running sandbox. |
disk detach <sandbox> <disk> <mount-path> | Unmount a disk from a sandbox. |
disk rm <name|id> | Delete a disk registration (does not affect the bucket). |
disk create flags:
| Flag | Description |
|---|---|
--bucket <name> | S3 bucket name. |
--endpoint <url> | S3 endpoint URL (e.g. https://s3.amazonaws.com, https://your-minio:9000). |
--access-key <key> | Access key ID. |
--secret-key <key> | Secret access key. |
--region <name> | S3 region (optional). |
--path-style | Force path-style addressing (required for MinIO and some S3-compatible stores). |
Run interactively (prompts for any missing field, masks the secret key) or pass all flags directly.
Bash1# Register a bucket interactively2createos sandbox disk create my-data34# Register non-interactively5createos sandbox disk create my-data \6 --bucket my-bucket \7 --endpoint https://s3.amazonaws.com \8 --access-key AKIAIOSFODNN7EXAMPLE \9 --secret-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY1011# Mount into a running sandbox12createos sandbox disk attach my-box my-data /mnt/data1314# Unmount15createos sandbox disk detach my-box my-data /mnt/data
Custom images
sandbox template
Build custom sandbox images from a Dockerfile. The Dockerfile must use a base image from the operator's allowlist (e.g. nodeops/sandbox:debian), must be single-stage, and must not use COPY or ADD.
Aliases: templates, tpl
| Subcommand | Description |
|---|---|
template submit <name> | Submit a Dockerfile to build a new image. |
template ls | List your templates. |
template show <name|id> | Show details for one template. |
template logs <name|id> | Stream build logs. |
template rm <name|id> | Delete a template. |
template submit flags:
| Flag | Description |
|---|---|
-f <path>, --file <path> | Path to the Dockerfile (default: ./Dockerfile). |
--no-follow | Submit and exit immediately; don't stream build logs. |
Bash1# Submit and stream build logs until done2createos sandbox template submit my-image34# Submit using a custom Dockerfile path5createos sandbox template submit my-image -f docker/Sandbox.dockerfile67# Submit without waiting for the build8createos sandbox template submit my-image --no-follow910# Use a template when creating a sandbox11createos sandbox create --shape s-1vcpu-1gb --rootfs my-image1213# Watch logs for an in-progress build14createos sandbox template logs my-image --follow
Once a template's status is ready, use its name as --rootfs when creating a sandbox.
Catalog
sandbox shapes
List available sandbox sizes.
Bash1createos sandbox shapes2createos sandbox shapes --output json
Prints a table of shape IDs with their vCPU count, RAM, and default disk size. Pass the shape ID to sandbox create --shape.
sandbox rootfs
List built-in OS images available for new sandboxes.
Bash1createos sandbox rootfs2createos sandbox rootfs --output json
Prints the catalog of base images. Pass a name to sandbox create --rootfs. User-built templates (from sandbox template submit) are listed separately.
Webhooks
Register HTTPS endpoints that receive a signed POST on sandbox, disk, network, and template lifecycle events. Unlike the rest of this page, these live under the top-level createos webhooks group (not createos sandbox). Full event catalog, delivery payload, and signature verification: REST API → Webhooks.
Endpoint-targeting commands accept the endpoint ID as a positional argument or --endpoint <id>, and prompt interactively when omitted on a terminal.
webhooks create
Create a webhook endpoint. Omit --event to subscribe to every action; repeat --event to filter. The signing secret is printed once — save it.
Bash1# Subscribe to all events2createos webhooks create --url https://example.com/webhook34# Subscribe to specific events5createos webhooks create --url https://example.com/webhook \6 --event sandbox.create --event sandbox.destroy78# Interactive (TTY): prompts for URL and events9createos webhooks create
| Flag | Description |
|---|---|
--url <url> | HTTPS URL to receive events. Required (prompted on a TTY). |
--event <action> | Event to subscribe to; repeatable. Omit for all events. |
webhooks list
List your webhook endpoints. Alias: createos webhooks ls
Bash1createos webhooks list
webhooks get
Show one endpoint's config plus its recent deliveries (status, attempts, timestamps).
Bash1createos webhooks get <endpoint-id>2createos webhooks get --endpoint <endpoint-id>
webhooks suspend
Stop deliveries without deleting the endpoint.
Bash1createos webhooks suspend <endpoint-id>
webhooks resume
Reactivate a suspended endpoint and reset its failure count. Endpoints are auto-suspended after repeated delivery failures.
Bash1createos webhooks resume <endpoint-id>
webhooks delete
Delete an endpoint and all its pending deliveries.
Bash1createos webhooks delete <endpoint-id>2createos webhooks delete <endpoint-id> --force # skip confirmation (alias: -f)