Run Devin in a sandbox
Last updated Oct 9, 2026 runs its agent loop in its own service. Each session works on a machine where Devin runs commands, edits files, and opens a browser. A Devin Outpost moves that machine to infrastructure that you choose. The Devin Outpost template runs each session in its own Linux sandbox: a Container that one Durable Object starts for that session.
Prerequisites
You need:
- A Devin Enterprise organization with permission to manage outposts and service users
- A Cloudflare account on the Workers Paid plan with access to Containers
- For manual deployment, Node.js 24 ↗︎ and a running Docker ↗︎ daemon
Get your Devin credentials
- Open your Devin organization outpost settings. In this URL, replace both occurrences of
my-orgwith your organization slug:
txt
https://my-org.devinenterprise.com/org/my-org/settings/enterprise-environment?tab=outposts
- Create or select an outpost, and copy its outpost ID for
DEVIN_OUTPOST_ID. - For
DEVIN_API_TOKEN, use a Devin service-user token with the Run outpost workers permission.
For more information about outposts, refer to the Devin Outposts overview ↗︎.
Deploy with one click
The Deploy to Cloudflare button creates the Worker, the cron trigger, the Durable Object namespace, and the container application.
Enter these values when the deployment flow prompts for them:
| Variable | Value |
|---|---|
DEVIN_OUTPOST_ID |
Your Devin Outpost ID |
DEVIN_API_TOKEN |
A Devin service-user token with the Run outpost workers permission |
After the deployment finishes, select your outpost from the Virtual environment menu when you create a Devin session.
Customize and deploy manually
Deploy manually when you need to add dependencies, tools, or environment variables to the container image.
- Create a project from the Devin Outpost template:npmyarnpnpm
npm create cloudflare@latest -- cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devin
yarn create cloudflare cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devin
pnpm create cloudflare@latest cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devin
- Go to the project directory and log in to your Cloudflare account:
sh
cd cloudflare-devin-outpost
npx wrangler login
- In
wrangler.jsonc, replace the emptyDEVIN_OUTPOST_IDvalue with your outpost ID.
The default DEVIN_API_URL is https://api.devin.ai/opbeta. Change this value only if your Devin environment uses another API URL.
4. Store your Devin API token as a Worker secret:
sh
npx wrangler secret put DEVIN_API_TOKEN
Enter your service-user token when Wrangler prompts you. Do not add the token to wrangler.jsonc.
5. Deploy the Worker and container:
sh
npm run deploy
Wrangler builds the container image and deploys the Worker, the container application, and the cron trigger. 6. Check the deployment with the Worker URL from the Wrangler output:
sh
curl https://<YOUR_WORKER>.workers.dev/
The Worker returns:
json
{
"service": "devin-outpost",
"status": "ok"
}
Run a Devin session
In Devin, create a session and select your outpost from the Virtual environment menu. The Worker checks for new sessions every 10 seconds by default, so the sandbox for the session starts shortly after you create it.
How the template runs sessions
A cron trigger runs the Worker once a minute. During each run, the Worker asks Devin for the sessions of your outpost every 10 seconds, or every DEVIN_RECONCILE_INTERVAL_MS milliseconds if you set that variable. The Worker sends the status of each session to the Durable Object for that session:
| Devin status | What the template does |
|---|---|
pending, running |
Starts the sandbox for the session if it is not running, from its snapshot if it has one. |
suspended |
Waits for the Devin CLI to exit, saves a snapshot of the sandbox, then stops it. |
terminated |
Stops the sandbox and forgets its snapshot. |
The Durable Object only starts and stops its container. Inside the sandbox, the Devin CLI (devin worker start) claims the session and runs it.
your Cloudflare account
Devin
lists sessions
Your Workerruns oncron trigger
sends each session
Durable Objectone persession
starts and stops
ContainerrunsDevin CLI
claims the session
When Devin suspends a session, the Devin CLI exits. The sandbox keeps running until the Durable Object saves a snapshot of its disk. When the session continues, the sandbox starts from that snapshot and the Devin CLI claims the session again. The snapshot keeps the files and installed packages of the session. It does not keep running processes. If the Devin CLI exits while the session is still running, the template saves a snapshot and starts a new sandbox from it.
For more information, refer to Save and restore a sandbox with snapshots.
Note
The template saves a snapshot only after the Devin CLI exits. If a sandbox stops before then, the session continues from its previous snapshot, or from the image if it has none. The Worker API cannot delete snapshots, so the snapshot of a terminated session stays in your account.
Security
Each session runs in its own container and does not share files or processes with other sessions. Inside the container, Devin runs as root, can reach the Internet, and holds the Devin API token. Code that runs in a session can read that token. Deploy a separate outpost for each group of users that must not share access.
For more information, refer to Sandbox security.
Related resources
- Devin Outposts overview ↗︎
- Devin Outpost template ↗︎
- Containers
- Save and restore a sandbox with snapshots
Was this helpful?
YesNo
On this page
{"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/sandbox/coding-agents/devin/#page","headline":"Run Devin in a sandbox","description":"Deploy a Devin Outpost that runs each Devin session in its own Linux sandbox on Containers.","url":"https://developers.cloudflare.com/sandbox/coding-agents/devin/","inLanguage":"en","image":"https://developers.cloudflare.com/sandbox/coding-agents/devin/og.png?v=cb54f4efb94168a8","dateModified":"2026-10-09","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}
description: Deploy a self-hosted OpenAI Agents API environment that runs each Codex session in its own Linux sandbox on Containers. title: Run Codex with the OpenAI Agents API in a sandbox image: https://developers.cloudflare.com/sandbox/coding-agents/openai-agents-api/og.png?v=ade466bed145a5e4
Documentation Index
Fetch the complete documentation index at: https://developers.cloudflare.com/sandbox/llms.txt
Use this file to discover all available pages before exploring further.

