<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ajeet Singh Raina</title>
    <description>The latest articles on DEV Community by Ajeet Singh Raina (@ajeetraina).</description>
    <link>https://dev.to/ajeetraina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F542589%2Fa49382c6-1e3d-4b9e-bfa8-23854886ad47.jpg</url>
      <title>DEV Community: Ajeet Singh Raina</title>
      <link>https://dev.to/ajeetraina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajeetraina"/>
    <language>en</language>
    <item>
      <title>Building an Autonomous A/B Testing Agent on Docker Cloud Sandboxes</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:04:38 +0000</pubDate>
      <link>https://dev.to/ajeetraina/building-an-autonomous-ab-testing-agent-on-docker-cloud-sandboxes-5926</link>
      <guid>https://dev.to/ajeetraina/building-an-autonomous-ab-testing-agent-on-docker-cloud-sandboxes-5926</guid>
      <description>&lt;p&gt;Have you ever wondered if an AI agent could run an A/B test all by itself?&lt;/p&gt;

&lt;p&gt;In this post, we will build one together. We will go slowly, one file at a time, so you can follow along even if you have never used Docker Cloud Sandboxes before.&lt;/p&gt;

&lt;p&gt;Full code: &lt;a href="https://github.com/ajeetraina/sbx-ab-agent" rel="noopener noreferrer"&gt;github.com/ajeetraina/sbx-ab-agent&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What are we building?
&lt;/h2&gt;

&lt;p&gt;Think of a small online shop. Some people say it is hard to find things in it. We want to fix that, but we are not sure which fix is best.&lt;/p&gt;

&lt;p&gt;So we do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put the shop online in a safe cloud box (a sandbox).&lt;/li&gt;
&lt;li&gt;Send in some pretend shoppers (AI agents) and ask them how easy the shop was to use.&lt;/li&gt;
&lt;li&gt;Ask an analyst (another AI agent) to suggest a few fixes.&lt;/li&gt;
&lt;li&gt;Give each fix to a builder (another AI agent) who writes the code, each in its own sandbox.&lt;/li&gt;
&lt;li&gt;Send the same pretend shoppers to test each new version.&lt;/li&gt;
&lt;li&gt;Pick the version with the best score and copy its code back to your laptop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the same idea as a picture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                ┌──────────── Docker Cloud Sandboxes ────────────┐
npm start ──►   │ A  original shop  → shoppers test → analyst    │
                │ B  new sandbox → builder adds fix B → re-test  │
                │ C  new sandbox → builder adds fix C → re-test  │
                └────────────────────────────────────────────────┘
                                   │
                                   ▼
                    winner + report + winning code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"A" is the original shop. "B" and "C" are the new versions. That is all A/B testing really means: try a few versions and see which one works better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use a sandbox at all?
&lt;/h2&gt;

&lt;p&gt;Our builder agent will write and run code that nobody has checked. You do not want that running on your laptop.&lt;/p&gt;

&lt;p&gt;A Docker Cloud Sandbox is a small, throwaway computer in the cloud (a microVM). It gives us four things we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safety.&lt;/strong&gt; If the agent does something silly, only the sandbox is affected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation.&lt;/strong&gt; Fix B and fix C each get their own sandbox, so they never mix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real link.&lt;/strong&gt; Each sandbox can share a public HTTPS URL, so you can open every version in your browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe keys.&lt;/strong&gt; Your OpenAI key is stored as a secret. The sandbox uses it for outgoing calls, but the key never sits inside the sandbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We control all of this from a small TypeScript program using the &lt;code&gt;@docker/sandboxes&lt;/code&gt; SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 20 or newer&lt;/li&gt;
&lt;li&gt;A Docker account with access to Docker Cloud Sandboxes&lt;/li&gt;
&lt;li&gt;An OpenAI API key (the agents use OpenAI's Codex)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Get the code and look around
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ajeetraina/sbx-ab-agent
&lt;span class="nb"&gt;cd &lt;/span&gt;sbx-ab-agent
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project is small. Here is a map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/                 the demo shop
  server.mjs         a tiny web server
  index.html         the page
  app.js             shows the products
  styles.css         the look
  products.json      the product list
src/
  sbx.ts             helpers that talk to Docker Cloud Sandboxes
  prompts.ts         the instructions for each AI agent
  ab.ts              the main program that runs every step
  dashboard.ts       a live web page to watch the run
  cleanup.ts         deletes the sandboxes when you are done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good reading order is: &lt;code&gt;app/&lt;/code&gt; first, then &lt;code&gt;prompts.ts&lt;/code&gt;, then &lt;code&gt;sbx.ts&lt;/code&gt;, then &lt;code&gt;ab.ts&lt;/code&gt;. That is the order we will follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Meet the shop (&lt;code&gt;app/&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;The shop shows a long list of products. That is it. There is no search, no filter and no sort. This is on purpose. It is the problem we want our agents to find and fix.&lt;/p&gt;

&lt;p&gt;Here is the code that draws the products, from &lt;code&gt;app/app.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It loads every product and puts them all on the page. Nothing more.&lt;/p&gt;

&lt;p&gt;Now look at the server in &lt;code&gt;app/server.mjs&lt;/code&gt;. The key line is this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server reads the file from disk every time someone asks for it. It never keeps an old copy. This matters later: when the builder agent changes &lt;code&gt;app.js&lt;/code&gt;, the live site changes right away. No restart needed.&lt;/p&gt;

&lt;p&gt;Try the shop on your own machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run shop
&lt;span class="c"&gt;# open http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Meet the three AI helpers (&lt;code&gt;src/prompts.ts&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;We have three roles. They all use the same AI (Codex). The only difference is the instructions (the prompt) we give each one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Helper 1: the pretend shopper
&lt;/h3&gt;

&lt;p&gt;We have three shoppers, each with a simple goal:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shopper&lt;/th&gt;
&lt;th&gt;Who they are&lt;/th&gt;
&lt;th&gt;What they want&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;budget-student&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a student with about $20&lt;/td&gt;
&lt;td&gt;a gift under $20 for a developer friend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hoodie-hunter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a busy engineer&lt;/td&gt;
&lt;td&gt;all hoodies in size L, then the cheapest one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sticker-collector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a sticker fan&lt;/td&gt;
&lt;td&gt;see every sticker and compare prices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In code, a shopper is just a small object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hoodie-hunter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;who&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a busy engineer who already knows they want a hoodie in size L&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;find all hoodies available in size L and pick the cheapest one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shopper is told: "You are a real person, not a developer. Do not edit any files." It looks at the shop using &lt;code&gt;curl&lt;/code&gt; and imagines the clicks and scrolling a real person would need.&lt;/p&gt;

&lt;p&gt;Most important: the shopper must answer in JSON, not in a paragraph. That way our program can read the answer easily.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"persona"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hoodie-hunter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"friction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"had to scroll the whole list; no size filter"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I found it, but I had to look at everything."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;score&lt;/code&gt; goes from 1 to 10. A 10 means the task was very easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Helper 2: the analyst
&lt;/h3&gt;

&lt;p&gt;The analyst reads all the shopper reports and suggests a few fixes. The rules we give it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each fix must be small.&lt;/li&gt;
&lt;li&gt;Only change &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt; and &lt;code&gt;styles.css&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No new libraries, no backend changes.&lt;/li&gt;
&lt;li&gt;Each fix should be a different idea.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also answers in JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Shoppers scroll the whole list. There is no way to narrow it down."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Search box and category filters"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hypothesis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sort by price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hypothesis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Helper 3: the builder
&lt;/h3&gt;

&lt;p&gt;The builder gets one fix (for example "Sort by price") and writes the code. It has strict rules too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only edit &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt; and &lt;code&gt;styles.css&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plain HTML, CSS and JavaScript. No frameworks.&lt;/li&gt;
&lt;li&gt;Do not restart the server.&lt;/li&gt;
&lt;li&gt;When done, check the page still loads with &lt;code&gt;curl&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These rules keep every version fair. Each version is the same shop plus one small change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Connect to Docker and store your key (&lt;code&gt;src/sbx.ts&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Now we start talking to Docker Cloud Sandboxes. Everything in this file is a small helper we will call later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signing in
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fileOAuthCredentialStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.docker-sandboxes/oauth.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;onVerification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;verificationUriComplete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verificationUri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userCode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Sign in to Docker: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;verificationUriComplete&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;verificationUri&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Code: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userCode&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAccessToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Sandboxes&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In plain words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first time, it prints a link and a code. You open the link and sign in.&lt;/li&gt;
&lt;li&gt;It saves your sign-in to a local file, so next time it does not ask again.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;new Sandboxes({ auth })&lt;/code&gt; gives us a client. We use this client for everything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you prefer no browser step, set &lt;code&gt;DOCKER_USERNAME&lt;/code&gt; and &lt;code&gt;DOCKER_PAT&lt;/code&gt; (a personal access token). The code then uses &lt;code&gt;pat()&lt;/code&gt; instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storing the OpenAI key as a secret
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sbx-ab-agent-openai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;serviceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This saves your OpenAI key in Docker, not inside any sandbox. Later we attach the secret to each sandbox. When Codex calls OpenAI, the sandbox adds the key to the request on the way out. Codex never sees the key itself.&lt;/p&gt;

&lt;p&gt;One small thing to remember: the SDK does not attach your OpenAI secret for you. You must pass it in when you create a sandbox. We will do that in the next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Start a sandbox and put the shop inside (&lt;code&gt;launchShop&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;This one function does five small jobs. Let us take them one by one.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create the sandbox
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launchAndWait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;codex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;small&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;'codex'&lt;/code&gt; is a kit: a ready-made sandbox that already has Codex installed. &lt;code&gt;launchAndWait&lt;/code&gt; creates it and waits until it is ready. Notice we pass our secret here.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Copy the shop files in
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;APP_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mo"&gt;0o755&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;parents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localAppDir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localAppDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make a folder in the sandbox, then copy each file from your &lt;code&gt;app/&lt;/code&gt; folder into it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Start the web server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;server.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;workingDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;APP_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shop-server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;processes.start&lt;/code&gt; runs a command in the background. The server keeps running while we do other things.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Wait until the server answers
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;waitForHttp&lt;/code&gt; helper uses &lt;code&gt;sandbox.run(...)&lt;/code&gt; to try the server once a second, up to 30 times. When it gets a good answer, we move on.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Get a public link
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens port 3000 to the internet and gives back a real HTTPS URL. You can open it in your browser.&lt;/p&gt;

&lt;p&gt;That is it. One function, and we have a live shop running in the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Ask Codex to do a job (&lt;code&gt;runAgent&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Every AI helper (shopper, analyst, builder) runs through this one function. It runs Codex inside the sandbox with no chat window, just a prompt in and an answer out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="s2"&gt;`printf '%s' "$1" | codex exec -C &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --skip-git-repo-check --ephemeral `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`--dangerously-bypass-approvals-and-sandbox -o &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;outFile&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-lc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;workingDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;APP_DIR&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;timeoutMs&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks scary, so let us break it down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;codex exec&lt;/code&gt; runs Codex once, without asking us questions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;printf ... | ... -&lt;/code&gt; sends the prompt into Codex. The &lt;code&gt;-&lt;/code&gt; at the end means "read the prompt from input". If you pass the prompt another way, Codex waits and then fails.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt; turns off Codex's own safety box. That is fine here, because we are already inside a throwaway sandbox.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-o ${outFile}&lt;/code&gt; saves only Codex's final answer to a file.&lt;/li&gt;
&lt;li&gt;Each call uses a new random file name, so many shoppers can run at the same time without mixing up answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After it finishes, we read the answer back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pulling out the JSON
&lt;/h3&gt;

&lt;p&gt;AI answers are not always clean. Sometimes the JSON comes wrapped in a code block, or with a sentence before it. The &lt;code&gt;extractJson&lt;/code&gt; helper finds the first { and the last } and reads what is between them. Simple, and it works well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Put it all together (&lt;code&gt;src/ab.ts&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Now the main program. It just calls the helpers above in order. Read &lt;code&gt;main()&lt;/code&gt; from top to bottom and you will see these steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step A: Start the original shop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;launchShop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ab-A-baseline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step B: Send the shoppers in
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseSessions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;simulate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PERSONAS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;simulate&lt;/code&gt; runs all three shoppers at the same time with &lt;code&gt;Promise.all&lt;/code&gt;. Each one returns its JSON report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step C: Ask the analyst for fixes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extractJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;analystPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GOAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseSessions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;N_VARIANTS&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step D: Build and test every fix, all at once
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;settled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allSettled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runVariant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each fix, &lt;code&gt;runVariant&lt;/code&gt; does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Starts a new sandbox with a fresh copy of the shop.&lt;/li&gt;
&lt;li&gt;Asks the builder to add the fix.&lt;/li&gt;
&lt;li&gt;Sends the same three shoppers in to test it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We use &lt;code&gt;Promise.allSettled&lt;/code&gt; instead of &lt;code&gt;Promise.all&lt;/code&gt;. The difference: if one fix fails, the others still finish. One bad version does not ruin the whole run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step E: Pick the winner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ranked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;arms&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avgScore&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avgScore&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avgSteps&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avgSteps&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In plain words: highest average score wins. If two are tied, the one where more shoppers finished wins. If still tied, fewer steps wins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step F: Bring the winning code home
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;winner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`results/winner/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The winning files are copied from the sandbox to &lt;code&gt;results/winner/&lt;/code&gt; on your laptop. The program also writes &lt;code&gt;results/report.md&lt;/code&gt; and &lt;code&gt;results/report.json&lt;/code&gt; with all the scores and shopper quotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Run it
&lt;/h2&gt;

&lt;p&gt;Set up your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# open .env and add: OPENAI_API_KEY=sk-...&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .env&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; +a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time, you will see a Docker sign-in link. Open it, sign in, and the run continues.&lt;/p&gt;

&lt;p&gt;A normal run (2 fixes, 3 shoppers) uses 3 small sandboxes and about 12 Codex calls. It takes around 5 to 10 minutes.&lt;/p&gt;

&lt;p&gt;Some handy options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--variants&lt;/span&gt; 3 &lt;span class="nt"&gt;--personas&lt;/span&gt; 2
npm start &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--goal&lt;/span&gt; &lt;span class="s2"&gt;"Users can't tell which items are on sale"&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--cleanup&lt;/span&gt;          &lt;span class="c"&gt;# delete the sandboxes at the end&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--no-dashboard&lt;/span&gt;     &lt;span class="c"&gt;# skip the live web page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 9: Watch it live and read the results
&lt;/h2&gt;

&lt;p&gt;While it runs, open &lt;a href="http://localhost:4000" rel="noopener noreferrer"&gt;http://localhost:4000&lt;/a&gt;. This is the live dashboard (&lt;code&gt;src/dashboard.ts&lt;/code&gt;). You will see each step light up, and a box for A, B and C showing scores as they come in.&lt;/p&gt;

&lt;p&gt;The terminal also prints a public link for each version. Open A, B and C in three tabs. You can watch B and C change while the builder is still working.&lt;/p&gt;

&lt;p&gt;When it finishes, you get a table like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arm&lt;/th&gt;
&lt;th&gt;Variant&lt;/th&gt;
&lt;th&gt;Ease&lt;/th&gt;
&lt;th&gt;Done&lt;/th&gt;
&lt;th&gt;Steps&lt;/th&gt;
&lt;th&gt;Lift&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;14.0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B (winner)&lt;/td&gt;
&lt;td&gt;Search and filters&lt;/td&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;+108%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Sort by price&lt;/td&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;+50%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(Your numbers will be different. Every run is a little different.)&lt;/p&gt;

&lt;p&gt;"Lift" means how much better the score is compared to A.&lt;/p&gt;

&lt;p&gt;To see exactly what the AI changed, compare the files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff &lt;span class="nt"&gt;-u&lt;/span&gt; app/app.js results/winner/app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That diff is basically your pull request.&lt;/p&gt;

&lt;p&gt;A quick note on ports, since there are a few:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http://localhost:4000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;your laptop&lt;/td&gt;
&lt;td&gt;the live dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://3000-....sbx.sandboxes-cloud.docker.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the cloud&lt;/td&gt;
&lt;td&gt;each version of the shop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;your laptop&lt;/td&gt;
&lt;td&gt;only when you run npm run shop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 10: Clean up
&lt;/h2&gt;

&lt;p&gt;By default, the sandboxes stay running so you can click around each version. When you are done:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This deletes every sandbox whose name starts with ab-. It uses &lt;code&gt;client.allSandboxes()&lt;/code&gt; to list them and &lt;code&gt;delete({ force: true })&lt;/code&gt; to remove each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheat sheet: every SDK call we used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What we wanted&lt;/th&gt;
&lt;th&gt;SDK call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sign in&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;oauth()&lt;/code&gt; or &lt;code&gt;pat()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Save the OpenAI key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.secrets.create(...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create a sandbox&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.kits.launchAndWait('codex', ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copy files in and out&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sandbox.files.mkdir&lt;/code&gt; / &lt;code&gt;files.write&lt;/code&gt; / &lt;code&gt;files.read&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start a server in the background&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sandbox.processes.start(...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run a quick command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sandbox.run([...])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run a command and wait for it&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sandbox.processes.run(...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a public URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sandbox.ports.create({ number: 3000 })&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean up&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;client.allSandboxes()&lt;/code&gt;, &lt;code&gt;sandbox.delete(...)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the whole SDK surface for this project. About ten calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"No OpenAI credential": you did not set &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;. Check your &lt;code&gt;.env&lt;/code&gt; and run set -a; source &lt;code&gt;.env&lt;/code&gt;; set +a again.&lt;/li&gt;
&lt;li&gt;Codex exits with code 1: the error message is at the end of the output. Read the last few lines.&lt;/li&gt;
&lt;li&gt;A version shows "failed": that is fine. The other versions still finish because of &lt;code&gt;Promise.allSettled&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Too many sandboxes left over: run &lt;code&gt;npm run cleanup&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Things to keep in mind
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The shoppers read the page with &lt;code&gt;curl&lt;/code&gt;, not a real browser. They can tell when search or filters are missing, but they cannot judge how the page looks.&lt;/li&gt;
&lt;li&gt;Scores come from AI judgement on only a few shoppers. Treat them as a hint, not hard proof.&lt;/li&gt;
&lt;li&gt;The Sandboxes SDK is still experimental. This project uses &lt;code&gt;@docker/sandboxes&lt;/code&gt; 0.53.0, so some names may change later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you learned
&lt;/h2&gt;

&lt;p&gt;You now know how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign in and create a client with the Docker Sandboxes SDK.&lt;/li&gt;
&lt;li&gt;Store an API key safely as a secret.&lt;/li&gt;
&lt;li&gt;Start a sandbox, copy files in, run a server and get a public URL.&lt;/li&gt;
&lt;li&gt;Run an AI agent inside a sandbox and read its answer.&lt;/li&gt;
&lt;li&gt;Run many sandboxes at the same time and compare the results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shop is just an example. The same pattern works for many things: testing prompts, tuning settings, trying different copy. Anywhere you can pretend to be a user and give a score, you can use this loop.&lt;/p&gt;

&lt;p&gt;The big idea is simple. When a safe, throwaway computer is just one function call away, letting an agent "try it and see" stops being risky.&lt;/p&gt;

&lt;p&gt;Give it a try, and let me know what you build with it!&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AIGov Meetup Singapore: Agentic AI Governance</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:45:59 +0000</pubDate>
      <link>https://dev.to/ajeetraina/aigov-meetup-singapore-agentic-ai-governance-3205</link>
      <guid>https://dev.to/ajeetraina/aigov-meetup-singapore-agentic-ai-governance-3205</guid>
      <description>&lt;p&gt;AI agents are no longer just chat assistants. A year ago, most of us used AI to answer questions or suggest a few lines of code. Today, agents write whole features, run shell commands, install packages, call APIs and push changes to real systems. Many of them do this with very little human input.&lt;/p&gt;

&lt;p&gt;That is a big step forward. It is also a big shift in risk. An agent that can run &lt;code&gt;rm -rf&lt;/code&gt; can also delete the wrong folder. An agent that can read your &lt;code&gt;.env&lt;/code&gt; file can also send your secrets somewhere you never planned. An agent that can call a tool can also call the wrong one, many times, very fast.&lt;/p&gt;

&lt;p&gt;So every team that uses AI agents now has to answer two hard questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do we keep these agents safe?&lt;/li&gt;
&lt;li&gt;How do we know the same rules apply to every agent, on every laptop, across the whole company?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what agentic AI governance is about. And this is what we will talk about at the &lt;a href="https://www.meetup.com/docker-singapore/events/316863705/" rel="noopener noreferrer"&gt;AIGov Meetup Singapore&lt;/a&gt; on October 29th.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the evening is about
&lt;/h2&gt;

&lt;p&gt;This is an evening of talks, live demos and good conversation with practitioners from &lt;strong&gt;Docker&lt;/strong&gt;, &lt;strong&gt;Thoughtworks&lt;/strong&gt; and &lt;strong&gt;Cloudera&lt;/strong&gt;. Each speaker looks at a different layer of the problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxing and policy:&lt;/strong&gt; how to run coding agents in an isolated space, with clear rules on what they can reach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification:&lt;/strong&gt; how to check what an agent did, instead of just trusting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data and platform governance:&lt;/strong&gt; how to keep control of the data and systems that agents touch at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put together, these talks give you a full picture. You will leave with ideas you can try with your own team the next morning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who should come
&lt;/h3&gt;

&lt;p&gt;This meetup is for you if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;developer&lt;/strong&gt; using Claude Code, Cursor, Codex or other coding agents every day&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;platform engineer&lt;/strong&gt; who has to support these tools across many teams&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;security lead&lt;/strong&gt; who wants to know what agents are doing on company machines&lt;/li&gt;
&lt;li&gt;Or just &lt;strong&gt;curious&lt;/strong&gt; about where agentic AI is heading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No deep background is needed. Bring your questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Event details
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Thursday, October 29, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;6:00 PM to 9:00 PM SST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Venue&lt;/td&gt;
&lt;td&gt;Thoughtworks, 18 Cross St, #12-01 18 Cross, Singapore 048423&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted by&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.meetup.com/docker-singapore/events/316863705/" rel="noopener noreferrer"&gt;Docker Singapore Meetup&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entry&lt;/td&gt;
&lt;td&gt;Registration required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Agenda
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time (SST)&lt;/th&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6:00 PM to 7:00 PM&lt;/td&gt;
&lt;td&gt;Doors open, food and networking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7:00 PM to 7:30 PM&lt;/td&gt;
&lt;td&gt;Define Once, Enforce Everywhere: Governing AI Coding Agents with Docker Sandboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7:30 PM to 8:00 PM&lt;/td&gt;
&lt;td&gt;Trust the Agent, But Verify: AI Governance with Agent/works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:00 PM to 8:30 PM&lt;/td&gt;
&lt;td&gt;Talk by Cloudera (details coming soon)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:30 PM to 9:00 PM&lt;/td&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Define Once, Enforce Everywhere: Governing AI Coding Agents with Docker Sandboxes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ajeet Singh Raina, Developer Advocate, Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most teams today have no single place to set rules for their coding agents. Each developer sets things up their own way, on their own laptop. That makes it very hard to know what any agent can actually do.&lt;/p&gt;

&lt;p&gt;This talk shows a different approach. With Docker Sandboxes, each agent runs inside an isolated sandbox. Platform and security teams write the policy once: which folders the agent can see, which network hosts it can reach, and which secrets it can use. That same policy then applies to every agent, whether it is Claude Code, Codex, Gemini CLI or another tool.&lt;/p&gt;

&lt;p&gt;Expect a live demo of an agent hitting a policy wall, and a look at how teams can roll this out without slowing developers down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trust the Agent, But Verify: AI Governance with Agent/works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Shen Ting Ang, Thoughtworks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Guardrails are only half the story. Once an agent has done its work, you still need to check what it did and why. This talk looks at how Thoughtworks approaches AI governance with Agent/works, and how teams can build trust in agents through verification rather than blind faith.&lt;/p&gt;

&lt;h3&gt;
  
  
  Talk by Cloudera
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Speaker and topic coming soon&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents are only as safe as the data they can reach. Cloudera will share their view on data and platform governance in the age of AI agents. We will update this post once the details are confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  See you there
&lt;/h2&gt;

&lt;p&gt;AI agents are moving fast, and the rules around them are still being written. The best way to get this right is to learn from each other: what worked, what broke, and what we would do differently.&lt;/p&gt;

&lt;p&gt;Come for the talks, stay for the conversations. Food and drinks are on us, and there is plenty of time to meet the speakers and other practitioners.&lt;/p&gt;

&lt;p&gt;Seats are limited, so please register early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.meetup.com/docker-singapore/events/316863705/" rel="noopener noreferrer"&gt;Register here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See you in Singapore on October 29th!&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>The $250 Agent Challenge: Build Something Real With Docker Cloud Sandboxes</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Wed, 07 Oct 2026 01:21:22 +0000</pubDate>
      <link>https://dev.to/ajeetraina/the-250-agent-challenge-build-something-real-with-docker-cloud-sandboxes-4071</link>
      <guid>https://dev.to/ajeetraina/the-250-agent-challenge-build-something-real-with-docker-cloud-sandboxes-4071</guid>
      <description>&lt;p&gt;What would you build if someone handed you &lt;strong&gt;$250 of cloud compute for AI agents&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;That's not a hypothetical. &lt;a href="https://www.docker.com/c/sbx-promo/" rel="noopener noreferrer"&gt;Docker is giving every new Docker Agentic Platform signup&lt;/a&gt; a &lt;strong&gt;$250 Cloud Sandbox credit&lt;/strong&gt;. That's enough to run 4 agents, 7 hours a day, for a whole month.&lt;/p&gt;

&lt;p&gt;So we're turning it into a hackathon. 🐳&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/ajeetraina/250-dollar-agent-challenge" rel="noopener noreferrer"&gt;The $250 Agent Challenge&lt;/a&gt;&lt;/strong&gt; is an open, online hackathon run by the Collabnix community. Claim the credit, build something real with it, and show us what an agent can do while you sleep. Winners get announced on stage at our Meetup in Bangalore on &lt;strong&gt;21 November&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this is worth your weekend
&lt;/h2&gt;

&lt;p&gt;AI agents are moving off our laptops. AWS, Microsoft and Docker now all run agents the same way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧱 every agent gets &lt;strong&gt;its own microVM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔑 the agent &lt;strong&gt;never holds your real API keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔌 tools come in &lt;strong&gt;through a gateway (MCP)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧯 outbound network is &lt;strong&gt;locked down by default&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⏰ agents &lt;strong&gt;run on a timer&lt;/strong&gt; while nobody is watching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.ajeetraina.com/getting-started-with-docker-cloud-sandboxes/" rel="noopener noreferrer"&gt;Docker Cloud Sandboxes&lt;/a&gt; give you all five, with the same &lt;code&gt;sbx&lt;/code&gt; CLI on your laptop and in the cloud. This hackathon is your chance to try that pattern hands-on, without an enterprise contract.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pick a track
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Track&lt;/th&gt;
&lt;th&gt;Build an agent that...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🌙 &lt;strong&gt;Night Shift&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;does real work while your laptop is closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 &lt;strong&gt;No Keys Allowed&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;uses real APIs but never sees your tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔌 &lt;strong&gt;Tool Master&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;connects MCP servers to do something useful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👥 &lt;strong&gt;The Crew&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;runs several agents in parallel, each in its own sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧰 &lt;strong&gt;Kit Maker&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;ships as a kit others can run with one command&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Solo or teams of up to 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special awards:&lt;/strong&gt; 💰 Best Bang for the Buck (best build for the least credit spent) · ✍️ Best Build Log · 🙌 People's Choice&lt;/p&gt;




&lt;h2&gt;
  
  
  Get started in four commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install (Windows: winget install -h Docker.sbx)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;docker/tap/sbx

&lt;span class="c"&gt;# 2. Sign in&lt;/span&gt;
sbx login

&lt;span class="c"&gt;# 3. Store your model key for the cloud (the agent only ever sees a placeholder)&lt;/span&gt;
sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; secret &lt;span class="nb"&gt;set &lt;/span&gt;anthropic

&lt;span class="c"&gt;# 4. Run an agent in the cloud&lt;/span&gt;
sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; run claude &lt;span class="nt"&gt;--name&lt;/span&gt; my-hack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's the whole loop. Claude Code, Codex, Copilot and Gemini all work out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; set an auto-stop timer on every sandbox so nothing runs up your credit while you sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No credit card?&lt;/strong&gt; You can still compete. The same &lt;code&gt;sbx&lt;/code&gt; CLI runs locally, and local entries are fully welcome. 💰 Best Bang for the Buck is the only award judged on cloud spend.&lt;/p&gt;


&lt;h2&gt;
  
  
  What you submit
&lt;/h2&gt;

&lt;p&gt;Four things, by the deadline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;build log&lt;/strong&gt; (a blog post or a repo README) that lets anyone repeat your build.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;2-minute demo video&lt;/strong&gt;. Record it and share the link; no live demo needed.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;screenshot of your spend&lt;/strong&gt;, with private details blanked out.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;a href="https://forms.gle/TFrsnDkbnZrrfoUW8" rel="noopener noreferrer"&gt;submission form&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then the community votes on the recorded demos.&lt;/p&gt;


&lt;h2&gt;
  
  
  The timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sat, Oct 10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Online kickoff: walkthrough and Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Oct 10 to Oct 31&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sat, Oct 31, 11:59 PM IST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Submissions close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nov 1 to Nov 14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Judging and People's Choice voting on the recorded demos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sat, Nov 21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🎉 Winners announced at our Meetup in Bangalore, with Docker swag and goodies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⏰ &lt;strong&gt;Claim the credit early.&lt;/strong&gt; Docker's offer ends &lt;strong&gt;Oct 31, 2026, 11:59 PM PT&lt;/strong&gt;. It's one credit per account, and a credit card is needed at signup.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Everything lives in the repo
&lt;/h2&gt;

&lt;p&gt;Rules, FAQ, the getting-started guide and the build log template:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ajeetraina" rel="noopener noreferrer"&gt;
        ajeetraina
      &lt;/a&gt; / &lt;a href="https://github.com/ajeetraina/250-dollar-agent-challenge" rel="noopener noreferrer"&gt;
        250-dollar-agent-challenge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      💰 The $250 Agent Challenge — an open hackathon: claim $250 in Docker Cloud Sandbox credit and build an AI agent that works while you sleep.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💰 The $250 Agent Challenge&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;An open hackathon where you claim &lt;strong&gt;$250 in Docker Cloud Sandbox credit&lt;/strong&gt;, build something real with it, and show the community what an AI agent can do &lt;em&gt;while you sleep&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  &lt;a href="https://www.docker.com/c/sbx-promo/" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Claim $250" src="https://camo.githubusercontent.com/a5e2a5f2ed9f520394f3019ae0090355af4f15038d36e1076f1c9d43e8aa8662/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436c61696d2d2532343235302532306372656469742d3234393645443f7374796c653d666f722d7468652d6261646765266c6f676f3d646f636b6572266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/ajeetraina/250-dollar-agent-challenge/GETTING_STARTED.md" rel="noopener noreferrer"&gt;&lt;img alt="Getting started" src="https://camo.githubusercontent.com/ddbcf14fd044ed107ddfbb0a697c494c7f9714cb0f71f01b540bbb757e6dfd56/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53746172742d696e25323031302532306d696e757465732d3232633535653f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/ajeetraina/250-dollar-agent-challenge#-how-to-submit" rel="noopener noreferrer"&gt;&lt;img alt="Submit" src="https://camo.githubusercontent.com/8be2e213dc2fea305442282f2e3106876cd6903fb4539bcedd2fdea58b0b2b79/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5375626d69742d796f75722532306275696c642d6635396530623f7374796c653d666f722d7468652d6261646765"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The deal&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Docker is giving new &lt;strong&gt;Docker Agentic Platform&lt;/strong&gt; signups a &lt;strong&gt;one-time $250 compute credit&lt;/strong&gt; (10× the standard $25) for its Cloud Sandboxes: microVMs that each run their own kernel in the cloud, so your agents keep working after you close your laptop.&lt;/p&gt;

&lt;p&gt;What $250 actually buys you (Docker's own example, priced at the &lt;em&gt;Medium&lt;/em&gt; tier of 4 vCPU, 8 GB, &lt;strong&gt;$0.28/hr&lt;/strong&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧑‍🤝‍🧑 &lt;strong&gt;4 agents in parallel, 7 hours a day, for 30 days&lt;/strong&gt;, or&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;~3,500 fifteen-minute automated runs&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;

&lt;p&gt;⏰ The offer runs through &lt;strong&gt;October 31, 2026, 11:59 PM PT&lt;/strong&gt;. A credit card is required at signup, and it's &lt;strong&gt;one credit per user / account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Claim it: &lt;/strong&gt;…&lt;/p&gt;


&lt;/blockquote&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ajeetraina/250-dollar-agent-challenge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;h2&gt;
  
  
  Ready?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star and read the repo:&lt;/strong&gt; &lt;a href="https://github.com/ajeetraina/250-dollar-agent-challenge" rel="noopener noreferrer"&gt;github.com/ajeetraina/250-dollar-agent-challenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💳 &lt;strong&gt;Claim your $250:&lt;/strong&gt; &lt;a href="https://www.docker.com/c/sbx-promo/" rel="noopener noreferrer"&gt;docker.com/c/sbx-promo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Submit when you're done:&lt;/strong&gt; &lt;a href="https://forms.gle/TFrsnDkbnZrrfoUW8" rel="noopener noreferrer"&gt;the submission form&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Come build in the open with us. Show the community what a month of agents can really do, and we'll see the winners on stage in Bangalore on 21 November.&lt;/p&gt;

&lt;p&gt;Drop your idea in the comments 👇 Teams often form right here.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cloud</category>
      <category>docker</category>
    </item>
    <item>
      <title>Getting Started with Docker Cloud Sandboxes</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Sat, 03 Oct 2026 03:43:16 +0000</pubDate>
      <link>https://dev.to/ajeetraina/getting-started-with-docker-cloud-sandboxes-1ill</link>
      <guid>https://dev.to/ajeetraina/getting-started-with-docker-cloud-sandboxes-1ill</guid>
      <description>&lt;p&gt;AI coding agents now run for a long time. A single task can take hours: a refactor, a full test run, a migration. The question is no longer whether the model can finish the work, but where that work should run.&lt;/p&gt;

&lt;p&gt;Your laptop is fine for the first few minutes, when you want to watch the agent and step in if it goes wrong. It's a poor place to leave a job running for hours, and a worse one for running many agents at once.&lt;/p&gt;

&lt;p&gt;Docker Sandboxes answer both ends of that spectrum with the &lt;strong&gt;same isolation model&lt;/strong&gt; and a &lt;strong&gt;single command&lt;/strong&gt; to move between them. In this post we start an agent locally, run real code in it, and then - without changing how it runs - promote that exact sandbox into the cloud. Start on your laptop. Finish in the cloud.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Everything below was run end-to-end on &lt;code&gt;sbx v0.45.1&lt;/code&gt; (macOS, Oct 2026).&lt;/strong&gt; The terminal output is copied verbatim from a real session - including the one gotcha that bites everybody the first time (keep reading to Part 2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll need&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sbx&lt;/code&gt; CLI, &lt;strong&gt;v0.45.0 or later&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Docker Agentic Platform&lt;/strong&gt; subscription for the cloud half (new accounts get free credit to start)&lt;/li&gt;
&lt;li&gt;An agent credential - we'll use Anthropic for Claude Code&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Where this fits: the Docker Agentic Platform
&lt;/h2&gt;

&lt;p&gt;Cloud Sandboxes aren't a standalone gadget - they're the &lt;strong&gt;runtime layer of the Docker Agentic Platform&lt;/strong&gt;, Docker's platform for configuring, connecting, running, and controlling AI agents in one place. The pieces that matter here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Docker Sandboxes&lt;/strong&gt; (&lt;code&gt;sbx&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Isolated microVM environments where agents actually run - local on your laptop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Sandboxes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same sandboxes, running on Docker-managed cloud infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Catalog &amp;amp; Enterprise Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connect MCP tools (Jira, Linear, Grafana, …) once; expose them to agents, with governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker Model Runner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local-first LLM inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gordon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker's built-in AI agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Policy and control over agents across teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The throughline is that &lt;strong&gt;sandboxes are the execution substrate&lt;/strong&gt; for the whole platform, and the &lt;em&gt;same&lt;/em&gt; isolation model runs whether a sandbox lives on your laptop or in Docker's cloud. That's the bit to keep in mind as we go: moving to the cloud doesn't swap you onto a different, less-safe runtime - it's the identical sandbox, hosted.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a sandbox actually is
&lt;/h2&gt;

&lt;p&gt;A Docker Sandbox is an &lt;strong&gt;isolated microVM&lt;/strong&gt; that an AI agent runs inside. It has its own Linux kernel, its own filesystem, its own Docker daemon, and all of its network traffic flows through a host-managed proxy. The agent gets &lt;code&gt;sudo&lt;/code&gt; inside the box - but the box can't see your host, your processes, or your credentials.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it isolates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hypervisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Separate Linux kernel per sandbox; the agent's processes are invisible to the host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network proxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All HTTP/HTTPS flows through a proxy; no raw TCP/UDP/ICMP; DNS is mediated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An isolated Docker daemon per sandbox - no access to your host Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Credentials&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The proxy injects auth headers per request; raw API keys never enter the VM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cloud Sandboxes&lt;/strong&gt; are the same four layers on Docker-managed remote infrastructure, with their &lt;strong&gt;own credentials, network policies, and lifecycle controls&lt;/strong&gt; (TTL, hibernation, persistent volumes) - independent of your laptop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1 - Start local
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install and check the version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;docker/tap/sbx     &lt;span class="c"&gt;# macOS - Docker Desktop NOT required&lt;/span&gt;
&lt;span class="c"&gt;# winget install -h Docker.sbx  # Windows&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm you're on 0.45.0+ (real output):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx version
&lt;span class="go"&gt;sbx version: v0.45.1 9d79d90ee4c5d297fb3d36b75384e8cea7a4fbcb
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 1&lt;/strong&gt; - terminal showing &lt;code&gt;sbx version&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2: Sign in
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens your browser for Docker OAuth. On first login you also pick a &lt;strong&gt;default network policy&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All outbound traffic allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Balanced&lt;/strong&gt; &lt;em&gt;(recommended)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Deny-by-default + common dev sites pre-allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Locked Down&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everything blocked unless you explicitly allow it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 2&lt;/strong&gt; - the Docker OAuth browser page and/or the policy-selection prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Store your agent credential
&lt;/h3&gt;

&lt;p&gt;The proxy injects this into outbound requests - the raw value never lands inside the sandbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; anthropic     &lt;span class="c"&gt;# paste your Anthropic API key when prompted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-g&lt;/code&gt; makes it &lt;strong&gt;global&lt;/strong&gt; (available to every sandbox). Confirm it's stored without ever revealing the value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx secret &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="go"&gt;SCOPE        TYPE      NAME        SECRET
(global)     service   anthropic   (stored)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Gotcha:&lt;/strong&gt; global secrets are read at sandbox &lt;strong&gt;creation&lt;/strong&gt; time. Change one, and you need to recreate the sandbox for it to take effect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 4: Create a sandbox and run a real, long-ish job in it
&lt;/h3&gt;

&lt;p&gt;The demo for this post is the kind of task you'd &lt;em&gt;want&lt;/em&gt; to walk away from - a job that churns through a batch of work and takes a while. Here's &lt;code&gt;worker.py&lt;/code&gt;: pass &lt;code&gt;--full&lt;/code&gt; and it's the "overnight" run; otherwise it's a quick smoke test. It writes progress and a result file as it goes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;worker.py
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;/usr/bin/env python3
&lt;span class="go"&gt;"""A deliberately long-running job: the kind of task you start on your laptop
and would rather not babysit."""
import sys, time
from datetime import datetime

FULL = "--full" in sys.argv
&lt;/span&gt;&lt;span class="gp"&gt;N = 20 if FULL else 3          #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--full&lt;/span&gt; is the &lt;span class="s2"&gt;"overnight"&lt;/span&gt; run&lt;span class="p"&gt;;&lt;/span&gt; default is a quick smoke &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;STEP = 1.5 if FULL else 0.3

RESULT = "/home/agent/result.txt"
start = time.time()
with open(RESULT, "w") as f:
    for i in range(1, N + 1):
        time.sleep(STEP)
        line = f"[{datetime.now():%H:%M:%S}] processed item {i}/{N}"
        print(line, flush=True)
&lt;/span&gt;&lt;span class="gp"&gt;        f.write(line + "\n");&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;f.flush&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;    print(f"DONE: {N} items in {time.time() - start:.1f}s", flush=True)
&lt;/span&gt;&lt;span class="gp"&gt;open("/home/agent/DONE", "w").close()   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sentinel so a watcher knows we finished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a sandbox with Claude Code, mounting that project (real output - note the microVM gets its own CPU/memory allocation and pulls the agent image):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx create claude ~/laptop-to-cloud-demo &lt;span class="nt"&gt;--name&lt;/span&gt; laptop-to-cloud-demo
&lt;span class="go"&gt;── RESOLVE SETUP
   resolving configuration…
     sandbox    laptop-to-cloud-demo
     agent      claude
     workspace  /Users/you/laptop-to-cloud-demo (rw)
     skills     …/agent-skills → /home/agent/.claude/skills · 5 folders · (ro)
     image      docker/sandbox-templates:claude-code-docker
     cpu        18
     memory     18 GiB
   ✓ configuration resolved
── PREPARE IMAGE
   → pull docker/sandbox-templates:claude-code-docker
   ✓ image ready
── CREATE SANDBOX
   ✓ Created sandbox laptop-to-cloud-demo

To connect to this sandbox, run:
  sbx run --name laptop-to-cloud-demo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;&lt;code&gt;run&lt;/code&gt; vs &lt;code&gt;create&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;sbx run claude&lt;/code&gt; (no path) mounts your &lt;em&gt;current directory&lt;/em&gt; and attaches you interactively in one step. &lt;code&gt;sbx create&lt;/code&gt; runs in the background and does &lt;strong&gt;not&lt;/strong&gt; default to the cwd - pass the workspace path explicitly, as above.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Confirm it's live (real output):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="go"&gt;SANDBOX                AGENT     STATUS    PORTS   WORKSPACE
laptop-to-cloud-demo   claude    running           /Users/you/laptop-to-cloud-demo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now develop on the laptop the way you normally would: run a quick smoke test of the job &lt;em&gt;inside&lt;/em&gt; the microVM (real output):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'python3 worker.py'&lt;/span&gt;
&lt;span class="go"&gt;[02:33:08] processed item 1/3
[02:33:08] processed item 2/3
[02:33:09] processed item 3/3
DONE: 3 items in 0.9s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Mind the path.&lt;/strong&gt; &lt;code&gt;sbx exec&lt;/code&gt; drops you into the &lt;strong&gt;workspace&lt;/strong&gt; as the working directory, so a relative &lt;code&gt;worker.py&lt;/code&gt; just works. But inside the sandbox your project is bind-mounted at its &lt;strong&gt;host absolute path&lt;/strong&gt; (&lt;code&gt;/Users/you/laptop-to-cloud-demo&lt;/code&gt;), &lt;em&gt;not&lt;/em&gt; under the agent's home - &lt;code&gt;~&lt;/code&gt; is &lt;code&gt;/home/agent&lt;/code&gt;. So &lt;code&gt;~/laptop-to-cloud-demo/worker.py&lt;/code&gt; will fail with "No such file"; use &lt;code&gt;worker.py&lt;/code&gt; (relative) or the full host path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It works. The full &lt;code&gt;--full&lt;/code&gt; run would take far longer - exactly the kind of thing you don't want to babysit on your laptop. Before we hand it off, &lt;strong&gt;stage the job into the sandbox's image filesystem&lt;/strong&gt; so it survives the move (the next section explains why the mounted workspace alone won't):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'cp worker.py /home/agent/worker.py &amp;amp;&amp;amp; ls -l /home/agent/worker.py'&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 agent agent 862 Oct  3 02:33 /home/agent/worker.py
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 3&lt;/strong&gt; - split view: Claude Code running in the sandbox on the left, &lt;code&gt;sbx ls&lt;/code&gt; showing it &lt;code&gt;running&lt;/code&gt; on the right. &lt;strong&gt;Your "local" money shot.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is what the laptop is good at: watching, steering, a fast iteration loop. Now that the long run is ready, we move it up and let it finish without us.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2 - Finish in the cloud
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 0: Activate Docker Agentic Platform / cloud access
&lt;/h3&gt;

&lt;p&gt;Follow the &lt;strong&gt;Signup and billing&lt;/strong&gt; guide to activate your Docker Agentic Platform subscription and review compute charges. New accounts get free credit to start. Pay-as-you-go, &lt;strong&gt;billed per second&lt;/strong&gt;, by sandbox size:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Per hour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Micro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2 GiB&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small &lt;em&gt;(default)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4 GiB&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8 GiB&lt;/td&gt;
&lt;td&gt;$0.28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;16 GiB&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XL&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;32 GiB&lt;/td&gt;
&lt;td&gt;$1.12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 4&lt;/strong&gt; - the Docker Agentic Platform billing/usage dashboard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The pivot: move the running sandbox to the cloud
&lt;/h3&gt;

&lt;p&gt;The one-liner the whole post builds toward. Here is the &lt;strong&gt;real, unedited output&lt;/strong&gt; of moving our sandbox up - read the warnings, they matter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx move laptop-to-cloud-demo &lt;span class="nt"&gt;--to&lt;/span&gt; cloud &lt;span class="nt"&gt;--name&lt;/span&gt; laptop-to-cloud-demo &lt;span class="nt"&gt;--ttl&lt;/span&gt; 30m &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="gp"&gt;warning: Secrets managed by sbx are not copied. The destination may use its own secrets;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;you may need to sign &lt;span class="k"&gt;in &lt;/span&gt;again.
&lt;span class="go"&gt;warning: Credentials saved in copied files can still travel with the sandbox.
warning: Local network policies are not copied. The destination uses cloud network policies.
warning: sandbox "laptop-to-cloud-demo" uses files outside its container filesystem. These files won't be copied to the cloud:
  "/Users/you/laptop-to-cloud-demo" (workspace, host bind mount)
→ move sandbox laptop-to-cloud-demo to cloud
Using cloud shape small (2 vCPU / 4096 MiB).
Pushing sandbox laptop-to-cloud-demo to cloud ...
Upload complete.
✓ move sandbox laptop-to-cloud-demo to cloud (41s)
✓ Moved to cloud sandbox laptop-to-cloud-demo (sbx_001m3zsrjd2pxfxt5fh5k9z0vrs)
  Attach with:  sbx --cloud run sbx_001m3zsrjd2pxfxt5fh5k9z0vrs
&lt;/span&gt;&lt;span class="gp"&gt;  Created cloud template tmpl_001m3zsqt39yxnwtwr8ksx3qxka to back it;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;remove it with
&lt;span class="go"&gt;  `sbx --cloud template rm tmpl_001m3zsqt39yxnwtwr8ksx3qxka` once the sandbox is deleted.
&lt;/span&gt;&lt;span class="gp"&gt;  Expires in 29m;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the sandbox will &lt;span class="k"&gt;then &lt;/span&gt;be stopped &lt;span class="o"&gt;(&lt;/span&gt;it can be started again later&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What just happened: &lt;code&gt;sbx move&lt;/code&gt; captured the sandbox's &lt;strong&gt;filesystem as a container image&lt;/strong&gt; and started a fresh cloud sandbox from it. &lt;code&gt;--ttl 30m&lt;/code&gt; capped its life at 30 minutes; when the TTL lapses it &lt;strong&gt;stops in place&lt;/strong&gt; (hibernates) so you can resume later, rather than being deleted. Neither side is destroyed - the move just &lt;em&gt;stops&lt;/em&gt; the local source; restart it any time with &lt;code&gt;sbx run --name laptop-to-cloud-demo&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 5&lt;/strong&gt; - the &lt;code&gt;sbx move … --to cloud&lt;/code&gt; run with these warnings + the "Moved to cloud sandbox" line. &lt;strong&gt;This is the hero shot of the post.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚠️ The gotcha everybody hits: the workspace does NOT travel
&lt;/h3&gt;

&lt;p&gt;Look again at that warning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;warning: sandbox uses files outside its container filesystem. These files won't be copied to the cloud:
  "/Users/you/laptop-to-cloud-demo" (workspace, host bind mount)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your mounted workspace is a &lt;strong&gt;host bind mount&lt;/strong&gt;, and bind mounts don't travel. What travels is the sandbox's own image filesystem (e.g. anything under &lt;code&gt;/home/agent&lt;/code&gt;) - which is exactly why we staged &lt;code&gt;worker.py&lt;/code&gt; there in Step 4. Here's the proof, live, in the &lt;strong&gt;cloud&lt;/strong&gt; sandbox after the move:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;    'echo "staged job (image fs):";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /home/agent/worker.py&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;     echo "workspace (bind mount):";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /Users/you/laptop-to-cloud-demo&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;span class="go"&gt;staged job (image fs):
&lt;/span&gt;&lt;span class="gp"&gt;-rw-r--r--+ 1 agent agent 862 Oct  3 02:33 /home/agent/worker.py    #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;← TRAVELED
&lt;span class="go"&gt;workspace (bind mount):
total 8
&lt;/span&gt;&lt;span class="gp"&gt;drwxr-xr-x+  2 root  root   27 Oct  3 02:33 .                       #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;← arrived EMPTY
&lt;span class="go"&gt;drwxr-xr-x+  4 agent agent 110 Oct  3 02:33 ..
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The staged job came across; the mounted workspace arrived empty. So the practical rule for "finish in the cloud":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage what the cloud run needs into the image filesystem&lt;/strong&gt; (e.g. &lt;code&gt;/home/agent&lt;/code&gt;) before you move - as we did with &lt;code&gt;worker.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Or commit and push from inside the sandbox&lt;/strong&gt; (its injected GitHub token works), which is the cleanest way to get work off any sandbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Or pull files back with &lt;code&gt;sbx cp&lt;/code&gt;&lt;/strong&gt; when you move the sandbox back down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the single most important thing to understand before you trust an overnight run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirm it's running in the cloud
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;--cloud&lt;/code&gt; global flag dispatches a supported verb to the hosted service. Real output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="go"&gt;SANDBOX                       AGENT    ID                                STATUS    PORTS   WORKSPACE
claude/laptop-to-cloud-demo   claude   sbx_001m3zsrjd2pxfxt5fh5k9z0vrs   running           -
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 6&lt;/strong&gt; - &lt;code&gt;sbx ls&lt;/code&gt; (local, source now stopped) next to &lt;code&gt;sbx --cloud ls&lt;/code&gt; (running in the cloud). Side by side, this &lt;em&gt;proves&lt;/em&gt; the same workload moved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The payoff: kick off the long run, then close the laptop
&lt;/h3&gt;

&lt;p&gt;This is the whole point of the post, made visible. Launch the &lt;code&gt;--full&lt;/code&gt; job in the background in the cloud (one caveat the move output hinted at: &lt;strong&gt;running processes don't travel&lt;/strong&gt; - so you start the long job &lt;em&gt;after&lt;/em&gt; you land in the cloud, not before):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;    'nohup python3 /home/agent/worker.py --full &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/agent/run.log 2&amp;gt;&amp;amp;1 &amp;amp; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"pid &lt;/span&gt;&lt;span class="nv"&gt;$!&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;span class="go"&gt;pid 1941
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Peek once while the lid's still open - it's genuinely running, with nothing attached:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'cat /home/agent/run.log'&lt;/span&gt;
&lt;span class="go"&gt;[02:34:20] processed item 1/20
[02:34:21] processed item 2/20
[02:34:23] processed item 3/20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;strong&gt;close your laptop.&lt;/strong&gt; Come back later, reconnect, and the work finished on its own in the cloud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'tail -1 /home/agent/result.txt'&lt;/span&gt;
&lt;span class="go"&gt;DONE: 20 items in 30.0s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Started on the laptop, finished in the cloud - no VM to provision, no lid to keep open.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📸 &lt;strong&gt;Screenshot 7&lt;/strong&gt; - the three steps stacked: launch (&lt;code&gt;pid 1941&lt;/code&gt;), the mid-flight &lt;code&gt;run.log&lt;/code&gt;, and the final &lt;code&gt;DONE: 20 items in 30.0s&lt;/code&gt;. &lt;strong&gt;This is the hero shot.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Working with a cloud sandbox
&lt;/h3&gt;

&lt;p&gt;Everything has a &lt;code&gt;--cloud&lt;/code&gt; form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; run sbx_001m3zsrjd2pxfxt5fh5k9z0vrs      &lt;span class="c"&gt;# attach (starts it if stopped)&lt;/span&gt;
sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;exec &lt;/span&gt;laptop-to-cloud-demo bash &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'...'&lt;/span&gt; &lt;span class="c"&gt;# run a command inside it&lt;/span&gt;
sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; ttl laptop-to-cloud-demo                 &lt;span class="c"&gt;# check / extend remaining lifetime&lt;/span&gt;
sbx &lt;span class="nb"&gt;cp &lt;/span&gt;laptop-to-cloud-demo:/home/agent/result.txt &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="c"&gt;# copy results back down&lt;/span&gt;
sbx move laptop-to-cloud-demo &lt;span class="nt"&gt;--to&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt;             &lt;span class="c"&gt;# bring the whole sandbox back&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clean up (stop billing)
&lt;/h3&gt;

&lt;p&gt;Billing is per-second, so tear down when done. Real output from this session's cleanup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;laptop-to-cloud-demo &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;span class="go"&gt;   ✓ remove sandbox laptop-to-cloud-demo (1s)
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; template &lt;span class="nb"&gt;rm &lt;/span&gt;tmpl_001m3zsqt39yxnwtwr8ksx3qxka &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="go"&gt;Removed: moved-laptop-to-cloud-demo-7513a8b6 (tmpl_001m3zsqt39yxnwtwr8ksx3qxka)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 A move leaves behind a &lt;strong&gt;backing cloud template&lt;/strong&gt; (shown in the move output). Remove it after you delete the sandbox, or it lingers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Or: start fresh in the cloud
&lt;/h3&gt;

&lt;p&gt;You don't have to start local. For the "run 100 agents in parallel" case, launch straight into the cloud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; run claude
sbx &lt;span class="nt"&gt;--cloud&lt;/span&gt; run codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cloud mode supports a growing set of verbs - &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;attach&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;move&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;ttl&lt;/code&gt;, plus cloud-only &lt;strong&gt;persistent volumes&lt;/strong&gt; (&lt;code&gt;sbx volume&lt;/code&gt;). Run &lt;code&gt;sbx --cloud --help&lt;/code&gt; for the current list.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3 - Go programmatic with the Sandboxes API &amp;amp; SDK
&lt;/h2&gt;

&lt;p&gt;The CLI is the fast path, but everything above is also in the &lt;strong&gt;Docker Sandboxes API and SDK&lt;/strong&gt; - which is where the "100 parallel agents" story gets real. The API lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt; sandboxes and &lt;strong&gt;run commands&lt;/strong&gt; inside them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer files&lt;/strong&gt; in and out&lt;/li&gt;
&lt;li&gt;Manage &lt;strong&gt;images, snapshots, volumes, and secrets&lt;/strong&gt; as first-class resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes cloud sandboxes a natural fit for CI and fan-out jobs: spin up N sandboxes from a known image, dispatch a task to each, collect results, tear them down - no VM provisioning in sight. See the API docs for the current SDK surface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local vs Cloud, at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Local Sandbox&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cloud Sandbox&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runs on&lt;/td&gt;
&lt;td&gt;Your laptop (microVM)&lt;/td&gt;
&lt;td&gt;Docker-managed infra (microVM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation model&lt;/td&gt;
&lt;td&gt;Hypervisor + proxy + isolated Docker + credential injection&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Identical&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Interactive iteration, steering, quick jobs&lt;/td&gt;
&lt;td&gt;Long-horizon work, overnight runs, scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials&lt;/td&gt;
&lt;td&gt;Host keychain, injected by proxy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Its own&lt;/strong&gt; - sign in on the destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network policy&lt;/td&gt;
&lt;td&gt;Local default (Open / Balanced / Locked Down)&lt;/td&gt;
&lt;td&gt;Its own cloud policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace&lt;/td&gt;
&lt;td&gt;Host bind mount (live)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Does not travel on move&lt;/strong&gt; - use image fs / &lt;code&gt;sbx cp&lt;/code&gt; / git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle&lt;/td&gt;
&lt;td&gt;Runs while your machine is on&lt;/td&gt;
&lt;td&gt;TTL, hibernation, persistent volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs local virtualization?&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Your hardware&lt;/td&gt;
&lt;td&gt;Pay-as-you-go by size, per second&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;It isn't "local sandboxes" &lt;em&gt;or&lt;/em&gt; "cloud sandboxes." It's the &lt;strong&gt;same sandbox&lt;/strong&gt;, part of the Docker Agentic Platform, and you choose where the hours run with one command. Iterate on your laptop where watching matters; &lt;code&gt;sbx move … --to cloud&lt;/code&gt; the moment the work gets long or wide. Same isolation, same safety model, no VMs to provision - just mind the workspace bind-mount rule before you walk away.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;docker/tap/sbx
sbx login
sbx run claude                     &lt;span class="c"&gt;# start here&lt;/span&gt;
sbx move &amp;lt;name&amp;gt; &lt;span class="nt"&gt;--to&lt;/span&gt; cloud &lt;span class="nt"&gt;--ttl&lt;/span&gt; 8h  &lt;span class="c"&gt;# finish here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Learn more&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Agentic Platform: &lt;a href="https://www.docker.com/products/docker-agentic-platform/" rel="noopener noreferrer"&gt;https://www.docker.com/products/docker-agentic-platform/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cloud Sandboxes: &lt;a href="https://docs.docker.com/ai/sandboxes/cloud/" rel="noopener noreferrer"&gt;https://docs.docker.com/ai/sandboxes/cloud/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sandboxes overview: &lt;a href="https://docs.docker.com/ai/sandboxes/" rel="noopener noreferrer"&gt;https://docs.docker.com/ai/sandboxes/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sandboxes API: &lt;a href="https://docs.docker.com/ai/sandboxes-api/" rel="noopener noreferrer"&gt;https://docs.docker.com/ai/sandboxes-api/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Announcement blog: &lt;a href="https://www.docker.com/blog/introducing-cloud-sandboxes-start-on-your-laptop-finish-in-the-cloud/" rel="noopener noreferrer"&gt;https://www.docker.com/blog/introducing-cloud-sandboxes-start-on-your-laptop-finish-in-the-cloud/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>sandbox</category>
      <category>agents</category>
    </item>
    <item>
      <title>Running DeepAgents in a Docker Sandbox, with no cloud keys</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Fri, 02 Oct 2026 16:57:21 +0000</pubDate>
      <link>https://dev.to/ajeetraina/running-deepagents-in-a-docker-sandbox-with-no-cloud-keys-48il</link>
      <guid>https://dev.to/ajeetraina/running-deepagents-in-a-docker-sandbox-with-no-cloud-keys-48il</guid>
      <description>&lt;p&gt;Agent frameworks are easy to &lt;code&gt;pip install&lt;/code&gt; and surprisingly hard to run responsibly. The moment you give an agent a filesystem, a shell, and a network, you have handed arbitrary generated code the same reach your laptop has. You also inherit a second problem that has nothing to do with safety: reproducing the exact environment, the exact package versions, and the exact model wiring on someone else's machine.&lt;/p&gt;

&lt;p&gt;This post walks through a small, self contained answer to both problems: a &lt;strong&gt;Docker Sandbox Kit&lt;/strong&gt; that drops the &lt;a href="https://github.com/langchain-ai/deepagents" rel="noopener noreferrer"&gt;deepagents&lt;/a&gt; harness into an isolated sandbox, pre wired to a &lt;strong&gt;local Docker Model Runner&lt;/strong&gt; so it runs with no cloud credentials at all. The whole kit is four files, and it is published on Docker Hub so you can run it in one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are packaging
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/langchain-ai/deepagents" rel="noopener noreferrer"&gt;DeepAgents&lt;/a&gt; is an opinionated agent harness built on LangGraph. Out of the box it gives an agent a planning tool, a virtual filesystem, sub agent delegation, and a detailed system prompt. You construct an agent in a few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepagents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_deep_agent&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_deep_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;my_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things make it interesting to package. First, it is a library rather than a turnkey CLI, so the useful unit to ship is "deepagents, installed and wired to a model, ready to import." Second, it defaults to a cloud model (Anthropic), which means a naive setup needs an API key and open egress to a provider. We want neither.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Docker Sandbox Kit is
&lt;/h2&gt;

&lt;p&gt;Docker Sandboxes (the &lt;code&gt;sbx&lt;/code&gt; CLI) run agents inside isolated microVM style environments with a credential proxy and an enforced network policy. A &lt;strong&gt;kit&lt;/strong&gt; is the unit of composition: a single OCI image whose manifest carries a &lt;strong&gt;descriptor&lt;/strong&gt; describing what the kit offers, what it needs from the host as typed capability requests, and what it needs from other kits.&lt;/p&gt;

&lt;p&gt;Kits come in two kinds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;workload&lt;/strong&gt; owns the environment the agent runs in. Its layers are a root filesystem, and it sets the entrypoint, user, and working directory.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;mixin&lt;/strong&gt; adds a tool, a credential, or a policy on top of somebody else's workload. Its layers are an overlay that lands on a base it has never seen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DeepAgents is a capability you add to an environment, not an environment of its own, so it is a natural &lt;strong&gt;mixin&lt;/strong&gt;. It composes onto any workload that carries a Python runtime, for example the stock &lt;code&gt;docker/sbx-kit-shell&lt;/code&gt; image.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          your host
  ┌──────────────────────────────────────────────────────────┐
  │                                                            │
  │   Docker Model Runner  ──  :12434  (OpenAI-compatible)     │
  │            ▲                                               │
  │            │  egress allowed only to                       │
  │            │  host.docker.internal:12434                   │
  │   ┌────────┴──────────────  sandbox  ──────────────────┐   │
  │   │  shell workload  +  deepagents mixin               │   │
  │   │    • deepagents + langchain-openai (pip, create)   │   │
  │   │    • OPENAI_BASE_URL / OPENAI_API_KEY pre-wired     │   │
  │   │    • ~/deepagents_quickstart.py                     │   │
  │   └─────────────────────────────────────────────────────┘   │
  └──────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sandbox reaches exactly one host at runtime, the Model Runner on port 12434, and nothing else. The model speaks the OpenAI wire format, so deepagents talks to it through a standard &lt;code&gt;ChatOpenAI&lt;/code&gt; client. No traffic leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four files
&lt;/h2&gt;

&lt;p&gt;The kit is authored as a companion pair plus its guidance and docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;deepagents.yaml          the v3 descriptor&lt;/span&gt;
&lt;span class="s"&gt;deepagents.dockerfile    a FROM scratch overlay that carries runtime ENV&lt;/span&gt;
&lt;span class="s"&gt;deepagents-context.md    agent guidance, staged into the sandbox&lt;/span&gt;
&lt;span class="s"&gt;README.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The descriptor
&lt;/h3&gt;

&lt;p&gt;The descriptor declares the kit's identity, its version, and the capabilities it requests. Here are the parts that carry the design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase scoped network policy.&lt;/strong&gt; Egress is granted per phase, and an absent phase grants nothing. The install phase may reach PyPI; the running agent may reach only the Model Runner. The PyPI grant closes before the agent ever starts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;com.docker.sandbox/network-policy@1&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pypi.org&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;files.pythonhosted.org&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;host.docker.internal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;12434&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create time install, not a baked layer.&lt;/strong&gt; A mixin overlay lands on a base whose Python version and &lt;code&gt;site-packages&lt;/code&gt; path you cannot know in advance, so copying a prebuilt package tree into the image would not resolve. Instead the kit installs into the &lt;em&gt;composed&lt;/em&gt; base's Python at sandbox create time, via lifecycle hooks. The hooks also do two things worth calling out: they fail early with a clear message if the base Python is older than 3.11, and after installing they re read the installed version and fail on mismatch. A pinned version claim is only honest if the build enforces it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;com.docker.sandbox/lifecycle@1&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;import&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys.exit(0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys.version_info&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(3,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;11)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;else&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;||&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'deepagents&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;needs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3.11'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&amp;amp;2;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}"&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pip&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;install&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--break-system-packages&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'deepagents==0.7.21'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;langchain-openai"&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000"&lt;/span&gt;
          &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;HTTP_PROXY&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;import&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;importlib.metadata&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;m,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys.exit(0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;m.version('deepagents')&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'0.7.21'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;else&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One subtlety: hook environments are deny by default, so &lt;code&gt;HTTP_PROXY&lt;/code&gt; and &lt;code&gt;HTTPS_PROXY&lt;/code&gt; are declared explicitly. &lt;code&gt;pip&lt;/code&gt; reads them to fetch through the sandbox's forced proxy; without the declaration the install would hang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No hard &lt;code&gt;requires&lt;/code&gt;.&lt;/strong&gt; It is tempting to declare &lt;code&gt;requires: ["deb/python3"]&lt;/code&gt;, but &lt;code&gt;requires&lt;/code&gt; is a closed set check: a name nothing in the composition provides makes the kit refuse to compose everywhere, and a &lt;code&gt;deb/&lt;/code&gt; name rules out every Alpine or Wolfi base that would otherwise have worked. The Python 3.11 guard hook above is the better tool: it degrades gracefully with an actionable error rather than refusing up front.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No credential.&lt;/strong&gt; Because the model is the local Model Runner, the API key is the sentinel string &lt;code&gt;"dmr"&lt;/code&gt; rather than a real secret, so the kit declares no &lt;code&gt;credential@1&lt;/code&gt; capability and asks for nothing from the credential proxy.&lt;/p&gt;

&lt;h3&gt;
  
  
  The overlay
&lt;/h3&gt;

&lt;p&gt;The content recipe is a &lt;code&gt;FROM scratch&lt;/code&gt; overlay that installs nothing. Its only job is to carry static environment onto the composed image. A mixin's &lt;code&gt;ENV&lt;/code&gt; is an additive image config field that merges at assembly, so it reaches both the composed image and the agent process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; scratch&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; OPENAI_BASE_URL="http://host.docker.internal:12434/engines/v1" \&lt;/span&gt;
    OPENAI_API_KEY="dmr" \
    DEEPAGENTS_MODEL="ai/qwen3" \
    LANGSMITH_TRACING="false"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;LANGSMITH_TRACING=false&lt;/code&gt; keeps LangChain from attempting hosted tracing, which the runtime policy would block anyway, but switching it off avoids the noise. &lt;code&gt;NO_PROXY&lt;/code&gt; is deliberately not set here, because the shell workload already defines it and two kits setting the same variable to different values is a hard composition conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  The quickstart
&lt;/h3&gt;

&lt;p&gt;A lifecycle &lt;code&gt;files&lt;/code&gt; entry stages a runnable example into the sandbox, marked so it is never overwritten if you have edited it. It passes an explicit &lt;code&gt;ChatOpenAI&lt;/code&gt; instance to override the Anthropic default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepagents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_deep_agent&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEEPAGENTS_MODEL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai/qwen3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dmr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_deep_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a concise assistant. Plan before you act.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;In two sentences, what is a sandbox?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Build, verify, run
&lt;/h2&gt;

&lt;p&gt;A kit is just an OCI artifact built by &lt;code&gt;docker buildx&lt;/code&gt;, with the descriptor validated before any content is built. A fast first check is to validate the descriptor without exporting anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; deepagents.yaml &lt;span class="nt"&gt;--output&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cacheonly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then export an OCI layout and run the conformance suite. The kit passes all 18 checks on both linux/amd64 and linux/arm64, including the overlay ownership checks that catch a mixin accidentally taking over the agent's home directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; deepagents.yaml &lt;span class="nt"&gt;-t&lt;/span&gt; deepagents:0.7.21 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oci,dest&lt;span class="o"&gt;=&lt;/span&gt;/tmp/deepagents-layout,tar&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;kit-tck validate &lt;span class="nt"&gt;--layout&lt;/span&gt; /tmp/deepagents-layout 0.7.21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A build proves the recipe ran, not that the overlay works, so the check that counts is a real composition. Point &lt;code&gt;--kit&lt;/code&gt; at the kit directory and let &lt;code&gt;sbx&lt;/code&gt; assemble it onto a shell workload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx run docker/sbx-kit-shell:1.0.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; deepagents-demo /path/to/workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On create, &lt;code&gt;sbx&lt;/code&gt; assembles the two kits, runs the three install hooks, and writes the quickstart file. Inside the sandbox the result is exactly what the descriptor promised:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;sbx &lt;span class="nb"&gt;exec &lt;/span&gt;deepagents-demo python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import deepagents; print(deepagents.__version__)"&lt;/span&gt;
0.7.21
&lt;span class="nv"&gt;$ &lt;/span&gt;sbx &lt;span class="nb"&gt;exec &lt;/span&gt;deepagents-demo sh &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'echo $OPENAI_BASE_URL'&lt;/span&gt;
http://host.docker.internal:12434/engines/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Publishing and using it
&lt;/h2&gt;

&lt;p&gt;Publishing a kit is just a build with &lt;code&gt;--push&lt;/code&gt;. Both platforms go in one invocation so the index that consumers resolve through is written once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; deepagents.yaml &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; docker.io/ajeetraina777/sbx-kit-deepagents:0.7.21 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; docker.io/ajeetraina777/sbx-kit-deepagents:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it is on Docker Hub, anyone can run it without cloning the repo. First make sure the Model Runner is serving a tool calling model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model pull ai/qwen3

sbx run docker/sbx-kit-shell:1.0.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kit&lt;/span&gt; docker.io/ajeetraina777/sbx-kit-deepagents:0.7.21 &lt;span class="nt"&gt;--name&lt;/span&gt; deepagents-demo &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this shape is worth copying
&lt;/h2&gt;

&lt;p&gt;The pattern generalizes well beyond deepagents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Package the capability, not the environment.&lt;/strong&gt; A mixin composes onto whatever workload a team already uses, so you are not forcing a base image on anyone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire to a local model when you can.&lt;/strong&gt; Pointing an OpenAI compatible client at Docker Model Runner removes the API key, the egress, and the per token cost from the loop. The sandbox can then run with essentially no network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the network policy phase scoped.&lt;/strong&gt; Letting install reach PyPI while the running agent reaches only the model is a meaningful boundary, and it is declared in a few lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin, and make the build enforce the pin.&lt;/strong&gt; A version claim that the content can quietly violate is worse than no claim.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full kit is on GitHub at &lt;a href="https://github.com/ajeetraina/docker-sbx-deepagents" rel="noopener noreferrer"&gt;ajeetraina/docker-sbx-deepagents&lt;/a&gt; and on Docker Hub at &lt;code&gt;ajeetraina777/sbx-kit-deepagents&lt;/code&gt;. It is small enough to read in one sitting and a good starting point for packaging your own agent tooling the same way.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>docker</category>
      <category>llm</category>
    </item>
    <item>
      <title>Running Docker Sandboxes on Windows Platform</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Tue, 30 Jun 2026 07:36:52 +0000</pubDate>
      <link>https://dev.to/ajeetraina/running-docker-sandboxes-on-windows-platform-1ikd</link>
      <guid>https://dev.to/ajeetraina/running-docker-sandboxes-on-windows-platform-1ikd</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enable WSL2 or Hyper V&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this guide, we tested it with Hyper V enablement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Enable-WindowsOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FeatureName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HypervisorPlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Enable-WindowsOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FeatureName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Microsoft-Windows-Subsystem-Linux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Enable-WindowsOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FeatureName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: sbx's microVM backend rests on the Windows hypervisor + VirtualMachinePlatform regardless of whether you went the WSL2 or Hyper-V route. All three features you enabled with Enable-WindowsOptionalFeature modify boot-time kernel components, so none of them are fully live until a restart — the API returns success, but the capability isn't actually present in the running kernel yet.&lt;br&gt;
Hence, reboot the system once before proceeding to the next step.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1. Download the latest version of sbx
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;winget &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; Docker.sbx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you want to use nightly build, download the release directly from this link: &lt;a href="https://github.com/docker/sbx-releases/releases/tag/nightly" rel="noopener noreferrer"&gt;https://github.com/docker/sbx-releases/releases/tag/nightly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the .msi file below and double-click to install or&lt;br&gt;
use the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="nb"&gt;msiexec&lt;/span&gt; &lt;span class="na"&gt;/i &lt;/span&gt;&lt;span class="kd"&gt;DockerSandboxes&lt;/span&gt;.msi &lt;span class="na"&gt;/quiet
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2. Verify if you've the latest version of sbx
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;sbx version
sbx version: v0.34.0-rc1-216-g0be67a90 0be67a900e2a642c494353de466135d18d53f338
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3. Login to sbx
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI prints a one-time device confirmation code and a URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Choose your agent and provider
&lt;/h2&gt;

&lt;p&gt;This lab works with any mainstream coding agent. Pick the provider whose API key you have - the rest of the lab will adapt.&lt;/p&gt;

&lt;p&gt;Pick a provider for the rest of this lab. Each option below assumes you've chosen one of these:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Use OpenAI + Codex
- Use Anthropic + Claude
- Use Google + Gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  OpenAI configuration:
&lt;/h3&gt;

&lt;p&gt;You'll run &lt;strong&gt;Codex&lt;/strong&gt; inside the sandbox, authenticated to OpenAI.&lt;/p&gt;

&lt;p&gt;First, export your API key in your host terminal** (don't paste it into this page):&lt;/p&gt;

&lt;p&gt;If you're using Windows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;$env:&lt;/span&gt;&lt;span class="py"&gt;OPENAI_API_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"sk-proj-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then store it as a global sbx secret. The command below reads &lt;code&gt;$OPENAI_API_KEY&lt;/code&gt; from your shell - your key never leaves the terminal and is not displayed anywhere:&lt;/p&gt;

&lt;h3&gt;
  
  
  Anthropic configuration:
&lt;/h3&gt;

&lt;p&gt;You'll run &lt;strong&gt;Claude Code&lt;/strong&gt; inside the sandbox, authenticated to Anthropic.&lt;/p&gt;

&lt;p&gt;First, export your API key in your host terminal (don't paste it into this page):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;$env:&lt;/span&gt;&lt;span class="py"&gt;ANTHROPIC_API_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"sk-ant-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Then store it as a global sbx secret. The command below reads `$ANTHROPIC_API_KEY` from your shell - your key never leaves the terminal and is not displayed anywhere:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Gemini configuration
&lt;/h3&gt;

&lt;p&gt;You'll run &lt;strong&gt;Gemini CLI&lt;/strong&gt; inside the sandbox, authenticated to Google.&lt;/p&gt;

&lt;p&gt;First, export your API key in your host terminal (don't paste it into this page):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;$env:&lt;/span&gt;&lt;span class="py"&gt;GEMINI_API_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AIza..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then store it as a global sbx secret. &lt;/p&gt;

&lt;p&gt;The command below is just an example that shows how it reads keys from your shell - your key never leaves the terminal and is not displayed anywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GOOGLE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | sbx secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; google
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | sbx secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; claude
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | sbx secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5. Clone the lab repository
&lt;/h2&gt;

&lt;p&gt;The exercises use DevBoard - a full-stack FastAPI + Next.js issue tracker with intentional bugs. It's pre-configured for this lab.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dockersamples/sbx-quickstart ~/sbx-lab
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/sbx-lab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6. Create your sandbox
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/sbx-lab
sbx create &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sbxlab &amp;lt;agent&amp;gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;First run:&lt;/strong&gt; The agent image will pull (1–2 minutes) and the sandbox will be created with the Balanced network policy you selected at login.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1o9p8e9ezkw82zerxex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1o9p8e9ezkw82zerxex.png" alt="Image3"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;sbxlab&lt;/code&gt; in the list with status &lt;code&gt;stopped&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\ajeet&amp;gt; sbx ls
SANDBOX AGENT STATUS PORTS WORKSPACE
shell-sbx-kits-box-main shell stopped C:\Users\ajeet\Downloads\sbx-kits-box-main\sbx-kits-box-main
PS C:\Users\ajeet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you run it (Step 6), the status changes to &lt;code&gt;running&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7. Run your sandbox
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx run shell-sbx-kits-box-main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select &lt;strong&gt;1. Yes, continue&lt;/strong&gt; to launch the agent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why this prompt exists:&lt;/strong&gt; sbx mounts only your project directory into the microVM. The trust check ensures you're aware of what the agent can see and act on.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sbx &lt;span class="nb"&gt;ls
&lt;/span&gt;SANDBOX AGENT STATUS PORTS WORKSPACE
shell-sbx-kits-box-main shell running C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\a&lt;/span&gt;jeet&lt;span class="se"&gt;\D&lt;/span&gt;ownloads&lt;span class="se"&gt;\s&lt;/span&gt;bx-kits-box-main&lt;span class="se"&gt;\s&lt;/span&gt;bx-kits-box-main
PS C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\a&lt;/span&gt;jeet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Set up the Network Policy
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;PS C:\Users\ajeet&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx policy reset
&lt;span class="go"&gt;Found 1 running sandbox(es):

shell-sbx-kits-box-main
The daemon will be stopped to apply the policy reset.
Running sandboxes will be terminated.

Are you sure you want to continue? (y/N): y
Stopping daemon at \.\pipe\docker_kaname_sandboxd...
✓ Daemon stopped successfully
✓ Policies reset.

Daemon started (PID: 28492, socket: \.\pipe\docker_kaname_sandboxd)
Logs: C:\Users\ajeet\AppData\Local\DockerSandboxes\sandboxes\state\sandboxd\daemon.log
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that you're in a Sandbox environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;agent@shell-sbx-kits-box-main:sbx-kits-box-main$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release
&lt;span class="go"&gt;PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo
&lt;/span&gt;&lt;span class="gp"&gt;agent@shell-sbx-kits-box-main:sbx-kits-box-main$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sbx policy reset
&lt;span class="go"&gt;bash: sbx: command not found
&lt;/span&gt;&lt;span class="gp"&gt;agent@shell-sbx-kits-box-main:sbx-kits-box-main$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Claude Code Won't Start on Windows 11? Fixing the Bun Segfault</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Tue, 30 Jun 2026 07:21:37 +0000</pubDate>
      <link>https://dev.to/ajeetraina/claude-code-wont-start-on-windows-11-fixing-the-bun-segfault-3026</link>
      <guid>https://dev.to/ajeetraina/claude-code-wont-start-on-windows-11-fixing-the-bun-segfault-3026</guid>
      <description>&lt;p&gt;If you just installed Claude Code on Windows 11 and it crashes the moment you launch it, you're not doing anything wrong. This is a known issue with the runtime Claude Code now ships with, and the fix takes about two minutes.&lt;/p&gt;

&lt;p&gt;Here's exactly what I hit, why it happens, and the step-by-step fix that got me running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;You install Claude Code, type &lt;code&gt;claude&lt;/code&gt;, and instead of the welcome screen you get a wall of text like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bun v1.4.0 (...) Windows x64 (baseline) Windows v10.26100
...
panic(main thread): Segmentation fault at address 0x113
oh no: Bun has crashed. This indicates a bug in Bun, not your code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Annoyingly, &lt;code&gt;claude --version&lt;/code&gt; and &lt;code&gt;claude doctor&lt;/code&gt; often work fine — it's only the interactive session that dies. That makes it look like the install succeeded when it didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;Claude Code used to run on Node.js. As of &lt;strong&gt;v2.1.113 (April 2026)&lt;/strong&gt;, the default build switched to a &lt;strong&gt;Bun-compiled native binary&lt;/strong&gt;. Bun has a segfault bug that triggers on certain Windows builds during interactive startup, so the new binary crashes on launch.&lt;/p&gt;

&lt;p&gt;The catch: even installing via npm doesn't save you anymore. The npm package now pulls in that same Bun binary as a platform dependency, and there's no Node.js fallback left in recent versions. So &lt;code&gt;npm i -g @anthropic-ai/claude-code&lt;/code&gt; installs the broken binary too.&lt;/p&gt;

&lt;p&gt;The fix is to drop back to the &lt;strong&gt;last version that still ran on Node.js (2.1.112)&lt;/strong&gt; and stop the auto-updater from dragging you forward again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix (step by step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Check your Node version
&lt;/h3&gt;

&lt;p&gt;You need Node 18+ for the JS build, but 18 has its own crash, use &lt;strong&gt;Node 20 or newer&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're below 20, upgrade before continuing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pin to the last pre-Bun release
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;anthropic-ai/claude-code&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;2.1.112&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see npm &lt;strong&gt;remove a package&lt;/strong&gt; during this, that's the &lt;code&gt;win32-x64&lt;/code&gt; Bun binary being dropped and replaced with the Node-run build. That's the whole point. (If 2.1.112 misbehaves, &lt;code&gt;@2.1.110&lt;/code&gt; is another confirmed-good version.)&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Disable the auto-updater
&lt;/h3&gt;

&lt;p&gt;This step is the one people skip — and then their install silently "upgrades" back to the broken binary overnight. There's no settings file toggle to fully turn updates off; the supported way is an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"DISABLE_AUTOUPDATER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;DISABLE_AUTOUPDATER&lt;/code&gt; stops background checks. If you want to block &lt;em&gt;every&lt;/em&gt; update path including manual ones, use &lt;code&gt;DISABLE_UPDATES&lt;/code&gt; instead.)&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Open a fresh terminal and verify
&lt;/h3&gt;

&lt;p&gt;The env var only reaches new windows, so close the current terminal and open a new one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;claude&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;doctor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want to see &lt;code&gt;2.1.112&lt;/code&gt;, install method &lt;code&gt;npm-global&lt;/code&gt;, and the point of the whole exercis,  &lt;strong&gt;no segfault&lt;/strong&gt;. Then start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;claude&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First launch hands you the auth screen (browser login for Pro/Max, or an API key for Console billing) and a trust prompt for your folder. You're in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things to know afterwards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ignore the "switch to native installer" banner.&lt;/strong&gt; Claude Code will nudge you to run &lt;code&gt;claude install&lt;/code&gt;. Don't ! that's exactly the path back to the Bun binary and the crash. Leave it alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're now frozen at 2.1.112.&lt;/strong&gt; That means you'll miss newer features that shipped later. For real work it's perfectly functional, but if you want the latest, the right move isn't to un-pin on Windows — it's &lt;strong&gt;WSL2&lt;/strong&gt;. The Bun crash is Windows-specific; the Linux build runs fine. Install Node inside your distro (make sure &lt;code&gt;which node&lt;/code&gt; returns a &lt;code&gt;/usr/...&lt;/code&gt; path, not &lt;code&gt;/mnt/c/...&lt;/code&gt;), keep your projects on the Linux filesystem, and install Claude Code there to get the current version with no crash.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;anthropic-ai/claude-code&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;2.1.112&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"DISABLE_AUTOUPDATER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# open a new terminal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;claude&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin to the last Node.js build, freeze updates, done.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code - Troubleshoot installation: &lt;a href="https://code.claude.com/docs/en/troubleshoot-install" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/troubleshoot-install&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code - Advanced setup (auto-updates, version pinning): &lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/setup&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tracking issue (Bun segfault on Windows): &lt;a href="https://github.com/anthropics/claude-code/issues/25630" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/issues/25630&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>You just can’t miss this…</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Tue, 26 May 2026 05:43:22 +0000</pubDate>
      <link>https://dev.to/ajeetraina/-3m3l</link>
      <guid>https://dev.to/ajeetraina/-3m3l</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/harsh_manvar/docker-with-ai-a-practical-guide-to-running-llms-agents-and-mcp-51n2" class="crayons-story__hidden-navigation-link"&gt;Docker with AI: A Practical Guide to Running LLMs, Agents and MCP&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/harsh_manvar" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F506067%2F206fe7bb-5447-4026-a211-5bfbeb03249e.jpeg" alt="harsh_manvar profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/harsh_manvar" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Harsh Manvar
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Harsh Manvar
                
              
              &lt;div id="story-author-preview-content-3754041" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/harsh_manvar" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F506067%2F206fe7bb-5447-4026-a211-5bfbeb03249e.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Harsh Manvar&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/harsh_manvar/docker-with-ai-a-practical-guide-to-running-llms-agents-and-mcp-51n2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 26&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/harsh_manvar/docker-with-ai-a-practical-guide-to-running-llms-agents-and-mcp-51n2" id="article-link-3754041"&gt;
          Docker with AI: A Practical Guide to Running LLMs, Agents and MCP
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/harsh_manvar/docker-with-ai-a-practical-guide-to-running-llms-agents-and-mcp-51n2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/harsh_manvar/docker-with-ai-a-practical-guide-to-running-llms-agents-and-mcp-51n2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              3&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Announcing the NVIDIA Nemotron 3 Super Build Contest</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Fri, 01 May 2026 08:45:20 +0000</pubDate>
      <link>https://dev.to/ajeetraina/announcing-the-nvidia-nemotron-3-super-build-contest-2d22</link>
      <guid>https://dev.to/ajeetraina/announcing-the-nvidia-nemotron-3-super-build-contest-2d22</guid>
      <description>&lt;p&gt;Have you ever wanted to use AI to make a real, tangible difference in your community? The &lt;a href="https://hackathon.collabnix.com/" rel="noopener noreferrer"&gt;NVIDIA Nemotron 3 Super Build Contest&lt;/a&gt;, organized by Docker Bangalore, &lt;a href="https://collabnix.com" rel="noopener noreferrer"&gt;Collabnix&lt;/a&gt;, and NVIDIA, is your perfect opportunity to do just that. With a deadline of May 25, 2026, developers are invited to build impactful solutions and compete for exciting prizes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hackathon.collabnix.com/hackathons/nvidia-nemotron-3-super-contest" rel="noopener noreferrer"&gt;Click here for details&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge: 4 Tracks for Public Good
&lt;/h2&gt;

&lt;p&gt;This contest isn't about building just another chatbot; every project must solve a real public problem. Participants must choose one of the following four tracks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track 1: Community Benefits Navigator&lt;/strong&gt; -  Many people struggle to access the public services they qualify for. This track challenges you to build an assistant that digests complex policy PDFs, eligibility rules, and checklists to help users apply for services like scholarships, legal aid, or health schemes in plain language&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track 2: Open-Source Maintainer Copilot for Small Community Projects&lt;/strong&gt; - Help prevent burnout among maintainers of public-interest repositories. Build a GitHub helper tailored for nonprofits and civic-tech teams that can automatically triage issues, draft release notes, and assist with newcomer onboarding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track 3: Local Governance / Public Meeting Explainer&lt;/strong&gt; - Local decisions are often opaque to the public. Use the model's multi-document reasoning skills to translate city council minutes, budgets, and policy updates into plain-language explanations that tell residents exactly what changed and what actions they can take&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track 4: Crisis Information and Resource Routing Assistant&lt;/strong&gt; - During chaotic events like floods or disease outbreaks, people need fast, localized guidance. Build a community response assistant that synthesizes rapidly changing context—like shelter lists, school closures, and verified guidance—into one easy-to-use conversational workflow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prizes and Judging
&lt;/h2&gt;

&lt;p&gt;Projects will be rigorously evaluated across six core dimensions: community value, grounded accuracy, actionability, safety, equity/accessibility, and operational efficiency. A panel of expert judges will also look at your innovation, code quality, and presentation.&lt;/p&gt;

&lt;p&gt;If you build one of the top projects, you could win big:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top 3 Winners: Amazon vouchers + NVIDIA swag&lt;/li&gt;
&lt;li&gt;2 Runners-up: NVIDIA swag&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Submit Your Project
&lt;/h2&gt;

&lt;p&gt;Ready to get started? Make sure your submission meets all the official requirements before the May 25, 2026 deadline. To successfully submit, you must:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Host your code on a public GitHub repository and include an architecture diagram in your README&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record a YouTube demo video showing your project in action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a blog post (just like this one!) about your project and share it on social media&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the right tags: Your social posts must include #NVIDIA and #Nemotron, and you must explicitly call out the Bengaluru meetup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submit officially by opening a Submission issue on the GitHub repository&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Head over to the &lt;a href="https://github.com/collabnix/nvidia-nemotron-contest" rel="noopener noreferrer"&gt;collabnix/nvidia-nemotron-contest&lt;/a&gt; GitHub repository to open your submission issue and get your project on the public wall. If you need help along the way, you can reach out via the Collabnix Slack or open a question issue.&lt;/p&gt;

&lt;p&gt;Happy building!&lt;/p&gt;

</description>
      <category>nvidia</category>
      <category>nvidiachallenge</category>
      <category>docker</category>
      <category>ai</category>
    </item>
    <item>
      <title>Announcing Operational AI with Docker Book by Ajeet Singh Raina &amp; Harsh Manvar</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:29:29 +0000</pubDate>
      <link>https://dev.to/ajeetraina/announcing-operational-ai-with-docker-book-by-ajeet-singh-raina-harsh-manvar-j77</link>
      <guid>https://dev.to/ajeetraina/announcing-operational-ai-with-docker-book-by-ajeet-singh-raina-harsh-manvar-j77</guid>
      <description>&lt;h2&gt;
  
  
  Get the Book
&lt;/h2&gt;

&lt;p&gt;📘 &lt;strong&gt;Packt:&lt;/strong&gt; &lt;a href="https://www.packtpub.com/en-in/product/operational-ai-with-docker-9781807301095" rel="noopener noreferrer"&gt;Operational AI with Docker&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;Amazon:&lt;/strong&gt; &lt;a href="https://www.amazon.com/dp/B0GTPYRT9Z" rel="noopener noreferrer"&gt;Available now (paperback + Kindle)&lt;/a&gt;&lt;br&gt;
🔖 &lt;strong&gt;ISBN:&lt;/strong&gt; 9781807301095&lt;/p&gt;

&lt;p&gt;For the better part of two years, I had a problem I couldn't solve in 280 characters or a blog post.&lt;/p&gt;

&lt;p&gt;Every time I ran a &lt;a href="https://meetup.com/collabnix" rel="noopener noreferrer"&gt;Collabnix Meetup&lt;/a&gt; and we were running them often, with three or four hundred DevOps engineers and developers showing up each time, mostly new faces - someone would walk up to me afterwards and ask the same question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Ajeet, where do I start with Docker and AI?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And honestly? My answer used to be a bit lame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ajeetraina.com" rel="noopener noreferrer"&gt;&lt;em&gt;"Follow my blogs."&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was writing one almost every day. The landscape was shifting that fast. We were moving from what I think of as &lt;strong&gt;GenAI 1.0 to 2.0&lt;/strong&gt; - from chatbots to automated AI workflows. MCP had just emerged. Docker Model Runner was new. Sandboxes hadn't even shipped yet. There was massive confusion about where to even begin.&lt;/p&gt;

&lt;p&gt;Then came &lt;strong&gt;December 2024&lt;/strong&gt;. MCP was introduced, and within a few weeks the ecosystem had &lt;strong&gt;over 3,000 MCP servers&lt;/strong&gt;. That's when it really hit me: blog posts aren't enough anymore. People need a single, structured place to learn this end to end.&lt;/p&gt;

&lt;p&gt;So Harsh Manvar and I decided to &lt;a href="https://www.packtpub.com/en-in/product/operational-ai-with-docker-9781807301088" rel="noopener noreferrer"&gt;write the book&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today, when someone walks up to me at a meetup and asks where to start with Docker and AI, I can finally say with confidence: &lt;strong&gt;&lt;a href="https://www.packtpub.com/en-in/product/operational-ai-with-docker-9781807301088" rel="noopener noreferrer"&gt;go grab this book&lt;/a&gt;&lt;/strong&gt;. You can learn it from scratch.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;Operational AI with Docker&lt;/strong&gt;, it's published by &lt;a href="https://www.packtpub.com/en-in/product/operational-ai-with-docker-9781807301095" rel="noopener noreferrer"&gt;Packt&lt;/a&gt;, and as of today — it's live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.packtpub.com/en-in/product/operational-ai-with-docker-9781807301095" rel="noopener noreferrer"&gt;Order Now&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why "Operational AI"?
&lt;/h2&gt;

&lt;p&gt;I keep going back to 2013 to explain what we're trying to do with this book.&lt;/p&gt;

&lt;p&gt;When Docker was introduced, the whole idea of &lt;strong&gt;build, ship, and run software&lt;/strong&gt; became wildly popular. Suddenly, moving from monoliths to microservices wasn't a giant migration project - it was something a developer could actually do on a Tuesday afternoon. The way I describe it: it was like ordering an iPhone from Amazon. You unbox it, switch it on, and it just works. No "CPU unsupported" errors. No dependency hell. No "works on my machine."&lt;/p&gt;

&lt;p&gt;Docker solved that exact problem for software workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI today has the exact same packaging problem, just with heavier baggage.&lt;/strong&gt; Models, weights, tokenizers, GPU drivers, fragile Python environments, agents that need tools, tools that need secrets, secrets that need policies.&lt;/p&gt;

&lt;p&gt;So Docker is doing for AI what it did for software a decade ago. The same three-word story, extended:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; AI agents using the MCP Toolkit, the MCP Catalog, and Docker Model Runner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship&lt;/strong&gt; them with Agentic Compose and Docker Agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run&lt;/strong&gt; them inside Docker Sandboxes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The philosophy hasn't changed. &lt;strong&gt;Build, ship, run, extended to AI workloads.&lt;/strong&gt; That's the entire thesis of this book.&lt;/p&gt;

&lt;p&gt;Docker isn't trying to be an AI framework. It's the runtime and packaging layer underneath, so the AI parts can actually be portable, reproducible, and shippable. That's where Docker fits. That's what this book teaches you to do.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problems This Book Solves
&lt;/h2&gt;

&lt;p&gt;When teams come to me asking about Docker and AI, they usually think their problem is technical. Most of the time, it isn't. Here are the four challenges I see over and over, and the book tackles each of them head-on:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Choosing the right model
&lt;/h3&gt;

&lt;p&gt;Hugging Face today has &lt;strong&gt;more than two million AI models&lt;/strong&gt; on it. Two million. So when a team starts an AI project, the first thing they hit isn't a Docker problem, it's a &lt;em&gt;decision&lt;/em&gt; problem.&lt;/p&gt;

&lt;p&gt;In Chapter 6, I break this down with a diagram, splitting models into three buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small Language Models (SLMs)&lt;/strong&gt; — roughly 0 to 7 billion parameters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium Language Models&lt;/strong&gt; — the middle range&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large Language Models&lt;/strong&gt; — the 70-billion-plus class&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams don't need an LLM. They need an SLM that runs cheaply, fast, and close to the user. But figuring that out takes effort, and very few people do it before they start coding.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The "AI = cloud-only" perception trap
&lt;/h3&gt;

&lt;p&gt;Most developers, when they hear "AI model," immediately think OpenAI, Gemini, Claude - something that lives in the cloud, behind an API key, costing money per token.&lt;/p&gt;

&lt;p&gt;That assumption shapes the entire architecture before anyone has written a line of code. The book breaks that assumption open and shows you what local-first AI actually looks like in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GPU fear
&lt;/h3&gt;

&lt;p&gt;The moment you say "run a model locally," people panic about hardware. &lt;em&gt;"Do I need a beefy GPU? Will my MacBook even handle this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are great open-source tools out there — &lt;code&gt;llmfit&lt;/code&gt; literally scans your hardware and tells you which models will run well on your machine, and it supports Docker Model Runner as a runtime. But most developers don't know these tools exist, so they default to the cloud out of fear, not necessity. The book walks through this so you can make the call with data, not anxiety.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. "Should I even run my model inside a container?"
&lt;/h3&gt;

&lt;p&gt;This is the question I get more than any other. And there's a real gap in understanding here.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Docker Model Runner&lt;/strong&gt;, you don't actually have to wrap the model in a container at all. DMR runs the model natively on the host, uses the GPU directly, and exposes it through an OpenAI-compatible endpoint — but it gives you Docker's packaging, versioning, and pull experience on top of that. You get the best of both worlds.&lt;/p&gt;

&lt;p&gt;That nuance is missed by a lot of teams, and it's exactly the kind of thing the book unpacks early on.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;The book is structured around the real lifecycle of an AI workload — from running a model on your laptop, to building agents, to securing and scaling them in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Run LLMs locally with Docker Model Runner&lt;/strong&gt; — pull a model the same way you pull a container image, with OpenAI- and Anthropic-compatible APIs.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Build and secure AI agents with Docker MCP Gateway&lt;/strong&gt; — the piece I think is most underrated in the current AI ecosystem. Dynamic tool discovery, policy enforcement, secrets isolation, audit logs.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Orchestrate multi-agent workflows declaratively&lt;/strong&gt; — defining agents, sub-agents, and tools in YAML using Docker Agent. Versioned, reproducible, reviewable.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Isolate agent execution with Docker Sandboxes&lt;/strong&gt; — running untrusted, agent-generated code inside microVMs so a hallucinated &lt;code&gt;rm -rf&lt;/code&gt; never reaches your host.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Build, run, and share multi-agent systems using Docker Agents&lt;/strong&gt; — orchestrator-worker patterns, agent-to-agent communication, shared state, and when &lt;em&gt;not&lt;/em&gt; to reach for multi-agent.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Deploy and scale GenAI services on Kubernetes&lt;/strong&gt; — taking everything from your laptop to a cluster, with the observability and cost-routing patterns production demands.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built for developers. Grounded in real tools. &lt;strong&gt;No fluff.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Should Read It
&lt;/h2&gt;

&lt;p&gt;Back in 2023, Harsh and I &lt;a href="https://www.docker.com/blog/llm-docker-for-local-and-hugging-face-hosting/" rel="noopener noreferrer"&gt;co-wrote a Docker blog called *"LLM Everywhere: Docker for Local and Hugging Face Hosting."&lt;/a&gt;* It went deep into model quantization formats — GPTQ, GGML — and how to actually run these models locally in containers. That blog took off. From an SEO standpoint, it became one of Docker's biggest hits in the AI space.&lt;/p&gt;

&lt;p&gt;But what really shaped the audience for this book was &lt;strong&gt;the questions that came pouring in afterwards&lt;/strong&gt;. People wanted to understand model training, model quantization, the trade-offs between formats. And one question came up over and over: &lt;em&gt;"Should I even run a model inside a container?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That tells you exactly where people are. They're not AI researchers. They're not pure ML engineers. They're &lt;strong&gt;developers, DevOps folks, and platform teams&lt;/strong&gt; who suddenly need to make AI work in their existing world.&lt;/p&gt;

&lt;p&gt;So that's who we wrote for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you're a &lt;strong&gt;developer&lt;/strong&gt; who built an agent demo and is now being asked to "productionize it" — this book is for you.&lt;/li&gt;
&lt;li&gt;If you're a &lt;strong&gt;platform engineer&lt;/strong&gt; whose team is shipping LLM-powered services and you're trying to figure out the runtime story — this book is for you.&lt;/li&gt;
&lt;li&gt;If you're an &lt;strong&gt;architect&lt;/strong&gt; mapping out an agentic AI strategy and need a concrete reference for what the operational layer actually looks like — this book is for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We didn't assume a deep ML background. &lt;strong&gt;If you know containers and you're curious about AI, you're in the right place. And if you know AI but containers feel like a black box, the early chapters meet you there.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;To &lt;strong&gt;Harsh Manvar&lt;/strong&gt; — Docker Captain, Google Developer Expert, CNCF Ambassador, and the steadiest co-author I could have asked for. Our collaboration goes back years of Docker community blogs, and this book is the natural culmination of that.&lt;/p&gt;

&lt;p&gt;To &lt;strong&gt;Apramit Bhattacharya&lt;/strong&gt;, &lt;strong&gt;Preet Ahuja&lt;/strong&gt; and the &lt;strong&gt;Packt editorial team&lt;/strong&gt; — for pushing back on chapters I thought were finished, and for making the book sharper at every pass.&lt;/p&gt;

&lt;p&gt;To the &lt;strong&gt;Collabnix community&lt;/strong&gt; — 17,000+ of you across Slack and Discord — who have been the sounding board for every idea in this book, often without realizing it. Every meetup question, every late-night DM, every "Ajeet, but how does this actually work in production?" — those shaped this book more than anything else.&lt;/p&gt;

&lt;p&gt;And to my family, who put up with a year of evenings and weekends.&lt;/p&gt;




&lt;p&gt;If you pick it up, I'd genuinely love to hear what you think. Tag me on LinkedIn or X (&lt;a href="https://twitter.com/ajeetsraina" rel="noopener noreferrer"&gt;@ajeetsraina&lt;/a&gt;), drop into the &lt;a href="https://launchpass.com/collabnix" rel="noopener noreferrer"&gt;Collabnix Slack&lt;/a&gt;, or just reach out directly. The companion code is open source, and we'll be maintaining it as the Docker AI stack continues to evolve.&lt;/p&gt;

&lt;p&gt;Operational AI is not a finished problem. This book is a snapshot of where the practice stands in 2026 — and a foundation you can build on as it keeps changing.&lt;/p&gt;

&lt;p&gt;Let's keep figuring it out, together.&lt;/p&gt;

&lt;p&gt;— Ajeet&lt;/p&gt;

</description>
      <category>dockerbook</category>
      <category>docker</category>
      <category>ai</category>
      <category>container</category>
    </item>
    <item>
      <title>How Autonomous AI Agents Become Secure by Design With Docker Sandboxes</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Wed, 15 Apr 2026 03:52:42 +0000</pubDate>
      <link>https://dev.to/ajeetraina/how-autonomous-ai-agents-become-secure-by-design-with-docker-sandboxes-20dn</link>
      <guid>https://dev.to/ajeetraina/how-autonomous-ai-agents-become-secure-by-design-with-docker-sandboxes-20dn</guid>
      <description>&lt;p&gt;I've been running AI coding agents for a while now. Claude Code on my MacBook, pointed at a project directory, autonomously editing files, running tests, pushing commits. It's genuinely useful — the kind of useful that makes you wonder how you shipped code without it.&lt;/p&gt;

&lt;p&gt;But a few months ago I started asking myself a question I'd been quietly avoiding: what exactly can this agent reach while it's running?&lt;/p&gt;

&lt;p&gt;The answer, once I actually looked, was uncomfortable. Everything. It could reach everything I could reach ~ my SSH keys, my AWS credentials, my .env files, my Git tokens. Not because it was malicious. Just because it was running on my laptop, as me, with my permissions.&lt;/p&gt;

&lt;p&gt;The risk isn't that your agent is malicious. It's that agents are increasingly reading external content — READMEs, web pages, GitHub issues, pull request descriptions. Any of that content could contain a prompt injection that redirects the agent's behavior. You don't need a sophisticated attack. You just need an agent that's trying to do its job.&lt;/p&gt;

&lt;p&gt;That's when Docker Sandboxes (sbx) started making a lot more sense to me. In the full post I walk through how a single architectural change collapses the blast radius of an AI agent — without slowing it down.&lt;/p&gt;

&lt;p&gt;👉 Continue reading on &lt;a href="https://www.ajeetraina.com/how-autonomous-ai-agents-become-secure-by-design-with-docker-sandboxes/" rel="noopener noreferrer"&gt;ajeetraina.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Interested to learn more about AI Coding Agent and Docker Sandboxing ? Don't miss out my upcoming session this Saturday 18th April at "Docker for AI" Show-n-Tell event at FAI Office, Indiranagar, Bengaluru. &lt;/p&gt;

&lt;p&gt;Register here:&amp;nbsp;&lt;a href="https://www.meetup.com/collabnix/events/313460653" rel="noopener noreferrer"&gt;https://www.meetup.com/collabnix/events/313460653&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Further Reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.ajeetraina.com/is-openclaw-safe-to-use-a-security-deep-dive-2026/" rel="noopener noreferrer"&gt;https://www.ajeetraina.com/is-openclaw-safe-to-use-a-security-deep-dive-2026/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.ajeetraina.com/stop-running-agents-in-containers-run-them-in-microvms-with-docker-sbx/" rel="noopener noreferrer"&gt;https://www.ajeetraina.com/stop-running-agents-in-containers-run-them-in-microvms-with-docker-sbx/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.ajeetraina.com/the-one-toolset-that-makes-docker-agent-cagent-actually-work-todo/" rel="noopener noreferrer"&gt;https://www.ajeetraina.com/the-one-toolset-that-makes-docker-agent-cagent-actually-work-todo/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sandbox</category>
      <category>agents</category>
      <category>ai</category>
      <category>docker</category>
    </item>
    <item>
      <title>Running NVIDIA Nemotron on a Mac with Docker Model Runner: What You Need to Know</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Sun, 08 Mar 2026 08:50:51 +0000</pubDate>
      <link>https://dev.to/ajeetraina/running-nvidia-nemotron-on-a-mac-with-docker-model-runner-what-you-need-to-know-3f11</link>
      <guid>https://dev.to/ajeetraina/running-nvidia-nemotron-on-a-mac-with-docker-model-runner-what-you-need-to-know-3f11</guid>
      <description>&lt;p&gt;&lt;a href="https://www.docker.com/blog/docker-model-runner-vllm-metal-macos/" rel="noopener noreferrer"&gt;Docker Model Runner just got a major upgrade for Mac users&lt;/a&gt;. With the introduction of &lt;strong&gt;vllm-metal&lt;/strong&gt; - a new backend that brings vLLM inference to macOS via Apple Silicon's Metal GPU - you can now run MLX models through the same OpenAI-compatible API, the same Claude Code-compatible API, and the same Docker workflow you already know.&lt;/p&gt;

&lt;p&gt;I put this to the test by running &lt;a href="https://www.nvidia.com/en-in/ai-data-science/foundation-models/nemotron/" rel="noopener noreferrer"&gt;NVIDIA Nemotron&lt;/a&gt; models on my Mac. Here's what the experience looks like, what works today, and what's coming very soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is vllm-metal?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/vllm-project/vllm-metal" rel="noopener noreferrer"&gt;vllm-metal&lt;/a&gt; is a plugin for vLLM that brings high-performance LLM inference to Apple Silicon. Developed by Docker engineers and now contributed to the open-source vLLM community, it unifies MLX (Apple's machine learning framework) and PyTorch under a single compute pathway — plugging directly into vLLM's existing engine, scheduler, and OpenAI-compatible API server.&lt;/p&gt;

&lt;p&gt;The architecture is elegant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------------------------------------------------+
|                          vLLM Core                          |
|        Engine | Scheduler | API | Tokenizers                |
+-------------------------------------------------------------+
                             |
+-------------------------------------------------------------+
|                   vllm_metal Plugin Layer                   |
|   | Platform  |  | Worker    |  | ModelRunner            |  |
+-------------------------------------------------------------+
                             |
+-------------------------------------------------------------+
|                   Unified Compute Backend                   |
|   | MLX (Primary inference) | PyTorch (model loading)  |   |
+-------------------------------------------------------------+
                             |
+-------------------------------------------------------------+
|              Metal GPU / Apple Silicon Unified Memory       |
+-------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source ~ &lt;a href="https://www.docker.com/blog/docker-model-runner-vllm-metal-macos/" rel="noopener noreferrer"&gt;https://www.docker.com/blog/docker-model-runner-vllm-metal-macos/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What makes this particularly powerful on Apple Silicon is &lt;strong&gt;unified memory&lt;/strong&gt;. Unlike discrete GPUs where data must be copied between CPU and GPU memory, Apple Silicon shares a single memory pool. vllm-metal exploits this with zero-copy tensor operations — combined with paged attention for KV cache management and Grouped-Query Attention support.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Update to &lt;strong&gt;Docker Desktop 4.62 or later&lt;/strong&gt; for Mac, then install the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model install-runner &lt;span class="nt"&gt;--backend&lt;/span&gt; vllm-metal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Docker Model Runner automatically routes MLX models to vllm-metal when the backend is installed.&lt;/p&gt;




&lt;h2&gt;
  
  
  vLLM Now Runs Everywhere with Docker Model Runner
&lt;/h2&gt;

&lt;p&gt;This release completes vLLM support across all three major platforms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;GPU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;vllm&lt;/td&gt;
&lt;td&gt;NVIDIA (CUDA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows (WSL2)&lt;/td&gt;
&lt;td&gt;vllm&lt;/td&gt;
&lt;td&gt;NVIDIA (CUDA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;vllm-metal&lt;/td&gt;
&lt;td&gt;Apple Silicon (Metal)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same &lt;code&gt;docker model&lt;/code&gt; commands work regardless of platform. Docker Model Runner picks the right backend automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Models Work with vllm-metal?
&lt;/h2&gt;

&lt;p&gt;vllm-metal works with &lt;strong&gt;safetensors models in MLX format&lt;/strong&gt;. The &lt;code&gt;mlx-community&lt;/code&gt; on Hugging Face maintains a large collection of quantized models optimized for Apple Silicon. Some great starting points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Lightweight and fast&lt;/span&gt;
docker model run hf.co/mlx-community/Llama-3.2-1B-Instruct-4bit

&lt;span class="c"&gt;# Strong 7B&lt;/span&gt;
docker model run hf.co/mlx-community/Mistral-7B-Instruct-v0.3-4bit

&lt;span class="c"&gt;# Latest coding model&lt;/span&gt;
docker model run hf.co/mlx-community/Qwen3-Coder-Next-4bit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Running NVIDIA Nemotron on Mac
&lt;/h2&gt;

&lt;p&gt;With vllm-metal installed, let's look at what the Nemotron lineup offers on Mac today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Llama-3.1-Nemotron-Nano-8B (Recommended)
&lt;/h3&gt;

&lt;p&gt;This is a standard transformer model fine-tuned by NVIDIA for instruction following and reasoning. It runs well on Mac via vllm-metal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model run hf.co/nvidia/Llama-3.1-Nemotron-Nano-8B-v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a &lt;strong&gt;32GB or 64GB Mac&lt;/strong&gt;, this model runs comfortably. On a &lt;strong&gt;16GB Mac&lt;/strong&gt;, free up unified memory first by reducing Docker Desktop's VM memory limit (Settings → Resources → Advanced → set to 4–5 GB).&lt;/p&gt;

&lt;h3&gt;
  
  
  Nemotron-3-Nano-30B: The Mamba2 Frontier
&lt;/h3&gt;

&lt;p&gt;The 30B model uses a &lt;strong&gt;hybrid SSM (State Space Model)&lt;/strong&gt; architecture — combining Mamba2 layers with attention layers. This is architecturally novel and represents the next frontier of efficient inference: better long-context performance, lower memory footprint at runtime, and compelling throughput characteristics.&lt;/p&gt;

&lt;p&gt;Mamba2 support in &lt;code&gt;mlx-lm&lt;/code&gt; is actively maturing, and as it does, models like Nemotron-3-Nano-30B will run natively through vllm-metal. This is an exciting space to watch — especially on higher-memory Macs where the 30B model size becomes practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  The $599 AI Development Rig
&lt;/h2&gt;

&lt;p&gt;One of the most compelling stories in this release: a base &lt;strong&gt;Mac Mini M4 at $599&lt;/strong&gt; is now a viable vLLM development environment. Because Apple Silicon uses unified memory, the 16GB (or upgraded 32GB/64GB) RAM is directly accessible by the GPU, enabling you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Develop and test locally&lt;/strong&gt; using the same OpenAI-compatible API as production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mirror production&lt;/strong&gt; — the same API surface as an H100 cluster, on your desk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run efficiently&lt;/strong&gt; — a fraction of the power consumption and heat of a discrete GPU rig&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This democratizes access to vLLM development in a way that wasn't possible before. Previously, getting started with high-throughput vLLM required an RTX 4090 ($1,700+) or enterprise-grade GPU cards. Now, the barrier to entry is a Mac Mini.&lt;/p&gt;




&lt;h2&gt;
  
  
  vllm-metal vs llama.cpp: Benchmark Context
&lt;/h2&gt;

&lt;p&gt;Docker benchmarked both backends on Llama 3.2 1B Instruct with 4-bit quantization:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;max_tokens&lt;/th&gt;
&lt;th&gt;llama.cpp (tok/s)&lt;/th&gt;
&lt;th&gt;vLLM-Metal (tok/s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;333.3&lt;/td&gt;
&lt;td&gt;251.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;345.1&lt;/td&gt;
&lt;td&gt;279.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;338.5&lt;/td&gt;
&lt;td&gt;275.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048&lt;/td&gt;
&lt;td&gt;339.1&lt;/td&gt;
&lt;td&gt;279.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;llama.cpp shows ~1.2–1.3x higher raw throughput on this benchmark. However, vllm-metal brings things that raw token speed doesn't capture: &lt;strong&gt;the full vLLM engine&lt;/strong&gt;, including its scheduler, paged attention, batching, and production-grade OpenAI-compatible API. For developers building real applications, that consistency and API compatibility often matters more than peak throughput on a single request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hardware Recommendations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mac Configuration&lt;/th&gt;
&lt;th&gt;What to Run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M-series, 16GB&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mlx-community/Llama-3.2-1B-Instruct-4bit&lt;/code&gt;, &lt;code&gt;ai/phi4-mini&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M-series, 32GB&lt;/td&gt;
&lt;td&gt;Nemotron 8B, &lt;code&gt;mlx-community/Mistral-7B-Instruct-v0.3-4bit&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M-series Max/Ultra, 64GB+&lt;/td&gt;
&lt;td&gt;Nemotron 8B comfortably, 30B models as SSM support matures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'm upgrading to a &lt;strong&gt;MacBook Pro Max&lt;/strong&gt; this month — full benchmarks and multi-model Nemotron demos coming soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Source at the Core
&lt;/h2&gt;

&lt;p&gt;Docker contributed vllm-metal to the vLLM open-source community — it now lives under the vLLM GitHub organization. This means every developer in the ecosystem can benefit from and contribute to high-performance inference on Apple Silicon. The project has also had significant contributions from Lik Xun Yuan, Ricky Chen, and Ranran Haoran Zhang.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install vllm-metal backend (Docker Desktop 4.62+ required)&lt;/span&gt;
docker model install-runner &lt;span class="nt"&gt;--backend&lt;/span&gt; vllm-metal

&lt;span class="c"&gt;# Run a Nemotron model&lt;/span&gt;
docker model run hf.co/nvidia/Llama-3.1-Nemotron-Nano-8B-v1

&lt;span class="c"&gt;# Or try an mlx-community model&lt;/span&gt;
docker model run hf.co/mlx-community/Mistral-7B-Instruct-v0.3-4bit

&lt;span class="c"&gt;# List all downloaded models&lt;/span&gt;
docker model &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/model-runner/" rel="noopener noreferrer"&gt;Docker Model Runner documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/docker/model-runner" rel="noopener noreferrer"&gt;docker/model-runner on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/mlx-community" rel="noopener noreferrer"&gt;mlx-community on Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vllm-project/vllm-metal" rel="noopener noreferrer"&gt;vllm-metal on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to learn more? Come, join me at Collabnix Community Meet and NVIDIA GTC 2026 Watch Party this March 21st virtually. Don't forget to &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSeIwlDc2StsDIutO_RiFaiKLmVL55wWTsas9ZZ10lYq81leug/viewform" rel="noopener noreferrer"&gt;register here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nvidia</category>
      <category>nvidiachallenge</category>
      <category>docker</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
