Sandbox SDK — `@next` (1.0 preview) skill
Build or maintain Cloudflare Sandbox apps on @cloudflare/sandbox@next (SDK 1.0 preview).
by cloudflare·Apache-2.0 license·★ 2,976 Stars on the repo·GitHub ↗
npx degit cloudflare/skills/skills/sandbox-next#main ~/.claude/skills/sandbox-nextChecked ·commit main
Files of Sandbox SDK — `@next` (1.0 preview)
Show the full text93 lines
Sandbox SDK — @next (1.0 preview)
Isolated Linux environments on Cloudflare Containers, driven from Workers.
Prefer preview docs and installed @next types over memory. APIs change; this skill is a gate, a contract, and a retrieval map—not a full manual.
We recommend new projects on this line. Apps still on the default package use sandbox-stable. Port only when asked, via sandbox-migrate-to-next.
1. Gate — confirm the package line
Before writing code, inspect the app:
| Check | Must match |
|---|---|
| npm dependency | @cloudflare/sandbox@next (or another preview tag) |
| Container image | Same line (e.g. cloudflare/sandbox:next, next-python) |
| If you find… | Action |
|---|---|
Default @cloudflare/sandbox (no @next) |
Stop. Load sandbox-stable. Do not apply this skill’s APIs. |
User wants to port stable → @next |
Stop. Load sandbox-migrate-to-next. |
| Self-deployed bridge only | Bridge is not on the 1.0 preview line yet. Keep bridge on stable package + image. Bridge (stable) |
Never mix an @next Worker package with a stable container image (or the reverse).
Skills install: Agent setup · cloudflare/skills
2. Contract — non-negotiables
sandbox.exec(argv)takes an argv list and resolves when the process starts. It returns a handle, not a finished command result.- Collect results with handle methods:
output(),logs(),waitForExit(),waitForPort(),waitForLog(),kill(signal?). - No implicit shell. Shell syntax needs an explicit shell, e.g.
["/bin/bash", "-lc", script]. - Each launch is independent. A
cd/exportin oneexecis not visible to the next. Passcwdandenvper launch, or one shell script. - Process handles have no stdin. Interactive use → terminals (
createTerminal+connect). - Local wait
timeout/AbortSignalcancel the wait only. They do not kill the process. Usekillorexec’s remotetimeout. getProcess/listProcesses/getTerminal/listTerminalsdo not start a container; they returnnull/[]when none is up.- Process and terminal IDs belong to the current container, not forever to a sandbox ID. For work that must survive replace, store the full job (argv, cwd, env, app state)—not only an id.
- Non-secret config only in
setEnvVars/ launchenv. Live credentials stay in the Worker; use outbound handlers when the sandbox calls external APIs. - Do not invent removed stable APIs (
gitCheckouton core, string-execcompletion, session execution,sandbox.terminal(request)). - Do not use one retry loop for every error (see Errors docs).
Minimal shape:
import { getSandbox, proxyToSandbox, Sandbox } from "@cloudflare/sandbox";
export { Sandbox };
const sandbox = getSandbox(env.Sandbox, "user-123");
const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]);
const result = await process.output({ encoding: "utf8" });
// result.stdout, result.exitCode
Task-specific API documentation: references/api-quick-ref.md
Examples index (next branch): references/examples.md
3. Retrieve — open the doc for the task
Fetch the page before implementing. Installed @next types win over guesses.
| You need to… | Open |
|---|---|
| Orient / choose preview | 1.0 preview overview |
| First Worker, wrangler, Dockerfile | Get started |
exec, handles, readiness, durability |
Process execution |
| Process API signatures | Processes API |
| Sandbox ID vs container vs sleep/destroy | Lifecycle |
cwd / env / setEnvVars |
Environment |
| Interactive PTY / browser terminal | Terminals · Terminals API |
| Python/JS code interpreter | Interpreter · Interpreter API |
| Extensions model | Extensions |
| Error classes and recovery | Errors · Errors API |
| Common failures | Troubleshooting |
| API hub | API reference |
Files, mounts, backups, ports, tunnels, proxyToSandbox |
Main docs for shared surfaces (ignore stable-only session/transport/sandbox.terminal): Files · Storage / mounts · Ports · Tunnels · Backups · Outbound traffic · Expose services · Production |
| Example apps | examples on next |
| Still on stable package | sandbox-stable · Main Sandbox docs |
| Porting an existing stable app | sandbox-migrate-to-next · Migrate |
4. Before you ship
- Lockfile and Dockerfile on the same
@nextline - Typecheck against installed
@nexttypes - No live secrets in sandbox env
- Production preview hostnames need wildcard DNS on a custom domain when using those URL patterns
| 1 | |
| 2 | name sandbox-next |
| 3 | description Build or maintain Cloudflare Sandbox apps on @cloudflare/sandbox@next (SDK 1.0 preview). Use sandbox-migrate-to-next when porting a stable app. |
| 4 | |
| 5 | |
| 6 | # Sandbox SDK — `@next` (1.0 preview) |
| 7 | |
| 8 | Isolated Linux environments on [Cloudflare Containers], driven from Workers. |
| 9 | |
| 10 | **Prefer preview docs and installed `@next` types over memory.** APIs change; this skill is a gate, a contract, and a retrieval map—not a full manual. |
| 11 | |
| 12 | We recommend **new projects** on this line. Apps still on the default package use **`sandbox-stable`**. Port only when asked, via **`sandbox-migrate-to-next`**. |
| 13 | |
| 14 | ## 1. Gate — confirm the package line |
| 15 | |
| 16 | Before writing code, inspect the app: |
| 17 | |
| 18 | | Check | Must match | |
| 19 | | ----- | ---------- | |
| 20 | | npm dependency | `@cloudflare/sandbox@next` (or another preview tag) | |
| 21 | | Container image | Same line (e.g. `cloudflare/sandbox:next`, `next-python`) | |
| 22 | |
| 23 | | If you find… | Action | |
| 24 | | ------------ | ------ | |
| 25 | | Default `@cloudflare/sandbox` (no `@next`) | **Stop.** Load **`sandbox-stable`**. Do not apply this skill’s APIs. | |
| 26 | | User wants to port stable → `@next` | **Stop.** Load **`sandbox-migrate-to-next`**. | |
| 27 | | Self-deployed **bridge** only | Bridge is **not** on the 1.0 preview line yet. Keep bridge on stable package + image. [Bridge (stable)] | |
| 28 | |
| 29 | Never mix an `@next` Worker package with a stable container image (or the reverse). |
| 30 | |
| 31 | Skills install: [Agent setup] · [cloudflare/skills] |
| 32 | |
| 33 | ## 2. Contract — non-negotiables |
| 34 | |
| 35 | `sandbox.exec(argv)` takes an **argv** list and resolves when the process **starts**. It returns a **handle**, not a finished command result. |
| 36 | Collect results with handle methods: `output()`, `logs()`, `waitForExit()`, `waitForPort()`, `waitForLog()`, `kill(signal?)`. |
| 37 | No implicit shell. Shell syntax needs an explicit shell, e.g. `["/bin/bash", "-lc", script]`. |
| 38 | Each launch is independent. A `cd` / `export` in one `exec` is not visible to the next. Pass `cwd` and `env` per launch, or one shell script. |
| 39 | Process handles have **no stdin**. Interactive use → terminals (`createTerminal` + `connect`). |
| 40 | Local wait `timeout` / `AbortSignal` cancel the **wait only**. They do not kill the process. Use `kill` or `exec`’s remote `timeout`. |
| 41 | `getProcess` / `listProcesses` / `getTerminal` / `listTerminals` do **not** start a container; they return `null` / `[]` when none is up. |
| 42 | Process and terminal IDs belong to the **current container**, not forever to a sandbox ID. For work that must survive replace, store the full job (argv, cwd, env, app state)—not only an id. |
| 43 | Non-secret config only in `setEnvVars` / launch `env`. Live credentials stay in the Worker; use outbound handlers when the sandbox calls external APIs. |
| 44 | Do **not** invent removed stable APIs (`gitCheckout` on core, string-`exec` completion, session execution, `sandbox.terminal(request)`). |
| 45 | Do **not** use one retry loop for every error (see Errors docs). |
| 46 | |
| 47 | Minimal shape: |
| 48 | |
| 49 | |
| 50 | import { getSandbox, proxyToSandbox, Sandbox } from "@cloudflare/sandbox"; |
| 51 | |
| 52 | export { Sandbox }; |
| 53 | |
| 54 | const sandbox = getSandbox(env.Sandbox, "user-123"); |
| 55 | const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]); |
| 56 | const result = await process.output({ encoding: "utf8" }); |
| 57 | // result.stdout, result.exitCode |
| 58 | |
| 59 | |
| 60 | Task-specific API documentation: [references/api-quick-ref.md] |
| 61 | |
| 62 | Examples index (`next` branch): [references/examples.md] |
| 63 | |
| 64 | ## 3. Retrieve — open the doc for the task |
| 65 | |
| 66 | Fetch the page before implementing. Installed `@next` types win over guesses. |
| 67 | |
| 68 | | You need to… | Open | |
| 69 | | ------------ | ---- | |
| 70 | | Orient / choose preview | [1.0 preview overview] | |
| 71 | | First Worker, wrangler, Dockerfile | [Get started] | |
| 72 | | `exec`, handles, readiness, durability | [Process execution] | |
| 73 | | Process API signatures | [Processes API] | |
| 74 | | Sandbox ID vs container vs sleep/destroy | [Lifecycle] | |
| 75 | | `cwd` / `env` / `setEnvVars` | [Environment] | |
| 76 | | Interactive PTY / browser terminal | [Terminals] · [Terminals API] | |
| 77 | | Python/JS code interpreter | [Interpreter] · [Interpreter API] | |
| 78 | | Extensions model | [Extensions] | |
| 79 | | Error classes and recovery | [Errors] · [Errors API] | |
| 80 | | Common failures | [Troubleshooting] | |
| 81 | | API hub | [API reference] | |
| 82 | | Files, mounts, backups, ports, tunnels, `proxyToSandbox` | Main docs for shared surfaces (ignore stable-only session/transport/`sandbox.terminal`): [Files] · [Storage / mounts] · [Ports] · [Tunnels] · [Backups] · [Outbound traffic] · [Expose services] · [Production] | |
| 83 | | Example apps | [examples on `next`] | |
| 84 | | Still on stable package | **`sandbox-stable`** · [Main Sandbox docs] | |
| 85 | | Porting an existing stable app | **`sandbox-migrate-to-next`** · [Migrate] | |
| 86 | |
| 87 | ## 4. Before you ship |
| 88 | |
| 89 | Lockfile and Dockerfile on the **same** `@next` line |
| 90 | Typecheck against installed `@next` types |
| 91 | No live secrets in sandbox env |
| 92 | Production preview hostnames need wildcard DNS on a custom domain when using those URL patterns |
| 93 |
Discussion
Alternatives
Browse more free Claude skills or everything in Development.