Run OpenClaw more securely inside NVIDIA OpenShell with managed inference https://docs.nvidia.com/nemoclaw/latest/
Find a file Use this template
Tinson Lai 907e410d8d
Some checks failed
Images / Base Images / build-and-push (push) Waiting to run
Images / Base Images / build-and-push-hermes (push) Waiting to run
Security / Code Scanning / CodeQL (javascript-typescript) (push) Waiting to run
Security / Code Scanning / CodeQL (python) (push) Waiting to run
Security / Code Scanning / ShellCheck SARIF (push) Waiting to run
e2e-branch-validation.yaml / feat(channels): add WhatsApp messaging channel with QR pairing (#3392) (push) Failing after 0s
Security / Installer Hash Check / check-hash (push) Waiting to run
E2E / macOS / macos-e2e (push) Waiting to run
CI / Main / checks (push) Waiting to run
CI / Main / sandbox-images-and-e2e (push) Blocked by required conditions
CI / Platform Vitest Main Watch / macos-vitest (push) Waiting to run
CI / Platform Vitest Main Watch / wsl-vitest (push) Waiting to run
E2E / WSL / wsl-e2e (push) Waiting to run
feat(channels): add WhatsApp messaging channel with QR pairing (#3392)
## Summary
Adds WhatsApp as a QR-paired messaging channel alongside
Telegram/Discord/Slack, and ships the network policy preset that
unblocks the consumer WhatsApp Web protocol from inside an OpenShell
sandbox. WhatsApp uses Curve25519 QR pairing rather than a static token,
so `ChannelDef.envKey` becomes optional and the wizard skips the token
prompt for QR-paired channels.

## Related Issue
Fixes #361
Fixes #513

## Changes
- New `nemoclaw-blueprint/policies/presets/whatsapp.yaml`:
- L4 CONNECT tunnel (`access: full, tls: skip`) for `web.whatsapp.com`
and `*.web.whatsapp.com` so the proxy stops negotiating h2 on the
`/ws/chat` upgrade and stops auto-terminating TLS on the Noise
handshake.
- REST allow-lists for the apex `whatsapp.net` and the `*.whatsapp.net`
wildcard (covers `mmg`, `static`, `cdn`, `pps`, `v`, `e1`, `f`, `s`,
etc. — all Meta-controlled; mirrors the `*.atlassian.net` precedent in
the jira preset).
- **Non-Meta endpoint:** a GET-only rule pinned to the single path
`raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/index.ts`
so Baileys' `fetchLatestBaileysVersion()` succeeds at runtime. Without
it Baileys advertises its bundled (stale) WA protocol constant and Meta
rejects pairing with `<failure reason="405"/>`.
- WhatsApp joins the **Open** tier in `tiers.yaml`.
- `ChannelDef` gains `loginMethod` (`"token-paste"` / `"host-qr"` /
`"in-sandbox-qr"`); `envKey` becomes optional. New
`channelUsesInSandboxQrPairing` and `channelHasStaticToken` helpers in
`sandbox/channels.ts`.
- `onboard.ts`: wizard prompt loop short-circuits for in-sandbox-QR
channels (prints pairing instructions, skips token prompt).
`getMessagingToken`, conflict-detection, `enabledEnvKeys` /
`disabledEnvKeys`, and the userId loop now tolerate tokenless channels.
`setupMessagingChannels` filters available channels by the active
agent's `messagingPlatforms` so each agent only sees what it advertises.
`activeMessagingChannels` now includes QR-selected channels so the
sandbox image, registry state, and policy bootstrap all preserve them.
- `policy-channel.ts`: `addSandboxChannel` and `removeSandboxChannel`
normalise `channelArg` before logging, registry writes, and rebuild
reasons. The in-sandbox-QR path registers the channel in the registry
without upserting a bridge provider. The matching built-in network
policy preset is applied to the sandbox before the rebuild so the bridge
has egress on first start; failures warn and tell the user to run
`policy-add` manually.
- `agents/openclaw/manifest.yaml`: `whatsapp` moves from the `# Future:`
comment into `supported:` and into `state_dirs:` (Baileys session state
is durable across rebuilds, not baked into the image). Hermes
intentionally does not advertise WhatsApp, and the wizard filter
respects that.
- `policy/index.ts`: messaging-preset warning text now uses generic
"channel setup, pairing, and runtime configuration" wording so it reads
correctly for QR-paired channels.
- In-sandbox guard (`scripts/nemoclaw-start.sh`): `openclaw channels
login` and `channels status` are intentionally allowed; mutating ops
stay blocked. The error message distinguishes WhatsApp's in-sandbox
pairing path from WeChat's host-side QR.
- Tests: `channels.test.ts` covers the in-sandbox-QR shape, the three
`loginMethod` values, and mixed-case canonicalisation;
`policies.test.ts` adds regression cases for `whatsapp.yaml` (L4 + `tls:
skip` on `web.whatsapp.com`; apex+wildcard `whatsapp.net` REST methods;
the GET-pinned `raw.githubusercontent.com` rule).
- Docs: `messaging-channels.md` describes the QR-pair flow, the durable
`whatsapp` state directory, and the three login modes; `commands.md`
describes `token-paste` / `host-qr` / `in-sandbox-qr` for `channels add`
and the auto-applied preset behaviour; `network-policies.md` and
`integration-policy-examples.md` fold `wechat` and `whatsapp` into the
baseline-policy and matching-preset wording; user-reference skill
regenerated.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [x] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification
- [x] `npx prek run --all-files` passes
- [x] `npm test` passes
- [x] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [x] Docs updated for user-facing behavior changes
- [ ] `make docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

---
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* WhatsApp channel added with in‑sandbox QR pairing; supported in
onboarding for both agents and persisted across rebuilds.

* **Documentation**
* Expanded onboarding, channel setup, CLI reference, troubleshooting,
network-policy, and integration docs to cover WhatsApp workflows,
pairing, and persistence.

* **Policy**
* New WhatsApp network preset (endpoints, node runtime scope) and added
to the Open tier.

* **Chores / CLI**
* In‑sandbox WhatsApp login permitted; config generation and agent
manifests updated to handle tokenless WhatsApp sessions.

* **Tests**
* Unit, integration, and E2E tests added/updated for WhatsApp behavior.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NemoClaw/pull/3392?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: J. Yaunches <jyaunches@nvidia.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Aaron Erickson <aerickson@nvidia.com>
2026-05-18 22:51:40 -07:00
.agents/skills docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
.claude docs(skills): make copy of docs-as-skills for Claude (#837) 2026-03-24 15:08:13 -07:00
.github feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
agents feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
bin fix(hermes): use invoked CLI name in onboard next-steps output (#3358) (#3382) 2026-05-12 20:54:22 -07:00
ci docs: revert wechat updates (#3621) 2026-05-15 12:52:17 -07:00
docs feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
fern docs: remaining fern doc fixes (#3780) 2026-05-18 20:04:42 -07:00
ISSUE_TEMPLATE Create bug_report.yml (#371) 2026-03-18 17:50:58 -07:00
nemoclaw fix(security): harden low-risk code scanning findings (#3657) 2026-05-17 17:47:40 -07:00
nemoclaw-blueprint feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
schemas fix(messaging): use native WebSocket credential rewrite (#3323) 2026-05-12 17:34:04 -07:00
scripts feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
src feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
test feat(channels): add WhatsApp messaging channel with QR pairing (#3392) 2026-05-18 22:51:40 -07:00
tools/e2e-advisor test(e2e): prove Discord proxy binary whitelist (#3663) 2026-05-17 11:27:46 -07:00
.coderabbit.yaml chore(ci): remove CodeRabbit E2E recommendations (#3723) 2026-05-18 20:14:42 -07:00
.dockerignore fix(security): add missing sensitive file patterns to .dockerignore (#1994) 2026-04-16 18:18:36 -07:00
.editorconfig Add linting, formatting, and code quality hardening 2026-03-14 10:21:53 -07:00
.gitignore feat(e2e): scenario-based setup matrix + Phase 1 migration infrastructure (#3363) 2026-05-13 17:45:41 -04:00
.gitleaksignore fix(e2e): make nightly teardown reliable and prevent sandbox leaks (#2313) 2026-04-23 08:46:09 -07:00
.gitmodules feat(router): add model router integration with complexity-based routing (#2202) 2026-05-06 15:09:30 -07:00
.markdownlint-cli2.yaml chore: fix all markdownlint violations and enable remaining rules (#730) 2026-03-23 14:14:39 -07:00
.pre-commit-config.yaml docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
.prettierignore chore: add Prettier formatting for root-level JS files (#1200) 2026-03-31 13:27:52 -07:00
.shellcheckrc fix(install): prevent nvm/login shell from resetting PATH in subshells (#651) 2026-03-23 09:10:07 -07:00
AGENTS.md docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
biome.json docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
CLAUDE.md docs(skills): reorganize skills with audience-based prefixes (#1603) 2026-04-08 10:00:57 -07:00
CODE_OF_CONDUCT.md chore: fix all markdownlint violations and enable remaining rules (#730) 2026-03-23 14:14:39 -07:00
commitlint.config.js chore(tooling): switch linting to biome (#2862) 2026-05-01 16:16:37 -07:00
CONTRIBUTING.md docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
Dockerfile fix(slack): allowlisted users for channel mentions (#3752) 2026-05-18 15:41:15 -07:00
Dockerfile.base fix(docker): refresh trixie apt package pins (#3650) 2026-05-16 13:09:47 -07:00
install.sh fix(onboard): use Docker-driver gateway on macOS OpenShell 0.0.37 (#3383) 2026-05-12 16:24:59 -07:00
jsconfig.json ci: add ESLint and tsc type checking for JavaScript files (#771) 2026-03-24 19:07:01 -07:00
LICENSE Add license and DCO guide 2026-03-15 10:54:32 -07:00
Makefile docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
package-lock.json refactor(cli): prune dead code and harden onboarding (#3632) 2026-05-16 11:59:17 -07:00
package.json docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
pyproject.toml docs: update inference docs (#1460) 2026-04-03 16:56:11 -07:00
README.md docs: fern migration (#3548) 2026-05-18 14:16:18 -07:00
SECURITY.md docs: improve vulnerability reporting guide (#1128) 2026-03-30 18:22:04 -07:00
spark-install.md docs: reorganize Get Started and add Deployment Topology diagram (#2445) 2026-04-24 16:06:45 -07:00
tsconfig.cli.json ci(e2e): auto-dispatch advised E2E jobs (#3426) 2026-05-13 09:39:11 -07:00
tsconfig.src.json refactor(cli): extract pure functions from onboard.js to typed TypeScript modules (#1240) 2026-04-01 12:45:36 -07:00
uninstall.sh refactor(uninstall): run uninstall through internal command (#3083) 2026-05-06 12:45:41 -07:00
uv.lock docs: update inference docs (#1460) 2026-04-03 16:56:11 -07:00
vitest.config.ts ci(nightly): restore Brev E2E workflow (#3401) 2026-05-15 08:19:28 -07:00

🦞 NVIDIA NemoClaw: Reference Stack for Running OpenClaw in OpenShell

License Security Policy Project Status Discord

NVIDIA NemoClaw is an open source reference stack that simplifies running OpenClaw always-on assistants more safely. It installs the NVIDIA OpenShell runtime, part of NVIDIA Agent Toolkit, which provides additional security for running autonomous agents.

Alpha software

NemoClaw is available in early preview starting March 16, 2026. This software is not production-ready. Interfaces, APIs, and behavior may change without notice as we iterate on the design. The project is shared to gather feedback and enable early experimentation. We welcome issues and discussion from the community while the project evolves.

NemoClaw adds guided onboarding, a hardened blueprint, state management, OpenShell-managed channel messaging, routed inference, and layered protection on top of the NVIDIA OpenShell runtime. For the full feature list, refer to Overview. For the system diagram, component model, and blueprint lifecycle, refer to How It Works and Architecture.

Getting Started

Follow these steps to install NemoClaw and run your first sandboxed OpenClaw agent.

Prerequisites

Before getting started, check the prerequisites to ensure you have the necessary software and hardware to run NemoClaw.

Hardware

Resource Minimum Recommended
CPU 4 vCPU 4+ vCPU
RAM 8 GB 16 GB
Disk 20 GB free 40 GB free

The sandbox image is approximately 2.4 GB compressed. During image push, the Docker daemon, k3s, and the OpenShell gateway run alongside the export pipeline, which buffers decompressed layers in memory. On machines with less than 8 GB of RAM, this combined usage can trigger the OOM killer. If you cannot add memory, configuring at least 8 GB of swap can work around the issue at the cost of slower performance.

Software

Dependency Version
Node.js 22.16 or later
npm 10 or later
Platform See below

OpenShell Lifecycle

For NemoClaw-managed environments, use nemoclaw onboard when you need to create or recreate the OpenShell gateway or sandbox. Avoid openshell self-update, npm update -g openshell, openshell gateway start --recreate, or openshell sandbox create directly unless you intend to manage OpenShell separately and then rerun nemoclaw onboard.

Container Runtimes

The following table lists tested platform and runtime combinations. Availability is not limited to these entries, but untested configurations may have issues.

OS Container runtime Status Notes
Linux Docker Tested Primary tested path.
macOS (Apple Silicon) Colima, Docker Desktop Tested with limitations Install Xcode Command Line Tools (xcode-select --install) and start the runtime before running the installer.
DGX Spark Docker Tested Use the standard installer and nemoclaw onboard. For an end-to-end walkthrough with local Ollama inference, see the NVIDIA Spark playbook.
Windows WSL2 Docker Desktop (WSL backend) Tested with limitations Requires WSL2 with Docker Desktop backend.

For platform-specific pre-setup (for example, Windows WSL 2), see Prerequisites.

Install NemoClaw and Onboard OpenClaw Agent

Download and run the installer script. The script installs Node.js if it is not already present, then runs the guided onboard wizard to create a sandbox, configure inference, and apply security policies.

Note

NemoClaw creates a fresh OpenClaw instance inside the sandbox during the onboarding process.

The installer runs as your normal user and does not require sudo or root. It installs Node.js via nvm and NemoClaw via npm, both into user-local directories. Docker must be installed and running before you run the installer. Installing Docker may require elevated privileges on Linux.

curl -fsSL https://www.nvidia.com/nemoclaw.sh | bash

The piped installer prompts through your terminal. In headless scripts or CI, pass explicit acceptance to the bash side of the pipe:

curl -fsSL https://www.nvidia.com/nemoclaw.sh | NEMOCLAW_NON_INTERACTIVE=1 NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 bash

If you use nvm or fnm to manage Node.js, the installer may not update your current shell's PATH. If nemoclaw is not found after install, run source ~/.bashrc (or source ~/.zshrc for zsh) or open a new terminal.

When the install completes, a summary confirms the running environment:

──────────────────────────────────────────────────
Sandbox      my-assistant (Landlock + seccomp + netns)
Model        nvidia/nemotron-3-super-120b-a12b (NVIDIA Endpoints)
──────────────────────────────────────────────────
Run:         nemoclaw my-assistant connect
Status:      nemoclaw my-assistant status
Logs:        nemoclaw my-assistant logs --follow
──────────────────────────────────────────────────

To change settings later:
  Model:       nemoclaw inference get
               nemoclaw inference set --model <model> --provider <provider> --sandbox my-assistant

[INFO]  === Installation complete ===

Chat with the Agent

Connect to the sandbox, then chat with the agent through the TUI or the CLI.

nemoclaw my-assistant connect

In the sandbox shell, open the OpenClaw terminal UI and start a chat:

openclaw tui

Alternatively, send a single message and print the response:

openclaw agent --agent main --local -m "hello" --session-id test

Model Router (Experimental)

NemoClaw includes an optional model router that automatically picks the most efficient model for each query. Instead of sending every request to a single large model, the router uses a lightweight encoder to predict which model in a pool can handle each query correctly, then routes to the cheapest one that meets an accuracy threshold.

The router uses the NVIDIA LLM Router v3 prefill routing engine and runs on the host as a LiteLLM proxy. The sandbox reaches it through the OpenShell gateway and continues to call https://inference.local/v1; do not probe localhost:4000 or host.openshell.internal directly from inside the sandbox.

Enable during onboard

Select Model Router (experimental) during the onboard wizard, or set NEMOCLAW_PROVIDER=routed for non-interactive mode:

NEMOCLAW_PROVIDER=routed nemoclaw onboard --non-interactive

The onboard wizard starts the router, configures the OpenShell provider, and creates the sandbox. The router process runs on the host on port 4000.

Configure the model pool

Edit nemoclaw-blueprint/router/pool-config.yaml to define which models the router can choose from:

routing:
  method: prefill
  checkpoint: llm-router/checkpoints/prefill_router_qwen08b.pt
  tolerance: 0.20
  encoder: Qwen/Qwen3.5-0.8B

models:
  - name: nano
    litellm_model: "openai/nvidia/nvidia/Nemotron-3-Nano-30B-A3B"
    cost_per_m_input_tokens: 0.05
    api_base: "https://inference-api.nvidia.com"

  - name: super
    litellm_model: "openai/nvidia/nvidia/nemotron-3-super-v3"
    cost_per_m_input_tokens: 0.10
    api_base: "https://inference-api.nvidia.com"

The tolerance parameter controls the accuracy-cost tradeoff: 0.0 always picks the most accurate model, 1.0 always picks the cheapest, and 0.20 (default) allows up to 20 percentage points below the best for a cheaper model.

Architecture

The router runs on the host, not inside the sandbox:

Sandbox (OpenClaw) ──> OpenShell Gateway (L7 proxy) ──> Model Router (:4000) ──> NVIDIA API
                                                         └── PrefillRouter selects model

Credentials flow through the OpenShell provider system. The sandbox never sees raw API keys.

Uninstall

To remove NemoClaw and all resources created during setup, run the CLI's built-in uninstall command:

nemoclaw uninstall
Flag Effect
--yes Skip the confirmation prompt.
--keep-openshell Leave OpenShell binaries installed.
--delete-models Also remove NemoClaw-pulled Ollama models.

nemoclaw uninstall runs the version-pinned uninstall.sh shipped with your installed CLI, with no network fetch at uninstall time.

If the nemoclaw CLI is missing or broken, fall back to the hosted script:

curl -fsSL https://raw.githubusercontent.com/NVIDIA/NemoClaw/refs/heads/main/uninstall.sh | bash

For a full comparison of the two forms, see nemoclaw uninstall vs. the hosted uninstall.sh.

For troubleshooting installation or onboarding issues, see the Troubleshooting guide.

Documentation

Refer to the following pages on the official documentation website for more information on NemoClaw.

Page Description
Overview What NemoClaw does and how it fits together.
Architecture Overview High-level overview of Plugin, blueprint, sandbox lifecycle, and protection layers.
Ecosystem How OpenClaw, OpenShell, and NemoClaw form a stack and when to use NemoClaw versus OpenShell alone.
Architecture Details Detailed description of Plugin structure, blueprint lifecycle, sandbox environment, and host-side state.
Prerequisites Hardware, software, and supported platforms, with any platform-specific pre-setup.
Inference Options Supported providers, validation, and routed inference configuration.
Network Policies Baseline rules, operator approval flow, and egress control.
Customize Network Policy Static and dynamic policy changes, presets.
Security Best Practices Controls reference, risk framework, and posture profiles for sandbox security.
Sandbox Hardening Container security measures, capability drops, process limits.
CLI Commands Full NemoClaw CLI command reference.
Troubleshooting Common issues and resolution steps.

Project Structure

The following directories make up the NemoClaw repository.

NemoClaw/
├── bin/              # CLI entry point and library modules (CJS)
├── nemoclaw/         # TypeScript plugin (Commander CLI extension)
│   └── src/
│       ├── blueprint/    # Runner, snapshot, SSRF validation, state
│       ├── commands/     # Slash commands, migration state
│       └── onboard/      # Onboarding config
├── nemoclaw-blueprint/   # Blueprint YAML and network policies
│   └── router/
│       ├── pool-config.yaml  # Model pool and routing config
│       └── llm-router/      # LLM Router v3 submodule (prefill routing engine)
├── scripts/          # Install helpers, setup, automation
├── test/             # Integration and E2E tests
├── fern/             # Fern site configuration and shared assets
└── docs/             # User-facing docs (Fern MDX plus legacy MyST source during migration)

Community

Join the NemoClaw community to ask questions, share feedback, and report issues.

Contributing

We welcome contributions. See CONTRIBUTING.md for development setup, coding standards, and the PR process.

Security

NVIDIA takes security seriously. If you discover a vulnerability in NemoClaw, DO NOT open a public issue. Use one of the private reporting channels described in SECURITY.md:

For security bulletins and PSIRT policies, visit the NVIDIA Product Security portal.

Notice and Disclaimer

This software automatically retrieves, accesses or interacts with external materials. Those retrieved materials are not distributed with this software and are governed solely by separate terms, conditions and licenses. You are solely responsible for finding, reviewing and complying with all applicable terms, conditions, and licenses, and for verifying the security, integrity and suitability of any retrieved materials for your specific use case. This software is provided "AS IS", without warranty of any kind. The author makes no representations or warranties regarding any retrieved materials, and assumes no liability for any losses, damages, liabilities or legal consequences from your use or inability to use this software or any retrieved materials. Use this software and the retrieved materials at your own risk.

License

Apache 2.0. See LICENSE.