How NemoClaw Works Under the Hood
Posted on Tue 12 May 2026 in AI Engineering
How NemoClaw Works Under the Hood
You've built the sandbox. You've sent a Slack message from inside it. Now let's talk about why things work the way they do — and why certain things that seem like they should work, don't.
This post is about the architecture. Once you understand it, everything clicks.
Two Types of Agents — and Why It Matters
NemoClaw runs two fundamentally different kinds of agents. Most people don't realise this until something breaks.
Subagent (main) |
ACP Agent (codex, claude) |
|
|---|---|---|
| Where it runs | Inside the sandbox | On your Mac host |
| Internet access | Blocked by default | Full |
| Can browse the web? | Only via approved plugins | Yes, directly |
| Can edit your files? | No | Yes |
| Persists between sessions? | No | Yes |
| Best for | Chat tasks, simple requests | Coding, scraping, file editing |
Your main agent — the one you talk to inside the sandbox — is a subagent. It's deliberately limited.
ACP agents are different. They run outside the sandbox entirely, on your host machine. They have real access to your filesystem, the internet, and your tools.
When a subagent hits a wall, it can ask an ACP agent for help. That's the design.
The Security Model: Why Config Is Read-Only in the Sandbox
Here's something that trips up almost everyone:
You find a config file inside your sandbox. You edit it. You restart. Nothing changes.
This isn't a bug. It's intentional.
NemoClaw builds sandbox config from your host at startup time:
~/.nemoclaw/sandboxes.json ← generated by NemoClaw on host
When the sandbox spins up, it reads from the host config and constructs the isolated environment. Anything you change inside the sandbox is overwritten the next time it starts.
The rule is simple: sandbox config flows one way — from host to sandbox, never the reverse.
This is a security decision. If a compromised agent could modify its own sandbox config, it could escalate its own permissions. By making config read-only from inside, NemoClaw ensures an agent can never grant itself more access than it was given at boot.
Where the Config Actually Lives
Two locations matter. Know them.
Host-side (persistent, authoritative):
~/.nemoclaw/ ← NemoClaw's own config
~/.config/openclaw/ ← OpenClaw gateway config (plugins, ACP agents)
Sandbox-side (ephemeral, read-only):
/sandbox/.openclaw/ ← Injected at startup, read-only inside sandbox
When you want to change something — a plugin setting, an API token, an ACP agent config — you change it on the host side, then restart the sandbox. Editing inside /sandbox/.openclaw/ is pointless.
Policy Presets: NemoClaw's Permission System
NemoClaw ships with policy presets that control what a sandbox is allowed to do. You saw these during nemoclaw onboard.
Common presets:
| Preset | Internet | File Access | ACP Dispatch |
|---|---|---|---|
strict |
Blocked | None | Disabled |
standard |
MCP plugins only | None | Disabled |
permissive |
Partial | Read-only | Enabled |
open |
Full | Read/Write | Enabled |
Most default installs use standard. This is why your sandbox can send Slack messages (through a plugin) but can't browse arbitrary URLs or edit your files.
To see your current policy:
nemoclaw kaav-assistant config get
To change it (on the host, before restarting):
nemoclaw kaav-assistant config set policy permissive
nemoclaw restart kaav-assistant
How ACP Connects Everything
Here's the full architecture — the thing that makes sense of all the above:
┌────────────────────────────────────────────┐
│ YOUR MAC (Host) │
│ │
│ ~/.nemoclaw/ ← NemoClaw config │
│ ~/.config/openclaw/ ← ACP/gateway cfg │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ OpenClaw Gateway │ │
│ │ ┌───────────┐ ┌─────────────────┐ │ │
│ │ │ ACPX Plugin│ │ ACP Agents │ │ │
│ │ │ │ │ (codex, claude) │ │ │
│ │ └───────────┘ └─────────────────┘ │ │
│ └──────────────────────────────────┬───┘ │
│ │ │
│ ┌──────────────────────────────────▼───┐ │
│ │ NemoClaw Sandbox │ │
│ │ │ │
│ │ /sandbox/.openclaw/ ← read-only │ │
│ │ │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ Subagent "main" │ │ │
│ │ │ (sends requests to gateway) │ │ │
│ │ └──────────────────────────────┘ │ │
│ └──────────────────────────────────────┘ │
└────────────────────────────────────────────┘
The subagent can request things from the gateway. The gateway decides whether to fulfil them based on policy. ACP agents sit on the other side of the gateway with full access.
The sandbox itself never gets more powerful. The system around it does the heavy lifting.
The ACPX Plugin: The Bridge
ACPX is the plugin that connects your sandboxed subagent to the ACP layer. You may have seen it when running:
openclaw plugins list
It's often listed but disabled. That's expected on a default install.
To check if ACP is actually reachable from inside your sandbox:
/acp doctor
- Healthy → the host gateway is running and ACP is connected
- Error / no response → the gateway isn't running on the host yet
If it's not healthy, you need to start the gateway on your host:
# On your Mac, outside the sandbox
openclaw gateway
Keep that process running. Your subagent will now be able to dispatch tasks to ACP agents.
Putting It All Together
Here's the mental model that ties everything together:
NemoClaw is a trust hierarchy.
- The host is fully trusted. It holds real config, real credentials, real tools.
- The gateway is selectively trusted. It decides what requests from the sandbox are allowed.
- The sandbox is minimally trusted. It can only do what the host explicitly permits.
- The subagent lives in the sandbox. It's the least trusted component in the chain.
This isn't a limitation. It's a feature. You can build powerful, capable AI workflows while maintaining clear boundaries about what each piece is allowed to do.
Understanding this hierarchy is the difference between fighting NemoClaw and working with it.
Quick Reference
Host config → ~/.nemoclaw/ and ~/.config/openclaw/
Sandbox config → /sandbox/.openclaw/ (read-only, injected at boot)
Change settings → Always on host, then nemoclaw restart
Check ACP → /acp doctor (from inside sandbox)
Start gateway → openclaw gateway (on host, outside sandbox)
Check policy → nemoclaw <name> config get