Skip to content
Sandbox SDK (1.0 Preview)

Sandbox SDK (1.0 Preview) Skill

Build on @cloudflare/sandbox@next, the Sandbox SDK 1.0 preview — with a package gate that stops an agent mixing preview APIs into a stable app.

GitHub Docs

Install

Install with the skills CLI

One command for Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf and dozens of other agents. Needs Node.js; the skill is fetched straight from cloudflare/skills.

$ npx skills add cloudflare/skills --skill sandbox-next

Run it in a terminal. The CLI finds the agents installed on your machine, asks which ones to add the skill to, and whether to install it into the folder you ran it from or for all your projects.

Other ways to install

Copy the whole skill folder — SKILL.md and any scripts or references beside it — into ~/.claude/skills/sandbox-next/, where Claude Code picks it up in every project. Only git is needed.

tmp=$(mktemp -d) && \
  git clone --depth 1 --branch main https://github.com/cloudflare/skills.git "$tmp" && \
  mkdir -p ~/.claude/skills && \
  cp -R "$tmp"/skills/sandbox-next ~/.claude/skills/sandbox-next

No scripts or references next to it? Saving the SKILL.md alone as ~/.claude/skills/sandbox-next/SKILL.md works too.

Using another agent? Its personal skills folder
Codex
~/.agents/skills/
Cursor
~/.cursor/skills/
GitHub Copilot
~/.copilot/skills/
Gemini CLI
~/.gemini/skills/
Windsurf
~/.codeium/windsurf/skills/
OpenCode
~/.config/opencode/skills/

About

  • Package gate that refuses to apply preview APIs to a stable app
  • Pins exec() semantics: argv list, handle-not-result, no implicit shell
  • Explains why process IDs are container-scoped, not sandbox-scoped
  • Pre-ship checklist for lockfile, types, secrets and preview DNS

Cloudflare's Sandbox SDK runs isolated Linux environments on Cloudflare Containers, driven from a Worker. The SDK now has two live lines — the stable package and the @next 1.0 preview — whose APIs differ enough that code written for one fails on the other. This official skill covers the preview line, and its first job is making sure the agent is on it.

That is the "gate": before writing any code, inspect the app's npm dependency and container image and confirm both are on the preview line (@cloudflare/sandbox@next, cloudflare/sandbox:next). A default dependency means stop and load sandbox-stable; a port request means stop and load sandbox-migrate-to-next. Mixing an @next Worker package with a stable container image, in either direction, is called out as never correct.

The contract section then pins the semantics that most often get assumed wrong. sandbox.exec(argv) takes an argv list, not a shell string, and resolves when the process starts — it returns a handle, not a finished result. Results come from the handle: output(), logs(), waitForExit(), waitForPort(), waitForLog(), kill(). There is no implicit shell, so shell syntax needs an explicit ["/bin/bash", "-lc", script]. Each launch is independent, so a cd or export in one exec is invisible to the next; pass cwd and env per launch. Local wait timeouts and AbortSignal cancel the wait only — they do not kill the process. Process and terminal IDs belong to the current container rather than to the sandbox ID forever, so durable work stores the whole job, not an id.

It closes with a retrieval map pointing at the right preview doc per task, and a pre-ship checklist: lockfile and Dockerfile on the same line, typecheck against installed @next types, no live credentials in sandbox env, wildcard DNS for preview hostnames on a custom domain. For teams building code interpreters, agent sandboxes or CI-style execution on Workers. Apache-2.0.

SKILL.md

The instructions your agent loads, as published by Cloudflare.

SKILL.md
name
sandbox-next
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.

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:

CheckMust match
npm dependency@cloudflare/sandbox@next (or another preview tag)
Container imageSame 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 → @nextStop. Load `sandbox-migrate-to-next`.
Self-deployed bridge onlyBridge 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 / export in one exec is not visible to the next. Pass cwd and env per launch, or one shell script.
  • Process handles have no stdin. Interactive use → terminals (createTerminal + connect).
  • Local wait timeout / AbortSignal cancel the wait only. They do not kill the process. Use kill or exec’s remote timeout.
  • getProcess / listProcesses / getTerminal / listTerminals do not start a container; they return null / [] 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 / launch env. Live credentials stay in the Worker; use outbound handlers when the sandbox calls external APIs.
  • Do not invent removed stable APIs (gitCheckout on core, string-exec completion, 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](references/api-quick-ref.md)

Examples index (next branch): [references/examples.md](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 preview1.0 preview overview
First Worker, wrangler, DockerfileGet started
exec, handles, readiness, durabilityProcess execution
Process API signaturesProcesses API
Sandbox ID vs container vs sleep/destroyLifecycle
cwd / env / setEnvVarsEnvironment
Interactive PTY / browser terminalTerminals · Terminals API
Python/JS code interpreterInterpreter · Interpreter API
Extensions modelExtensions
Error classes and recoveryErrors · Errors API
Common failuresTroubleshooting
API hubAPI reference
Files, mounts, backups, ports, tunnels, proxyToSandboxMain docs for shared surfaces (ignore stable-only session/transport/sandbox.terminal): Files · Storage / mounts · Ports · Tunnels · Backups · Outbound traffic · Expose services · Production
Example appsexamples 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 @next line
  • Typecheck against installed @next types
  • No live secrets in sandbox env
  • Production preview hostnames need wildcard DNS on a custom domain when using those URL patterns
Install
Featured

Build crash-safe AI agents on AgentKit and step.ai — durable tool calls, human-in-the-loop approval, realtime progress, and when not to reach for an agent loop at all.

Skill: Genkit for JavaScript

by Genkit (Google)

Featured

The official Genkit skill for Node.js and TypeScript — flows, Dotprompt files, tools and the beta agent API with sessions, interrupts and branching.

76 views
Browse all skills →