--- title: "Cloudflare" description: "Deploy the daemon inside a Cloudflare Sandbox." --- ## Prerequisites - Cloudflare account with Workers Paid plan - Docker running locally for `wrangler dev` - `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` for the coding agents Cloudflare Sandbox SDK is in beta. See [Sandbox SDK docs](https://developers.cloudflare.com/sandbox/) for details. ## Quick Start Create a new Sandbox SDK project: ```bash npm create cloudflare@latest -- my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal cd my-sandbox ``` ## TypeScript Example ```typescript import { getSandbox, proxyToSandbox, type Sandbox } from "@cloudflare/sandbox"; export { Sandbox } from "@cloudflare/sandbox"; type Env = { Sandbox: DurableObjectNamespace; ANTHROPIC_API_KEY?: string; OPENAI_API_KEY?: string; }; /** Check if sandbox-agent is already running by probing its health endpoint */ async function isServerRunning(sandbox: Sandbox): Promise { try { const result = await sandbox.exec("curl -sf http://localhost:8000/v1/health"); return result.success; } catch { return false; } } export default { async fetch(request: Request, env: Env): Promise { // Proxy requests to exposed ports first const proxyResponse = await proxyToSandbox(request, env); if (proxyResponse) return proxyResponse; const { hostname } = new URL(request.url); const sandbox = getSandbox(env.Sandbox, "sandbox-agent"); // Check if server is already running to avoid port conflicts const alreadyRunning = await isServerRunning(sandbox); if (!alreadyRunning) { // Install sandbox-agent await sandbox.exec( "curl -fsSL https://releases.rivet.dev/sandbox-agent/latest/install.sh | sh" ); // Install agents await sandbox.exec("sandbox-agent install-agent claude"); await sandbox.exec("sandbox-agent install-agent codex"); // Set environment variables for agents const envVars: Record = {}; if (env.ANTHROPIC_API_KEY) envVars.ANTHROPIC_API_KEY = env.ANTHROPIC_API_KEY; if (env.OPENAI_API_KEY) envVars.OPENAI_API_KEY = env.OPENAI_API_KEY; await sandbox.setEnvVars(envVars); // Start sandbox-agent server as background process await sandbox.startProcess( "sandbox-agent server --no-token --host 0.0.0.0 --port 8000" ); // Wait for server to start await new Promise((r) => setTimeout(r, 2000)); } // Expose the port with a preview URL const exposed = await sandbox.exposePort(8000, { hostname }); return Response.json({ endpoint: exposed.url, message: alreadyRunning ? "sandbox-agent server was already running" : "sandbox-agent server started", }); }, }; ``` ## Connect from Client ```typescript import { SandboxAgent } from "sandbox-agent"; // Get the endpoint from the Worker const { endpoint } = await fetch("http://localhost:8787").then((r) => r.json()); // Connect to sandbox-agent const client = await SandboxAgent.connect({ baseUrl: endpoint }); // Wait for server to be ready for (let i = 0; i < 30; i++) { try { await client.getHealth(); break; } catch { await new Promise((r) => setTimeout(r, 1000)); } } // Create a session and start coding await client.createSession("my-session", { agent: "claude", permissionMode: "default", }); await client.postMessage("my-session", { message: "Summarize this repository", }); for await (const event of client.streamEvents("my-session")) { console.log(event.type, event.data); } ``` ## Configuration Update `wrangler.jsonc` to add environment variables: ```jsonc { "vars": { "ANTHROPIC_API_KEY": "your-api-key" } } ``` Or use `.dev.vars` for local development: ```bash echo "ANTHROPIC_API_KEY=your-api-key" > .dev.vars ``` The `.dev.vars` file is automatically gitignored and only used during local development with `npm run dev`. ## Local Development Start the development server: ```bash npm run dev ``` First run builds the Docker container (2-3 minutes). Subsequent runs are much faster. Test with curl: ```bash curl http://localhost:8787 ``` ## Production Deployment For production, preview URLs require a custom domain with wildcard DNS routing. See [Cloudflare Production Deployment](https://developers.cloudflare.com/sandbox/guides/production-deployment/) for setup instructions. ## Faster Cold Starts To speed up cold starts, you can: 1. Create a custom Dockerfile with sandbox-agent pre-installed 2. Pre-install agents in the Docker image Example `Dockerfile`: ```dockerfile FROM docker.io/cloudflare/sandbox:latest RUN curl -fsSL https://releases.rivet.dev/sandbox-agent/latest/install.sh | sh && \ sandbox-agent install-agent claude && \ sandbox-agent install-agent codex ``` Then update `wrangler.jsonc`: ```jsonc { "containers": { "sandbox": { "image": "./Dockerfile" } } } ```