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 infoIf 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/minimalyarn create cloudflare my-sandbox --template=cloudflare/sandbox-sdk/examples/minimalpnpm create cloudflare@latest my-sandbox --template=cloudflare/sandbox-sdk/examples/minimalThis creates a my-sandbox directory with everything you need:
- src/index.ts- Worker with sandbox integration
- wrangler.jsonc- Configuration for Workers and Containers
- Dockerfile- Container environment definition
cd my-sandboxThe 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 ID
- proxyToSandbox()- Required at the top for preview URLs to work
- sandbox.exec()- Execute commands and capture output
- sandbox.writeFile()/- readFile()- File operations
Start the development server:
npm run devTest the endpoints:
# Execute Python codecurl http://localhost:8787/run
# File operationscurl http://localhost:8787/fileYou should see JSON responses with the command output and file contents.
Deploy your Worker and container:
npx wrangler deployThis will:
- Build your container image using Docker
- Push it to Cloudflare's Container Registry
- Deploy your Worker globally
Check deployment status:
npx wrangler containers listVisit your Worker URL (shown in deploy output):
# Replace with your actual URLcurl https://my-sandbox.YOUR_SUBDOMAIN.workers.dev/runYour 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 Sandboxbinding 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