Getting started
Build your first application with Sandbox SDK - a secure code execution environment. In this guide, you'll create a Worker that can execute Python code and work with files in isolated containers.
- Sign up for a Cloudflare account ↗.
- Install
Node.js
↗.
Node.js version manager
Use a Node version manager like Volta ↗ or nvm ↗ to avoid permission issues and change Node.js versions. Wrangler, discussed later in this guide, requires a Node version of 16.17.0
or later.
Sandbox SDK uses Docker ↗ to build container images alongside your Worker. Docker must be running when you deploy or run locally.
Install Docker by following the Docker Desktop installation guide ↗.
Verify Docker is running:
docker info
If Docker is not running, this command will hang or return "Cannot connect to the Docker daemon".
Create a new Sandbox SDK project:
npm create cloudflare@latest -- my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal
yarn create cloudflare my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal
pnpm create cloudflare@latest my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal
This creates a my-sandbox
directory with everything you need:
src/index.ts
- Worker with sandbox integrationwrangler.jsonc
- Configuration for Workers and ContainersDockerfile
- Container environment definition
cd my-sandbox
The template provides a minimal Worker that demonstrates core sandbox capabilities:
import { getSandbox, proxyToSandbox, type Sandbox } from '@cloudflare/sandbox';
export { Sandbox } from '@cloudflare/sandbox';
type Env = { Sandbox: DurableObjectNamespace<Sandbox>;};
export default { async fetch(request: Request, env: Env): Promise<Response> { // Required for preview URLs (if you expose ports later) const proxyResponse = await proxyToSandbox(request, env); if (proxyResponse) return proxyResponse;
const url = new URL(request.url);
// Get or create a sandbox instance const sandbox = getSandbox(env.Sandbox, 'my-sandbox');
// Execute Python code if (url.pathname === '/run') { const result = await sandbox.exec('python -c "print(2 + 2)"'); return Response.json({ output: result.stdout, success: result.success }); }
// Work with files if (url.pathname === '/file') { await sandbox.writeFile('/workspace/hello.txt', 'Hello, Sandbox!'); const file = await sandbox.readFile('/workspace/hello.txt'); return Response.json({ content: file.content }); }
return new Response('Try /run or /file'); },};
Key concepts:
getSandbox()
- Gets or creates a sandbox instance by IDproxyToSandbox()
- Required at the top for preview URLs to worksandbox.exec()
- Execute commands and capture outputsandbox.writeFile()
/readFile()
- File operations
Start the development server:
npm run dev
Test the endpoints:
# Execute Python codecurl http://localhost:8787/run
# File operationscurl http://localhost:8787/file
You should see JSON responses with the command output and file contents.
Deploy your Worker and container:
npx wrangler deploy
This will:
- Build your container image using Docker
- Push it to Cloudflare's Container Registry
- Deploy your Worker globally
Check deployment status:
npx wrangler containers list
Visit your Worker URL (shown in deploy output):
# Replace with your actual URLcurl https://my-sandbox.YOUR_SUBDOMAIN.workers.dev/run
Your sandbox is now deployed.
Your wrangler.jsonc
connects three pieces together:
{ "containers": [ { "class_name": "Sandbox", "image": "./Dockerfile" } ], "durable_objects": { "bindings": [ { "class_name": "Sandbox", "name": "Sandbox" } ] }, "migrations": [ { "new_sqlite_classes": ["Sandbox"], "tag": "v1" } ]}
[[containers]]class_name = "Sandbox"image = "./Dockerfile"
[[durable_objects.bindings]]class_name = "Sandbox"name = "Sandbox"
[[migrations]]new_sqlite_classes = [ "Sandbox" ]tag = "v1"
- containers - Your Dockerfile defines the execution environment
- durable_objects - Makes the
Sandbox
binding available in your Worker - migrations - Initializes Durable Object storage (required once)
For detailed configuration options including environment variables, secrets, and custom images, see the Wrangler configuration reference.
Now that you have a working sandbox, explore more capabilities:
- Execute commands - Run shell commands and stream output
- Manage files - Work with files and directories
- Expose services - Get public URLs for services running in your sandbox
- API reference - Complete API documentation
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark
-