- 个人或小团队自建消息助手:需要接 WhatsApp/Telegram/Slack 并让它长期在线,容器隔离加显式目录挂载把「agent 能碰什么」变成可审计的边界,自己写个 bot 进程做不到这层隔离
- 需要读懂并改内部逻辑:几百行 TS 加双 SQLite 的宿主/容器通信,出问题时能顺着 inbound.db/outbound.db 追下去;换成大型 agent 框架只能靠猜
- 定时任务 + 跨渠道记忆:同一份记忆在多个渠道间共享、会话按渠道隔离,适合把「提醒我」「查一下昨天聊的」这类跨端请求交给一个常驻进程
- 想用 Claude Agent SDK 但不想自己搭容器编排:它把 SDK 调用、容器生命周期、渠道适配器粘在一起,省掉的是这层胶水而不是模型能力

nanoclaw
nanocoaiMIT活跃维护 有专家点评轻量级容器化 AI 助手,可接入 WhatsApp、Telegram、Slack 等聊天工具,自带记忆和定时任务,基于 Anthropic Agents SDK 运行。
A lightweight alternative to OpenClaw that runs in containers for security. Connects to WhatsApp, Telegram, Slack, Discord, Gmail and other messaging apps,, has memory, scheduled jobs, and runs directly on Anthropic's Agents SDK
专家点评
上手难度:进阶更新于 2026-11-11把 AI 助手关进独立容器、代码量小到能通读的 OpenClaw 轻量替代
适用场景
踩坑
- 渠道适配器不在主干:clone 下来只有核心,WhatsApp/Slack 等要另跑 /add- 技能装,装之前别指望开箱即用
- 运行时和模型提供方被锁在 Claude/Anthropic 上:issue 里「支持 opencode/codex/gemini」是反应数最高的一条,说明想换提供方的人不少而现状不满足;README 说的「可切换」和实际可用度要自己验证
- 安装链路对版本敏感:Node 22.23.4+/24.22.1+/26.12.1+ 与 pnpm 10+ 卡得死,且 /customize、/debug 和装崩后的恢复都依赖本机已装 Claude Code,缺一个就卡在中间态;issue 里「安装应该更简单」也是被提过的
- 容器后端在演进:HN 上从 Apple Containers 迁到 Docker 的讨论热度不低,Podman 支持还只是 issue 提议,非 Docker 环境别假设能跑
同类对比
OpenClaw 本身是直接对照物,要更完整的功能面就留在那边;只想要 agent 编排而不需要容器隔离和消息渠道,直接用 Anthropic Agent SDK 或更轻的 agent 框架更省事。
git clone https://github.com/nanocoai/nanoclaw.git nanoclaw-v2
cd nanoclaw-v2
bash nanoclaw.shREADME 未说明显存或 GPU 要求;需要 macOS 或 Linux(Windows 走 WSL2),并安装 Docker Desktop 或 Docker Engine。
项目说明
由 README 自动翻译提炼在独立容器里安全运行 AI 助手的轻量 OpenClaw 替代品,代码小到能读懂
轻量级容器化 AI 助手,可接入 WhatsApp、Telegram、Slack 等聊天工具,自带记忆和定时任务,基于 Anthropic Agents SDK 运行。
核心能力
- 每个 agent 跑在独立 Linux 容器,只挂载显式允许的目录
- 用 inbound.db/outbound.db 双 SQLite 做宿主与容器间通信
- 按需用 /add-<channel> 技能安装 WhatsApp、Slack、Telegram 等渠道
- 支持定时任务、跨渠道共享记忆与按渠道隔离会话
- 基于 Anthropic Claude Agent SDK,可切换 Codex、OpenCode 等提供方
容易踩的坑
需要 Node.js 22.23.4+/24.22.1+/26.12.1+ 与 pnpm 10+,版本不符会装不上;渠道适配器不在主干,要另跑 /add- 技能安装;/customize、/debug 和安装出错恢复依赖已安装的 Claude Code。
- v2026.11.0-beta.1pre-release2026-11-09 · 2026-11-09 12:00 UTC
查看更新说明
NanoClaw 2026.11.0-beta.1 is the first beta of 2026.11.0: an early test build, so expect rough edges. The November release takes the place of 2026.10.1, which never becomes a stable release; its two release candidates stay published, and everything they brought is in this entry. Installs on the
betachannel get this beta;stablestays on 2026.10.0 until 2026.11.0 is published. Since 2026.10.1-rc.2, a stuck channel send no longer silences a conversation, agents can put KPI fields, a table and charts in cards, setup on Linux and WSL asks for your password in the open before it installs Node or Docker, setup on Linux reaches Docker right after it adds you to the docker group, setup names the NanoClaw account a machine is signed in to and lets you switch it, Discord server messages that @mention someone reach the agent, agent reactions reach Telegram, Mattermost recovers by itself from a short outage at startup, the OneCLI upgrade guide deletes the Dial key only when it has to, and locally built agent images clear every known High and Critical advisory that had a fix. Since 2026.10.0 it moves OneCLI to 1.45, where new agent groups get only their model key and other keys go to the groups you choose, makes the webhook server listen only on this machine by default, applies egress lockdown to agents that were already running, asks for Node's October 2026 security releases, and lets Claude agents read PDFs; Google Chat now checks that its webhooks come from your app. It also lets agents create other agents from templates, adds Cursor as an agent provider, and moves locally built agent images to Claude Code 2.1.296 with Claude Haiku 5.5. Six changes need action from some installs, among them the OneCLI upgrade, the webhook address and two new Google Chat settings, so check the section below before you update.⚠️ Before you update
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
grep -o '"@chat-adapter/[a-z]*"' package.jsonprints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix:/update-nanoclawrefreshes installed channels; after a manual merge, rerun/add-<channel>for each one. Google Chat: @mentions in spaces now needGOOGLE_CHAT_BOT_USER_ID=users/<id>in.env(DMs work without it; without it the log says "Google Chat botUserId is not configured" at startup): once the app has replied to you in a DM, list that DM's messages with the Chat API (spaces.messages.list), copy thesender.nameof a message whose sendertypeisBOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives asslack:bot:U…instead ofslack:bot:B…, so approve each sibling bot once more. Check: each channel answers a test message. Rollback:pnpm exec tsx scripts/update-nanoclaw.ts rollback --id <transaction-id>(rolling back). - [BREAKING] Iron Proxy installs that connected Codex with ChatGPT before this release must sign in to Codex again. Detect, from the NanoClaw folder (works while the service is stopped):
f=data/session-materials/iron-control/codex.json; [ -f "$f" ] && grep -q '"mode":"chatgpt"' "$f" && ! grep -q '"accountId"' "$f" && echo affected. Once running, an affected install's Codex agents answer only with the failure notice ("Sorry, something went wrong and I couldn't answer") and the agent container log showsselected workspace missing from routing discovery. Why: Codex 0.156 and later check the login's workspace id, and older Iron logins never recorded it. Fix:pnpm exec tsx setup/index.ts --step provider-auth codex, then check that a Codex agent answers. OneCLI installs are affected only when the vault holds several ChatGPT logins or one without a recorded id; the host log then says "OneCLI login stand-in keeps its placeholder account id": delete the extra or stale login (`onecl
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
- v2026.10.1-rc.2pre-release2026-10-22 · 2026-10-22 15:48 UTC
查看更新说明
NanoClaw 2026.10.1-rc.2 is the second release candidate for 2026.10.1. Installs on the
betachannel get this candidate;stablestays on 2026.10.0 until 2026.10.1 is published. Since 2026.10.1-rc.1 it moves OneCLI to 1.45, where new agent groups get only their model key and other keys go to the groups you choose, makes the webhook server listen only on this machine by default, applies egress lockdown to agents that were already running, asks for Node's October 2026 security releases, and lets Claude agents read PDFs; Google Chat now checks that its webhooks come from your app. It also lets agents create other agents from templates, adds Cursor as an agent provider, and moves locally built agent images to Claude Code 2.1.296 with Claude Haiku 5.5. Setup waits for a slow first reply and says when that reply failed, approval cards appear in the thread you are waiting in, and fewer agent runs fail. Six changes need action from some installs, among them the OneCLI upgrade, the webhook address and two new Google Chat settings, so check the section below before you update.⚠️ Before you update
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
grep -o '"@chat-adapter/[a-z]*"' package.jsonprints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix:/update-nanoclawrefreshes installed channels; after a manual merge, rerun/add-<channel>for each one. Google Chat: @mentions in spaces now needGOOGLE_CHAT_BOT_USER_ID=users/<id>in.env(DMs work without it; without it the log says "Google Chat botUserId is not configured" at startup): once the app has replied to you in a DM, list that DM's messages with the Chat API (spaces.messages.list), copy thesender.nameof a message whose sendertypeisBOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives asslack:bot:U…instead ofslack:bot:B…, so approve each sibling bot once more. Check: each channel answers a test message. Rollback:pnpm exec tsx scripts/update-nanoclaw.ts rollback --id <transaction-id>(rolling back). - [BREAKING] Iron Proxy installs that connected Codex with ChatGPT before this release must sign in to Codex again. Detect, from the NanoClaw folder (works while the service is stopped):
f=data/session-materials/iron-control/codex.json; [ -f "$f" ] && grep -q '"mode":"chatgpt"' "$f" && ! grep -q '"accountId"' "$f" && echo affected. Once running, an affected install's Codex agents answer only with the failure notice ("Sorry, something went wrong and I couldn't answer") and the agent container log showsselected workspace missing from routing discovery. Why: Codex 0.156 and later check the login's workspace id, and older Iron logins never recorded it. Fix:pnpm exec tsx setup/index.ts --step provider-auth codex, then check that a Codex agent answers. OneCLI installs are affected only when the vault holds several ChatGPT logins or one without a recorded id; the host log then says "OneCLI login stand-in keeps its placeholder account id": delete the extra or stale login (onecli secrets list, thenonecli secrets delete --id <id>), run the same command, and grant the new secret to each agent that had the old one, asdocs/onecli-upgrades.mdin your install describes. Rollback: return to the previous release. - [BREAKING] Forks and hand-made templates: the template code moved and
templates/is now ignored by git. Affected: fork code that importscloneRegistry,listTemplatesFromDir,copyTemplateorDEFAULT_TEMPLATES_SOURCEfromsetup/templates.ts(it stops compiling), forks that edit theGROUP_SCOPE_RESOURCESline or the stamper'sensureContainerConfigline, forks that point setup at their own template library, and anyone who keeps a hand-made template intemplates/. Why: templates fetched
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
- v2026.10.1-rc.1pre-release2026-10-20 · 2026-10-20 16:50 UTC
查看更新说明
NanoClaw 2026.10.1-rc.1 is the first release candidate for 2026.10.1. Installs on the
betachannel get this candidate;stablestays on 2026.10.0 until 2026.10.1 is published. It lets agents create other agents from templates, adds Cursor as an agent provider, and moves locally built agent images to Claude Code 2.1.296 with Claude Haiku 5.5. Setup waits for a slow first reply and says when that reply failed, approval cards appear in the thread you are waiting in, and fewer agent runs fail on Docker Desktop. Chat SDK channels move to 4.41.1, and Iron Proxy installs that signed Codex in with ChatGPT must sign in again, so check the section below before you update.⚠️ Before you update
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
grep -o '"@chat-adapter/[a-z]*"' package.jsonprints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix:/update-nanoclawrefreshes installed channels; after a manual merge, rerun/add-<channel>for each one. Google Chat: @mentions in spaces now needGOOGLE_CHAT_BOT_USER_ID=users/<id>in.env(DMs work without it; without it the log says "Google Chat botUserId is not configured" at startup): once the app has replied to you in a DM, list that DM's messages with the Chat API (spaces.messages.list), copy thesender.nameof a message whose sendertypeisBOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives asslack:bot:U…instead ofslack:bot:B…, so approve each sibling bot once more. Check: each channel answers a test message. Rollback:pnpm exec tsx scripts/update-nanoclaw.ts rollback --id <transaction-id>(rolling back). - [BREAKING] Iron Proxy installs that connected Codex with ChatGPT before this release must sign in to Codex again. Detect, from the NanoClaw folder (works while the service is stopped):
f=data/session-materials/iron-control/codex.json; [ -f "$f" ] && grep -q '"mode":"chatgpt"' "$f" && ! grep -q '"accountId"' "$f" && echo affected. Once running, an affected install's Codex agents answer only with the failure notice ("Sorry, something went wrong and I couldn't answer") and the agent container log showsselected workspace missing from routing discovery. Why: Codex 0.156 and later check the login's workspace id, and older Iron logins never recorded it. Fix:pnpm exec tsx setup/index.ts --step provider-auth codex, then check that a Codex agent answers. OneCLI installs are affected only when the vault holds several ChatGPT logins or one without a recorded id; the host log then says "OneCLI login stand-in keeps its placeholder account id": delete the extra or stale login (onecli secrets list, thenonecli secrets delete --id <id>), run the same command, and grant the new secret to each agent that had the old one, asdocs/onecli-upgrades.mdin your install describes. Rollback: return to the previous release. - [BREAKING] Forks and hand-made templates: the template code moved and
templates/is now ignored by git. Affected: fork code that importscloneRegistry,listTemplatesFromDir,copyTemplateorDEFAULT_TEMPLATES_SOURCEfromsetup/templates.ts(it stops compiling), forks that edit theGROUP_SCOPE_RESOURCESline or the stamper'sensureContainerConfigline, forks that point setup at their own template library, and anyone who keeps a hand-made template intemplates/. Why: templates fetched by setup or by an agent are install state and must not block/update-nanoclaw, and setup now lists a library from itsindex.json. Fix: importcloneRegistryandlistTemplatesFromDirfromsrc/templates/library.tsandawait cloneRegistry();copyTemplateis gone, so callensureTemplateLocal; a fork that changedDEFAULT_TEMPLATES_SOURCEeditsLIBRARY_REPO(owner/repo) andLIBRARY_BRANCHin
- [BREAKING] Chat SDK channels move to adapter 4.41.1, which fixes Telegram messages with links that were never delivered. Affected: installs where
- v2026.10.0最新正式版2026-10-09 · 2026-10-09 11:26 UTC
NanoClaw 2026.10.0 is the first release with calendar version numbers and the first one
/update-nanoclawinstalls by default: updates now follow published releases instead of the tip ofmain. It was tested first as 2026.10.0-rc.1 and 2026.10.0-rc.2 on thebetachannel. It also makes updates and rollbacks more dependable, lets Iron Proxy reach a keyless local model over plain HTTP, routes the service through an outbound proxy when you have one, and shows Claude's own reason when a run fails. Iron Proxy installs need one setup rerun, so check the section below before you update.⚠️ Before you update
- [BREAKING] OneCLI installs: upgrade the OneCLI gateway to exactly 1.42.0, which closes a credential-injection bypass.
/update-nanoclawnever upgrades a running gateway, so this step stops the update until it is done. Followdocs/onecli-upgrades.mdin your install (the same guide on GitHub): its detect step says when it does not apply (Iron Proxy installs skip it); otherwise save 1.42.0 as the gateway version, upgrade, confirm that the running image is 1.42.0, and note the old version for its rollback step. Do not go past 1.42.0: OneCLI 1.43 and later break assigning credentials to agents and are not supported yet. New installs already get 1.42.0. /update-nanoclawnow installs the newest release, not the tip ofmain. The channel is set byNANOCLAW_UPDATE_CHANNELin.env:stable(the default) follows releases,edgefollowsmainas before, andbetatakes release candidates when there are any. Your first update after this release still runs your current update steps, so it lands on the tip ofmain, which is this release only until new changes merge; from then on, updates follow the channel. An install that is already newer than the latest release is never moved back: the updater asks whether to keep followingmainor wait for the next release, and saves the answer. To choose yourself later, runpnpm exec tsx scripts/update-nanoclaw.ts set-channel --channel edge(orstable).- Iron Proxy installs: rerun the Iron setup once after updating. It rebuilds the proxy on upstream v0.52.0 (expired proxy certificates are regenerated, host rules match case-insensitively), moves the approval bridge to
@grpc/grpc-js1.14.5 (fixes GHSA-m9gg-hp2v-232j and GHSA-f596-whhp-79r4), and letsgit clone/fetchand the agent browser authenticate through the proxy. Runpnpm exec tsx .claude/skills/add-iron-proxy/scripts/setup.ts --with-control. The agent browser now trusts the gateway's certificate, so HTTPS pages behind Iron load: installs that build their own agent image get it from the image rebuild in/update-nanoclaw, while installs that pull the hardened image get it only with the next image (until then the browser stays broken there; the agent still starts). OneCLI installs need nothing.
✨ New
- Updates follow release channels. Choose
stable,betaoredgeper install; the channel and the exact release are recorded indata/upgrade-state.json, so support can see what an install tracks. - With Iron Proxy, a keyless model on the same machine works over plain HTTP. Enter
http://host.docker.internal:<port>/v1and restart; setup checks that the port answers like a model server, only that port and the OpenAI inference routes are reachable, and requests to it no longer ask for approval on every call. Models that need a key still needhttps://on a public DNS name. - The service can reach the internet through an outbound proxy. It now uses
HTTPS_PROXY,HTTP_PROXYorALL_PROXYandNO_PROXYfrom your setup shell or.env; a OneCLI gateway on a local address is added toNO_PROXYautomatically. Needs Node 22.21+ or 24.5+, and setup warns if your Node ignores the proxy. - A failed Claude run tells you why. For known failures such as an invalid API key, the
- [BREAKING] OneCLI installs: upgrade the OneCLI gateway to exactly 1.42.0, which closes a credential-injection bypass.
- v2026.10.0-rc.2pre-release2026-10-05 · 2026-10-05 11:05 UTC
查看更新说明
NanoClaw 2026.10.0-rc.2 is the second release candidate for 2026.10.0, the first release with calendar version numbers and the first one
/update-nanoclawinstalls by default: updates now follow published releases instead of the tip ofmain. Installs on thebetachannel get this candidate;stablestays on 2.4.0 until 2026.10.0 is published. Since 2026.10.0-rc.1 it pins the fixed WhatsApp library, holds OneCLI gateway upgrades on 1.42.0, stops macOS updates from failing when the service is slow to stop, and lets the agent browser load HTTPS pages behind Iron Proxy. It also makes updates and rollbacks more dependable, lets Iron Proxy reach a keyless local model over plain HTTP, routes the service through an outbound proxy when you have one, and shows Claude's own reason when a run fails. Iron Proxy installs need one setup rerun, so check the section below before you update.⚠️ Before you update
- [BREAKING] OneCLI installs: upgrade the OneCLI gateway to exactly 1.42.0, which closes a credential-injection bypass.
/update-nanoclawnever upgrades a running gateway, so this step stops the update until it is done. Followdocs/onecli-upgrades.mdin your install (the same guide on GitHub): its detect step says when it does not apply (Iron Proxy installs skip it); otherwise save 1.42.0 as the gateway version, upgrade, confirm that the running image is 1.42.0, and note the old version for its rollback step. Do not go past 1.42.0: OneCLI 1.43 and later break assigning credentials to agents and are not supported yet. New installs already get 1.42.0. /update-nanoclawnow installs the newest release, not the tip ofmain. The channel is set byNANOCLAW_UPDATE_CHANNELin.env:stable(the default) follows releases,edgefollowsmainas before, andbetatakes release candidates when there are any. Your first update after this release still runs your current update steps, so it lands on the tip ofmain, which is this release only until new changes merge; from then on, updates follow the channel. An install that is already newer than the latest release is never moved back: the updater asks whether to keep followingmainor wait for the next release, and saves the answer. To choose yourself later, runpnpm exec tsx scripts/update-nanoclaw.ts set-channel --channel edge(orstable).- Iron Proxy installs: rerun the Iron setup once after updating. It rebuilds the proxy on upstream v0.52.0 (expired proxy certificates are regenerated, host rules match case-insensitively), moves the approval bridge to
@grpc/grpc-js1.14.5 (fixes GHSA-m9gg-hp2v-232j and GHSA-f596-whhp-79r4), and letsgit clone/fetchand the agent browser authenticate through the proxy. Runpnpm exec tsx .claude/skills/add-iron-proxy/scripts/setup.ts --with-control. The agent browser now trusts the gateway's certificate, so HTTPS pages behind Iron load: installs that build their own agent image get it from the image rebuild in/update-nanoclaw, while installs that pull the hardened image get it only with the next image (until then the browser stays broken there; the agent still starts). OneCLI installs need nothing.
✨ New
- Updates follow release channels. Choose
stable,betaoredgeper install; the channel and the exact release are recorded indata/upgrade-state.json, so support can see what an install tracks. - With Iron Proxy, a keyless model on the same machine works over plain HTTP. Enter
http://host.docker.internal:<port>/v1and restart; setup checks that the port answers like a model server, only that port and the OpenAI inference routes are reachable, and requests to it no longer ask for approval on every call. Models that need a key still needhttps://on a public DNS name. - The service can reach the internet through an outbound proxy. It now uses
HTTPS_PROXY,HTTP_PROXYor
- [BREAKING] OneCLI installs: upgrade the OneCLI gateway to exactly 1.42.0, which closes a credential-injection bypass.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Agents in Slack: one app per agent
Setup provisions each agent its own Slack app: manifest, avatar, and workspace install, no tokens to paste. Spawn teammates from chat: every one gets its own bot identity, container, and memory, with shared rooms and canvases.
Why I Built NanoClaw
OpenClaw is an impressive project, but I wouldn't have been able to sleep if I had given complex software I didn't understand full access to my life. OpenClaw has nearly half a million lines of code, 53 config files, and 70+ dependencies. Its security is at the application level (allowlists, pairing codes) rather than true OS-level isolation. Everything runs in one Node process with shared memory.
NanoClaw provides that same core functionality, but in a codebase small enough to understand: one process and a handful of files. Agents run in their own Linux containers with filesystem isolation, not merely behind permission checks.
Quick Start
git clone https://github.com/nanocoai/nanoclaw.git nanoclaw-v2
cd nanoclaw-v2
bash nanoclaw.sh
nanoclaw.sh walks you from a fresh machine to a named agent you can message. It installs Node, pnpm, and Docker if missing, installs a credential gateway and registers your Anthropic credential with it, builds the agent container, and pairs your first channel (Slack, Telegram, Discord, WhatsApp, iMessage, or a local CLI). If a step fails, Claude Code is invoked automatically to diagnose and resume from where it broke.
Run from a fresh v2 checkout next to your v1 install:
git clone https://github.com/nanocoai/nanoclaw.git nanoclaw-v2
cd nanoclaw-v2
bash migrate-v2.sh
migrate-v2.sh finds your v1 install (sibling directory, or NANOCLAW_V1_PATH=/path/to/nanoclaw), migrates state into the v2 checkout, then execs into Claude Code to finish the parts that need judgment (owner seeding, shared-memory migration, fork-customisation replay).
Run the script directly, not from inside a Claude session — the deterministic side needs interactive prompts and real shell I/O for Node/pnpm bootstrap, Docker, the credential gateway, and the container build.
What it does: merges .env, seeds the v2 DB from registered_groups, copies group folders + session data + scheduled tasks, installs the channel adapters you select, copies channel auth state (including the Baileys keystore for WhatsApp — LID mapping is now resolved per-message by the Baileys v7 adapter, not migrated), builds the agent container.
What it doesn't: flip the system service. Pick "switch to v2" at the prompt, or do it manually after testing — your v1 install is left untouched.
See docs/v1-to-v2-changes.md for what's different and docs/migration-dev.md for development notes.
Philosophy
Small enough to understand. One process, a few source files and no microservices. If you want to understand the full NanoClaw codebase, just ask Claude Code to walk you through it.
Secure by isolation. Agents run in Linux containers and they can only see what's explicitly mounted. Bash access is safe because commands run inside the container, not on your host.
Built for the individual user. NanoClaw isn't a monolithic framework; it's software that fits each user's exact needs. Instead of becoming bloatware, NanoClaw is designed to be bespoke. You make your own fork and have Claude Code modify it to match your needs.
Customization = code changes. No configuration sprawl. Want different behavior? Modify the code. The codebase is small enough that it's safe to make changes.
AI-native, hybrid by design. The install and onboarding flow is an optimized scripted path, fast and deterministic. When a step needs judgment, whether a failed install, a guided decision, or a customization, control hands off to Claude Code seamlessly. Beyond setup there's no monitoring dashboard or debugging UI either: describe the problem in chat and Claude Code handles it.
Skills over features. Trunk ships the registry and infrastructure, not specific channel adapters or alternative agent providers. Channels (Discord, Slack, Telegram, WhatsApp, …) live on a long-lived channels branch; alternative providers (OpenCode, Codex, Cursor) ship inside their own skill's payload/ folder. You run /add-telegram, /add-opencode, etc. and the skill copies exactly the module(s) you need into your fork. No feature you didn't ask for.
Best harness, best model. NanoClaw natively uses Claude Code via Anthropic's official Claude Agent SDK, so you get the latest Claude models and Claude Code's full toolset, including the ability to modify and expand your own NanoClaw fork. Other providers are drop-in options: /add-codex for OpenAI's Codex (ChatGPT subscription or API key), /add-opencode for OpenRouter, Google, DeepSeek and more via OpenCode, /add-cursor for Cursor's local Agent SDK (Cursor account or API key), and /add-ollama-provider for local open-weight models. Provider is configurable per agent group.
What It Supports
- Multi-channel messaging — WhatsApp, Telegram, Discord, Slack, Microsoft Teams, iMessage, Matrix, Google Chat, Webex, Linear, GitHub, WeChat, and email via Resend. Installed on demand with
/add-<channel>skills. Run one or many at the same time. - Flexible isolation — connect each channel to its own agent for full privacy, share one agent across many channels for unified memory with separate conversations, or fold multiple channels into a single shared session so one conversation spans many surfaces. Pick per channel via
/manage-channels. See docs/isolation-model.md. - Per-agent workspace — each agent group has its own
CLAUDE.md, its own memory, its own container, and only the mounts you allow. Nothing crosses the boundary unless you wire it to. - Scheduled tasks: recurring jobs executed by the agent, with optional script gates that avoid waking it when there is no work
- Web access — search and fetch content from the web
- Container isolation — agents are sandboxed in Docker containers (macOS/Linux/WSL2)
- Credential security — agents never hold raw API keys. Outbound requests route through a credential gateway that injects credentials at request time and enforces per-agent policies and rate limits. Which gateway is yours to pick: setup installs one (currently OneCLI's Agent Vault) behind a provider seam.
- Agent templates: stamp a ready-to-run agent (instructions + MCP tools + skills, no secrets) from a reusable bundle via
ncl groups create --template <ref>. Templates load from the localtemplates/folder; populate it by hand or by copying from the public library. See docs/templates.md.
Accounts and what leaves your machine
NanoClaw has no user accounts. The only thing it reports is anonymous setup diagnostics, and
NANOCLAW_NO_DIAGNOSTICS=1 turns those off. Your agents, messages, files and keys never leave
your machine.
One opt-in exception: you can fetch a prebuilt agent image instead of building it locally. Fetching ours needs a free account, so we see your email address and when you ask for an image — nothing about your agents, and nothing after the image lands. Building locally needs no account and contacts nothing, and is the default. The same account unlocks the perks below.
Perks
The free account also opens the community portal at portal.nanoclaw.dev, a dashboard where you switch on what the account offers. Today that is Echo's hardened agent image and a managed Slack app for your agent, created and installed for you with no tokens to paste. Everything else in NanoClaw works without it.
Setup opens the portal once. You sign in in the browser, approve the terminal you are running setup from, and enable the perk; the wizard notices and continues on its own. Enabling Echo is where you agree to Echo's terms, including whether you want product and security email. Close the page without enabling anything and setup carries on without the perk, then offers it once more later.
What stays on your machine: the sign-in record and install token in ~/.config/nanoclaw/account.json,
one device key per machine in ~/.config/nanoclaw/device-key.json, and this checkout's journal in
data/community-portal.json (which perks are on, setup progress, the credentials a perk handed
you), all mode 0600. The install token never passes through the browser: the browser sees only
the one-time sign-in code, and the token reaches this machine from the account service directly.
The host keeps one outbound connection to the portal so a perk you change in the browser reaches
the running agent; it sends nothing about your agents, messages or files.
Revisit a step with pnpm exec tsx setup/portal.ts --stage echo or --stage slack. To sign a
machine out, forget it under Devices in the portal: its token stops working and the host
disconnects. Files, recovery commands and troubleshooting: docs/community-portal.md.
Usage
Talk to your assistant with the trigger word (default: @Andy):
@Andy send an overview of the sales pipeline every weekday morning at 9am (has access to my Obsidian vault folder)
@Andy review the git history for the past week each Friday and update the README if there's drift
@Andy every Monday at 8am, compile news on AI developments from Hacker News and TechCrunch and message me a briefing
From a channel you own or administer, you can manage groups and tasks:
@Andy list all scheduled tasks across groups
@Andy pause the Monday briefing task
@Andy join the Family Chat group
Customizing
NanoClaw doesn't use configuration files. To make changes, just tell Claude Code what you want:
- "Change the trigger word to @Bob"
- "Remember in the future to make responses shorter and more direct"
- "Add a custom greeting when I say good morning"
- "Store conversation summaries weekly"
Or run /customize for guided changes.
The codebase is small enough that Claude can safely modify it.
Contributing
Don't add features. Add skills.
If you want to add a new channel or agent provider, don't add it to trunk. New channel adapters land on the channels branch; a new agent provider keeps its code in its skill's payload/ folder on main. Users install them in their own fork with /add-<name> skills, which copy the relevant module(s) into the standard paths, wire the registration, and pin dependencies.
This keeps trunk as pure registry and infra, and every fork stays lean — users get the channels and providers they asked for and nothing else.
RFS (Request for Skills)
No channel or provider skills are currently requested — propose one via an issue.
Requirements
- macOS or Linux (Windows via WSL2)
- Node.js 22.23.4+, 24.22.1+ or 26.12.1+ and pnpm 10+ (the installer will install or update both if needed)
- Docker Desktop (macOS/Windows) or Docker Engine (Linux)
- Claude Code for
/customize,/debug, error recovery during setup, and all/add-<channel>skills
Architecture
messaging apps → host process (router) → inbound.db → container (Bun, Claude Agent SDK) → outbound.db → host process (delivery) → messaging apps
A single Node host orchestrates per-session agent containers. When a message arrives, the host routes it via the entity model (user → messaging group → agent group → session), writes it to the session's inbound.db, and wakes the container. The agent-runner inside the container polls inbound.db, runs the agent, and writes responses to outbound.db. The host polls outbound.db and delivers back through the channel adapter.
Two SQLite files per session, each with exactly one writer — no cross-mount contention, no IPC, no stdin piping. Channels and alternative providers self-register at startup; trunk ships the registry and the Chat SDK bridge, while the adapters themselves are skill-installed per fork.
For the full architecture writeup see docs/architecture.md; for the three-level isolation model see docs/isolation-model.md.
Key files:
src/index.ts— entry point: DB init, channel adapters, delivery polls, sweepsrc/router.ts— inbound routing: messaging group → agent group → session →inbound.dbsrc/delivery.ts— pollsoutbound.db, delivers via adapter, handles system actionssrc/host-sweep.ts— 60s sweep: stale detection, due-message wake, recurrencesrc/session-manager.ts— resolves sessions, opensinbound.db/outbound.dbsrc/container-runner.ts— spawns per-agent-group containers, leases the session's gateway contributionsrc/db/— central DB (users, roles, agent groups, messaging groups, wiring, migrations)src/channels/— channel adapter infra (adapters installed via/add-<channel>skills)src/providers/— host-side provider config (claudebaked in; others via skills)container/agent-runner/— Bun agent-runner: poll loop, MCP tools, provider abstractiongroups/<folder>/— per-agent-group filesystem (CLAUDE.md, skills, container config)
FAQ
Why Docker?
Docker provides cross-platform support (macOS, Linux and Windows via WSL2) and a mature ecosystem.
Can I run this on Linux or Windows?
Yes. Docker is the default runtime and works on macOS, Linux, and Windows (via WSL2). Just run bash nanoclaw.sh.
Is this secure?
Agents run in containers, not behind application-level permission checks. They can only access explicitly mounted directories. Credentials never enter the container — outbound API requests route through the installed credential gateway, which injects authentication at the proxy level and supports rate limits and access policies. You should still review what you're running, but the codebase is small enough that you actually can. See the security documentation for the full security model.
Why no configuration files?
We don't want configuration sprawl. Every user should customize NanoClaw so that the code does exactly what they want, rather than configuring a generic system. If you prefer having config files, you can tell Claude to add them.
Can I use third-party or open-source models?
Yes. The supported path is /add-opencode (OpenRouter, OpenAI, Google, DeepSeek, and more via OpenCode config) or /add-ollama-provider (local open-weight models via Ollama). Both are configurable per agent group, so different agents can run on different backends in the same install.
For one-off experiments, any Claude API-compatible endpoint also works via .env:
ANTHROPIC_BASE_URL=https://your-api-endpoint.com
ANTHROPIC_AUTH_TOKEN=your-token-here
How do I debug issues?
Ask Claude Code. "Why isn't the scheduler running?" "What's in the recent logs?" "Why did this message not get a response?" That's the AI-native approach that underlies NanoClaw.
Why isn't the setup working for me?
If a step fails, nanoclaw.sh hands off to Claude Code to diagnose and resume. If that doesn't resolve it, run claude, then /debug. If Claude identifies an issue likely to affect other users, open a PR against the relevant setup step or skill.
How do I uninstall NanoClaw?
bash nanoclaw.sh --uninstall
Every install is tagged with a per-checkout id, so the uninstaller removes only what belongs to that copy: the background service, containers and image, app data and logs, your agents' files, and this copy's gateway agents. Shared things — the gateway service and your credentials, other NanoClaw copies on the machine — are left alone. It shows exactly what it found and asks for confirmation per group; nothing is deleted until you say yes. Use --dry-run to preview without changing anything, or --yes to skip the prompts. Your .env is backed up before removal. To finish, delete the checkout folder itself.
What changes will be accepted into the codebase?
Only security fixes, bug fixes, and clear improvements will be accepted to the base configuration. That's all.
Everything else (new capabilities, OS compatibility, hardware support, enhancements) should be contributed as skills: channel code on the channels registry branch, everything else (agent providers included) as a self-contained skill. See docs/customizing.md and CONTRIBUTING.md.
This keeps the base system minimal and lets every user customize their installation without inheriting features they don't want.
Community
Questions? Ideas? Join the Discord.
Changelog
See CHANGELOG.md for breaking changes, or the full release history on the documentation site.
License
MIT