<?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>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>
    <item>
      <title>Arm Migration via Arm MCP Server, Docker MCP Toolkit, VS Code and Co-Pilot</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Mon, 02 Mar 2026 06:17:12 +0000</pubDate>
      <link>https://dev.to/ajeetraina/arm-migration-via-arm-mcp-server-docker-mcp-toolkit-vs-code-and-co-pilot-3jh0</link>
      <guid>https://dev.to/ajeetraina/arm-migration-via-arm-mcp-server-docker-mcp-toolkit-vs-code-and-co-pilot-3jh0</guid>
      <description>&lt;p&gt;This video detail the use of the Docker MCP Toolkit to automate the migration of software from x86 to Arm64 architecture. By integrating specialized Arm MCP Servers with AI assistants like GitHub Copilot, developers can significantly reduce the manual labor required for complex porting tasks. &lt;/p&gt;

&lt;p&gt;The system automatically identifies x86-specific dependencies, converts legacy SIMD intrinsics to Arm NEON equivalents, and updates Dockerfiles to ensure hardware compatibility. &lt;/p&gt;

&lt;p&gt;This workflow streamlines the modernization of legacy C++ applications by connecting natural language commands to containerized diagnostic and transformation tools. Ultimately, the guide demonstrates how to achieve substantial cost savings and performance gains on cloud platforms like AWS Graviton with minimal architectural expertise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/blog/automate-arm-migration-docker-mcp-copilot/" rel="noopener noreferrer"&gt;Click to read the blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/k4TT2Ogspss"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>docker</category>
      <category>arm</category>
      <category>mcp</category>
      <category>vscode</category>
    </item>
    <item>
      <title>NanoClaw just moved from Apple Containers to Docker</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Sat, 28 Feb 2026 06:57:32 +0000</pubDate>
      <link>https://dev.to/ajeetraina/nanoclaw-just-moved-from-apple-containers-to-docker-2p7e</link>
      <guid>https://dev.to/ajeetraina/nanoclaw-just-moved-from-apple-containers-to-docker-2p7e</guid>
      <description>&lt;p&gt;&lt;a href="https://www.ajeetraina.com/run-nanoclaw-on-macbook-safely-with-docker-microvm-sandboxes/" rel="noopener noreferrer"&gt;NanoClaw&lt;/a&gt; just moved from Apple Containers to Docker and the reason behind it is a masterclass in open source stewardship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/Gavriel_Cohen" rel="noopener noreferrer"&gt;Gavriel Cohen&lt;/a&gt; built NanoClaw AI as a personal project. He uses a Mac, loved Apple Containers for their lightweight Apple Silicon optimization, and shipped what worked for him. Simple, honest, personal.&lt;/p&gt;

&lt;p&gt;Then thousands of developers started using it. Production workloads. Businesses building on top of it. A real community formed.&lt;/p&gt;

&lt;p&gt;And that’s when he made a decision that not every creator has the humility to make:&lt;/p&gt;

&lt;p&gt;“The defaults should serve the community, not just me.”&lt;/p&gt;

&lt;p&gt;He switched to Docker ~ battle-tested, universally supported, runs everywhere because it was the right thing for the project, not his personal preference.&lt;/p&gt;

&lt;p&gt;Apple Containers are still fully supported. Run /convert-to-apple-container and in ~30 seconds it merges changes into your codebase via git ~ minimal token usage, deterministic in most cases, with Claude resolving merge conflicts.&lt;/p&gt;

&lt;p&gt;This is what great open source leadership looks like. Knowing when to get out of your own way.&lt;/p&gt;

&lt;p&gt;Congrats to the NanoClaw community on this milestone 🐳&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://x.com/Gavriel_Cohen/status/2026028681907339382" rel="noopener noreferrer"&gt;https://x.com/Gavriel_Cohen/status/2026028681907339382&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>openclaw</category>
      <category>nanoclaw</category>
    </item>
    <item>
      <title>Running OpenClaw on NVIDIA Jetson Thor with Docker Model Runner: A Complete Guide</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Mon, 23 Feb 2026 05:40:30 +0000</pubDate>
      <link>https://dev.to/ajeetraina/running-openclaw-on-nvidia-jetson-thor-with-docker-model-runner-a-complete-guide-5162</link>
      <guid>https://dev.to/ajeetraina/running-openclaw-on-nvidia-jetson-thor-with-docker-model-runner-a-complete-guide-5162</guid>
      <description>&lt;p&gt;What if you could run your own AI-powered Discord bot completely local, no cloud APIs, no subscription fees on an NVIDIA Jetson Thor? That's exactly what we did. In this guide, I'll walk you through setting up &lt;a href="https://openclaw.ai" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;, an open-source AI agent framework, powered by &lt;a href="https://docs.docker.com/model-runner/" rel="noopener noreferrer"&gt;Docker Model Runner&lt;/a&gt; running Qwen3 8B locally on NVIDIA Jetson Thor.&lt;/p&gt;

&lt;p&gt;The result? A fully functional Discord bot that responds to messages using a locally hosted LLM, with zero data leaving your network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have the following ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NVIDIA Jetson Thor with Docker Engine installed&lt;/li&gt;
&lt;li&gt;Docker Model Runner plugin enabled&lt;/li&gt;
&lt;li&gt;Node.js v22+ installed&lt;/li&gt;
&lt;li&gt;A Discord account with server admin access&lt;/li&gt;
&lt;li&gt;Basic familiarity with the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install OpenClaw
&lt;/h2&gt;

&lt;p&gt;OpenClaw provides a one-liner installer that detects your OS and sets everything up via npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see output confirming the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🦞 OpenClaw Installer
✓ Detected: linux
✓ Node.js v22.22.0 found
✓ npm configured for user installs
🦞 OpenClaw installed successfully (2026.2.21-2)!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.amazonaws.com%2Fuploads%2Farticles%2Ft3m8fsvnkfgd21v27471.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.amazonaws.com%2Fuploads%2Farticles%2Ft3m8fsvnkfgd21v27471.png" alt="Image1" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Flsoui4x0zcoqn09lv744.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.amazonaws.com%2Fuploads%2Farticles%2Flsoui4x0zcoqn09lv744.png" alt="Image2" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F3tuaxarikgyi5kj9i6t3.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.amazonaws.com%2Fuploads%2Farticles%2F3tuaxarikgyi5kj9i6t3.png" alt="Image3" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F715rnt6c7yrna830ylmb.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.amazonaws.com%2Fuploads%2Farticles%2F715rnt6c7yrna830ylmb.png" alt="Image5" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose Custom Provider.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fr589bgkez1rch1ogdc8l.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.amazonaws.com%2Fuploads%2Farticles%2Fr589bgkez1rch1ogdc8l.png" alt="Image6" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please Note&lt;/strong&gt;: The right URL would like &lt;code&gt;https://localhost:12434/v1&lt;/code&gt;. We will change it later point of time&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Verify Docker Model Runner
&lt;/h2&gt;

&lt;p&gt;Docker Model Runner lets you run LLMs locally as part of Docker's ecosystem. First, let's check what models are available:&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 &lt;span class="nb"&gt;ls&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;MODEL NAME           PARAMETERS  QUANTIZATION     ARCHITECTURE  SIZE
llama3.2:3B-Q4_K_M   3.21 B      IQ2_XXS/Q4_K_M  llama         1.87 GiB
qwen3:8B-Q4_K_M      8.19 B      IQ2_XXS/Q4_K_M  qwen3         4.68 GiB
smollm2              361.82 M    IQ2_XXS/Q4_K_M  llama         256.35 MiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll use &lt;strong&gt;Qwen3 8B&lt;/strong&gt; as our primary model — it offers a solid balance of intelligence and performance for the Jetson Thor's capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the API Endpoint
&lt;/h3&gt;

&lt;p&gt;Docker Model Runner exposes an OpenAI-compatible API on port 12434:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:12434/v1/models | jq &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"ai/smollm2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"owned_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker"&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;"ai/llama3.2:3B-Q4_K_M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"owned_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker"&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;"ai/qwen3:8B-Q4_K_M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"owned_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker"&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;
  
  
  Test a Chat Completion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:12434/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "qwen3:8B-Q4_K_M",
    "messages": [{"role": "user", "content": "Hello, say hi in one sentence"}],
    "max_tokens": 500
  }'&lt;/span&gt; | jq &lt;span class="s1"&gt;'.choices[0].message.content'&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;"Hello! How can I assist you today?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see a response, your model runner is working perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Important: Configure Context Size
&lt;/h3&gt;

&lt;p&gt;By default, Docker Model Runner may use a 4096-token context window, which is too small for OpenClaw (minimum 16,000 tokens required). Bump it up:&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 configure &lt;span class="nt"&gt;--context-size&lt;/span&gt; 32768 ai/qwen3:8B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the configuration:&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 configure show ai/qwen3:8B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Backend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"llama.cpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai/qwen3:8B-Q4_K_M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Config"&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;"context-size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32768&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;h2&gt;
  
  
  Step 3: A Note on Qwen3's Thinking Mode
&lt;/h2&gt;

&lt;p&gt;Qwen3 has a built-in "thinking" mode that uses tokens for chain-of-thought reasoning before generating a visible response. If you set &lt;code&gt;max_tokens&lt;/code&gt; too low (e.g., 50), you might get an empty &lt;code&gt;content&lt;/code&gt; field because all tokens were consumed by &lt;code&gt;reasoning_content&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The fix is simple: use a higher &lt;code&gt;max_tokens&lt;/code&gt; value (500+), or disable thinking mode by adding &lt;code&gt;/nothink&lt;/code&gt; as a system prompt. For OpenClaw usage with 32K+ context, this won't be an issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Configure OpenClaw
&lt;/h2&gt;

&lt;p&gt;Run the setup wizard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenClaw should auto-detect Docker Model Runner. The key configuration in &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; should look like this:&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;"models"&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;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"providers"&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;"dmr"&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:12434/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dmr-local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openai-completions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"models"&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;"ai/qwen3:8B-Q4_K_M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qwen3 8B (64K context)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"contextWindow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"maxTokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65536&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;"ai/llama3.2:3B-Q4_K_M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Llama 3.2 3B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"contextWindow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32768&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"maxTokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32768&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;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;"agents"&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;"defaults"&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;"model"&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;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dmr/ai/qwen3:8B-Q4_K_M"&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;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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Make sure the &lt;code&gt;baseUrl&lt;/code&gt; uses &lt;code&gt;/v1&lt;/code&gt; (not &lt;code&gt;/engines/v1&lt;/code&gt;). The &lt;code&gt;/engines/v1&lt;/code&gt; endpoint may report incorrect context window sizes, causing OpenClaw to reject the model with a "context window too small" error.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Please Note&lt;/strong&gt;: During the OpenClaw installer, if you chose Discord then it might ask for Discord Bot. Keep it ready before you proceed further.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F2ohrw3s7gvrt5rbxbhgd.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.amazonaws.com%2Fuploads%2Farticles%2F2ohrw3s7gvrt5rbxbhgd.png" alt="Image7" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fgppr9o5nyxt6bu2rnvvx.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.amazonaws.com%2Fuploads%2Farticles%2Fgppr9o5nyxt6bu2rnvvx.png" alt="Image8" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fhb4xq6b3v4sdhnjn9e8p.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.amazonaws.com%2Fuploads%2Farticles%2Fhb4xq6b3v4sdhnjn9e8p.png" alt="Image9" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Frgpvc0f8ykjo64pd3jkd.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.amazonaws.com%2Fuploads%2Farticles%2Frgpvc0f8ykjo64pd3jkd.png" alt="Image10" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fpn9v36dth273uj9mv9nr.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.amazonaws.com%2Fuploads%2Farticles%2Fpn9v36dth273uj9mv9nr.png" alt="Image11" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Create a Discord Bot
&lt;/h2&gt;

&lt;p&gt;Now for the fun part — connecting OpenClaw to Discord.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Application
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;Discord Developer Portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New Application&lt;/strong&gt; and name it (e.g., "OpenClaw Bot")&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configure the Bot
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Bot&lt;/strong&gt; in the left sidebar&lt;/li&gt;
&lt;li&gt;Scroll to &lt;strong&gt;Privileged Gateway Intents&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Message Content Intent&lt;/strong&gt; — this is critical for the bot to read messages&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save Changes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll up and click &lt;strong&gt;Reset Token&lt;/strong&gt; to generate a bot token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the token&lt;/strong&gt; — you'll need it next&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fix the Install Link (Avoid "Code Grant" Errors)
&lt;/h3&gt;

&lt;p&gt;This is a common gotcha. Go to &lt;strong&gt;Installation&lt;/strong&gt; in the left sidebar and set the &lt;strong&gt;Install Link&lt;/strong&gt; to &lt;strong&gt;None&lt;/strong&gt;. This prevents the dreaded "Integration requires code grant" error when trying to invite the bot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate the Invite URL
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;OAuth2&lt;/strong&gt; → &lt;strong&gt;URL Generator&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under Scopes, check only &lt;strong&gt;bot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under Bot Permissions, check: &lt;strong&gt;Send Messages&lt;/strong&gt;, &lt;strong&gt;Read Message History&lt;/strong&gt;, &lt;strong&gt;View Channels&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the generated URL at the bottom&lt;/li&gt;
&lt;li&gt;Open it in your browser, select your server, and click &lt;strong&gt;Authorize&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use this URL template directly (replace &lt;code&gt;YOUR_CLIENT_ID&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;https://discord.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&amp;amp;permissions=68608&amp;amp;scope=bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Add Discord to OpenClaw
&lt;/h2&gt;

&lt;p&gt;Add the Discord channel with your bot token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw channels add &lt;span class="nt"&gt;--channel&lt;/span&gt; discord &lt;span class="nt"&gt;--token&lt;/span&gt; YOUR_DISCORD_BOT_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or edit the config directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.openclaw/openclaw.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the Discord section under &lt;code&gt;channels&lt;/code&gt;:&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="nl"&gt;"channels"&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;"discord"&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;"enabled"&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;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_DISCORD_BOT_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"groupPolicy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streamMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&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;h2&gt;
  
  
  Step 7: Start the Gateway
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the bot come online:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[gateway] agent model: dmr/ai/qwen3:8B-Q4_K_M
[gateway] listening on ws://127.0.0.1:18789
[discord] [default] starting provider (@OpenClaw Bot)
[discord] logged in to discord as 1475353419764994181
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 8: Pair Your Discord Account
&lt;/h2&gt;

&lt;p&gt;OpenClaw uses a pairing system for DMs. Send a direct message to your bot on Discord (e.g., "Hello"). The bot will respond with a pairing code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenClaw: access not configured.
Your Discord user id: 663426992733159434
Pairing code: 9TRNA3AL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Approve the pairing in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw pairing approve &lt;span class="nt"&gt;--channel&lt;/span&gt; discord 9TRNA3AL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now send another message — and watch Qwen3 respond through your Discord bot, running entirely on your Jetson Thor!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Here's what's happening under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discord (your messages)
        │
        ▼
┌─────────────────┐
│  OpenClaw       │
│  Gateway        │
│  (WebSocket)    │
│  Port 18789     │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Docker Model   │
│  Runner         │
│  Port 12434     │
│  (OpenAI API)   │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Qwen3 8B       │
│  (llama.cpp)    │
│  NVIDIA GPU     │
└─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything runs locally on the Jetson Thor. Your messages go from Discord → OpenClaw Gateway → Docker Model Runner → Qwen3 on the GPU, and the response flows back the same way. No cloud, no API keys (except Discord's bot token), no per-token costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Here are some issues we encountered and how to fix them:&lt;/p&gt;

&lt;h3&gt;
  
  
  "Model context window too small (4096 tokens)"
&lt;/h3&gt;

&lt;p&gt;This happens when Docker Model Runner defaults to 4096 context. Fix it with:&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 configure &lt;span class="nt"&gt;--context-size&lt;/span&gt; 32768 ai/qwen3:8B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also ensure your OpenClaw config uses &lt;code&gt;baseUrl: "http://localhost:12434/v1"&lt;/code&gt; (not &lt;code&gt;/engines/v1&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  "Integration requires code grant" when inviting the bot
&lt;/h3&gt;

&lt;p&gt;Go to the Discord Developer Portal → &lt;strong&gt;Installation&lt;/strong&gt; → set &lt;strong&gt;Install Link&lt;/strong&gt; to &lt;strong&gt;None&lt;/strong&gt;. Then use a clean invite URL with only the &lt;code&gt;bot&lt;/code&gt; scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Empty responses from Qwen3
&lt;/h3&gt;

&lt;p&gt;Qwen3's thinking mode can consume all tokens before generating a visible response. Increase &lt;code&gt;max_tokens&lt;/code&gt; to 500+ or use &lt;code&gt;/nothink&lt;/code&gt; as a system prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bot not appearing in Discord server
&lt;/h3&gt;

&lt;p&gt;Make sure you've authorized the bot using the OAuth2 URL with the &lt;code&gt;bot&lt;/code&gt; scope. Check the gateway logs for &lt;code&gt;[discord] logged in to discord as ...&lt;/code&gt; to confirm the bot is connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;With OpenClaw running on Jetson Thor, you now have a foundation for building powerful local AI agents. Some ideas to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add more channels&lt;/strong&gt;: Connect Telegram, WhatsApp, or Slack alongside Discord&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install skills&lt;/strong&gt;: Extend your bot with OpenClaw skills for image generation, web browsing, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run as a service&lt;/strong&gt;: Use &lt;code&gt;systemctl&lt;/code&gt; to keep the gateway running 24/7&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try different models&lt;/strong&gt;: Swap between Qwen3 8B and Llama 3.2 3B depending on your speed vs. quality needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build custom skills&lt;/strong&gt;: Create modular capability packages that teach your bot new tricks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The beauty of this setup is that it's entirely self-hosted. Your conversations stay on your hardware, your models run on your GPU, and you have complete control over the experience.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fgbuzxxxnctxk99ez9w22.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.amazonaws.com%2Fuploads%2Farticles%2Fgbuzxxxnctxk99ez9w22.png" alt="Image11" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fd4aihvj91zasmb20yaau.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.amazonaws.com%2Fuploads%2Farticles%2Fd4aihvj91zasmb20yaau.png" alt="Image12" width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Running OpenClaw with Docker Model Runner on NVIDIA Jetson Thor demonstrates the power of edge AI. In under 30 minutes, we went from a bare Jetson Thor to a fully functional Discord bot powered by a locally running 8B parameter model. No cloud dependencies, no recurring API costs, and complete data privacy.&lt;/p&gt;

&lt;p&gt;The combination of Docker's containerized model management, OpenClaw's multi-channel agent framework, and NVIDIA's GPU acceleration makes this setup both practical and powerful. Whether you're building a personal assistant, a community bot, or an edge AI prototype, this stack gives you everything you need.&lt;/p&gt;

&lt;p&gt;Happy hacking! 🦞&lt;/p&gt;

</description>
      <category>ai</category>
      <category>docker</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
