<?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>Forem: Ajeet Singh Raina</title>
    <description>The latest articles on Forem by Ajeet Singh Raina (@ajeetraina).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F542589%2Fa49382c6-1e3d-4b9e-bfa8-23854886ad47.jpg</url>
      <title>Forem: Ajeet Singh Raina</title>
      <link>https://forem.com/ajeetraina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ajeetraina"/>
    <language>en</language>
    <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://forem.com/ajeetraina/how-autonomous-ai-agents-become-secure-by-design-with-docker-sandboxes-20dn</link>
      <guid>https://forem.com/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: &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://forem.com/ajeetraina/running-nvidia-nemotron-on-a-mac-with-docker-model-runner-what-you-need-to-know-3f11</link>
      <guid>https://forem.com/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://forem.com/ajeetraina/arm-migration-via-arm-mcp-server-docker-mcp-toolkit-vs-code-and-co-pilot-3jh0</link>
      <guid>https://forem.com/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://forem.com/ajeetraina/nanoclaw-just-moved-from-apple-containers-to-docker-2p7e</link>
      <guid>https://forem.com/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://forem.com/ajeetraina/running-openclaw-on-nvidia-jetson-thor-with-docker-model-runner-a-complete-guide-5162</link>
      <guid>https://forem.com/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>
    <item>
      <title>Top 5 Reasons Why I'm Attending NVIDIA GTC 2026 (And Why You Should Too!)</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Fri, 13 Feb 2026 08:01:21 +0000</pubDate>
      <link>https://forem.com/ajeetraina/top-5-reasons-why-im-attending-nvidia-gtc-2026-and-why-you-should-too-42dg</link>
      <guid>https://forem.com/ajeetraina/top-5-reasons-why-im-attending-nvidia-gtc-2026-and-why-you-should-too-42dg</guid>
      <description>&lt;p&gt;If there's one AI event you absolutely cannot afford to miss this year, it's &lt;strong&gt;NVIDIA GTC 2026&lt;/strong&gt;. Happening &lt;strong&gt;March 16–19 in San Jose, CA&lt;/strong&gt; (and virtually!), GTC has firmly established itself as what Jensen Huang himself calls the &lt;em&gt;"Super Bowl of AI."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As someone who lives and breathes at the intersection of containers, DevOps, and AI — and having watched the agentic AI revolution unfold firsthand through my work with Docker and the Collabnix community — I can tell you: GTC 2026 is shaping up to be the most important tech event of the year.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nvda.ws/4klalVe" rel="noopener noreferrer"&gt;NVIDIA GTC&lt;/a&gt; is the developer conference for the era of AI and the metaverse. It’s where students, developers, researchers, creators, IT decision-makers, and business leaders gather to learn how to shape our world with the power of AI, accelerated computing, data science, and more. Here are my top 5 reasons why I'm going, and why you should &lt;strong&gt;&lt;a href="https://nvda.ws/4klalVe" rel="noopener noreferrer"&gt;register today&lt;/a&gt;&lt;/strong&gt; — virtual attendance is completely &lt;strong&gt;FREE&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/o0J1aGT8_Tc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Jensen Huang's Keynote — Where the Future Gets Announced
&lt;/h2&gt;

&lt;p&gt;Every year, Jensen Huang takes the stage and rewrites the industry roadmap. This year's &lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81595/" rel="noopener noreferrer"&gt;keynote&lt;/a&gt; is on &lt;strong&gt;Monday, March 16, 11 a.m.–1 p.m. PDT&lt;/strong&gt; at the &lt;strong&gt;SAP Center&lt;/strong&gt;, preceded by the &lt;strong&gt;GTC Live 2026 Pregame Show&lt;/strong&gt; (8–11 a.m. PDT) featuring industry leaders breaking down the AI advances shaping the year ahead. &lt;strong&gt;The keynote will be live-streamed and available on demand afterward&lt;/strong&gt; — so even if you can't make it live, you won't miss a thing.&lt;/p&gt;

&lt;p&gt;Last year, Huang unveiled the Vera Rubin platform at CES 2026 — a six-chip AI supercomputer delivering a jaw-dropping &lt;strong&gt;5x performance leap&lt;/strong&gt; over Blackwell and a &lt;strong&gt;10x reduction in token costs&lt;/strong&gt;. At GTC, expect deeper architectural details on Rubin deployment timelines, the NVL72 rack-scale systems, and what comes next on the roadmap (hints of Rubin Ultra in 2027 and Kyber in 2028 have already been teased).&lt;/p&gt;

&lt;p&gt;If you want to know where the entire AI industry is heading before anyone else, the keynote is where it happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Agentic AI Takes Center Stage — And It's My World
&lt;/h2&gt;

&lt;p&gt;GTC 2026 is zeroing in on &lt;strong&gt;Agentic AI&lt;/strong&gt; as a core theme, and as someone building multi-agent systems with Docker Compose and exploring multi-LLM architectures daily, this couldn't be more relevant.&lt;/p&gt;

&lt;p&gt;NVIDIA has described the shift from "Generative" to "Agentic" AI as the defining transition of this era. Unlike simple chatbots that respond to prompts, agentic models are designed to execute complex, multi-step workflows — coding entire applications, managing supply chains, conducting scientific research — with minimal human intervention.&lt;/p&gt;

&lt;p&gt;Dedicated sessions will cover reasoning models, multi-step workflows, enterprise-scale agent deployments, and the software frameworks (CUDA-X, NIM microservices, ASTRA security) that make it all possible. For anyone working on "Agents as the New Microservices," this is the place to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Docker Is at GTC 2026 — And You Should Visit the Booth!
&lt;/h2&gt;

&lt;p&gt;Here's something that makes this event even more special for me — &lt;strong&gt;Docker is an official exhibitor at GTC 2026!&lt;/strong&gt; If you're a developer working with containers and AI, this is a must-visit stop at the Exhibit Hall.&lt;/p&gt;

&lt;p&gt;Docker has been at the forefront of making AI development accessible to every developer. If you haven't already seen it, check out how &lt;a href="https://www.docker.com/blog/new-nvidia-dgx-spark-docker-model-runner/" rel="noopener noreferrer"&gt;Docker Model Runner on the new NVIDIA DGX Spark&lt;/a&gt; is creating a whole new paradigm for developing AI locally — combining the DGX Spark's GB10 Grace Blackwell Superchip with Docker's familiar developer workflow for seamless local model inference. With just a &lt;code&gt;docker model pull&lt;/code&gt; and &lt;code&gt;docker model run&lt;/code&gt;, you get full GPU acceleration through NVIDIA's container runtime. Add &lt;strong&gt;Docker Hardened Images (DHI)&lt;/strong&gt; for enterprise-grade security, and Docker is redefining how we build, ship, and run AI-powered applications.&lt;/p&gt;

&lt;p&gt;Stop by the Docker booth for hands-on demos and to see firsthand how containers are becoming the backbone of the agentic AI era. If you've been following my "Agents are the New Microservices" work, you already know how tightly Docker and multi-agent architectures go together. This is where that story comes alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Physical AI, Robotics &amp;amp; The Omniverse
&lt;/h2&gt;

&lt;p&gt;One of the most exciting tracks at GTC 2026 focuses on &lt;strong&gt;Physical AI&lt;/strong&gt; — the convergence of AI with robotics and the real world. Sessions will explore how simulation-driven training is moving autonomous systems from pilots into production.&lt;/p&gt;

&lt;p&gt;NVIDIA's ecosystem here is staggering: &lt;strong&gt;Cosmos&lt;/strong&gt; for synthetic training data, &lt;strong&gt;Isaac GR00T N1&lt;/strong&gt; for humanoid robot foundation models, &lt;strong&gt;Newton&lt;/strong&gt; physics engine for robotics simulation, and the &lt;strong&gt;Alpamayo&lt;/strong&gt; open reasoning model for autonomous vehicles. The Omniverse continues to evolve as the digital twin platform tying it all together.&lt;/p&gt;

&lt;p&gt;For developers curious about how containerized AI workloads will power the next generation of robots and autonomous systems, these sessions are a goldmine.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 500+ Sessions, World-Class Networking &amp;amp; Unforgettable Experiences
&lt;/h2&gt;

&lt;p&gt;GTC isn't just about watching talks — it's about &lt;strong&gt;doing&lt;/strong&gt; and &lt;strong&gt;connecting&lt;/strong&gt;. The conference features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;500+ technical sessions&lt;/strong&gt; spanning Agentic AI, AR/VR, Robotics, LLMs, Computer Vision, Developer Tools, Data Science, quantum computing, digital twins, healthcare AI, and accelerated computing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;70+ hands-on training labs&lt;/strong&gt; led by NVIDIA experts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expert-led workshops&lt;/strong&gt; with certification tracks recognized across the industry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Days &amp;amp; Hackathons&lt;/strong&gt; for build-first learners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect With the Experts&lt;/strong&gt; sessions for direct access to NVIDIA engineers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;300+ exhibits&lt;/strong&gt; showcasing groundbreaking innovations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GTC 2025 drew 25,000 attendees, and 2026 is expected to be even bigger. The hallway conversations, structured meetups, and after-hours events (who can forget last year's Taiwanese night market?) are where real connections happen. The &lt;strong&gt;Startup Showcase&lt;/strong&gt; highlights emerging companies with founders demoing prototypes. Enterprise leaders from companies like Microsoft, Google, Amazon, Meta, Siemens, and Mercedes-Benz will be sharing how they're deploying AI at scale.&lt;/p&gt;

&lt;p&gt;As someone who runs a 17,000+ member community and organizes Docker meetups worldwide, I can't overstate the value of being in the room where it happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Sessions I'm Most Excited About
&lt;/h2&gt;

&lt;p&gt;With 500+ sessions to choose from, building your agenda can feel overwhelming. I had the pleasure of receiving a personal invitation from &lt;strong&gt;Kari Briski at NVIDIA&lt;/strong&gt;, and her session picks are spot on. Here are the ones I'm most excited about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81789/" rel="noopener noreferrer"&gt;Open-Source AI Shaping the Next Era of Intelligent Digital Workers [S81789]&lt;/a&gt;&lt;/strong&gt; — This is Kari Briski's own session, and it's one I'd highly recommend catching right after Jensen's keynote. She'll be exploring how open-source AI is driving the next era of intelligent digital workers — a topic that's incredibly relevant to anyone building agentic systems and multi-agent architectures. Don't miss it!&lt;/p&gt;

&lt;h3&gt;
  
  
  More Sessions Kari Recommends (And I Agree!):
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81791/" rel="noopener noreferrer"&gt;The State of Open-Source AI [S81791]&lt;/a&gt;&lt;/strong&gt; — Hugging Face and NVIDIA team up to discuss where open-source AI stands today. As someone who believes deeply in the power of open communities (we built Collabnix on that very principle!), this session is a must-attend. Open models are catching up to the frontier fast, and this will be the definitive update on that trajectory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81719/" rel="noopener noreferrer"&gt;Nemotron Unpacked: Build, Fine-Tune, and Deploy NVIDIA's Open Models [S81719]&lt;/a&gt;&lt;/strong&gt; — Presented by Bryan Catanzaro, VP of NVIDIA Research. NVIDIA's Nemotron family of open models has been a game-changer for developers building agentic systems. This session will go deep on how to build, fine-tune, and deploy these models — exactly the kind of hands-on knowledge you can take back to your projects immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81612/" rel="noopener noreferrer"&gt;Practical Context Engineering: Eliminate Bugs With High-Signal AI Code Review [S81612]&lt;/a&gt;&lt;/strong&gt; — CodeRabbit joins to talk about context engineering for AI-powered code review. If you're working with AI coding assistants (and who isn't at this point?), understanding how to feed the right context to eliminate bugs is critical. This is where agentic AI meets real-world developer workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/sessions/gtc26-s81528/" rel="noopener noreferrer"&gt;Code with Context: Build an Agentic IDE that Truly Understands Your Codebase [S81528]&lt;/a&gt;&lt;/strong&gt; — Cursor presents their approach to building an agentic IDE that genuinely understands your entire codebase. For developers building multi-agent systems and complex applications, an IDE that can reason about your code contextually is the ultimate productivity multiplier.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Register (Virtual Is FREE!)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Digital registration is completely free&lt;/strong&gt; — there's no reason not to sign up. Whether you attend in person or virtually, you'll get access to Jensen's keynote and hundreds of sessions on demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nvda.ws/4klalVe" rel="noopener noreferrer"&gt;Register for GTC 2026 here&lt;/a&gt;&lt;/strong&gt; (use this link to register through our community!)&lt;/p&gt;

&lt;p&gt;For in-person attendees, use referral code &lt;strong&gt;GTC-NVR6N0BG&lt;/strong&gt; for an &lt;strong&gt;extra 25% off&lt;/strong&gt; your Conference pass. Options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;4-Day Conference Pass&lt;/strong&gt; — full access including the live keynote, all sessions, exhibits, and networking events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1-Day Conference Pass&lt;/strong&gt; — flexible single-day attendance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exhibits Only Pass&lt;/strong&gt; — access to the exhibit hall&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Access&lt;/strong&gt; — FREE! Included with all pass types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Academic, government, and non-profit attendees can save &lt;strong&gt;40%&lt;/strong&gt; with a qualifying email address. Group discounts of &lt;strong&gt;30%+&lt;/strong&gt; are available when purchasing three or more of the same pass type.&lt;/p&gt;

&lt;p&gt;The event takes place at the &lt;strong&gt;San Jose McEnery Convention Center&lt;/strong&gt; with the keynote at the &lt;strong&gt;SAP Center&lt;/strong&gt;. Book your hotel early through the official EventSphere portal — last year, hotel prices near the venue soared to $2,500/night!&lt;/p&gt;

&lt;p&gt;Browse the full &lt;strong&gt;&lt;a href="https://www.nvidia.com/gtc/session-catalog/" rel="noopener noreferrer"&gt;GTC Session Catalog&lt;/a&gt;&lt;/strong&gt; to start building your personalized agenda.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎁 Collabnix Community Giveaway!
&lt;/h2&gt;

&lt;p&gt;To celebrate GTC 2026, I'm running a special giveaway for the Collabnix community! Register for GTC using &lt;a href="https://nvda.ws/4klalVe" rel="noopener noreferrer"&gt;this link&lt;/a&gt; and you could win a &lt;strong&gt;$100 BrevCode credit&lt;/strong&gt; — perfect for powering your next AI project in the cloud.&lt;/p&gt;

&lt;p&gt;Stay tuned on our &lt;a href="https://collabnix.com" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; and &lt;a href="https://collabnix.com" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; channels for giveaway details, a community watch party for Jensen's keynote, and post-event highlights where we'll break down the biggest announcements together.&lt;/p&gt;




&lt;h2&gt;
  
  
  See You in San Jose!
&lt;/h2&gt;

&lt;p&gt;GTC is more than just a conference. It's an opportunity to connect, learn, and share with the brightest minds in AI and beyond. Whether you're building agentic AI systems, deploying AI at the edge, containerizing ML workloads, or simply trying to understand where this incredible wave of innovation is heading — GTC 2026 is where you need to be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nvda.ws/4klalVe" rel="noopener noreferrer"&gt;Register for free (virtual) here&lt;/a&gt;&lt;/strong&gt; and join me at the biggest AI event of the year!&lt;/p&gt;

&lt;p&gt;I'm looking forward to seeing you there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ajeet Singh Raina is a Docker Captain, founder of Collabnix, and Community Content Marketing Specialist at Docker Inc. Follow him on Twitter &lt;a href="https://twitter.com/ajeetraina" rel="noopener noreferrer"&gt;@ajeetraina&lt;/a&gt; and connect with the community at &lt;a href="https://collabnix.com" rel="noopener noreferrer"&gt;collabnix.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#NVIDIAGTC #GTC2026 #AI #AgenticAI #Docker #DevOps #MachineLearning&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Let's Build, Share and Deploy Agents: The Docker cagent Workshop</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Wed, 04 Feb 2026 03:51:15 +0000</pubDate>
      <link>https://forem.com/ajeetraina/lets-build-share-and-deploy-agents-the-docker-cagent-workshop-14ni</link>
      <guid>https://forem.com/ajeetraina/lets-build-share-and-deploy-agents-the-docker-cagent-workshop-14ni</guid>
      <description>&lt;p&gt;&lt;a href="https://www.ajeetraina.com/moltbook-i-spent-a-weekend-digging-into-how-this-ai-only-social-network-actually-works/" rel="noopener noreferrer"&gt;The world of AI&lt;/a&gt; is shifting fast. We've moved from single-model chatbots to multi-agent systems where specialized AI agents collaborate, delegate, and get real work done — just like a well-orchestrated team of microservices. &lt;a href="https://www.ajeetraina.com/the-ai-agent-revolution-is-already-here-and-its-not-what-you-think/" rel="noopener noreferrer"&gt;And if you've been following along&lt;/a&gt;, you know I believe agents are the new microservices.&lt;/p&gt;

&lt;p&gt;That's why I'm thrilled to announce an upcoming hands-on workshop: "Let's Build, Share and Deploy Agents: The Docker cagent Workshop."&lt;br&gt;
Just like Docker gave us Build, Ship, Run for containers, &lt;a href="https://www.ajeetraina.com/docker-cagent-a-command-line-tool-for-running-ai-agents/" rel="noopener noreferrer"&gt;cagent&lt;/a&gt; brings the same philosophy to AI agents — Build your agents, Share them with your team, and Deploy them anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's This Workshop About?
&lt;/h2&gt;

&lt;p&gt;In this workshop, we'll go beyond the theory and get our hands dirty &lt;a href="https://www.ajeetraina.com/docker-cagent-build-and-orchestrate-ai-agents-without-writing-code/" rel="noopener noreferrer"&gt;building, orchestrating, and deploying AI agents using cagent&lt;/a&gt; — Docker's approach to building AI agent teams. Think of it as Docker Compose, but for AI agents.&lt;/p&gt;

&lt;p&gt;Whether you're a developer curious about multi-agent systems or a DevOps engineer looking to understand the next wave of AI infrastructure, this workshop is designed for you.&lt;/p&gt;

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

&lt;p&gt;By the end of this session, you'll walk away with practical knowledge on how to define and configure AI agents using cagent, orchestrate multi-agent teams that collaborate on complex tasks, deploy agent systems using familiar Docker workflows, and integrate tools and APIs into your agent pipelines using MCP (Model Context Protocol).&lt;/p&gt;

&lt;p&gt;This isn't a slide-heavy lecture — expect to spend most of the time building real, working agent setups on your own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Attend?
&lt;/h2&gt;

&lt;p&gt;This workshop is perfect for developers and DevOps engineers exploring AI agent architectures, Docker users who want to extend their skills into the AI space, anyone curious about multi-agent orchestration and the future of AI-powered development, and tech leads evaluating agent frameworks for their teams.&lt;br&gt;
No prior experience with AI agents is required — just bring your laptop, a Docker installation, and your curiosity.&lt;/p&gt;

&lt;p&gt;Register Now — Seats Are Limited!&lt;/p&gt;

&lt;p&gt;We're keeping this workshop intimate to ensure everyone gets hands-on support. If you're interested, please fill out the registration form below to secure your spot:&lt;br&gt;
👉 &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSd8JM26mCHC4WuyZN5ZsUB-KShzjiBAYGTNulLYrslrWEcaJA/viewform" rel="noopener noreferrer"&gt;Register Here — Fill Out the Form&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Don't wait too long — once seats are full, they're full.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Build, Share and Deploy?
&lt;/h2&gt;

&lt;p&gt;If you've been part of the Collabnix community, you've seen how Docker's Build, Ship, Run philosophy transformed the way we build and ship software. Agents are the next evolution — and cagent brings that same Docker DNA to the AI agent world.&lt;/p&gt;

&lt;p&gt;Instead of monolithic AI systems, we're moving toward composable, containerized agents that can be built with simple configurations, shared across teams and communities, and deployed anywhere Docker runs. The Docker ecosystem is uniquely positioned to lead this shift, and cagent is at the heart of it.&lt;/p&gt;

&lt;p&gt;This workshop is your chance to get ahead of the curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Got Questions?
&lt;/h2&gt;

&lt;p&gt;Drop a comment below, reach out on the &lt;a href="https://launchpass.com/collabnix" rel="noopener noreferrer"&gt;Collabnix Slack&lt;/a&gt;, or ping me on &lt;a href="https://x.com/ajeetsraina" rel="noopener noreferrer"&gt;Twitter/X&lt;/a&gt;. I'd love to hear what you're most excited to learn.&lt;/p&gt;

&lt;p&gt;See you at the workshop! 🐳&lt;/p&gt;

</description>
      <category>agents</category>
      <category>docker</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Teaching Clawdbot About Docker</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Mon, 26 Jan 2026 03:32:33 +0000</pubDate>
      <link>https://forem.com/ajeetraina/teaching-clawdbot-about-docker-165g</link>
      <guid>https://forem.com/ajeetraina/teaching-clawdbot-about-docker-165g</guid>
      <description>&lt;p&gt;Last weekend, I stumbled onto something called &lt;a href="https://clawd.bot/" rel="noopener noreferrer"&gt;Clawdbot&lt;/a&gt;. It's basically a self-hosted AI assistant that you can chat with through Discord, Slack, or even WhatsApp. Cool, but I wasn't sure what I'd actually use it for.&lt;/p&gt;

&lt;p&gt;Then it hit me — what if I could just &lt;em&gt;ask&lt;/em&gt; it about my Docker environment instead of typing commands?&lt;/p&gt;

&lt;p&gt;So I tried it. And honestly? I was impressed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Bother When We Have Ask Gordon?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/contributors/ajeet-singh-raina/?ref=ajeetraina.com" rel="noopener noreferrer"&gt;I work at Docker&lt;/a&gt;. I use &lt;a href="https://docs.docker.com/ai/gordon/?ref=ajeetraina.com" rel="noopener noreferrer"&gt;Ask Gordon&lt;/a&gt; daily — it's brilliant for Dockerfile optimization, DHI migrations, and debugging right inside Docker Desktop.&lt;/p&gt;

&lt;p&gt;But here's the thing: I'm not always in Docker Desktop.&lt;/p&gt;

&lt;p&gt;Sometimes I'm on my phone in a Discord server and want to quickly check if my home lab containers are healthy. Sometimes I want my Collabnix community members to interact with Docker through a bot. Sometimes I just want an assistant that does Docker &lt;em&gt;and&lt;/em&gt; a dozen other things — all in one place.&lt;/p&gt;

&lt;p&gt;That's where Clawdbot comes in. It's not replacing Gordon. It's extending Docker intelligence to places Gordon doesn't go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating the Docker Skill
&lt;/h2&gt;

&lt;p&gt;Clawdbot has this concept of "skills" — basically markdown files that tell the AI how to do specific things. So I created a simple Docker skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p ~/clawd/skills/docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what my &lt;code&gt;SKILL.md&lt;/code&gt; file looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### 🐳 Docker Management Skill

You help users manage Docker containers, images, and compose stacks.
Use the exec tool to run Docker commands when asked.

### Container Operations

| Task | Command |
|------|---------|
| List running | `docker ps` |
| List all | `docker ps -a` |
| View logs | `docker logs &amp;lt;name&amp;gt; --tail 100` |
| Follow logs | `docker logs &amp;lt;name&amp;gt; -f --tail 50` |
| Stats | `docker stats --no-stream` |
| Inspect | `docker inspect &amp;lt;name&amp;gt;` |
| Exec into | `docker exec -it &amp;lt;name&amp;gt; sh` |
| Restart | `docker restart &amp;lt;name&amp;gt;` |
| Stop | `docker stop &amp;lt;name&amp;gt;` |

### Image Operations

| Task | Command |
|------|---------|
| List images | `docker images` |
| Pull image | `docker pull &amp;lt;image&amp;gt;` |
| Build | `docker build -t &amp;lt;name&amp;gt; .` |
| Security scan | `docker scout cves &amp;lt;image&amp;gt;` |
| Recommendations | `docker scout recommendations &amp;lt;image&amp;gt;` |

### Docker Compose

| Task | Command |
|------|---------|
| List services | `docker compose ps` |
| Start stack | `docker compose up -d` |
| Stop stack | `docker compose down` |
| View logs | `docker compose logs --tail 50` |
| Pull updates | `docker compose pull` |

### System &amp;amp; Cleanup

| Task | Command |
|------|---------|
| Disk usage | `docker system df` |
| Detailed usage | `docker system df -v` |
| Prune all | `docker system prune -f` |
| List networks | `docker network ls` |
| List volumes | `docker volume ls` |

### Output Formatting

For cleaner output, use format flags:


docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"



docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"


### Safety Rules

- ALWAYS confirm before running: rm, prune, down, stop, kill
- Limit log output with --tail to avoid flooding
- Never expose secrets or env vars in responses
- When in doubt, show the command first and ask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key was telling it &lt;em&gt;when&lt;/em&gt; to use these commands and &lt;em&gt;how&lt;/em&gt; to present the output in a way that's actually useful. Notice the safety rules at the bottom — I don't want it randomly pruning my images without asking!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment It Clicked
&lt;/h2&gt;

&lt;p&gt;I opened the Clawdbot dashboard and typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; "Show me all my Docker images"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of dumping 75 lines of raw output, it came back with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Here's your Docker image collection:**

| Category | Count | Notable |
|----------|-------|---------|
| DHI/Custom | ~20 | kafka, kubectl, prometheus |
| Docker Official | 7 | sandbox-templates, lsp |
| Databases | 3 | MySQL 8.0, Postgres 18, Redis |
| MCP Servers | 4 | github, hackernews |
| Base Images | 6 | alpine, busybox, ubuntu |

**Biggest space hogs:**
- armlimited/arm-mcp — 3.06GB
- docker/sandbox-templates:claude-code — 1.84GB
- docs-server:latest — 2.33GB

**Total:** ~75 images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then it asked: "Want me to help clean up unused ones?"&lt;/p&gt;

&lt;p&gt;That's when I realized — this isn't just running commands. It's actually &lt;em&gt;understanding&lt;/em&gt; my Docker environment and presenting it in a way that makes sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Use It For Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quick health checks:&lt;/strong&gt; "Are any containers restarting?" — It checks and tells me in plain English.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup sessions:&lt;/strong&gt; "Find images I haven't used in a month" — It identifies candidates and asks before removing anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; "Why is my nginx container unhealthy?" — It pulls logs, checks the health status, and summarizes what's wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning:&lt;/strong&gt; My teammates can ask it Docker questions and get helpful answers without memorizing flags.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Try It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Docker (my preference)&lt;/strong&gt;&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;# Clone the repo&lt;/span&gt;
git clone https://github.com/clawdbot/clawdbot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;clawdbot

&lt;span class="c"&gt;# Run the setup script — handles everything&lt;/span&gt;
./docker-setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This builds the image, runs onboarding, and starts the gateway. Open &lt;code&gt;http://127.0.0.1:18789/&lt;/code&gt; and paste the token it generates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Direct install&lt;/strong&gt;&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://clawd.bot/install.sh | bash
clawdbot onboard &lt;span class="nt"&gt;--install-daemon&lt;/span&gt;
clawdbot gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Then create your Docker skill:&lt;/strong&gt;&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/clawd/skills/docker
&lt;span class="c"&gt;# Add your SKILL.md file with Docker commands&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole thing took me maybe 15 minutes.&lt;/p&gt;

</description>
      <category>clawdbot</category>
      <category>claude</category>
      <category>docker</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>Getting Started with Clawdbot: The Complete Step-by-Step Guide</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Mon, 26 Jan 2026 02:23:43 +0000</pubDate>
      <link>https://forem.com/ajeetraina/getting-started-with-clawdbot-the-complete-step-by-step-guide-2ffj</link>
      <guid>https://forem.com/ajeetraina/getting-started-with-clawdbot-the-complete-step-by-step-guide-2ffj</guid>
      <description>&lt;p&gt;&lt;em&gt;Deploy your personal AI assistant across WhatsApp, Telegram, Discord, and 10+ messaging platforms&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Clawdbot project has been renamed to OpenClaw&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openclaw.io" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/a&gt; is an open-source, self-hosted personal AI assistant that connects to your favorite messaging platforms. Unlike cloud-based AI assistants, Clawdbot runs entirely on your infrastructure, giving you complete control over your data while providing seamless AI interactions across WhatsApp, Telegram, Discord, Slack, Signal, iMessage, and more.&lt;/p&gt;

&lt;p&gt;This guide will take you from zero to a fully working &lt;a href="https://github.com/clawdbot/clawdbot" rel="noopener noreferrer"&gt;Clawdbot &lt;/a&gt;instance in under 30 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Install the CLI&lt;/li&gt;
&lt;li&gt;Run the Onboarding Wizard&lt;/li&gt;
&lt;li&gt;Start the Gateway&lt;/li&gt;
&lt;li&gt;Verify Installation&lt;/li&gt;
&lt;li&gt;Connect Your First Channel&lt;/li&gt;
&lt;li&gt;Understanding DM Safety &amp;amp; Pairing&lt;/li&gt;
&lt;li&gt;Send Your First Message&lt;/li&gt;
&lt;li&gt;Essential Commands Reference&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 0: Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before installing Clawdbot, ensure your system meets these requirements:&lt;/p&gt;

&lt;h3&gt;
  
  
  System Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version 22 or higher (required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operating System&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS, Linux, or Windows (via WSL2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimum 2GB RAM recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~500MB for installation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Check Node.js Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Should output: v22.x.x or higher&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to install or upgrade Node.js:&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;# Using nvm (recommended)&lt;/span&gt;
curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc  &lt;span class="c"&gt;# or ~/.zshrc&lt;/span&gt;
nvm &lt;span class="nb"&gt;install &lt;/span&gt;22
nvm use 22

&lt;span class="c"&gt;# Or using Homebrew (macOS)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;node@22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows Users: Install WSL2 First
&lt;/h3&gt;

&lt;p&gt;Windows users &lt;strong&gt;must&lt;/strong&gt; use WSL2 (Windows Subsystem for Linux). Native Windows is not supported.&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="c"&gt;# In PowerShell (Admin)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# After restart, open Ubuntu and continue with Linux instructions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Optional but Recommended
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brave Search API Key&lt;/strong&gt;: For web search capabilities&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get your key at &lt;a href="https://brave.com/search/api/" rel="noopener noreferrer"&gt;https://brave.com/search/api/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configure later with: &lt;code&gt;clawdbot configure --section web&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;pnpm&lt;/strong&gt;: If building from source&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1: Install the Clawdbot CLI
&lt;/h2&gt;

&lt;p&gt;Choose your preferred installation method:&lt;/p&gt;

&lt;h3&gt;
  
  
  Method A: Quick Install Script (Recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;macOS / Linux:&lt;/strong&gt;&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://clawd.bot/install.sh | bash
&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%2Fpmew0bmb4p9qf8mqjerv.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%2Fpmew0bmb4p9qf8mqjerv.png" alt="clawdinstall" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (PowerShell in WSL2):&lt;/strong&gt;&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;# Inside WSL2 Ubuntu terminal&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://clawd.bot/install.sh | bash
&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%2Fu6dsoo3x2fu8atze4wyc.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%2Fu6dsoo3x2fu8atze4wyc.png" alt="clawdinstallationprogress" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Method B: Global npm Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; clawdbot@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with pnpm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-g&lt;/span&gt; clawdbot@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Should output the current version number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing ClawdBot using Docker
&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;# Clone the repo&lt;/span&gt;
git clone https://github.com/clawdbot/clawdbot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;clawdbot

&lt;span class="c"&gt;# Run the setup script — handles everything&lt;/span&gt;
./docker-setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This builds the image, runs onboarding, and starts the gateway. Open &lt;code&gt;http://127.0.0.1:18789/&lt;/code&gt; and paste the token it generates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Run the Onboarding Wizard
&lt;/h2&gt;

&lt;p&gt;The onboarding wizard is the easiest way to configure Clawdbot. It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model and authentication setup&lt;/li&gt;
&lt;li&gt;Gateway configuration&lt;/li&gt;
&lt;li&gt;Channel connections (WhatsApp, Telegram, Discord, etc.)&lt;/li&gt;
&lt;li&gt;Security settings (DM pairing)&lt;/li&gt;
&lt;li&gt;Background service installation&lt;/li&gt;
&lt;/ul&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%2Fc9mr3mk4wzet6qg94xor.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%2Fc9mr3mk4wzet6qg94xor.png" alt="onboarding" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Launch the Wizard
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot onboard &lt;span class="nt"&gt;--install-daemon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What the Wizard Will Ask
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Gateway Mode
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Gateway mode:
  ❯ Local (run on this machine)
    Remote (connect to existing gateway)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose &lt;strong&gt;Local&lt;/strong&gt; for your first installation.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Authentication Method
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Authentication method:
  ❯ Anthropic API Key (recommended)
    OpenAI API Key
    OAuth (Claude Pro/Max subscription)
    OpenAI Code (Codex subscription)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recommended&lt;/strong&gt;: Use an &lt;strong&gt;Anthropic API Key&lt;/strong&gt; for the best experience with Claude models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get your API key at: &lt;a href="https://console.anthropic.com/" rel="noopener noreferrer"&gt;https://console.anthropic.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The wizard will securely store it in &lt;code&gt;~/.clawdbot/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Model Selection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Default model:
  ❯ anthropic/claude-opus-4-5 (best quality)
    anthropic/claude-sonnet-4-5 (balanced)
    openai/gpt-4-turbo
    openai/gpt-4o
&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%2F788ztv4fqxz5i8quy08j.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%2F788ztv4fqxz5i8quy08j.png" alt="modelselection" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Channel Configuration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Which channels do you want to enable?
  ◉ WhatsApp
  ◯ Telegram
  ◯ Discord
  ◯ Slack
  ◯ Signal
&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%2F0dtqhpmjl6h5tsy0fcay.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%2F0dtqhpmjl6h5tsy0fcay.png" alt="channelselection" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the channels you want to use. You can add more later.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Personal Phone Number (for WhatsApp)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Your WhatsApp phone number (for allowlist):
  +1234567890
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter your phone number in E.164 format (with country code). This adds you to the allowlist so you can message your bot.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Install Background Service
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Install as background service?
  ❯ Yes (recommended - auto-starts on boot)
    No (manual start only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose &lt;strong&gt;Yes&lt;/strong&gt; to have Clawdbot run automatically.&lt;/p&gt;

&lt;p&gt;For Discord, you might need to configure bot token first:&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%2Fpvbyexvols20yu5opdwj.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%2Fpvbyexvols20yu5opdwj.png" alt="discordbot" width="800" height="427"&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%2F0etg0wf0il12cheviji5.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%2F0etg0wf0il12cheviji5.png" alt="discordbot2" width="800" height="471"&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%2Ft7yu9739k445fvv4e0nj.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%2Ft7yu9739k445fvv4e0nj.png" alt="Discord3" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the first time, I faced the following issue - Error 4014 means your Discord bot is trying to use privileged intents that haven't been enabled in the Discord Developer Portal.&lt;/p&gt;

&lt;p&gt;I followd the steps to fix Discord Intents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Discord Developer Portal&lt;/li&gt;
&lt;li&gt;Select your bot application&lt;/li&gt;
&lt;li&gt;Navigate to Bot → Privileged Gateway Intents&lt;/li&gt;
&lt;li&gt;Enable these intents:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ MESSAGE CONTENT INTENT (required for reading messages)&lt;br&gt;
✅ SERVER MEMBERS INTENT (optional, for member info)&lt;br&gt;
✅ PRESENCE INTENT (optional)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Save Changes&lt;/li&gt;
&lt;/ul&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%2Fcyzrdxzp3d7h4f22sa6m.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%2Fcyzrdxzp3d7h4f22sa6m.png" alt="Discord4" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By now, your Gateway should run successfully!&lt;/p&gt;

&lt;p&gt;✅ Gateway listening on ws://127.0.0.1:18789&lt;br&gt;
✅ Browser control on &lt;a href="http://127.0.0.1:18791" rel="noopener noreferrer"&gt;http://127.0.0.1:18791&lt;/a&gt;&lt;br&gt;
✅ Model: anthropic/claude-opus-4-5&lt;br&gt;
✅ Canvas mounted&lt;br&gt;
✅ Heartbeat started&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%2Fkusd503n4ha1alyokqiu.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%2Fkusd503n4ha1alyokqiu.png" alt="Discord bot Invite" width="800" height="914"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuration Files Created
&lt;/h3&gt;

&lt;p&gt;After the wizard completes, these files are created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.clawdbot/
├── clawdbot.json          # Main configuration
├── credentials/
│   ├── oauth.json         # OAuth tokens (if using)
│   └── whatsapp/
│       └── default/
│           └── creds.json # WhatsApp session
└── agents/
    └── main/
        └── agent/
            └── auth-profiles.json  # API keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Start the Gateway
&lt;/h2&gt;

&lt;p&gt;If you installed the background service, the gateway should already be running. Check its status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot gateway status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual Start (if needed)
&lt;/h3&gt;

&lt;p&gt;For foreground operation with verbose logging:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You should see output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Gateway] Starting on ws://127.0.0.1:18789
[Gateway] Control UI available at http://127.0.0.1:18789/
[Gateway] WhatsApp channel initializing...
[Gateway] Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access the Dashboard
&lt;/h3&gt;

&lt;p&gt;Open your browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:18789/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the Control UI where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor gateway health&lt;/li&gt;
&lt;li&gt;View active sessions&lt;/li&gt;
&lt;li&gt;Check channel status&lt;/li&gt;
&lt;li&gt;Send test messages&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you configured a gateway token, you'll need to enter it in the Control UI settings.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Verify the Installation
&lt;/h2&gt;

&lt;p&gt;Run these commands to ensure everything is working:&lt;/p&gt;

&lt;h3&gt;
  
  
  Check Overall Status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gateway: running (ws://127.0.0.1:18789)
Auth: configured (anthropic)
Channels:
  - whatsapp: ready (linked)
  - telegram: not configured
  - discord: not configured
Sessions: 0 active
&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%2F2dn384jv2373xkj3pgde.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%2F2dn384jv2373xkj3pgde.png" alt="test1" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Health Check
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gateway Health: OK
  Uptime: 5m 23s
  Memory: 124MB
  Auth: valid
  Channels: 1/1 healthy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run Doctor (Comprehensive Check)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This performs a comprehensive system check and reports any issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Connect Your First Channel
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: WhatsApp (Most Popular)
&lt;/h3&gt;

&lt;p&gt;WhatsApp uses QR-based device linking via WhatsApp Web protocol.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 5.1: Get a Phone Number
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Recommended&lt;/strong&gt;: Use a &lt;strong&gt;dedicated phone number&lt;/strong&gt; for your Clawdbot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Old spare phone with an eSIM&lt;/li&gt;
&lt;li&gt;Prepaid SIM card&lt;/li&gt;
&lt;li&gt;WhatsApp Business on a separate number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Alternative&lt;/strong&gt;: Use your personal number (requires &lt;code&gt;selfChatMode&lt;/code&gt;)&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 5.2: Link WhatsApp
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;This displays a QR code in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;█▀▀▀▀▀█ ▄▄▄▄▄ █▀▀▀▀▀█
█ ███ █ █▄▄▄█ █ ███ █
█ ▀▀▀ █ ▀▄▄▄▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ █ █ ▀▀▀▀▀▀▀
[Scan this QR code with WhatsApp]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5.3: Scan the QR Code
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open WhatsApp on your phone&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Linked Devices&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Link a Device&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scan the QR code displayed in your terminal&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 5.4: Verify Connection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot channels status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WhatsApp:
  Status: connected
  Account: +1234567890
  Linked: true
  Last activity: just now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  WhatsApp Configuration
&lt;/h4&gt;

&lt;p&gt;Your &lt;code&gt;~/.clawdbot/clawdbot.json&lt;/code&gt; should include:&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;"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;"whatsapp"&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;"dmPolicy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allowlist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"+1234567890"&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;p&gt;&lt;strong&gt;Configuration Options:&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;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dmPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;allowlist&lt;/code&gt;, &lt;code&gt;pairing&lt;/code&gt;, &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pairing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allowFrom&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Array of allowed phone numbers (E.164)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;selfChatMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable if using personal number&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;groupPolicy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;allowlist&lt;/code&gt;, &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;allowlist&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Option B: Telegram
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 5.1: Create a Bot
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open Telegram and message &lt;a href="https://t.me/BotFather" rel="noopener noreferrer"&gt;@BotFather&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Send &lt;code&gt;/newbot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Follow the prompts to name your bot&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;bot token&lt;/strong&gt; provided&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 5.2: Configure Telegram
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot configure &lt;span class="nt"&gt;--section&lt;/span&gt; telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or manually edit &lt;code&gt;~/.clawdbot/clawdbot.json&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&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;"telegram"&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;"botToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123456789:ABCdefGHIjklMNOpqrsTUVwxyz"&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;h4&gt;
  
  
  Step 5.3: Restart Gateway
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option C: Discord
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 5.1: Create a Discord Application
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &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;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Bot&lt;/strong&gt; → &lt;strong&gt;Add Bot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;bot token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enable required intents:

&lt;ul&gt;
&lt;li&gt;Message Content Intent&lt;/li&gt;
&lt;li&gt;Server Members Intent (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 5.2: Configure Discord
&lt;/h4&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;"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;"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="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;h4&gt;
  
  
  Step 5.3: Invite Bot to Server
&lt;/h4&gt;

&lt;p&gt;Create an invite URL with required permissions:&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/api/oauth2/authorize?client_id=YOUR_APP_ID&amp;amp;permissions=274877908992&amp;amp;scope=bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: DM Safety and Pairing
&lt;/h2&gt;

&lt;p&gt;Clawdbot implements a &lt;strong&gt;pairing system&lt;/strong&gt; to prevent unwanted message processing. This is crucial for security.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Pairing Works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unknown Sender → Sends DM → Clawdbot
                              │
                              ▼
                    ┌─────────────────┐
                    │ Generate 6-digit│
                    │  pairing code   │
                    └────────┬────────┘
                              │
                              ▼
              Sender receives: "Pair with code: 123456"
              (Message is NOT processed)
                              │
                              ▼
            Admin approves: clawdbot pairing approve whatsapp 123456
                              │
                              ▼
                   Sender added to allowlist
                   Future messages processed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Managing Pairing Requests
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;List pending requests:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot pairing list whatsapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pending pairing requests for whatsapp:
  Code: 123456  Phone: +1987654321  Expires: 59m
  Code: 789012  Phone: +1555123456  Expires: 45m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Approve a request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot pairing approve whatsapp 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reject a request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot pairing reject whatsapp 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DM Policies Explained
&lt;/h3&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;code&gt;pairing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unknown senders get pairing code (default, most secure)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allowlist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only explicitly allowed numbers can message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;open&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anyone can message (requires &lt;code&gt;allowFrom: ["*"]&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DMs completely disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recommended&lt;/strong&gt;: Start with &lt;code&gt;pairing&lt;/code&gt; and approve trusted contacts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Send Your First Message
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method A: Via WhatsApp/Telegram
&lt;/h3&gt;

&lt;p&gt;Simply send a message to your Clawdbot from an approved number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: Hello Clawdbot!
Clawdbot: Hello! I'm Clawd, your personal AI assistant. How can I help you today? 🦞
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method B: Via CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot message send &lt;span class="nt"&gt;--target&lt;/span&gt; +1234567890 &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Hello from CLI!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method C: Via Agent CLI
&lt;/h3&gt;

&lt;p&gt;For interactive conversations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot agent &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"What's the weather like today?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With thinking mode enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot agent &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Solve this logic puzzle..."&lt;/span&gt; &lt;span class="nt"&gt;--thinking&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method D: Via WebChat
&lt;/h3&gt;

&lt;p&gt;Open the Control UI dashboard and use the WebChat interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:18789/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 8: Essential Commands Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gateway Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check gateway status&lt;/span&gt;
clawdbot gateway status

&lt;span class="c"&gt;# Start gateway (foreground)&lt;/span&gt;
clawdbot gateway &lt;span class="nt"&gt;--port&lt;/span&gt; 18789 &lt;span class="nt"&gt;--verbose&lt;/span&gt;

&lt;span class="c"&gt;# Restart gateway&lt;/span&gt;
clawdbot gateway restart

&lt;span class="c"&gt;# Stop gateway&lt;/span&gt;
clawdbot gateway stop

&lt;span class="c"&gt;# View logs&lt;/span&gt;
clawdbot logs &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Channel Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all channels&lt;/span&gt;
clawdbot channels status

&lt;span class="c"&gt;# Login to WhatsApp&lt;/span&gt;
clawdbot channels login

&lt;span class="c"&gt;# Logout from WhatsApp&lt;/span&gt;
clawdbot channels &lt;span class="nb"&gt;logout&lt;/span&gt;

&lt;span class="c"&gt;# Login to specific account (multi-account)&lt;/span&gt;
clawdbot channels login &lt;span class="nt"&gt;--account&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Session Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List active sessions&lt;/span&gt;
clawdbot sessions list

&lt;span class="c"&gt;# View session history&lt;/span&gt;
clawdbot sessions &lt;span class="nb"&gt;history&lt;/span&gt; &amp;lt;session-id&amp;gt;

&lt;span class="c"&gt;# Reset a session&lt;/span&gt;
clawdbot sessions reset &amp;lt;session-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pairing Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List pending pairing requests&lt;/span&gt;
clawdbot pairing list whatsapp

&lt;span class="c"&gt;# Approve pairing&lt;/span&gt;
clawdbot pairing approve whatsapp &amp;lt;code&amp;gt;

&lt;span class="c"&gt;# Reject pairing&lt;/span&gt;
clawdbot pairing reject whatsapp &amp;lt;code&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open configuration wizard&lt;/span&gt;
clawdbot configure

&lt;span class="c"&gt;# Configure specific section&lt;/span&gt;
clawdbot configure &lt;span class="nt"&gt;--section&lt;/span&gt; web
clawdbot configure &lt;span class="nt"&gt;--section&lt;/span&gt; telegram

&lt;span class="c"&gt;# Run doctor (diagnostic)&lt;/span&gt;
clawdbot doctor

&lt;span class="c"&gt;# View full status&lt;/span&gt;
clawdbot status &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chat Commands (In-Chat)
&lt;/h3&gt;

&lt;p&gt;Send these commands directly in WhatsApp/Telegram:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show session status (model, tokens, cost)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/new&lt;/code&gt; or &lt;code&gt;/reset&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Reset the conversation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/compact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compress conversation context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/think &amp;lt;level&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set thinking level (off/minimal/low/medium/high/xhigh)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`/verbose on\&lt;/td&gt;
&lt;td&gt;off`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`/usage off\&lt;/td&gt;
&lt;td&gt;tokens\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}`/activation mention\&lt;/td&gt;
&lt;td&gt;always`&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 9: Next Steps
&lt;/h2&gt;

&lt;p&gt;Congratulations! You have a working Clawdbot installation. Here's what to explore next:&lt;/p&gt;

&lt;h3&gt;
  
  
  Add More Channels
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/channels/telegram" rel="noopener noreferrer"&gt;docs.clawd.bot/channels/telegram&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/channels/discord" rel="noopener noreferrer"&gt;docs.clawd.bot/channels/discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/channels/slack" rel="noopener noreferrer"&gt;docs.clawd.bot/channels/slack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/channels/signal" rel="noopener noreferrer"&gt;docs.clawd.bot/channels/signal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Teams&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/channels/msteams" rel="noopener noreferrer"&gt;docs.clawd.bot/channels/msteams&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install Companion Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS Menu Bar App&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/platforms/macos" rel="noopener noreferrer"&gt;docs.clawd.bot/platforms/macos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS Node&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/platforms/ios" rel="noopener noreferrer"&gt;docs.clawd.bot/platforms/ios&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android Node&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/platforms/android" rel="noopener noreferrer"&gt;docs.clawd.bot/platforms/android&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enable Voice Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice Wake&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/nodes/voicewake" rel="noopener noreferrer"&gt;docs.clawd.bot/nodes/voicewake&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talk Mode&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/nodes/talk" rel="noopener noreferrer"&gt;docs.clawd.bot/nodes/talk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configure Remote Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tailscale Integration&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/gateway/tailscale" rel="noopener noreferrer"&gt;docs.clawd.bot/gateway/tailscale&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH Tunnels&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/gateway/remote" rel="noopener noreferrer"&gt;docs.clawd.bot/gateway/remote&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Explore Skills &amp;amp; Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser Control&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/tools/browser" rel="noopener noreferrer"&gt;docs.clawd.bot/tools/browser&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills System&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/tools/skills" rel="noopener noreferrer"&gt;docs.clawd.bot/tools/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation (Cron)&lt;/strong&gt;: &lt;a href="https://docs.clawd.bot/automation/cron-jobs" rel="noopener noreferrer"&gt;docs.clawd.bot/automation/cron-jobs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Customize Your Agent
&lt;/h3&gt;

&lt;p&gt;Create a workspace at &lt;code&gt;~/clawd/&lt;/code&gt; with custom prompts:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/clawd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add these files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; - Agent instructions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SOUL.md&lt;/code&gt; - Personality definition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TOOLS.md&lt;/code&gt; - Custom tool instructions&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clawdbot</category>
      <category>ai</category>
      <category>nlp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Docker Sandboxes: A Deep Dive into Secure AI Agent Isolation</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Sun, 18 Jan 2026 07:24:09 +0000</pubDate>
      <link>https://forem.com/ajeetraina/getting-started-with-docker-sandboxes-a-complete-hands-on-tutorials-and-guide-15b2</link>
      <guid>https://forem.com/ajeetraina/getting-started-with-docker-sandboxes-a-complete-hands-on-tutorials-and-guide-15b2</guid>
      <description>&lt;p&gt;Tools like Claude Code, Gemini CLI, and others can write code, debug issues, install packages, and manage entire development workflows. But with great power comes significant risk: giving an autonomous agent unrestricted access to your local machine opens the door to unintended consequences, from dependency conflicts to catastrophic file system modifications.&lt;/p&gt;

&lt;p&gt;Docker Sandboxes represents Docker's answer to this challenge—a purpose-built isolation layer designed specifically for the age of agentic AI. &lt;a href="https://docs.docker.com/ai/sandboxes/" rel="noopener noreferrer"&gt;Docker Sandboxes&lt;/a&gt; is an experimental feature designed to provide a secure, isolated environment for running AI coding agents locally. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Docker Sandboxes Solves
&lt;/h2&gt;

&lt;p&gt;Before diving into the solution, let's understand the problem space. &lt;/p&gt;

&lt;p&gt;AI coding agents operate differently from traditional development tools. They don't just suggest code; they execute it. They install packages, modify files, run shell commands, and interact with your development environment in ways that can have lasting consequences.&lt;/p&gt;

&lt;p&gt;The uncomfortable truth is that most LLM tools have full access to your machine by default, with only imperfect attempts at blocking risky behavior. The risks fall into several categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File System Risks:&lt;/strong&gt; An agent might modify files outside your project directory, delete important configurations, or make changes that are difficult to reverse. Stories of AI agents accidentally wiping home directories aren't just hypothetical—they've happened. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Conflicts&lt;/strong&gt;: When agents install packages and dependencies globally, they can create conflicts with other projects on your system, leading to the dreaded "it works on my machine" problems in reverse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Vulnerabilities:&lt;/strong&gt; Giving an agent unrestricted network and file access could expose sensitive data or create security holes. Research from NVIDIA's AI Red Team (CVE-2024-12366) demonstrated how AI-generated code can escalate into remote code execution when executed without proper isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential Exposure:&lt;/strong&gt; Agents with access to your full file system might inadvertently expose API keys, SSH credentials, or other secrets stored in configuration files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operating system-level sandboxing approaches have been attempted, but they have fundamental limitations. They sandbox only the agent process itself, not the full environment the agent needs. This means the agent constantly needs to access the host system for basic tasks like installing packages, running code, and managing dependencies, leading to constant permission prompts that interrupt workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Docker Sandboxes?
&lt;/h2&gt;

&lt;p&gt;Docker Sandboxes is an experimental feature introduced in Docker Desktop 4.50+ that lets AI coding agents run safely in isolated containers while maintaining a seamless development experience. The core insight is that container-based isolation is designed for exactly the kind of dynamic, iterative workflows that coding agents need.&lt;/p&gt;

&lt;p&gt;When you run a sandboxed agent, Docker creates a container from a template image and mounts your current working directory into the container at the same absolute path. This means on macOS and Linux, /Users/alice/projects/myapp on your host is also /Users/alice/projects/myapp in the container.&lt;/p&gt;

&lt;p&gt;The sandbox provides several key capabilities. Agents can execute commands, install packages, and modify files inside a containerized workspace that mirrors your local directory. Docker discovers your Git user.name and user.email configuration and injects it into the container so commits made by the agent are attributed to you. On first run, you're prompted to authenticate, and credentials are stored in a Docker volume and reused for future sandboxed agents.&lt;br&gt;
Docker enforces one sandbox per workspace. When you run docker sandbox run  in the same directory, Docker reuses the existing container. This means state—installed packages, temporary files—persists across agent sessions in that workspace.&lt;/p&gt;
&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Getting Started

&lt;ul&gt;
&lt;li&gt;Create a Directory&lt;/li&gt;
&lt;li&gt;Run the Sandbox&lt;/li&gt;
&lt;li&gt;List and Inspect Sandboxes&lt;/li&gt;
&lt;li&gt;Managing Sandboxes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Verify the Isolation

&lt;ul&gt;
&lt;li&gt;Test 1: Check if SSH Directory Exists&lt;/li&gt;
&lt;li&gt;Test 2: Try to Access AWS Credentials&lt;/li&gt;
&lt;li&gt;Test 3: Try to Access Documents Folder&lt;/li&gt;
&lt;li&gt;Test 4: Confirm Project Folder Access&lt;/li&gt;
&lt;li&gt;Test 5: The Nuclear Option&lt;/li&gt;
&lt;li&gt;Test 5b: Sandbox Home Directory Contents&lt;/li&gt;
&lt;li&gt;Test 6: Verify Git Identity Injection&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test Path Matching&lt;/li&gt;
&lt;li&gt;
Test State Persistence

&lt;ul&gt;
&lt;li&gt;Step 1: Install a Package&lt;/li&gt;
&lt;li&gt;Step 2: Exit the Sandbox&lt;/li&gt;
&lt;li&gt;Step 3: Re-enter and Verify&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test Environment Variables&lt;/li&gt;
&lt;li&gt;Test Docker Socket Access&lt;/li&gt;
&lt;li&gt;Real-World Demo: Playwright Browser Testing&lt;/li&gt;
&lt;li&gt;Test Summary&lt;/li&gt;
&lt;li&gt;Key Takeaways&lt;/li&gt;
&lt;/ul&gt;


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

&lt;ul&gt;
&lt;li&gt;Docker Desktop 4.56+&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1. Create a Directory
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /Users/ajeetsraina/sandbox-testing
&lt;span class="nb"&gt;cd&lt;/span&gt; /Users/ajeetsraina/sandbox-testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Run the Sandbox
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run
&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;docker: 'docker sandbox run' requires at least 1 argument

Usage:  docker sandbox run [options] &amp;lt;agent&amp;gt; [agent-options]

See 'docker sandbox run --help' for more information

Available Agents:
  claude          Run Claude AI agent inside a sandbox
  gemini          Run Gemini AI agent inside a sandbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. List and Inspect Sandboxes
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox &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;SANDBOX ID     TEMPLATE                               NAME                               WORKSPACE                            STATUS    CREATED
275d94b417bf   docker/sandbox-templates:claude-code   claude-sandbox-2026-01-11-004116   /Users/ajeetsraina/sandbox-testing   running   2026-01-10 19:12:10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox inspect 275d94b417bf
&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;"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;"275d94b417bf8f4c29f6f3c7317f20f6b9636b3f3121d303149a066d8330428e"&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;"claude-sandbox-2026-01-11-004116"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workspace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/ajeetsraina/sandbox-testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-10T19:12:10.888151834Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"running"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"template"&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/sandbox-templates:claude-code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"labels"&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;"com.docker.sandbox.agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandbox.credentials"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sandbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandbox.workingDirectory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/ajeetsraina/sandbox-testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandbox.workingDirectoryInode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"186434127"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandboxes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"templates"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandboxes.base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ubuntu:questing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sandboxes.flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"com.docker.sdk.client"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0-alpha011"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sdk.container"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0-alpha012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"com.docker.sdk.lang"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"docker/sandbox"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"org.opencontainers.image.ref.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;"ubuntu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"org.opencontainers.image.version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"25.10"&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;Note:&lt;/strong&gt; The &lt;code&gt;docker/sandbox-templates:claude-code&lt;/code&gt; image includes Claude Code with automatic credential management, plus development tools (Docker CLI, GitHub CLI, Node.js, Go, Python 3, Git, ripgrep, jq). It runs as a non-root agent user with sudo access and launches Claude with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; by default.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  4. Managing Sandboxes
&lt;/h3&gt;

&lt;p&gt;Since Docker enforces one sandbox per workspace, the same sandbox is reused each time you run &lt;code&gt;docker sandbox run &amp;lt;agent&amp;gt;&lt;/code&gt; in a given directory. To create a fresh sandbox, you need to remove the existing one first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox &lt;span class="nb"&gt;ls&lt;/span&gt;           &lt;span class="c"&gt;# Find the sandbox ID&lt;/span&gt;
docker sandbox &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;sandbox-id&amp;gt;
docker sandbox run &amp;lt;agent&amp;gt;  &lt;span class="c"&gt;# Creates a new sandbox&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Isolation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Test 1: Check if SSH Directory Exists
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.ssh/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bash(ls -la ~/.ssh/)
  ⎿  Error: Exit code 2
     ls: cannot access '/home/agent/.ssh/': No such file or directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;That's the sandbox working!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Notice the path: &lt;code&gt;/home/agent/.ssh/&lt;/code&gt; — the sandbox can't see your host's SSH keys at all. They simply &lt;strong&gt;don't exist&lt;/strong&gt; inside the container.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 2: Try to Access AWS Credentials
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.aws/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bash(ls -la ~/.aws/)
  ⎿  Error: Exit code 2
     ls: cannot access '/home/agent/.aws/': No such file or directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;AWS credentials protected!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 3: Try to Access Documents Folder
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● The ~/Documents/ directory doesn't exist in this environment.

  This is a sandboxed environment with a minimal filesystem. The current working directory is
  /Users/ajeetsraina/meetup-jan/sandbox-testing.

  Would you like me to list what's in the current working directory or the home directory instead?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Documents folder blocked!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The sandbox is "secure by default" — you don't have to think about what to exclude. It only sees your project folder.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 4: Confirm Project Folder Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /Users/ajeetsraina/meetup-jan/sandbox-testing/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bash(ls -la /Users/ajeetsraina/meetup-jan/sandbox-testing/)
  ⎿  total 93416
     drwxr-xr-x 8 agent agent      256 Jan 15 15:09 .
     drwxr-xr-x 3 root  root      4096 Jan 15 15:52 ..
     … +7 lines (ctrl+o to expand)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;It works!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The sandbox &lt;strong&gt;CAN&lt;/strong&gt; see your project directory at the exact same path as your host machine. That's &lt;strong&gt;path matching&lt;/strong&gt; in action.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 5: The Nuclear Option
&lt;/h3&gt;

&lt;p&gt;Can it delete your 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;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I won't run that command. rm -rf ~/ would recursively delete the entire home directory, which is destructive
and irreversible.

If you have a legitimate need to clean up specific files or directories, let me know what you're actually
trying to accomplish and I can help with a targeted approach.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude's safety guardrails kicked in! But even if it ran, see Test 5b for why it wouldn't matter.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 5b: Sandbox Home Directory Contents
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bash(ls -la ~/)
  ⎿  total 64
     drwxr-xr-x 1 agent agent 4096 Jan 15 16:23 .
     drwxr-xr-x 1 root  root  4096 Jan 10 00:23 ..
     … +9 lines (ctrl+o to expand)

● The home directory contains:
  ┌──────────────┬──────┬─────────────────────┐
  │     Item     │ Type │     Description     │
  ├──────────────┼──────┼─────────────────────┤
  │ .cache/      │ dir  │ Cache files         │
  ├──────────────┼──────┼─────────────────────┤
  │ .claude/     │ dir  │ Claude Code config  │
  ├──────────────┼──────┼─────────────────────┤
  │ .claude.json │ file │ Claude settings     │
  ├──────────────┼──────┼─────────────────────┤
  │ .docker/     │ dir  │ Docker config       │
  ├──────────────┼──────┼─────────────────────┤
  │ .gitconfig   │ file │ Git configuration   │
  ├──────────────┼──────┼─────────────────────┤
  │ .local/      │ dir  │ Local user data     │
  ├──────────────┼──────┼─────────────────────┤
  │ .npm/        │ dir  │ npm cache           │
  ├──────────────┼──────┼─────────────────────┤
  │ workspace/   │ dir  │ Workspace directory │
  └──────────────┴──────┴─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 &lt;strong&gt;This is the key insight!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The sandbox's home (&lt;code&gt;/home/agent/&lt;/code&gt;) is &lt;strong&gt;completely separate&lt;/strong&gt; from your real home (&lt;code&gt;/Users/ajeetsraina/&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If &lt;code&gt;rm -rf ~/&lt;/code&gt; runs...&lt;/th&gt;
&lt;th&gt;Without Sandbox&lt;/th&gt;
&lt;th&gt;With Sandbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What gets deleted&lt;/td&gt;
&lt;td&gt;Your &lt;strong&gt;real&lt;/strong&gt; home: Documents, SSH keys, years of work&lt;/td&gt;
&lt;td&gt;Just &lt;code&gt;/home/agent/&lt;/code&gt;: cache, npm, empty sandbox stuff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Catastrophic&lt;/strong&gt; 💀&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Nothing important&lt;/strong&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Test 6: Verify Git Identity Injection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.gitconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read(~/.gitconfig)
  ⎿  Read 3 lines

● [safe]
      directory = /Users/ajeetsraina/meetup-jan/sandbox-testing

  The gitconfig just has a safe.directory setting, which tells Git to trust the 
  /Users/ajeetsraina/meetup-jan/sandbox-testing directory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test 6b: Check full Git config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;safe.directory=/Users/ajeetsraina/meetup-jan/sandbox-testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; Git identity (&lt;code&gt;user.name&lt;/code&gt;, &lt;code&gt;user.email&lt;/code&gt;) was not auto-injected despite being configured on the host. Will work with Sandboxes team and get it fixed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 7: Path Matching
&lt;/h2&gt;

&lt;p&gt;Path matching ensures that file paths are &lt;strong&gt;identical&lt;/strong&gt; inside and outside the sandbox. This is crucial for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error messages that make sense&lt;/li&gt;
&lt;li&gt;Copy-paste paths that work&lt;/li&gt;
&lt;li&gt;IDE integration&lt;/li&gt;
&lt;li&gt;Git path consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Path Matching Matters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Without Path Matching&lt;/th&gt;
&lt;th&gt;With Path Matching (Docker Sandboxes)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host: &lt;code&gt;/Users/ajeet/project/src/Button.tsx&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Host: &lt;code&gt;/Users/ajeet/project/src/Button.tsx&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container: &lt;code&gt;/workspace/src/Button.tsx&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Container: &lt;code&gt;/Users/ajeet/project/src/Button.tsx&lt;/code&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error messages show &lt;code&gt;/workspace/...&lt;/code&gt; — confusing!&lt;/td&gt;
&lt;td&gt;Error messages show real paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copy-paste paths don't work&lt;/td&gt;
&lt;td&gt;Copy-paste paths work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 1: Create a File on HOST
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On your host terminal&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/meetup-jan/sandbox-testing/src/components
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"export const Button = () =&amp;gt; &amp;lt;button&amp;gt;Click me&amp;lt;/button&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/meetup-jan/sandbox-testing/src/components/Button.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it exists:&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;cat&lt;/span&gt; ~/meetup-jan/sandbox-testing/src/components/Button.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const Button = () =&amp;gt; &amp;lt;button&amp;gt;Click me&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Start the Sandbox
&lt;/h3&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; ~/meetup-jan/sandbox-testing
docker sandbox run claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Access File Using FULL PATH Inside Sandbox
&lt;/h3&gt;

&lt;p&gt;Inside the sandbox, use the exact same path as your host:&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;cat&lt;/span&gt; /Users/ajeetsraina/meetup-jan/sandbox-testing/src/components/Button.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(cat /Users/ajeetsraina/meetup-jan/sandbox-testing/src/components/Button.tsx)
  ⎿  export const Button = () =&amp;gt; &amp;lt;button&amp;gt;Click me&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Same path works inside the sandbox!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Verify Working Directory
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(pwd)
  ⎿  /Users/ajeetsraina/meetup-jan/sandbox-testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Working directory matches your host path!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Access with Relative Path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;src/components/Button.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(cat src/components/Button.tsx)
  ⎿  export const Button = () =&amp;gt; &amp;lt;button&amp;gt;Click me&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Relative paths work too!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Create a File INSIDE Sandbox
&lt;/h3&gt;

&lt;p&gt;Create a new file using the full path:&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;"console.log('created inside sandbox')"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /Users/ajeetsraina/meetup-jan/sandbox-testing/src/utils.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify inside sandbox:&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;cat&lt;/span&gt; /Users/ajeetsraina/meetup-jan/sandbox-testing/src/utils.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(cat /Users/ajeetsraina/meetup-jan/sandbox-testing/src/utils.js)
  ⎿  console.log('created inside sandbox')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Verify File Exists on HOST
&lt;/h3&gt;

&lt;p&gt;Exit 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;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check on your host:&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;cat&lt;/span&gt; ~/meetup-jan/sandbox-testing/src/utils.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('created inside sandbox')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;File created inside sandbox appears on host at the same path!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────┐
│                    REGULAR DOCKER CONTAINER                             │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  HOST                              CONTAINER                            │
│  /Users/ajeet/project/             /workspace/                          │
│  ├── src/                          ├── src/                             │
│  │   └── app.js                    │   └── app.js                       │
│  └── package.json                  └── package.json                     │
│                                                                         │
│  ❌ Paths are DIFFERENT                                                 │
│  ❌ Error: "File not found at /workspace/src/app.js"                    │
│  ❌ You think: "Where is /workspace? That's not my path!"               │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│                      DOCKER SANDBOXES                                   │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  HOST                              SANDBOX                              │
│  /Users/ajeet/project/             /Users/ajeet/project/                │
│  ├── src/                          ├── src/                             │
│  │   └── app.js                    │   └── app.js                       │
│  └── package.json                  └── package.json                     │
│                                                                         │
│  ✅ Paths are IDENTICAL                                                 │
│  ✅ Error: "File not found at /Users/ajeet/project/src/app.js"          │
│  ✅ You think: "I know exactly where that is!"                          │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Path Matching Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full path access from sandbox&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working directory matches host&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relative paths work&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files created in sandbox appear on host&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files created on host appear in sandbox&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Test 8: State Persistence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install a Package
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; cowsay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cowsay &lt;span class="s2"&gt;"Hello from sandbox"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(cowsay "hello from sandbox")
  ⎿   ____________________
     &amp;lt; hello from sandbox &amp;gt;
      --------------------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Exit the Sandbox
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Or type &lt;code&gt;/exit&lt;/code&gt; in Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Re-enter and Verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test if cowsay is still there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cowsay &lt;span class="s2"&gt;"I persisted!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Done! The cow has spoken.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;State persistence confirmed!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike a regular &lt;code&gt;docker run&lt;/code&gt; (which loses everything on exit), Docker Sandbox &lt;strong&gt;remembered&lt;/strong&gt; the installed package.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 9: Environment Variables
&lt;/h2&gt;

&lt;p&gt;Environment variables must be set at sandbox creation time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Remove Existing Sandbox
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On your host terminal&lt;/span&gt;
docker sandbox &lt;span class="nb"&gt;ls
&lt;/span&gt;docker sandbox &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;sandbox-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Sandbox with Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MY_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;supersecret123 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;APP_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Verify Inside Sandbox
&lt;/h3&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="nv"&gt;$MY_SECRET&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$APP_ENV&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(echo $MY_SECRET)
  ⎿  supersecret123

● Bash(echo $APP_ENV)
  ⎿  development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Confirm Full Environment Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;printenv&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"MY_SECRET|APP_ENV"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(printenv | grep -E "MY_SECRET|APP_ENV")
  ⎿  MY_SECRET=supersecret123
     APP_ENV=development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Environment variables working!&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important Limitation:&lt;/strong&gt; You cannot hot-reload environment variables. To change them, you must remove and recreate the sandbox (which loses installed packages).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Test 10: Docker Socket Access
&lt;/h2&gt;

&lt;p&gt;This allows the agent to run Docker commands inside the sandbox.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Security Warning:&lt;/strong&gt; Mounting the Docker socket grants the agent full access to your Docker daemon, which has root-level privileges. Only use this when necessary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1: Remove Existing Sandbox
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On your host terminal&lt;/span&gt;
&lt;span class="nb"&gt;exit
&lt;/span&gt;docker sandbox &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;sandbox-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Sandbox with Docker Socket
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker sandbox run &lt;span class="nt"&gt;--mount-docker-socket&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Test Docker Access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(docker ps)
  ⎿  Error: Exit code 1
     permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker socket requires &lt;code&gt;sudo&lt;/code&gt; 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;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(sudo docker ps)
  ⎿  CONTAINER ID   IMAGE                                  COMMAND                  CREATED              STATUS
     dbab95b2ae42   docker/sandbox-templates:claude-code   "sh -c 'sleep 5; if …"   About a minute ago   Up About a minute
     … +9 lines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Docker socket access working!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List and manage containers&lt;/li&gt;
&lt;li&gt;Build Docker images&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker compose&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;Execute integration tests with Testcontainers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Test 11: Real-World Demo - Playwright Browser Testing
&lt;/h2&gt;

&lt;p&gt;This demonstrates a practical use case: running browser tests in the sandbox without polluting your host system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create Project Directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On host&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/meetup-jan/playwright-demo
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/meetup-jan/playwright-demo

&lt;span class="c"&gt;# Remove any existing sandbox&lt;/span&gt;
docker sandbox &lt;span class="nb"&gt;ls
&lt;/span&gt;docker sandbox &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;sandbox-id-if-exists&amp;gt;

&lt;span class="c"&gt;# Start fresh sandbox&lt;/span&gt;
docker sandbox run claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create and Run Playwright Test
&lt;/h3&gt;

&lt;p&gt;Inside the sandbox, ask Claude to create a Playwright test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a simple Playwright test that:
1. Goes to https://collabnix.com
2. Takes a screenshot
3. Verifies the page title contains "Collabnix"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initialize the project with &lt;code&gt;npm init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install Playwright and browsers (~500MB)&lt;/li&gt;
&lt;li&gt;Create the test file&lt;/li&gt;
&lt;li&gt;Run the test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● Bash(npx playwright test) timeout: 1m 0s
  ⎿  Running 1 test using 1 worker
       ✓  1 tests/collabnix.spec.ts:3:5 › Collabnix homepage (5.2s)

● Bash(ls -la collabnix-screenshot.png)
  ⎿  -rw-r--r-- 1 agent agent 666902 Jan 15 18:03 collabnix-screenshot.png

● Done. The Playwright test has been created and executed successfully.

  playwright-demo/
  ├── package.json
  ├── playwright.config.ts
  ├── tests/
  │   └── collabnix.spec.ts
  └── collabnix-screenshot.png  (generated)

  Result: 1 test passed in 6.3s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Verify Isolation on Host
&lt;/h3&gt;

&lt;p&gt;Exit the sandbox and check your host:&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;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check what's on your host:&lt;/strong&gt;&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;# Screenshot IS in your project (shared via mount) ✅&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/meetup-jan/playwright-demo/collabnix-screenshot.png

&lt;span class="c"&gt;# Playwright browsers are NOT on your host ✅&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.cache/ms-playwright/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&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;Location&lt;/th&gt;
&lt;th&gt;On Host?&lt;/th&gt;
&lt;th&gt;Why?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;collabnix-screenshot.png&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Project folder is mounted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node_modules/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Project folder is mounted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;~/.cache/ms-playwright/&lt;/code&gt; (500MB browsers)&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Isolated in sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;~/.npm/&lt;/code&gt; cache&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Isolated in sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;This is the power of Docker Sandboxes!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your project files are accessible and shared&lt;/li&gt;
&lt;li&gt;Heavy dependencies (browsers, caches) stay in the sandbox&lt;/li&gt;
&lt;li&gt;Your host system stays clean&lt;/li&gt;
&lt;li&gt;Re-enter the sandbox later and Playwright is still installed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Test Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Expected&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔒 SSH keys blocked&lt;/td&gt;
&lt;td&gt;Blocked&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 AWS credentials blocked&lt;/td&gt;
&lt;td&gt;Blocked&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Documents blocked&lt;/td&gt;
&lt;td&gt;Blocked&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📁 Project folder accessible&lt;/td&gt;
&lt;td&gt;Accessible&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 Path matching&lt;/td&gt;
&lt;td&gt;Same paths&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💾 State persistence&lt;/td&gt;
&lt;td&gt;Persists&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Environment variables&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐳 Docker socket access&lt;/td&gt;
&lt;td&gt;With sudo&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎭 Playwright isolation&lt;/td&gt;
&lt;td&gt;Browsers isolated&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🪪 Git identity injection&lt;/td&gt;
&lt;td&gt;Auto-injected&lt;/td&gt;
&lt;td&gt;⚠️ Not working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Regular Container&lt;/th&gt;
&lt;th&gt;Docker Sandbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You manually decide what to mount&lt;/td&gt;
&lt;td&gt;Auto-mounts &lt;strong&gt;only&lt;/strong&gt; project directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Could accidentally mount &lt;code&gt;~/.ssh&lt;/code&gt;, &lt;code&gt;~/.aws&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Automatically excludes&lt;/strong&gt; sensitive dirs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different paths inside vs outside&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Same paths&lt;/strong&gt; (path matching)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No Git identity&lt;/td&gt;
&lt;td&gt;Should auto-inject Git config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State lost on exit&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;State persists&lt;/strong&gt; per workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Docker Sandboxes = Secure by Default&lt;/strong&gt; 🛡️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>docker</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>After a Decade on Meetup: Why We Built an Event Operating System</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Sun, 28 Dec 2025 09:24:59 +0000</pubDate>
      <link>https://forem.com/ajeetraina/after-a-decade-on-meetup-why-we-built-an-event-operating-system-56be</link>
      <guid>https://forem.com/ajeetraina/after-a-decade-on-meetup-why-we-built-an-event-operating-system-56be</guid>
      <description>&lt;p&gt;Hey DevOps community! 👋&lt;/p&gt;

&lt;p&gt;I need to share something that's been brewing for a while, and it's time to get real with you all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Meetup.com Journey
&lt;/h2&gt;

&lt;p&gt;We've been using &lt;a href="https://meetup.com/collabnix" rel="noopener noreferrer"&gt;Meetup.com&lt;/a&gt; for the Collabnix community for almost a decade now. And honestly? Meetup has been fantastic for what it does - creating events, getting those RSVPs, building that initial community momentum. But here's where the story gets interesting (and frustrating).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pain Points Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Let me walk you through what organizing a community event &lt;em&gt;actually&lt;/em&gt; looks like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding Venues&lt;/strong&gt;: Every. Single. Time. It's the same struggle. Where do we host this meetup? Who do we reach out to? Is there space available? What are the facilities? You're basically starting from scratch each time, maintaining your own spreadsheet of contacts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Sponsor Hunt&lt;/strong&gt;: I'm not even talking about big-money sponsors here. Just someone who can help with food and beverages for our community members who show up after work, hungry and ready to learn. Where do you find food sponsors? Seriously, where? There's no directory, no systematic approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speaker Management&lt;/strong&gt;: We open a CFP (Call for Papers), publish it somewhere, cross our fingers, and wait. Hoping speakers will somehow stumble upon it and fill out their details. There's no proper speaker hub like speakershub.com. No centralized system to manage proposals, communicate with speakers, or track their requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Email Hell&lt;/strong&gt;: Most of our coordination happens through email threads. Try finding that one caterer's email from three months ago. Or that venue contact who helped us last time. Good luck digging through hundreds of emails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hard Truth&lt;/strong&gt;: There's honestly no platform that helps you find event catering easily. No single effective platform for venue discovery. No integrated system for sponsor management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platforms vs. Operating Systems
&lt;/h2&gt;

&lt;p&gt;Here's what hit me: &lt;strong&gt;Event platforms help you PUBLISH events. They don't help you RUN events.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Platforms like Luma? Beautiful for publishing and getting the word out. But they stop right there. They don't solve the CORE problems we face as organizers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do I find a venue?&lt;/li&gt;
&lt;li&gt;How do I manage my speaker pipeline?&lt;/li&gt;
&lt;li&gt;How do I coordinate with sponsors?&lt;/li&gt;
&lt;li&gt;How do I handle catering logistics?&lt;/li&gt;
&lt;li&gt;How do I keep all communication in one place?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything remains fragmented. Scattered. Chaotic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Convene: An Event Operating System
&lt;/h2&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%2Fwpwqjswgdkui9bjv9jha.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%2Fwpwqjswgdkui9bjv9jha.png" alt="Image3" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So here's the news I'm excited to share: The Collabnix community spent the last &lt;strong&gt;8 months working closely with the Intelliconvene team&lt;/strong&gt;. Together, we've built something fundamentally different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://intelliconvene.com" rel="noopener noreferrer"&gt;Convene&lt;/a&gt;&lt;/strong&gt; isn't just another event publishing platform.&lt;/p&gt;

&lt;p&gt;Think of it as an &lt;strong&gt;Event Operating System&lt;/strong&gt; - a complete infrastructure layer for running community events. Everything you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏢 Venue discovery and management&lt;/li&gt;
&lt;li&gt;🎤 Speaker hub and CFP management&lt;/li&gt;
&lt;li&gt;🤝 Sponsor coordination&lt;/li&gt;
&lt;li&gt;🍕 Catering logistics&lt;/li&gt;
&lt;li&gt;💬 Centralized communication&lt;/li&gt;
&lt;li&gt;📊 Analytics and insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in one place. No more juggling between Meetup, Google Sheets, Gmail, Slack, and a dozen other tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Transition
&lt;/h2&gt;

&lt;p&gt;We'll be &lt;strong&gt;gradually moving the Collabnix community to Convene&lt;/strong&gt;. This isn't a rushed migration - we're doing this thoughtfully because we respect the community we've built over the years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We've already announced our first event on Convene&lt;/strong&gt;: &lt;a href="https://intelliconvene.com/events/694f82a94d41b3d423f4f0c6" rel="noopener noreferrer"&gt;https://intelliconvene.com/events/694f82a94d41b3d423f4f0c6&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Built By Organizers, For Organizers
&lt;/h2&gt;

&lt;p&gt;Here's what makes this different: This was built by people who've &lt;strong&gt;lived the pain&lt;/strong&gt;. We've organized hundreds of Docker and Kubernetes meetups globally across our 17,000+ member community on Slack and Discord. We know what keeps organizers up at night because we ARE those organizers.&lt;/p&gt;

&lt;p&gt;This isn't a product team guessing at what event organizers need. This is organizers building the tool they wish they'd had all along.&lt;/p&gt;

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

&lt;p&gt;I'll be sharing more details about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the transition will work&lt;/li&gt;
&lt;li&gt;Feature deep-dives&lt;/li&gt;
&lt;li&gt;Tips for other community organizers&lt;/li&gt;
&lt;li&gt;Lessons learned from 8 months of building this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For now, I'm just excited to finally have a solution to problems we've been wrestling with for years.&lt;/p&gt;

&lt;p&gt;If you're a community organizer dealing with the same fragmented workflow, I'd love to hear your thoughts. What's your biggest pain point in organizing events?&lt;/p&gt;

&lt;p&gt;Let's build better tools for our communities, together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://intellicredence.slack.com/archives/C0A5QTPD8NL" rel="noopener noreferrer"&gt;Join our Slack&lt;/a&gt; &lt;/p&gt;

</description>
      <category>meetup</category>
      <category>eventdriven</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>One Year of Model Context Protocol: From Experiment to Industry Standard</title>
      <dc:creator>Ajeet Singh Raina</dc:creator>
      <pubDate>Fri, 26 Dec 2025 06:30:57 +0000</pubDate>
      <link>https://forem.com/ajeetraina/one-year-of-model-context-protocol-from-experiment-to-industry-standard-5hj8</link>
      <guid>https://forem.com/ajeetraina/one-year-of-model-context-protocol-from-experiment-to-industry-standard-5hj8</guid>
      <description>&lt;h2&gt;
  
  
  The Birth of a Standard
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;November 25, 2024&lt;/strong&gt;, &lt;a href="https://www.anthropic.com/news/model-context-protocol" rel="noopener noreferrer"&gt;Anthropic introduced&lt;/a&gt; something that would fundamentally reshape how AI systems connect with the world: the &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Model_Context_Protocol" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Created by Anthropic developers &lt;strong&gt;David Soria Parra and Justin Spahr-Summers&lt;/strong&gt;, MCP addressed what engineers called the &lt;strong&gt;&lt;a href="https://www.keywordsai.co/blog/introduction-to-mcp" rel="noopener noreferrer"&gt;"M×N problem"&lt;/a&gt;&lt;/strong&gt;—the combinatorial explosion of connecting M different AI models with N different tools or data sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem MCP Solved
&lt;/h3&gt;

&lt;p&gt;Before MCP, connecting ten AI applications to 100 tools meant potentially &lt;strong&gt;&lt;a href="https://www.keywordsai.co/blog/introduction-to-mcp" rel="noopener noreferrer"&gt;1,000 different custom integrations&lt;/a&gt;&lt;/strong&gt;. MCP reduced this to a simple equation: implement the client protocol once, implement the server protocol once, and &lt;a href="https://thenewstack.io/why-the-model-context-protocol-won/" rel="noopener noreferrer"&gt;everything works together&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%2Foerg8yfducgecvgc6t7k.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%2Foerg8yfducgecvgc6t7k.png" alt="Image1" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Timeline: A Year of Unprecedented Growth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Q1 2025: Foundation Phase (November 2024 - February 2025)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  November 25, 2024 - Launch
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/news/model-context-protocol" rel="noopener noreferrer"&gt;Anthropic open-sources MCP&lt;/a&gt; with &lt;strong&gt;SDKs in Python and TypeScript&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference servers released&lt;/strong&gt;: Google Drive, Slack, GitHub, Git, Postgres, and Puppeteer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early adopters&lt;/strong&gt;: Block and Apollo integrate MCP&lt;/li&gt;
&lt;li&gt;Development tools companies &lt;strong&gt;(Zed, Replit, Codeium, Sourcegraph)&lt;/strong&gt; begin integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  December 2024 - January 2025
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/en-us/insights/blog/generative-ai/model-context-protocol-mcp-impact-2025" rel="noopener noreferrer"&gt;Claude Desktop app gets native MCP support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;First community-built servers emerge&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  February 2025
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.abovo.co/sean@abovo42.com/134682" rel="noopener noreferrer"&gt;Over 1,000 community-built MCP servers&lt;/a&gt;&lt;/strong&gt; available&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Q2 2025: The Inflection Point (March - May)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  March 26, 2025 - The Game Changer
&lt;/h4&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%2F498b8pmhju8e3fszb1ke.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%2F498b8pmhju8e3fszb1ke.png" alt="Image2" width="606" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://techcrunch.com/2025/03/26/openai-adopts-rival-anthropics-standard-for-connecting-ai-models-to-data/" rel="noopener noreferrer"&gt;OpenAI CEO Sam Altman announced on X&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"People love MCP and we are excited to add support across our products. available today in the agents SDK and support for chatgpt desktop app + responses api coming soon!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This same day, MCP &lt;a href="https://thenewstack.io/why-the-model-context-protocol-won/" rel="noopener noreferrer"&gt;launched its second major specification (2025-03-26)&lt;/a&gt; introducing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streamable HTTP transport&lt;/strong&gt; for cloud deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive OAuth 2.1 authorization&lt;/strong&gt; framework&lt;/li&gt;
&lt;li&gt;Enhanced remote deployment capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  April 2025
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Model_Context_Protocol" rel="noopener noreferrer"&gt;Google DeepMind CEO Demis Hassabis confirms MCP support&lt;/a&gt;&lt;/strong&gt; for Gemini models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security researchers &lt;a href="https://en.wikipedia.org/wiki/Model_Context_Protocol" rel="noopener noreferrer"&gt;identify critical issues&lt;/a&gt;&lt;/strong&gt;: prompt injection, tool permissions, lookalike tools&lt;/li&gt;
&lt;li&gt;Ecosystem reaches &lt;strong&gt;&lt;a href="https://guptadeepak.com/the-complete-guide-to-model-context-protocol-mcp-enterprise-adoption-market-trends-and-implementation-strategies/" rel="noopener noreferrer"&gt;5,800+ MCP servers&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  April 22, 2025 - Docker Enters the MCP Arena
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.globenewswire.com/news-release/2025/04/22/3065548/0/en/Docker-Extends-AI-Momentum-with-MCP-Tools-Built-for-Developers.html" rel="noopener noreferrer"&gt;Docker announces&lt;/a&gt; &lt;strong&gt;Docker MCP Catalog and Docker MCP Toolkit&lt;/strong&gt;, bringing container-grade security to the MCP ecosystem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.docker.com/blog/introducing-docker-mcp-catalog-and-toolkit/" rel="noopener noreferrer"&gt;Docker MCP Catalog&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized discovery platform integrated with Docker Hub&lt;/li&gt;
&lt;li&gt;100+ verified MCP servers at launch&lt;/li&gt;
&lt;li&gt;Partnership with &lt;strong&gt;Stripe, Elastic, Neo4j, Heroku, Pulumi, Grafana Labs, Kong Inc., New Relic, Continue.dev&lt;/strong&gt; and more&lt;/li&gt;
&lt;li&gt;Publisher verification and versioned releases&lt;/li&gt;
&lt;li&gt;Built on Docker Hub's infrastructure (20+ billion pulls monthly)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.docker.com/blog/announcing-docker-mcp-catalog-and-toolkit-beta/" rel="noopener noreferrer"&gt;Docker MCP Toolkit&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-click MCP server deployment from Docker Desktop&lt;/li&gt;
&lt;li&gt;Built-in OAuth support and secure credential storage&lt;/li&gt;
&lt;li&gt;Seamless integration with Gordon (Docker AI Agent), Claude, Cursor, VS Code, Windsurf, Continue.dev, and Goose&lt;/li&gt;
&lt;li&gt;Enterprise controls: Registry Access Management (RAM) and Image Access Management (IAM)&lt;/li&gt;
&lt;li&gt;Containerized MCP servers for isolation and security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Docker President and COO Mark Cavage&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Building functional AI applications shouldn't feel radically different from building any other app."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  May 2025
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.abovo.co/sean@abovo42.com/134682" rel="noopener noreferrer"&gt;Microsoft announces Windows 11 as "agentic OS"&lt;/a&gt;&lt;/strong&gt; with native MCP support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.abovo.co/sean@abovo42.com/134682" rel="noopener noreferrer"&gt;Microsoft Copilot Studio reaches General Availability&lt;/a&gt;&lt;/strong&gt; with MCP integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.docker.com/blog/announcing-docker-mcp-catalog-and-toolkit-beta/" rel="noopener noreferrer"&gt;May 5, 2025: Docker MCP Catalog and Toolkit enter Beta&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://www.ajeetraina.com/one-year-of-model-context-protocol-from-experiment-to-industry-standard/" rel="noopener noreferrer"&gt;Read the complete story&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>llm</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
