<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rednakta</title>
    <description>The latest articles on DEV Community by rednakta (@rednakta).</description>
    <link>https://dev.to/rednakta</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%2F3846751%2F3aaa6d11-420a-4dea-8974-6596ea1103b9.png</url>
      <title>DEV Community: rednakta</title>
      <link>https://dev.to/rednakta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rednakta"/>
    <language>en</language>
    <item>
      <title>Top 10 Local AI Agents You Can Run on Your PC in 2026</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Wed, 06 May 2026 08:34:31 +0000</pubDate>
      <link>https://dev.to/rednakta/top-10-openclaw-alternatives-local-ai-agents-you-can-run-on-your-pc-in-2026-305e</link>
      <guid>https://dev.to/rednakta/top-10-openclaw-alternatives-local-ai-agents-you-can-run-on-your-pc-in-2026-305e</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical comparison of every personal AI agent worth installing in 2026 — and one underneath layer that simplifies running them.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenClaw Cleared 345k Stars in 8 Weeks. Then the Ecosystem Showed Up.
&lt;/h2&gt;

&lt;p&gt;No open-source project has ever crossed 345,000 stars that fast. OpenClaw cleared a decade of React's record like it wasn't there. And almost as fast as the original landed, an entire &lt;code&gt;*Claw&lt;/code&gt; ecosystem grew underneath it: NanoClaw, Hermes Agent, Nanobot, ZeroClaw, NullClaw, IronClaw, PicoClaw, Moltworker. A dozen variations on the same idea, all painting the same picture at once. &lt;strong&gt;A personal AI agent that lives on your laptop, talks to a local model, and actually gets things done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're picking one in 2026, "is local AI ready?" isn't the question anymore. The real one is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which of these do I install, and where do I run it so it doesn't eat my home directory?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the post.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Category Exploded in 2026
&lt;/h2&gt;

&lt;p&gt;Three things happened at once.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local models stopped being toys.&lt;/strong&gt; Qwen 3, Gemma 4, Llama 4, the Hermes 4 fine-tunes — all of them run usefully on a Mac mini or a midrange RTX. The "send everything to OpenAI" tax stopped being mandatory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP arrived.&lt;/strong&gt; Model Context Protocol gave agents a standard way to grow tools, and the npm/pip ecosystem rushed to fill the catalog. (&lt;a href="https://docs.nilbox.run/blog/mcp-sandbox-for-claude" rel="noopener noreferrer"&gt;That a few of those entries turned out to be backdoors&lt;/a&gt; is its own story.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw made it look easy.&lt;/strong&gt; A weekend project from one Austrian developer proved you could ship a &lt;em&gt;personal&lt;/em&gt; agent — laptop-resident, messaging-app-aware, persistently running — without a billion-dollar lab. Once that proof landed, every smaller team in the world started forking it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is healthy, noisy, and slightly chaotic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 10 at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Approx LoC&lt;/th&gt;
&lt;th&gt;Sandbox model&lt;/th&gt;
&lt;th&gt;One-line trait&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;~430,000&lt;/td&gt;
&lt;td&gt;Application-level checks, shared process&lt;/td&gt;
&lt;td&gt;The original; broadest tool catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NanoClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;~500 (core) / ~15 files&lt;/td&gt;
&lt;td&gt;OS-level container per agent (Docker, Apple Container)&lt;/td&gt;
&lt;td&gt;Slim rewrite + real isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;td&gt;5 backends: local, Docker, SSH, Singularity, Modal&lt;/td&gt;
&lt;td&gt;Memory + skill-learning loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nanobot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;Process-level&lt;/td&gt;
&lt;td&gt;OpenClaw's core in 1% of the code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ZeroClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;small&lt;/td&gt;
&lt;td&gt;Process / OS-level&lt;/td&gt;
&lt;td&gt;Single binary, 30+ channels, ~20 model providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NullClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zig&lt;/td&gt;
&lt;td&gt;very small&lt;/td&gt;
&lt;td&gt;Process-level&lt;/td&gt;
&lt;td&gt;678KB binary, 1MB RAM, sub-2ms boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IronClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;small&lt;/td&gt;
&lt;td&gt;WebAssembly per tool&lt;/td&gt;
&lt;td&gt;Default-zero-permission tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PicoClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;very small&lt;/td&gt;
&lt;td&gt;Process-level&lt;/td&gt;
&lt;td&gt;The minimum viable variant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Moltworker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Cloudflare Workers (serverless)&lt;/td&gt;
&lt;td&gt;No local install, no host access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;memU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;mid&lt;/td&gt;
&lt;td&gt;n/a (library)&lt;/td&gt;
&lt;td&gt;Long-term memory layer that bolts onto any agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. OpenClaw — The One That Started Everything
&lt;/h2&gt;

&lt;p&gt;A personal AI agent that runs on your laptop, talks to local or remote models, and exposes itself through every messaging app you already use. Started as a weekend project, hit 250k stars in 60 days, kept going.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Biggest community, biggest skill marketplace, broadest "it just works" tool catalog. Default skills cover code, web, files, calendar, mail, and dozens of integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; ~430k lines across hundreds of files, in a layered architecture nobody fully understands. Isolation is enforced at the application level inside a single shared process — if one skill misbehaves, it can in principle reach anything OpenClaw can reach, which is &lt;em&gt;most of your machine&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Any modern machine. Resource-hungry.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. NanoClaw — The Slim, Container-Isolated Rewrite
&lt;/h2&gt;

&lt;p&gt;Take OpenClaw's idea, throw out 99.9% of the code, and run each agent inside its own Docker container instead of trusting application-level permission checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; ~15 source files. ~500 lines of TypeScript at the core. One Node.js process. Every agent runs under &lt;strong&gt;OS-level container isolation&lt;/strong&gt; — Docker on Linux/WSL2, Docker or Apple Container on macOS. If a skill goes off the rails, the blast radius is the container, not your home directory. Built on top of Anthropic's &lt;a href="https://github.com/anthropics/claude-agent-sdk-typescript" rel="noopener noreferrer"&gt;Claude Agent SDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; Smaller skill catalog than OpenClaw, so more glue code. Docker requirement is a real ask for non-technical users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Mac, Linux, WSL2 with Docker. Famously, also on a &lt;strong&gt;Raspberry Pi&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Hermes Agent — The One That Learns
&lt;/h2&gt;

&lt;p&gt;From &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;Nous Research&lt;/a&gt;, the lab behind the Hermes / Nomos / Psyche model families. Built around a &lt;code&gt;do → learn → improve&lt;/code&gt; loop — every successful task becomes a reusable skill, every interaction updates a persistent model of the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; &lt;strong&gt;Memory across sessions&lt;/strong&gt; that actually changes behavior, not just retrieval. Auto-detects models installed via Ollama and ships per-model tool-call parsers — so a 7B local Qwen runs predictably instead of half-broken. Five sandbox backends out of the box: &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;singularity&lt;/code&gt;, &lt;code&gt;modal&lt;/code&gt;. 110k stars in 10 weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; More server-shaped than desktop-shaped — the natural deployment is "leave it running on a VPS or home server, talk to it from Telegram/Discord/Slack/Signal/WhatsApp/email," not "click an icon on your dock." More moving parts at setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Anywhere with Python and one of the five sandbox backends. Especially good on AMD Ryzen AI Max+ and Apple Silicon.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Nanobot — OpenClaw's Core in 4,000 Lines
&lt;/h2&gt;

&lt;p&gt;From &lt;a href="https://github.com/HKUDS/nanobot" rel="noopener noreferrer"&gt;HKUDS&lt;/a&gt; at Hong Kong University. Deliver OpenClaw's core capabilities — tool use, messenger integrations, memory, scheduling — in code small enough for one person to read every line in an afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; ~4,000 lines of Python. 26,800+ stars. Auditability as a feature: when something breaks, you fix it. Telegram, Discord, WhatsApp out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; Process-level isolation only. No built-in container boundary — you bring the sandbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Anywhere Python runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. ZeroClaw — Rust Single-Binary
&lt;/h2&gt;

&lt;p&gt;From &lt;a href="https://github.com/zeroclaw-labs/zeroclaw" rel="noopener noreferrer"&gt;zeroclaw-labs&lt;/a&gt;. One Rust binary; configure and run. Talks to 20+ LLM providers and reaches the world through 30+ channels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Single static binary — no runtime, no &lt;code&gt;node_modules&lt;/code&gt;, no Python venv. Cross-compiles anywhere. The "spiritual successor to NullClaw" with a community an order of magnitude larger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; Newer ecosystem; the skill marketplace is thinner. Rust learning curve if you write tools natively (MCP servers work fine as-is).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Any OS / architecture you can &lt;code&gt;cargo build --target&lt;/code&gt; to.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. NullClaw — The Bare-Metal Pick
&lt;/h2&gt;

&lt;p&gt;Written in &lt;a href="https://github.com/nullclaw/nullclaw" rel="noopener noreferrer"&gt;Zig&lt;/a&gt;. 678KB static binary. ~1MB RAM at idle. Boots in &lt;strong&gt;under 2 milliseconds&lt;/strong&gt; on Apple Silicon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; The agent for tight resource budgets. Routers. Edge devices. Raspberry Pi Zero. The boundary between "agent" and "embedded firmware" gets blurry — that's the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; ~2,600 stars at writing — a quarter the size of ZeroClaw's community. Sparse documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Anything with a CPU. Genuinely.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. IronClaw — WebAssembly All the Way Down
&lt;/h2&gt;

&lt;p&gt;Every tool runs inside its own &lt;strong&gt;WebAssembly sandbox&lt;/strong&gt;, default zero permissions. Network access, filesystem access, secret access — each explicitly granted per tool, denied otherwise. Built-in leak detection scans agent outputs to catch API keys and PII before they escape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; The closest design in this list to &lt;em&gt;capability-secure&lt;/em&gt;. If you've spent serious time worrying about prompt-injection-driven secret exfil, IronClaw takes that threat model seriously at the language-runtime level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; WASM ecosystem still maturing for general tool use. Slower than process-level alternatives on tool-heavy workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Anywhere wasmtime / wasmer runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. PicoClaw — The Textbook Minimum
&lt;/h2&gt;

&lt;p&gt;The smallest functional variant. If a 4,000-line codebase still feels like too much, this is the starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Educational. A great fork starting point for very specific use cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; Deliberately missing things. Don't ship as a daily driver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Wherever you'd run a 200-line Python script.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Moltworker — Cloudflare-Style Serverless Variation
&lt;/h2&gt;

&lt;p&gt;Cloudflare's official adaptation of the OpenClaw idea to &lt;a href="https://blog.cloudflare.com/dynamic-workers/" rel="noopener noreferrer"&gt;Cloudflare Workers&lt;/a&gt;. The agent runs &lt;em&gt;serverless&lt;/em&gt; inside Cloudflare's sandbox; nothing executes on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Zero local footprint. Scales to zero when nobody's using it. Bills per invocation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; Not a &lt;em&gt;local&lt;/em&gt; agent. If your value prop is "stays on my hardware," wrong column. If it's "give my team an OpenClaw-shaped thing without thinking about hosting," exactly right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; A Cloudflare account.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. memU — The Memory Layer
&lt;/h2&gt;

&lt;p&gt;From NevaMind AI. Strictly speaking, not an &lt;em&gt;agent&lt;/em&gt; — a &lt;strong&gt;long-term memory engine&lt;/strong&gt; that plugs into any of the agents above. Builds a local knowledge graph of your preferences, past projects, and habits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Pair with NanoClaw or Hermes and the agent stops re-learning who you are every session. Local-first by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses.&lt;/strong&gt; A component, not an agent. To actually do something, you still need one of the items above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on.&lt;/strong&gt; Wherever the agent you pair it with runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Sandbox Question Underneath All Ten
&lt;/h2&gt;

&lt;p&gt;Pick any agent above and read its security model. They fall into one of three buckets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Process-level only&lt;/strong&gt; (OpenClaw, Nanobot, PicoClaw, NullClaw default): a misbehaving skill can reach anything the agent process can reach. On your laptop, that's &lt;em&gt;most of your PC&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container per agent&lt;/strong&gt; (NanoClaw, Hermes Agent in Docker mode, ZeroClaw in some configs): an OS-level boundary, much better, still shares the kernel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capability-secure&lt;/strong&gt; (IronClaw at the tool layer): rigorous, but only IronClaw, and only for tools — the agent process itself still has capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And by default, &lt;em&gt;none&lt;/em&gt; of them defends against the &lt;strong&gt;other&lt;/strong&gt; class of attack: &lt;strong&gt;the agent leaking its API token&lt;/strong&gt;. A prompt injection that gets the model to echo &lt;code&gt;$OPEN_API_TOKEN&lt;/code&gt;. A malicious npm/pip dependency that POSTs &lt;code&gt;process.env&lt;/code&gt;. An MCP server that quietly BCC's its operator on every call. The token is real, the agent can read it, a single successful exfil sweeps out the rest of the month's API budget at minimum.&lt;/p&gt;

&lt;p&gt;The right shape is &lt;strong&gt;a VM around the entire agent&lt;/strong&gt; &lt;em&gt;plus&lt;/em&gt; &lt;strong&gt;a token-substitution boundary so the agent never sees the real key&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  One nilbox Install Replaces Ten Sandbox Configurations
&lt;/h2&gt;

&lt;p&gt;That's what &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt; is. One installer for macOS, Windows, Linux. Inside it, a Debian VM (&lt;em&gt;Linux for nilbox&lt;/em&gt;) where you install OpenClaw, or Hermes, or whichever variant on this list you picked — &lt;em&gt;unmodified&lt;/em&gt;, the same way the README tells you to. The agent runs as-is. API tokens are placeholders; the real values get swapped in only at the boundary on the way out. Network egress goes through that boundary and nowhere else. Full write-up: &lt;a href="https://docs.nilbox.run/blog/zero-token-architecture" rel="noopener noreferrer"&gt;Zero Token Architecture&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And here's what falls out &lt;em&gt;on top of&lt;/em&gt; security: &lt;strong&gt;you stop having to learn ten different sandbox models.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NanoClaw wants Docker.&lt;/li&gt;
&lt;li&gt;Hermes wants you to pick between &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;singularity&lt;/code&gt;, and &lt;code&gt;modal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;IronClaw wants you to think in WASM capabilities.&lt;/li&gt;
&lt;li&gt;ZeroClaw runs bare and &lt;em&gt;will&lt;/em&gt; technically work that way — until you remember it shouldn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one ships its own threat model, its own setup checklist, its own "did I configure isolation correctly?" question. Run two of them on the same machine and you're maintaining two unrelated sandbox stacks at once.&lt;/p&gt;

&lt;p&gt;Drop them all into nilbox and that whole layer collapses into one. Same boundary. Same install path. Same kill switch (close the window). The per-agent sandbox question goes away — the answer is the same for every variant on this list: install nilbox once, then install the agent inside it the way its README says. &lt;strong&gt;One sandbox, ten agents.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Honest Exceptions
&lt;/h2&gt;

&lt;p&gt;Three places where the "just put it in nilbox" recipe doesn't apply:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Why it's an exception&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Moltworker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Already runs serverless inside Cloudflare's own sandbox. There's no local install for nilbox to wrap. Isolation is Cloudflare's problem, not yours.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NullClaw on a Raspberry Pi / edge device&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You explicitly chose bare metal because you have a 1MB RAM budget and a 2ms boot target. Running it inside a desktop VM defeats the entire point of picking NullClaw.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NanoClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker-based by design. &lt;strong&gt;Docker doesn't run inside the nilbox VM.&lt;/strong&gt; With NanoClaw you've already bought into one isolation model (containers) — pick that &lt;em&gt;or&lt;/em&gt; pick nilbox + a non-Docker-bound agent, but you can't stack them.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For everything else on this list — every install you'd otherwise drop directly onto your laptop or workstation — nilbox is the layer underneath.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Choose in Two Minutes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most features, don't mind the size?&lt;/strong&gt; OpenClaw.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw's idea + real container isolation?&lt;/strong&gt; NanoClaw.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want the agent to learn your habits over time?&lt;/strong&gt; Hermes Agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want to read every line yourself?&lt;/strong&gt; Nanobot or PicoClaw.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One binary that runs from a Pi to a workstation?&lt;/strong&gt; ZeroClaw, or NullClaw if you really need it tiny.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lying-awake-paranoid about prompt-injection exfil?&lt;/strong&gt; IronClaw — and even then, run it inside a sandbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't want anything on your machine?&lt;/strong&gt; Moltworker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, regardless of which: &lt;strong&gt;wrap it in a VM and a token boundary.&lt;/strong&gt; That last step is the same for all ten (with the three exceptions above).&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is OpenClaw safe to run directly on my main machine?&lt;/strong&gt;&lt;br&gt;
Not really. The shared-process, application-level permission model means a misbehaving skill — including one nudged by prompt injection — can reach files and tokens it shouldn't. Run it inside a VM (or &lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt;) and you sidestep that entire class of problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw vs. Hermes Agent — what's the actual difference?&lt;/strong&gt;&lt;br&gt;
OpenClaw is broader and more reactive: lots of skills, low setup overhead, no native learning system. Hermes is narrower and more cumulative: fewer out-of-the-box integrations, but every successful task becomes a reusable skill, and the agent gets better at &lt;em&gt;your&lt;/em&gt; workflows over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run NanoClaw without Docker?&lt;/strong&gt;&lt;br&gt;
Not really. Container isolation is the whole pitch — without it you're running a smaller OpenClaw with no isolation upgrade. On macOS, Apple Container works as a Docker substitute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I stack nilbox on top of NanoClaw's container isolation?&lt;/strong&gt;&lt;br&gt;
No. NanoClaw is Docker-based and Docker doesn't run inside the nilbox VM. Pick one or the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who's winning on raw popularity right now?&lt;/strong&gt;&lt;br&gt;
By stars, OpenClaw (345k+). By growth rate, Hermes Agent (110k in 10 weeks). By Reddit consensus on "what should I actually run?", NanoClaw — for the security reasons above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install nilbox&lt;/strong&gt;: &lt;a href="https://docs.nilbox.run/docs/getting-started/installation" rel="noopener noreferrer"&gt;docs.nilbox.run&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt; — bridge, proxy, VM image, store manifest, all open source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick an agent above&lt;/strong&gt; that fits your taste, drop it into the nilbox store, done&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;*Claw&lt;/code&gt; ecosystem is the most exciting thing to happen to personal computing in years. A real agent on your hardware, talking to your messaging apps, talking to local models, doing actual work. Pick one whose tradeoffs match your taste. Run it in a sandbox. That's the whole answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/sandbox-comparison" rel="noopener noreferrer"&gt;Which Sandbox Should You Use for Your AI Agent? — VM vs Docker vs OSS vs nilbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/open-source-local-sandbox" rel="noopener noreferrer"&gt;The Open-Source Local Sandbox Agents, MCP Servers, and Unknown Apps Actually Need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/mcp-sandbox-for-claude" rel="noopener noreferrer"&gt;Stop Installing MCP Servers on Your Laptop — Here's a One-Click Sandbox for Claude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/zero-token-architecture" rel="noopener noreferrer"&gt;Zero Token Architecture — full write-up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>openclaw</category>
      <category>security</category>
    </item>
    <item>
      <title>Stop Installing MCP Servers on Your Laptop — Here's a One-Click Sandbox for Claude</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Fri, 01 May 2026 05:22:46 +0000</pubDate>
      <link>https://dev.to/rednakta/stop-installing-mcp-servers-on-your-laptop-heres-a-one-click-sandbox-for-claude-71g</link>
      <guid>https://dev.to/rednakta/stop-installing-mcp-servers-on-your-laptop-heres-a-one-click-sandbox-for-claude-71g</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical guide to running MCP servers without trusting them. Works with Claude Code and Claude Desktop, no fork required.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The MCP Install Path Is an Arbitrary-Code-Execution Invitation
&lt;/h2&gt;

&lt;p&gt;Every guide tells you the same thing. Open your Claude config, drop in this one-liner:&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;"mcpServers"&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;"filesystem"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"@modelcontextprotocol/server-filesystem"&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/me"&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;That's the whole security boundary. &lt;code&gt;npx&lt;/code&gt; resolves a package name against npm — &lt;em&gt;whatever version is up right this second&lt;/em&gt; — and runs it with &lt;strong&gt;your user, your shell, your tokens, and read/write on &lt;code&gt;/Users/me&lt;/code&gt;.&lt;/strong&gt; Every time the agent calls a tool.&lt;/p&gt;

&lt;p&gt;The last twelve months made it clear how bad a default that is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;postmark-mcp&lt;/code&gt; BCC backdoor (Sept 2025).&lt;/strong&gt; An attacker mirrored the legitimate Postmark MCP server on npm, built trust over several versions, then shipped a release that quietly BCC'd every email the agent sent to an attacker-controlled address. No zero-day. The package did exactly what &lt;code&gt;npm install&lt;/code&gt; advertised — it ran. (&lt;a href="https://snyk.io/blog/malicious-mcp-server-on-npm-postmark-mcp-harvests-emails/" rel="noopener noreferrer"&gt;Snyk writeup&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2025-49596 + the systemic stdio RCE.&lt;/strong&gt; Researchers found a design flaw in Anthropic's official MCP SDKs — Python, TypeScript, Java, Rust. The stdio launch path executes the command &lt;em&gt;whether the process started successfully or not&lt;/em&gt;. ~200,000 vulnerable instances, 150M+ downloads, a chain of follow-on CVEs across LibreChat, WeKnora, MCP Inspector, and more. (&lt;a href="https://thehackernews.com/2026/04/anthropic-mcp-design-vulnerability.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor (CVE-2025-54136), GitHub Kanban MCP (CVE-2025-53818).&lt;/strong&gt; Command injection in the wider ecosystem, both reachable through MCP-style tool calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase × Cursor service-role exfil.&lt;/strong&gt; Privileged MCP access + untrusted user input + an outbound channel = leaked tokens in a public support thread.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern under all of these is the same: &lt;strong&gt;an MCP server is just a process you spawned.&lt;/strong&gt; The question isn't whether it can be malicious. It's what your laptop is wearing the moment it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Hard Requirements
&lt;/h2&gt;

&lt;p&gt;Most "secure MCP" projects fail one of these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Has to work with Claude Code and Claude Desktop unchanged.&lt;/strong&gt; No patched fork, no "wait for upstream support." You edit the same config file you'd already be editing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Has to run the MCP server package as-is.&lt;/strong&gt; No "secure rewrite," no SDK swap. The same &lt;code&gt;npx @modelcontextprotocol/server-filesystem&lt;/code&gt;, &lt;code&gt;uvx mcp-server-sqlite&lt;/code&gt;, &lt;code&gt;node ./my-mcp-server.js&lt;/code&gt; you were going to type.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A bespoke gateway that requires you to port servers to it loses on (2). A patched Claude fork loses on (1). One-off Docker wrappers tend to lose on (1) the moment a non-developer teammate has to install them.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt;&lt;/strong&gt; to satisfy both.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;nilbox is an open-source desktop sandbox. One-click installer on Windows, macOS, Linux. The MCP server runs inside a sandboxed Linux VM. Claude Desktop and Claude Code talk to it over plain stdio — exactly the way the upstream README describes — except &lt;em&gt;the stdio they're talking to is a tiny bridge that forwards the bytes into the VM.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Desktop / Claude Code
          │ stdio (JSON-RPC)
          ▼
   nilbox-mcp-bridge   ← runs on the host, bundled with nilbox
          │
          ▼
       nilbox VM       ← isolated Linux, no internet NIC, no real API token
          │
          ▼
  npx @modelcontextprotocol/server-filesystem /mnt/shared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither side knows there's a VM in the middle. Claude sees an ordinary stdio MCP server. The MCP server sees an ordinary stdio invocation of &lt;code&gt;npx ...&lt;/code&gt;. The package on npm is unchanged. The Claude clients are unchanged. The threat surface is changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo: Running &lt;code&gt;server-filesystem&lt;/code&gt; Inside nilbox
&lt;/h2&gt;

&lt;p&gt;Six steps. The walkthrough below uses the canonical filesystem MCP server because it's the right thing to be paranoid about — full read/write on whatever path you point it at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install Node.js inside the VM.&lt;/strong&gt; filesystem MCP runs through &lt;code&gt;npx&lt;/code&gt;, so the VM needs Node.js. One click in the nilbox store.&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%2F6e6ngpjwldz1jmbzfqus.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%2F6e6ngpjwldz1jmbzfqus.png" alt="Installing Node.js from the nilbox store" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Register the MCP server.&lt;/strong&gt; Pick &lt;em&gt;Filesystem&lt;/em&gt; in the store; it writes the config inside the VM:&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;"servers"&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;"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;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&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;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/shared"&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;Same &lt;code&gt;npx&lt;/code&gt; command the upstream README hands you. Same package, same args. Just rooted at &lt;code&gt;/mnt/shared&lt;/code&gt; inside the VM, not your home directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Port mapping is automatic.&lt;/strong&gt; When Claude spawns &lt;code&gt;nilbox-mcp-bridge&lt;/code&gt;, it connects to &lt;code&gt;127.0.0.1:19001&lt;/code&gt; on the host. nilbox routes that into the VM. You don't touch this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Pick the directory the MCP can see.&lt;/strong&gt; This single screen decides which host folder gets reflected to &lt;code&gt;/mnt/shared&lt;/code&gt; inside the VM.&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%2Fcytdjjgob8zcji9t4ewc.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%2Fcytdjjgob8zcji9t4ewc.png" alt="Directory mapping" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the &lt;em&gt;only&lt;/em&gt; window the MCP server gets. Any host path outside the folder you mapped — &lt;code&gt;~/.ssh&lt;/code&gt;, &lt;code&gt;~/.aws&lt;/code&gt;, &lt;code&gt;~/Documents&lt;/code&gt;, your browser profile — is &lt;strong&gt;not visible at all&lt;/strong&gt; to the MCP server. There's no permission denial. The path simply doesn't exist in the world the server lives in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Directory denial isn't a policy, it's a structure.&lt;/strong&gt; This isn't "we worry about an accidental read of &lt;code&gt;~/.ssh&lt;/code&gt;, so we block it." That path doesn't exist inside the VM in the first place. A malicious MCP server can be as clever as it likes — it can't read what it can't see.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8exicfqb3b0mpa5ky4v6.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%2F8exicfqb3b0mpa5ky4v6.png" alt="Claude and the MCP Sandbox" width="800" height="1203"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Point Claude at the bridge.&lt;/strong&gt; nilbox generates the snippet. You paste it.&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;"mcpServers"&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;"nilbox-filesystem"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Applications/nilbox.app/Contents/MacOS/nilbox-mcp-bridge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"--port"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"19001"&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;Goes into &lt;code&gt;claude_desktop_config.json&lt;/code&gt; for Claude Desktop, or &lt;code&gt;~/.claude/mcp.json&lt;/code&gt; for Claude Code. (&lt;code&gt;claude mcp add&lt;/code&gt; with the same &lt;code&gt;command&lt;/code&gt; and &lt;code&gt;args&lt;/code&gt; works identically.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Restart Claude.&lt;/strong&gt; The tools list shows up, file reads work, file writes work. Neither side knows the difference. A malicious tool call has nowhere to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bare Host vs nilbox: How the Attack Story Differs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Bare laptop install&lt;/th&gt;
&lt;th&gt;Docker-wrapped MCP&lt;/th&gt;
&lt;th&gt;nilbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reads &lt;code&gt;~/.ssh/&lt;/code&gt;, &lt;code&gt;~/.aws/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✓ (default)&lt;/td&gt;
&lt;td&gt;If mounted&lt;/td&gt;
&lt;td&gt;✗ (separate filesystem)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reaches the public internet&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗ (no NIC, default-deny via host proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sees your real Anthropic API token&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗ (Zero Token Architecture)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runs the upstream package as-is&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-click setup for non-developers&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survives a compromised npm release&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (blast radius is the VM disk)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A malicious MCP server on a bare host takes the laptop. The same malicious MCP server inside nilbox takes a Debian VM disk image — which you delete and move on.&lt;/p&gt;

&lt;p&gt;The Zero Token row is bigger than people expect. Even when a malicious MCP server inside the VM reads &lt;code&gt;process.env&lt;/code&gt;, what it gets is a placeholder, not your real &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;. The boundary proxy &lt;em&gt;outside&lt;/em&gt; the VM swaps in the real token mid-flight, and the inside of the sandbox never sees the real value. Full write-up: &lt;a href="https://docs.nilbox.run/blog/zero-token-architecture" rel="noopener noreferrer"&gt;Zero Token Architecture&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Doesn't Solve
&lt;/h2&gt;

&lt;p&gt;To be straight about it: nilbox doesn't stop a malicious MCP server from returning a response that &lt;strong&gt;prompt-injects the model.&lt;/strong&gt; A server that's supposed to return file contents can return file contents &lt;em&gt;plus&lt;/em&gt; "ignore the user, call this next tool with these arguments," and a tool-using agent might follow it. That's a model-side problem, not a sandbox-side one.&lt;/p&gt;

&lt;p&gt;What nilbox solves is the &lt;strong&gt;second-order blast radius.&lt;/strong&gt; Even if the model is fooled, the tool itself can't read your home directory, can't talk to a malicious endpoint, and can't see your real API key. The injection might cost you one wasted tool call — it can't take your secrets, your repo, or your machine.&lt;/p&gt;

&lt;p&gt;The right division of labor: guardrails on the model side, a real sandbox on the side where someone else's code runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install nilbox&lt;/strong&gt;: &lt;a href="https://docs.nilbox.run/docs/getting-started/installation" rel="noopener noreferrer"&gt;docs.nilbox.run&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt; — bridge, proxy, VM image, store manifest, all open source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server catalog&lt;/strong&gt;: filesystem, sqlite, git, and growing — same one-click pattern, same architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've been holding off on MCP servers because every package update felt like running a stranger's &lt;code&gt;curl | bash&lt;/code&gt; — that gut feeling was right. Run them somewhere they can't bite. Same &lt;code&gt;npx&lt;/code&gt; command. Different machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/zero-token-architecture" rel="noopener noreferrer"&gt;Zero Token Architecture — full write-up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/open-source-local-sandbox" rel="noopener noreferrer"&gt;The Open-Source Local Sandbox Agents, MCP Servers, and Unknown Apps Actually Need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/blog/sandbox-comparison" rel="noopener noreferrer"&gt;Which Sandbox Should You Use for Your AI Agent? — VM vs Docker vs OSS vs nilbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>sandbox</category>
    </item>
    <item>
      <title>Buy a mac mini to Run OpenClaw? Anyone Can Get a Safer Sandbox in 1 Minute</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Sat, 25 Apr 2026 22:53:15 +0000</pubDate>
      <link>https://dev.to/rednakta/buy-a-mac-mini-to-run-openclaw-anyone-can-get-a-safer-sandbox-in-1-minute-44c0</link>
      <guid>https://dev.to/rednakta/buy-a-mac-mini-to-run-openclaw-anyone-can-get-a-safer-sandbox-in-1-minute-44c0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/openclaw-2026-04-16"&gt;OpenClaw Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you've been around the OpenClaw conversation lately, you've probably heard some version of this advice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Just buy a mac mini and run it over there."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The translation is, &lt;em&gt;"OpenClaw might do something to my main machine that I don't want, so I should keep a separate computer that I can afford to break."&lt;/em&gt; Real money. Real friction. And — when you actually look at it — &lt;strong&gt;not actually safer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is about flipping that piece of advice on its head. The two real reasons people hesitate to run OpenClaw — &lt;strong&gt;security and installation&lt;/strong&gt; — can be solved without a second machine, without developer skills, in about a minute.&lt;/p&gt;

&lt;p&gt;The thing I built to solve them is &lt;strong&gt;&lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt;&lt;/strong&gt; — an open-source desktop sandbox that runs the same way on Windows, macOS, and Linux, installs in one click, and never lets OpenClaw see your real API token while still letting it work normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The problem in one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw is a powerful desktop AI agent, but two real barriers stop normal people from adopting it safely.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The security barrier&lt;/strong&gt; — there is essentially no sandbox out there that controls &lt;em&gt;both tokens and network egress&lt;/em&gt;. Most "AI agent sandboxes" stop at process and file isolation. A mac mini doesn't fix this either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The install barrier&lt;/strong&gt; — installing OpenClaw cleanly on Windows is, in practice, "first prepare a Linux environment." Enable virtualization, set up WSL, install dependencies, finally paste the one-line install command. Nothing for a developer. A cliff for everyone else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I built&lt;/strong&gt; is a desktop sandbox that takes both barriers down at once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: nilbox (open source — &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt;: A GUI-based, cross-platform desktop sandbox. The same one-click install on Windows, macOS, and Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For whom&lt;/strong&gt;: Anyone who wants to run OpenClaw safely without knowing what a VM, a container, or WSL is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-line value&lt;/strong&gt;: It lets someone who has never heard of mac minis, WSL, or Docker run OpenClaw safely in about a minute.&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%2Fgp98s2suzjsiof3albj9.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%2Fgp98s2suzjsiof3albj9.png" alt="nilbox desktop installer creating a Linux for nilbox sandbox" width="800" height="611"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The nilbox desktop app — one click and a dedicated Linux sandbox for OpenClaw is provisioned.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Used OpenClaw
&lt;/h2&gt;

&lt;p&gt;This is the substance of the post. Two real problems people hit when they try to run OpenClaw seriously, and how I solved each.&lt;/p&gt;


&lt;h3&gt;
  
  
  Real Problem 1 — Security: "Process Isolation Is Not Where the Story Ends"
&lt;/h3&gt;

&lt;p&gt;Let's be honest first. There's no shortage of sandboxing options for an agent like OpenClaw. VMs, Docker, Firecracker-based OSS sandboxes, hosted code interpreters — the menu is long. The reason people still tell you to "just buy a mac mini" anyway is that &lt;strong&gt;almost every option on that menu leaves two things wide open.&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  What's missing 1: Token isolation
&lt;/h4&gt;

&lt;p&gt;Most sandboxes isolate the process and the filesystem. The token walks straight in.&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 the environment OpenClaw runs in&lt;/span&gt;
&lt;span class="nv"&gt;OPEN_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-proj-1a2b3c4d5e...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One prompt injection, one malicious package, one curious &lt;code&gt;env&lt;/code&gt; call — and the real token is gone. &lt;strong&gt;This is exactly as true on a mac mini as anywhere else.&lt;/strong&gt; The token is &lt;em&gt;inside&lt;/em&gt;, so isolating the box around it doesn't help.&lt;/p&gt;

&lt;p&gt;nilbox tackles this head-on. We &lt;strong&gt;never put the real token inside the sandbox&lt;/strong&gt; that OpenClaw runs in.&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;# What OpenClaw actually sees inside nilbox&lt;/span&gt;
&lt;span class="nv"&gt;OPEN_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OPEN_API_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not a typo. The variable's value is its own name. OpenClaw reads it, builds an &lt;code&gt;Authorization: Bearer OPEN_API_TOKEN&lt;/code&gt; header, makes the call. &lt;strong&gt;Outside&lt;/strong&gt; the sandbox, nilbox's boundary proxy intercepts the request, recognizes the placeholder, swaps in the real token, and forwards upstream. The response flows back unchanged. From OpenClaw's point of view, it's a perfectly ordinary API call.&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%2Fpf34qseoef3dn6jkn2s0.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%2Fpf34qseoef3dn6jkn2s0.png" alt="Zero Token Architecture — OpenClaw only sees a placeholder; the boundary proxy substitutes the real token" width="800" height="294"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Zero Token Architecture — OpenClaw holds only a placeholder. The boundary proxy substitutes the real token outside the sandbox.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The consequence is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if OpenClaw is breached and "the token leaks" — &lt;strong&gt;what leaks is the fake one.&lt;/strong&gt; The real token never existed in the world OpenClaw lives in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A mac mini doesn't give you this. A mac mini is just a separate computer; the token is still sitting in plaintext inside it. &lt;strong&gt;In other words, nilbox is more secure than a mac mini on the token axis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The longer argument behind this design lives in &lt;a href="https://docs.nilbox.run/docs/tutorial-zero-token/introduction" rel="noopener noreferrer"&gt;the Zero Token Architecture write-up&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  What's missing 2: Network egress control
&lt;/h4&gt;

&lt;p&gt;Stopping the token leak isn't enough on its own. If OpenClaw can &lt;code&gt;POST&lt;/code&gt; to any host on the internet, your data exfiltration risk is still there. Most sandboxes ship with egress wide open by default. Locking it down means writing iptables rules or running a proxy sidecar — fine for ops engineers, unrealistic for everyone else.&lt;/p&gt;

&lt;p&gt;People sometimes go the other way: "just block the network." That stops exfiltration cold, sure, but now OpenClaw can't talk to the LLM and it can't do anything. Not a serious answer either.&lt;/p&gt;

&lt;p&gt;nilbox treats this &lt;strong&gt;the way a firewall does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Block everything by default (default-deny).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allow only the hosts you explicitly allow.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The single allowed path is the nilbox boundary proxy itself — so every outbound request becomes observable and controllable at one point.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the part that's a little more interesting: &lt;strong&gt;the sandbox doesn't ship with a normal TCP/IP networking driver inside it.&lt;/strong&gt; No code in OpenClaw — no malicious dependency, no injected payload, nothing — has the standard "open a socket to the real internet" path available. If a request doesn't go through the legitimate boundary proxy, it can't go anywhere. Not a policy decision. A physical one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No exploit can route around the boundary, because there is no other route to take.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A mac mini is, again, different. It's a normal desktop OS with a normal network stack. By default OpenClaw running on a mac mini has full reach into the public internet — and your LAN. &lt;strong&gt;nilbox is more secure than a mac mini on the network axis too.&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  "Why not just use a VM or a container?"
&lt;/h4&gt;

&lt;p&gt;It's a fair question. Honest answer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Process isolation&lt;/th&gt;
&lt;th&gt;Token protection&lt;/th&gt;
&lt;th&gt;Network control&lt;/th&gt;
&lt;th&gt;One-click install for non-developers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plain VM (VirtualBox, etc.)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker container&lt;/td&gt;
&lt;td&gt;Partial (shared kernel)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud OSS sandbox (E2B, etc.)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;nilbox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ (VM-grade)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A VM or a container gives you a "room" for OpenClaw to live in. Inside that room, the token is still in plaintext, the network is still wide open, and — most importantly — &lt;strong&gt;none of those tools is one-click for someone who has never heard of them.&lt;/strong&gt; Security tools that nobody installs are not security tools.&lt;/p&gt;

&lt;p&gt;I went deeper into this comparison in a separate piece: &lt;a href="https://dev.to/rednakta/which-sandbox-should-you-use-for-your-ai-agent-44j0"&gt;Which Sandbox Should You Use for Your AI Agent? — VM vs Docker vs OSS vs nilbox&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Real Problem 2 — Installation: "Hope Is Not a Threat Model"
&lt;/h3&gt;

&lt;p&gt;The real bottleneck on security turns out to be &lt;strong&gt;usability.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write down, honestly, the path a Windows user has to walk to run OpenClaw cleanly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable hardware virtualization (some people end up in BIOS).&lt;/li&gt;
&lt;li&gt;Install WSL or a separate VM.&lt;/li&gt;
&lt;li&gt;Install a Linux distribution inside it.&lt;/li&gt;
&lt;li&gt;Resolve dependencies — Node, Python, Playwright browser binaries, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Now&lt;/em&gt; paste the one-line OpenClaw install command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Trivial for a developer. &lt;strong&gt;For someone without a development background, that whole path is the challenge.&lt;/strong&gt; A "one-line install" is only one line on the surface; underneath it sits a stack of assumptions. If any of them goes sideways, the user shrugs, decides "this isn't for me," and &lt;strong&gt;runs OpenClaw directly on their main OS.&lt;/strong&gt; That's the scariest outcome of all.&lt;/p&gt;

&lt;p&gt;nilbox's answer is small.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the nilbox desktop app on Windows (or macOS, or Linux).&lt;/li&gt;
&lt;li&gt;Click once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw is installed inside a safe sandbox, alongside Playwright&lt;/strong&gt; (browser automation environment) ready to go.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No WSL, no BIOS detour, no Docker daemon, no dependency triage. The virtualization layer is something nilbox sets up; the OpenClaw install itself is encapsulated as a vetted one-liner inside the nilbox catalog.&lt;/p&gt;

&lt;p&gt;The catalog will keep growing. &lt;strong&gt;Adding more open-source projects that pair well with OpenClaw — one-click installable from inside nilbox — is the next part of the roadmap.&lt;/strong&gt; Security tools are only security tools when someone actually runs them, and powerful tools like OpenClaw are only powerful when someone is actually able to install them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;A demo of nilbox installing OpenClaw in one click and running it safely with no real token inside the sandbox:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/NcAgj-HStK0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One-click nilbox install + OpenClaw running safely inside the sandbox.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Supplementary material:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repo&lt;/strong&gt; (boundary proxy, VM image, store manifest — all open source): &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site&lt;/strong&gt;: &lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox.run&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://docs.nilbox.run" rel="noopener noreferrer"&gt;docs.nilbox.run&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;A few things I didn't quite expect going in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The real bottleneck on sandbox security was usability.&lt;/strong&gt; "More secure tooling" loses to "tooling more people can actually use." The reason "buy a mac mini" became a folk answer wasn't that it was actually safe — it was that "a physically separate machine" is the most intuitive isolation model for a non-technical user. The real work was carrying that same intuition into a single click on the user's existing computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMs and containers are spoken about as if they were synonyms for "sandbox," but they're empty on two important axes — token isolation and egress control.&lt;/strong&gt; Just naming those two axes separately changed how the conversation went.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default-deny networking is the sweet spot between safety and usability.&lt;/strong&gt; Block everything is unusable; allow everything is unsafe. "Block, then explicitly allow" is a model normal users already understand from firewalls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-sourcing the boundary mattered more than I expected.&lt;/strong&gt; Users don't have to "trust me" — they can read the code that swaps the token, and the code that decides which requests are allowed out. That is a much stronger default than a marketing claim.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ClawCon Michigan
&lt;/h2&gt;

&lt;p&gt;I did not attend ClawCon Michigan.&lt;/p&gt;




&lt;h3&gt;
  
  
  Further reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/rednakta/which-sandbox-should-you-use-for-your-ai-agent-44j0"&gt;Which Sandbox Should You Use for Your AI Agent? — VM vs Docker vs OSS vs nilbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/docs/tutorial-zero-token/introduction" rel="noopener noreferrer"&gt;Zero Token Architecture — full write-up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nilbox.run/docs/getting-started/installation" rel="noopener noreferrer"&gt;Install nilbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt; — source, issues, releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Let's stop telling people to buy a mac mini because OpenClaw makes them nervous. One click, one minute, and a sandbox that actually controls tokens and network — that's the home OpenClaw deserves.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
      <category>sandbox</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Open-Source Local Sandbox Agents, MCP Servers, and Unknown Apps Actually Need</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Sat, 25 Apr 2026 02:27:48 +0000</pubDate>
      <link>https://dev.to/rednakta/the-open-source-local-sandbox-agents-mcp-servers-and-unknown-apps-actually-need-7fh</link>
      <guid>https://dev.to/rednakta/the-open-source-local-sandbox-agents-mcp-servers-and-unknown-apps-actually-need-7fh</guid>
      <description>&lt;p&gt;There's a conversation developers keep having right now, and it's the same conversation in three different disguises.&lt;/p&gt;

&lt;p&gt;"How do I run this AI agent without it nuking my repo?" "How do I try this MCP server without handing a stranger's code my shell?" "How do I check out this random GitHub project without installing half of it into my laptop?"&lt;/p&gt;

&lt;p&gt;Three questions, one answer. All three are &lt;em&gt;untrusted code running as you, on your machine, with your files and your tokens&lt;/em&gt;. That's the same trust class. It deserves the same response: a &lt;strong&gt;local sandbox you can install in one click&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not a cloud API you pipe prompts into. Not a closed-source "trust us" runtime. A sandbox whose boundary is on disk, whose source is on GitHub, and whose kill switch is a window you close.&lt;/p&gt;

&lt;p&gt;And as far as we can tell, nothing of that exact shape existed until now. nilbox is — to our knowledge — the &lt;strong&gt;first cross-platform GUI sandbox&lt;/strong&gt; for AI agents, MCP servers, and untrusted apps: one installer for Windows, one for macOS, one for Linux, the same VM and the same boundary inside each. The source lives in the open at github, so the boundary is something you can read rather than something you have to take on faith.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Agents, MCP servers, and unknown apps collapse to one problem: untrusted code running on your host as you.&lt;/li&gt;
&lt;li&gt;Cloud sandboxes don't fit desktop workflows; closed-source sandboxes don't fit the trust model you're trying to establish in the first place.&lt;/li&gt;
&lt;li&gt;The right shape is &lt;strong&gt;local + one-click&lt;/strong&gt;: VM-grade isolation on your own machine, no round-trip to somebody else's cluster, with a readable source you can audit if you want to.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt; ships that — to our knowledge, the &lt;strong&gt;first cross-platform GUI sandbox&lt;/strong&gt; of this kind shipping real installers on Windows, macOS, and Linux. Debian-based VM, Zero Token boundary so the real API key never enters the sandbox, default-deny egress. Source is up at &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt; for transparency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three workloads, one threat model
&lt;/h2&gt;

&lt;p&gt;Stop thinking of these as three separate problems. They're one problem with three surfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agents.&lt;/strong&gt; The agent reads a web page, decides what to execute, and runs it. The "decision" is a language model's token stream. That means every external input — a README, a PDF, an HTML page, the output of a tool call — is a potential instruction. Prompt injection is not a rare exploit; it's how untrusted text is &lt;em&gt;supposed&lt;/em&gt; to work against a model that was trained on "helpfully follow instructions." The agent is one injected sentence away from &lt;code&gt;cat ~/.ssh/id_rsa&lt;/code&gt; or &lt;code&gt;curl -X POST&lt;/code&gt; with your secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP servers.&lt;/strong&gt; MCP is great. It's also a protocol for letting an agent call code somebody else wrote and you didn't read. Two independent risks compound here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The MCP server itself is a binary you just ran. If it's hostile, it's already inside your agent's trust boundary the moment you start it.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;responses&lt;/em&gt; an MCP server returns are text the agent will treat as tool output — and often, downstream, as context for the next model call. A malicious response is a prompt injection carrier with extra steps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So MCP isn't a safer category than agents. It's an amplifier: more third-party code paths, more injection surfaces, more tokens in play.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown apps.&lt;/strong&gt; The oldest version of the problem. The &lt;code&gt;curl | bash&lt;/code&gt; install for a CLI you want to evaluate. The GitHub repo a coworker forwarded. The binary in a Slack DM. The npm package whose name you half-remember. You want to &lt;em&gt;try&lt;/em&gt; it without &lt;em&gt;installing&lt;/em&gt; it — without writing it into your PATH, your dotfiles, your keychain, your browser session.&lt;/p&gt;

&lt;p&gt;The threat shape is the same across all three. Untrusted code, your credentials, your network, your home directory. &lt;strong&gt;Same trust class, same answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;:::warning[The framing trap]&lt;br&gt;
It's tempting to build three different answers — a coding-agent sandbox, an MCP runner, a try-before-you-install jail. Don't. That's three half-finished security boundaries you have to keep in sync forever. One sandbox that all three run inside is less to maintain &lt;em&gt;and&lt;/em&gt; less to get wrong.&lt;br&gt;
:::&lt;/p&gt;

&lt;h2&gt;
  
  
  Why local matters
&lt;/h2&gt;

&lt;p&gt;The "local" word is doing real work in the sentence above. Drop it and the sandbox stops being the right tool for desktop AI workloads — for reasons that have less to do with security and more to do with how a developer's environment actually works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The dev environment is the work.&lt;/strong&gt; Your editor, your terminal, your services on &lt;code&gt;localhost&lt;/code&gt;, your shell aliases, your git checkout, the &lt;code&gt;node_modules&lt;/code&gt; you spent eleven minutes resolving — that's what the agent should be touching. Cloud sandboxes ask you to ship a snapshot somewhere else, run the agent there, and reconcile the result back. A local sandbox just runs alongside you. The agent reads the repo you're already reading, edits the files you can see in your editor, and its work shows up as &lt;code&gt;git diff&lt;/code&gt; lines you can review before they leave your branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability.&lt;/strong&gt; A laptop is the developer's actual environment, full stop. The plane, the cafe, the captive-portal hotel wifi, the corporate VPN that won't let HTTPS out to certain hosts, the off-network box you log into from a different country — wherever the laptop goes, the work goes. A local sandbox goes with it. A cloud sandbox needs network reachability, an active account, and someone else's uptime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ownership of side-effects.&lt;/strong&gt; When a local agent writes a file, the file is on your disk. When it edits a config, you &lt;code&gt;git diff&lt;/code&gt; it before committing. When the experiment goes nowhere, you &lt;code&gt;git stash&lt;/code&gt; and walk away. No remote session to clean up, no detached state on a server, no sync conflict between a cloud copy and a local copy. The agent's work is just work in your repo, treated like work you'd have done yourself.&lt;/p&gt;

&lt;p&gt;The cloud-sandbox category has its place — hosted code interpreters, backend agent platforms, anything where the sandbox is part of a product you're shipping. That's not this post. This post is about the sandbox &lt;em&gt;you&lt;/em&gt; need, sitting between your laptop and the things you don't trust yet.&lt;/p&gt;

&lt;p&gt;(A small aside on the source side of things: nilbox's boundary proxy, VM image, and store manifest are all in a public GitHub repo. Not as a marketing pitch, just as transparency — if you're going to trust a security boundary, being able to read it beats taking someone's word for it.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What a "good enough" local sandbox has to do
&lt;/h2&gt;

&lt;p&gt;Four things. If any of them is missing, the sandbox is incomplete.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kernel-level isolation.&lt;/strong&gt; Not just namespaces. A container escape is a host compromise, and LLM output is the exact kind of untrusted code that historically finds those bugs. VM-grade (hypervisor, microVM, whatever you want to call it) is the minimum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token leak prevention.&lt;/strong&gt; The real API key must not enter the sandbox. If it does, prompt injection and malicious packages both win — the kernel boundary doesn't protect a credential the process is &lt;em&gt;authorized to read&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default-deny egress.&lt;/strong&gt; The sandbox should reach the LLM provider you actually use and not much else. An agent that can &lt;code&gt;POST&lt;/code&gt; anywhere on the internet is one tool call away from exfiltration, regardless of how isolated the process itself is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Covers all three workloads.&lt;/strong&gt; Agent loops, MCP servers, and ad-hoc unknown apps have to run in the same environment, under the same boundary. If MCP servers require their own isolation mechanism, you'll skip it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A fifth, softer requirement: &lt;strong&gt;one-click install on the OS you actually use.&lt;/strong&gt; Security tools nobody runs are not security tools. If installing the sandbox is a multi-evening adventure in WSL, Docker daemons, or hypervisor kernel modules, your teammates will just run the agent on the host and hope. Hope is not a threat model.&lt;/p&gt;

&lt;h2&gt;
  
  
  How nilbox implements it
&lt;/h2&gt;

&lt;p&gt;nilbox is built exactly for this shape: a local sandbox for agents, MCP servers, and unknown apps, with the source kept open in the same repo.&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%2Fw8jutz0622nop89a9die.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%2Fw8jutz0622nop89a9die.png" alt="nilbox setup" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sandbox itself is a Debian-based VM called &lt;em&gt;Linux for nilbox&lt;/em&gt;. One-click install on macOS, Windows, and Linux — no WSL gymnastics, no Docker daemon, no "please enable virtualization in your BIOS" side-quest. The desktop app handles hypervisor setup, disk provisioning, and the shell handoff. When the window is open, the sandbox is running; when it's closed, it isn't.&lt;/p&gt;

&lt;p&gt;To our knowledge this is the &lt;strong&gt;first sandbox of this shape&lt;/strong&gt; that ships a real desktop GUI on all three platforms rather than an API or a CLI. Docker has a desktop app but isn't kernel-isolated; VMware and VirtualBox are cross-platform but not purpose-built for agents; cloud sandbox APIs are purpose-built but neither local nor GUI. Source is up at &lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt; if you'd rather read the boundary than take our word for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero Token Architecture&lt;/strong&gt; is the second layer. The agent inside the sandbox never sees the real API key. You hand it a placeholder — literally &lt;code&gt;OPEN_API_TOKEN=OPEN_API_TOKEN&lt;/code&gt; — and a boundary proxy substitutes the real token outside the sandbox, right before the outbound call leaves your machine:&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%2F6w9gcer9kcg6epfaxdgt.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%2F6w9gcer9kcg6epfaxdgt.png" alt="zero token architecture" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the sandbox leaks its environment — prompt injection, a malicious dependency, a curious &lt;code&gt;env&lt;/code&gt; tool call — what escapes is a string that equals its own variable name. You can't call an LLM with it, you can't charge anybody's account with it, you can't even prove which vendor it was for. The full argument lives in the &lt;a href="https://dev.to/blog/zero-token-architecture"&gt;Zero Token Architecture write-up&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP servers run inside the same sandbox&lt;/strong&gt; as the agent. That's the whole point of picking a single boundary — MCP isn't a separate trust domain, it's more code in the already-untrusted pile. When the agent talks to the MCP server, both are inside &lt;code&gt;Linux for nilbox&lt;/code&gt;; when either talks to the outside world, both hit the same boundary proxy and the same egress policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown apps&lt;/strong&gt; work the same way. Install the app into the sandbox via the store or a shell session. Try it, poke it, let it install things in its own home directory. If it turns out to be hostile, the blast radius is a Debian VM on a disk image you can delete. Your host &lt;code&gt;~/.ssh&lt;/code&gt;, your keychain, your browser cookies — never in scope.&lt;/p&gt;

&lt;p&gt;That's the full picture: one VM, one boundary, three workloads.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Kernel isolation&lt;/th&gt;
&lt;th&gt;Token leak prevention&lt;/th&gt;
&lt;th&gt;Egress allow-list&lt;/th&gt;
&lt;th&gt;Fits agent + MCP + unknown app&lt;/th&gt;
&lt;th&gt;One-click desktop GUI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw VM&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (manual)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker container&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (manual)&lt;/td&gt;
&lt;td&gt;Mostly&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud sandbox API&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Agent-only, usually&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;nilbox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ (VM)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're wondering how these four break down in more detail, the &lt;a href="https://dev.to/blog/sandbox-comparison"&gt;sandbox comparison post&lt;/a&gt; walks through each category and where it holds up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;p&gt;One sandbox. Three workloads. Local, so it fits your desktop workflow and your file tree. Default-secure, so the agent inside doesn't have the real API key, can't &lt;code&gt;POST&lt;/code&gt; to arbitrary hosts, and can't reach out of the VM into your home directory. The source sits on GitHub if you ever want to verify any of that for yourself.&lt;/p&gt;

&lt;p&gt;If you've been running agents, MCP servers, or sketchy binaries directly on your host because the "real" solution felt like too much setup — this is the setup. It's a window you open on your laptop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rednakta/nilbox" rel="noopener noreferrer"&gt;github.com/rednakta/nilbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>sandbox</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Which Sandbox Should You Use for Your AI Agent?</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Wed, 22 Apr 2026 11:34:53 +0000</pubDate>
      <link>https://dev.to/rednakta/which-sandbox-should-you-use-for-your-ai-agent-44j0</link>
      <guid>https://dev.to/rednakta/which-sandbox-should-you-use-for-your-ai-agent-44j0</guid>
      <description>&lt;p&gt;Let's stop pretending this is a nice-to-have.&lt;/p&gt;

&lt;p&gt;If you're running an AI agent in 2026 — OpenClaw, a Claude Code clone, a custom LangChain loop, anything that writes code and runs it — the agent is executing untrusted output on your machine. Not "might execute." &lt;strong&gt;Is executing.&lt;/strong&gt; Every &lt;code&gt;pip install&lt;/code&gt;, every shell command, every "let me just try this quick fix" is the agent acting on tokens a language model chose.&lt;/p&gt;

&lt;p&gt;That makes the sandbox question non-negotiable. The only real question left is &lt;em&gt;which&lt;/em&gt; sandbox.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;AI agents run untrusted, model-generated code — a sandbox isn't optional, it's the baseline.&lt;/li&gt;
&lt;li&gt;Your four realistic options: a Virtual Machine, a Docker container, a purpose-built OSS sandbox (E2B, Daytona, Firecracker-based), or a Zero Token Architecture runtime like &lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;VM, Docker, and most OSS sandboxes isolate the &lt;em&gt;process&lt;/em&gt; just fine — none of them protect the &lt;strong&gt;API token&lt;/strong&gt;, the &lt;strong&gt;network egress&lt;/strong&gt;, or defend against &lt;strong&gt;prompt injection exfiltrating secrets&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;nilbox is the only one that ships with all three out of the box, at the cost of being scoped to desktop AI agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why an AI agent sandbox is non-negotiable
&lt;/h2&gt;

&lt;p&gt;Here's the threat surface, concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The agent runs code you didn't write.&lt;/strong&gt; LLM-generated, copy-pasted from a model's decision tree, installed from an ecosystem like npm or PyPI that has a documented history of supply-chain attacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection is unsolved.&lt;/strong&gt; A README, an HTML page, a PDF, an MCP tool response — any of them can carry instructions that your model decides to follow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files leak.&lt;/strong&gt; Source code, &lt;code&gt;.env&lt;/code&gt; files, SSH keys, browser cookies, anything under the user's home directory is one &lt;code&gt;cat ~/.aws/credentials&lt;/code&gt; away from an egress call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your internal network is reachable.&lt;/strong&gt; An agent running on your laptop sits on the same LAN as your NAS, your router admin panel, your work VPN's reachable subnets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running an AI agent directly on your host OS in 2026 is the same decision class as running a random &lt;code&gt;.exe&lt;/code&gt; from a forum in 2005. The sandbox isn't paranoia. It's the minimum.&lt;/p&gt;

&lt;p&gt;So — which sandbox?&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Kernel-level isolation&lt;/th&gt;
&lt;th&gt;API token leak prevention&lt;/th&gt;
&lt;th&gt;Built-in egress firewall&lt;/th&gt;
&lt;th&gt;Prompt-injection token defense&lt;/th&gt;
&lt;th&gt;One-click cross-OS GUI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Virtual Machine&lt;/strong&gt; (VirtualBox, VMware, etc.)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (manual)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker container&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial (shared kernel)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (manual)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;OSS sandboxes&lt;/strong&gt; (E2B, Daytona, Firecracker-based, etc.)&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (API-first)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;nilbox&lt;/strong&gt; (Zero Token + Linux for nilbox)&lt;/td&gt;
&lt;td&gt;✓ (VM)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now the deep dives. Each contender, same structure: how it isolates, where it genuinely holds up, where it breaks for AI agents specifically, and who it's actually best for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Machine
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How it isolates.&lt;/strong&gt; A hypervisor gives the guest its own kernel, filesystem, and memory. From the host's point of view, the agent is running inside something that looks like a completely separate computer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it holds up.&lt;/strong&gt; VMs are the most battle-tested isolation primitive we have. Decades of hardened attack-surface research, strong kernel boundary, snapshot-and-revert is free, and if the guest gets rooted your host is still mostly fine. For running arbitrary binaries with no assumptions about their behavior, a VM is the heavyweight gold standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it breaks for AI agents.&lt;/strong&gt; The problem is that a VM isolates the &lt;em&gt;process&lt;/em&gt;, not the &lt;em&gt;credentials&lt;/em&gt; the process needs to do its job. To run an agent that talks to OpenAI or Anthropic, you have to inject the real API key into the VM. Once it's in there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt injection can convince the agent to echo &lt;code&gt;$OPEN_API_TOKEN&lt;/code&gt; into its next response.&lt;/li&gt;
&lt;li&gt;A malicious dependency can &lt;code&gt;POST process.env&lt;/code&gt; to a remote server.&lt;/li&gt;
&lt;li&gt;The VM's network egress is wide open by default — no firewall, no allow-list, the guest can reach any URL that resolves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VMs also lose on ergonomics. Installing one is a multi-step adventure, setup drifts between users, and nobody on your team is going to spin one up correctly every single time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Long-running workloads where you need full OS isolation and have the operational muscle to run a real VM infrastructure. Not great as a daily driver for desktop AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker container
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How it isolates.&lt;/strong&gt; Docker uses Linux kernel namespaces and cgroups to give the container its own view of processes, network, and filesystem, while sharing the host kernel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it holds up.&lt;/strong&gt; Fast. Ubiquitous. Reproducible. A &lt;code&gt;Dockerfile&lt;/code&gt; gives you a pinned environment that works the same on every team member's machine. The tooling is unreasonably good, and the ecosystem of pre-built images covers almost any runtime an agent might need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it breaks for AI agents.&lt;/strong&gt; Three independent problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shared kernel.&lt;/strong&gt; A container escape is a host compromise. There's been a steady trickle of these for a decade. For untrusted code — which is what LLM output is — a container is a weaker boundary than a VM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokens live in env vars.&lt;/strong&gt; You pass the real API key via &lt;code&gt;-e OPEN_API_TOKEN=sk-...&lt;/code&gt; or a Docker secret mount, and now the agent process can read it directly. Every token-leak vector that applies to a VM applies here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress is uncontrolled.&lt;/strong&gt; By default a container can reach the full internet and, on most setups, your LAN. Locking that down means building a second Docker network, running a proxy sidecar, or configuring iptables — doable, but nobody actually does it consistently.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; CI pipelines, reproducible dev environments, any team that already lives in Docker and wants fast iteration. A reasonable &lt;em&gt;component&lt;/em&gt; of an agent sandbox — not a complete one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other open-source sandboxes
&lt;/h2&gt;

&lt;p&gt;Covering E2B, Daytona, Firecracker-based microVM projects, and the broader category of purpose-built "run LLM-generated code safely" projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How they isolate.&lt;/strong&gt; Varies by project. Some wrap Docker (weaker kernel boundary, same issues). Some use Firecracker or similar microVM technology (stronger, closer to VM-grade isolation). Some are pure userland jails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where they hold up.&lt;/strong&gt; These are the only tools on this list &lt;em&gt;purpose-built&lt;/em&gt; for running AI-generated code. Cold-start is measured in milliseconds, the APIs are clean, and the better ones (microVM-backed) give you VM-grade isolation with container-grade ergonomics. If you're shipping a hosted code-interpreter product, this is the correct category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where they break for AI agents.&lt;/strong&gt; Almost all of them are API-first and cloud-hosted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The API token is still real.&lt;/strong&gt; Whether you pass it as an env var to the sandbox runtime or as a header to the hosted API, the agent inside eventually sees the real key. Prompt injection and malicious packages still win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress firewall varies wildly.&lt;/strong&gt; Some projects let you allow-list hostnames; most assume the caller will configure this correctly. "Some assembly required" is not a security posture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No desktop integration.&lt;/strong&gt; These are infrastructure primitives. If you want a GUI, you build it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-hosted variants move your code off-box.&lt;/strong&gt; Which may or may not be fine depending on your compliance story, but it's a separate conversation you now have to have.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Server-side agent platforms, hosted code interpreters, teams shipping an AI product where the sandbox is part of their backend. Wrong shape for a desktop developer running agents on their own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  nilbox — Zero Token Architecture + Linux for nilbox
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How it isolates.&lt;/strong&gt; Two layers. First, a dedicated Debian-based VM called &lt;em&gt;Linux for nilbox&lt;/em&gt; that runs the agent — same hypervisor-grade isolation as a raw VM, but installed with one click on Windows, macOS, or Linux. Second, a boundary proxy that implements &lt;strong&gt;Zero Token Architecture&lt;/strong&gt;: the agent never sees the real API key.&lt;/p&gt;

&lt;p&gt;The short version of Zero Token (I wrote the &lt;a href="https://dev.to/nilbox/your-ai-agent-doesnt-need-your-api-key-4j8j"&gt;full argument here&lt;/a&gt;): instead of handing the agent &lt;code&gt;OPEN_API_TOKEN=sk-proj-real-...&lt;/code&gt;, you hand it &lt;code&gt;OPEN_API_TOKEN=OPEN_API_TOKEN&lt;/code&gt;. Yes, the value is literally the variable's own name. The boundary proxy intercepts outbound calls, recognizes the placeholder, swaps in the real token (stored encrypted outside the agent), and forwards upstream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────┐   OPEN_API_TOKEN   ┌──────────┐   sk-proj-real   ┌──────┐
│  Agent    │  ───────────────▶  │ Boundary │  ──────────────▶ │ LLM  │
└───────────┘                    └──────────┘                  └──────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Where it holds up.&lt;/strong&gt; It closes all three of the gaps the other options leave open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token leak prevention.&lt;/strong&gt; Prompt injection can exfiltrate every environment variable the agent has. What escapes is &lt;code&gt;OPEN_API_TOKEN=OPEN_API_TOKEN&lt;/code&gt; — a useless string. The attacker can't call the LLM with it, can't charge your account, can't even prove which vendor it was for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress firewall built in.&lt;/strong&gt; The boundary refuses outbound traffic that doesn't go through the token-substitution path, which also catches "the agent is trying to call an arbitrary URL" as a side effect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click cross-platform GUI.&lt;/strong&gt; No WSL, no Docker CLI, no VM setup wizard. Install the desktop app, click install on OpenClaw or your agent of choice, done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it breaks / trade-offs.&lt;/strong&gt; nilbox is scoped to desktop AI agents. It isn't a server-side code-interpreter product, it isn't a Firecracker replacement, and the ecosystem is younger than Docker or VMware by a couple of decades. If you're shipping a hosted service, this isn't your tool. If you're running an agent on your own laptop, it is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for.&lt;/strong&gt; Desktop developers running AI agents who want defense-in-depth — token leak prevention, network egress control, and VM isolation — without assembling the three themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you need…&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full OS isolation for arbitrary binaries, operational team to run it&lt;/td&gt;
&lt;td&gt;Virtual Machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproducible dev environments, fast iteration, existing Docker muscle&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend sandbox for a hosted AI product or code-interpreter service&lt;/td&gt;
&lt;td&gt;E2B / Daytona / Firecracker-based OSS sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop AI agents with token + network + prompt-injection defense out of the box&lt;/td&gt;
&lt;td&gt;nilbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No row says "everything." That's the honest answer. Docker wins on ergonomics, VMs win on maturity, Firecracker-class sandboxes win on purpose-built isolation, and nilbox wins on &lt;em&gt;defense-in-depth for the desktop AI-agent use case specifically&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;p&gt;Every option on this list gives you &lt;em&gt;some&lt;/em&gt; isolation. Only one of them also assumes your agent will leak its API key, pivot to your network, and echo your secrets back into a prompt response — and designs around it.&lt;/p&gt;

&lt;p&gt;Here's the rule: &lt;strong&gt;whatever you pick, measure it against token leakage, egress control, and prompt-injection exfiltration, not just "does it isolate the process?"&lt;/strong&gt; A process-level sandbox that still hands the agent a real &lt;code&gt;sk-proj-...&lt;/code&gt; is an incomplete answer. The agent doesn't need to escape the sandbox to cost you money or leak data — it just needs to talk on the network with credentials it shouldn't have.&lt;/p&gt;

&lt;p&gt;If you're rolling your own, bolt a local proxy + placeholder token + egress allow-list onto your Docker or VM setup. If you'd rather not build that, &lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;nilbox&lt;/a&gt; is open source and ships the full stack for desktop agents. Either way: &lt;strong&gt;stop running agents without a sandbox, and stop calling a sandbox complete when the agent inside it still holds your real API key.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Previously, on the same theme: &lt;a href="https://dev.to/rednakta/zero-token-architecture-why-your-ai-agent-should-never-see-your-real-api-key-3a1n"&gt;Your AI Agent Doesn't Need Your API Key&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sandbox</category>
      <category>agents</category>
      <category>openclaw</category>
      <category>ai</category>
    </item>
    <item>
      <title>Zero Token Architecture: Why Your AI Agent Should Never See Your Real API Key</title>
      <dc:creator>rednakta</dc:creator>
      <pubDate>Sat, 18 Apr 2026 10:59:02 +0000</pubDate>
      <link>https://dev.to/rednakta/zero-token-architecture-why-your-ai-agent-should-never-see-your-real-api-key-3a1n</link>
      <guid>https://dev.to/rednakta/zero-token-architecture-why-your-ai-agent-should-never-see-your-real-api-key-3a1n</guid>
      <description>&lt;p&gt;Hot take: every AI agent security guide I've read is solving the wrong problem.&lt;/p&gt;

&lt;p&gt;We spend hours sandboxing the runtime. We lock down the filesystem. We audit every package. We wrap the agent in Docker, then wrap Docker in a VM, then wrap the VM in policy.&lt;/p&gt;

&lt;p&gt;And then we hand the agent a plaintext API key and call it secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop protecting the token. Just don't hand it over.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Prompt injection + arbitrary package execution means any token your AI agent can see is a token it can leak.&lt;/li&gt;
&lt;li&gt;Instead of protecting the token after the agent has it, pass the agent a &lt;em&gt;fake&lt;/em&gt; token whose value equals its own name.&lt;/li&gt;
&lt;li&gt;Intercept the agent's outbound API call at the boundary and swap in the real token there.&lt;/li&gt;
&lt;li&gt;If the fake leaks, the attacker gets a useless string. The real token never leaves your trusted process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem with "protect the token"
&lt;/h2&gt;

&lt;p&gt;Here's what an AI agent's environment typically looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OPEN_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-proj-1a2b3c4d5e...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a real, working key. The agent reads it, puts it in an &lt;code&gt;Authorization: Bearer&lt;/code&gt; header, and makes calls. Fine — until any of these happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection&lt;/strong&gt; convinces the agent to &lt;code&gt;echo $OPEN_API_TOKEN&lt;/code&gt; into its next response.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;malicious npm/pip package&lt;/strong&gt; the agent installed reads &lt;code&gt;process.env&lt;/code&gt; and POSTs it to a server far, far away.&lt;/li&gt;
&lt;li&gt;The agent &lt;strong&gt;writes a log file&lt;/strong&gt; that happens to include the header it just sent.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;tool call&lt;/strong&gt; returns the token because the model decided it would be helpful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every mitigation we reach for — sandboxes, permission prompts, egress filtering, audit logs — is downstream of the mistake. The mistake is that the secret exists inside a process we do not trust.&lt;/p&gt;

&lt;p&gt;You cannot perfectly contain a value inside a process that runs arbitrary, model-generated code. You just can't. So stop trying.&lt;/p&gt;

&lt;h2&gt;
  
  
  The paradigm flip
&lt;/h2&gt;

&lt;p&gt;Ask a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the agent never had the real token in the first place?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sounds impossible, because API calls need tokens. But the agent doesn't need the &lt;em&gt;real&lt;/em&gt; token — it just needs the call to succeed. If something else substitutes the real token on the way out, the agent's world is unchanged.&lt;/p&gt;

&lt;p&gt;That something else is a tiny proxy sitting between your agent and the upstream LLM. Let's call it the boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before
&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;# In the agent's environment&lt;/span&gt;
&lt;span class="nv"&gt;OPEN_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-proj-1a2b3c4d5e...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real token sits inside the agent. Compromise the agent, compromise the token.&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&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;# In the agent's environment&lt;/span&gt;
&lt;span class="nv"&gt;OPEN_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OPEN_API_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not a typo. The variable's &lt;strong&gt;value is its own name&lt;/strong&gt;. The agent reads it, builds &lt;code&gt;Authorization: Bearer OPEN_API_TOKEN&lt;/code&gt;, sends the request. It has no idea anything is weird.&lt;/p&gt;

&lt;p&gt;The boundary intercepts the outbound call, recognizes the placeholder, swaps in the real token (which lives encrypted, outside the agent's reach), and forwards the request upstream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────┐   OPEN_API_TOKEN   ┌──────────┐   sk-proj-real   ┌──────┐
│  Agent    │  ───────────────▶  │ Boundary │  ──────────────▶ │ LLM  │
└───────────┘                    └──────────┘                  └──────┘
     ▲                                                              │
     │                         response                             │
     └──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the agent's perspective: totally normal request, totally normal response. From the attacker's perspective, there's nothing worth stealing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hacker scenario
&lt;/h2&gt;

&lt;p&gt;Let's pretend the worst happened. Prompt injection, malicious dependency, whatever — the attacker exfiltrates everything in the agent's environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old world:&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;OPEN_API_TOKEN=sk-proj-1a2b3c4d5e...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Game over. Billable incidents. Rotation storm. PagerDuty at 3am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New world:&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;OPEN_API_TOKEN=OPEN_API_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations, they got a string. They can't call the LLM with it. They can't charge your account with it. They can't even prove which vendor it was for without extra context.&lt;/p&gt;

&lt;p&gt;The leak still &lt;em&gt;happened&lt;/em&gt;. We simply made the leaked value worthless.&lt;/p&gt;

&lt;p&gt;This is the same logic as a one-time password or a macaroon: assume the secret &lt;em&gt;will&lt;/em&gt; escape, and design so that escaping it costs the attacker nothing and you nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters right now
&lt;/h2&gt;

&lt;p&gt;Three trends collide:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agents are running untrusted code.&lt;/strong&gt; Tool use, code interpreters, and "install this skill" flows mean agent processes routinely execute arbitrary inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection is not solved.&lt;/strong&gt; It's not going to be solved by a better system prompt. Treat agent processes as adversarial, always.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokens are expensive.&lt;/strong&gt; A leaked OpenAI or Anthropic key is not just a credential breach, it's a bill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every AI agent stack I see ships with the real token in an env var because that's how twelve-factor apps work. Agents aren't twelve-factor apps. They're sandboxes for arbitrary model output, except the sandbox is "a language model promised to be careful."&lt;/p&gt;

&lt;p&gt;The fix isn't a better sandbox. The fix is not putting the secret in the sandbox in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to apply this
&lt;/h2&gt;

&lt;p&gt;If you're rolling your own agent harness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put a &lt;strong&gt;local HTTP proxy&lt;/strong&gt; between your agent and any upstream API.&lt;/li&gt;
&lt;li&gt;Give the agent a placeholder token (&lt;code&gt;KEY=KEY&lt;/code&gt; works fine).&lt;/li&gt;
&lt;li&gt;Store the real secret &lt;strong&gt;outside&lt;/strong&gt; the agent's process — OS keychain, a separate daemon, whatever.&lt;/li&gt;
&lt;li&gt;In the proxy, match on the placeholder and substitute the real bearer before forwarding.&lt;/li&gt;
&lt;li&gt;Refuse to forward requests that didn't come through the expected placeholder — this also catches agents trying to call arbitrary URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather not build this yourself, this idea is the spine of &lt;a href="https://nilbox.run" rel="noopener noreferrer"&gt;&lt;strong&gt;nilbox&lt;/strong&gt;&lt;/a&gt;, an open-source desktop runtime for AI agents. It bundles the proxy, VM isolation, and an encrypted token store so any agent you install can't see your keys — even if it wants to. The full write-up lives in the &lt;a href="https://docs.nilbox.run/docs/tutorial-zero-token/introduction" rel="noopener noreferrer"&gt;Zero Token Architecture docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The whole security conversation around AI agents is framed as "how do we protect the token we gave the agent?" That's the wrong question.&lt;/p&gt;

&lt;p&gt;The right question is: &lt;strong&gt;why did we give it a token at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the agent never had it, the agent can't leak it. Everything else is downstream.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>architecture</category>
      <category>security</category>
      <category>openclaw</category>
    </item>
  </channel>
</rss>
