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

v2026.10.0发布于 2026-10-09 11:26 UTC31,101star +8 / 7 天12,650fork同步于 2026-11-10 23:23 UTC

专家点评

上手难度:进阶更新于 2026-11-11

把 AI 助手关进独立容器、代码量小到能通读的 OpenClaw 轻量替代

适用场景

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

踩坑

  • 渠道适配器不在主干: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 框架更省事。

怎么上手

由 README 提炼,执行前请确认
git clone https://github.com/nanocoai/nanoclaw.git nanoclaw-v2
cd nanoclaw-v2
bash nanoclaw.sh
硬件要求按 README 说明

README 未说明显存或 GPU 要求;需要 macOS 或 Linux(Windows 走 WSL2),并安装 Docker Desktop 或 Docker Engine。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 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。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v2026.10.0
  1. 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 beta channel get this beta; stable stays 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.json prints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix: /update-nanoclaw refreshes installed channels; after a manual merge, rerun /add-<channel> for each one. Google Chat: @mentions in spaces now need GOOGLE_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 the sender.name of a message whose sender type is BOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives as slack:bot:U… instead of slack: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 shows selected 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
  2. 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 beta channel get this candidate; stable stays 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.json prints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix: /update-nanoclaw refreshes installed channels; after a manual merge, rerun /add-<channel> for each one. Google Chat: @mentions in spaces now need GOOGLE_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 the sender.name of a message whose sender type is BOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives as slack:bot:U… instead of slack: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 shows selected 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, then onecli secrets delete --id <id>), run the same command, and grant the new secret to each agent that had the old one, as docs/onecli-upgrades.md in 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 imports cloneRegistry, listTemplatesFromDir, copyTemplate or DEFAULT_TEMPLATES_SOURCE from setup/templates.ts (it stops compiling), forks that edit the GROUP_SCOPE_RESOURCES line or the stamper's ensureContainerConfig line, forks that point setup at their own template library, and anyone who keeps a hand-made template in templates/. Why: templates fetched
  3. 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 beta channel get this candidate; stable stays 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.json prints anything (Telegram, Slack, Discord, Google Chat, Teams, WhatsApp Cloud, GitHub, Linear). Fix: /update-nanoclaw refreshes installed channels; after a manual merge, rerun /add-<channel> for each one. Google Chat: @mentions in spaces now need GOOGLE_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 the sender.name of a message whose sender type is BOT, and restart the service. Slack agent-to-agent rooms: a sibling bot now arrives as slack:bot:U… instead of slack: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 shows selected 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, then onecli secrets delete --id <id>), run the same command, and grant the new secret to each agent that had the old one, as docs/onecli-upgrades.md in 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 imports cloneRegistry, listTemplatesFromDir, copyTemplate or DEFAULT_TEMPLATES_SOURCE from setup/templates.ts (it stops compiling), forks that edit the GROUP_SCOPE_RESOURCES line or the stamper's ensureContainerConfig line, forks that point setup at their own template library, and anyone who keeps a hand-made template in templates/. 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 its index.json. Fix: import cloneRegistry and listTemplatesFromDir from src/templates/library.ts and await cloneRegistry(); copyTemplate is gone, so call ensureTemplateLocal; a fork that changed DEFAULT_TEMPLATES_SOURCE edits LIBRARY_REPO (owner/repo) and LIBRARY_BRANCH in
  4. 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-nanoclaw installs by default: updates now follow published releases instead of the tip of main. It was tested first as 2026.10.0-rc.1 and 2026.10.0-rc.2 on the beta channel. 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-nanoclaw never upgrades a running gateway, so this step stops the update until it is done. Follow docs/onecli-upgrades.md in 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-nanoclaw now installs the newest release, not the tip of main. The channel is set by NANOCLAW_UPDATE_CHANNEL in .env: stable (the default) follows releases, edge follows main as before, and beta takes release candidates when there are any. Your first update after this release still runs your current update steps, so it lands on the tip of main, 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 following main or wait for the next release, and saves the answer. To choose yourself later, run pnpm exec tsx scripts/update-nanoclaw.ts set-channel --channel edge (or stable).
    • 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-js 1.14.5 (fixes GHSA-m9gg-hp2v-232j and GHSA-f596-whhp-79r4), and lets git clone/fetch and the agent browser authenticate through the proxy. Run pnpm 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, beta or edge per install; the channel and the exact release are recorded in data/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>/v1 and 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 need https:// on a public DNS name.
    • The service can reach the internet through an outbound proxy. It now uses HTTPS_PROXY, HTTP_PROXY or ALL_PROXY and NO_PROXY from your setup shell or .env; a OneCLI gateway on a local address is added to NO_PROXY automatically. 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
  5. 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-nanoclaw installs by default: updates now follow published releases instead of the tip of main. Installs on the beta channel get this candidate; stable stays 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-nanoclaw never upgrades a running gateway, so this step stops the update until it is done. Follow docs/onecli-upgrades.md in 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-nanoclaw now installs the newest release, not the tip of main. The channel is set by NANOCLAW_UPDATE_CHANNEL in .env: stable (the default) follows releases, edge follows main as before, and beta takes release candidates when there are any. Your first update after this release still runs your current update steps, so it lands on the tip of main, 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 following main or wait for the next release, and saves the answer. To choose yourself later, run pnpm exec tsx scripts/update-nanoclaw.ts set-channel --channel edge (or stable).
    • 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-js 1.14.5 (fixes GHSA-m9gg-hp2v-232j and GHSA-f596-whhp-79r4), and lets git clone/fetch and the agent browser authenticate through the proxy. Run pnpm 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, beta or edge per install; the channel and the exact release are recorded in data/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>/v1 and 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 need https:// on a public DNS name.
    • The service can reach the internet through an outbound proxy. It now uses HTTPS_PROXY, HTTP_PROXY or

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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.

    Quick Start


    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 local templates/ 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, sweep
    • src/router.ts — inbound routing: messaging group → agent group → session → inbound.db
    • src/delivery.ts — polls outbound.db, delivers via adapter, handles system actions
    • src/host-sweep.ts — 60s sweep: stale detection, due-message wake, recurrence
    • src/session-manager.ts — resolves sessions, opens inbound.db / outbound.db
    • src/container-runner.ts — spawns per-agent-group containers, leases the session's gateway contribution
    • src/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 (claude baked in; others via skills)
    • container/agent-runner/ — Bun agent-runner: poll loop, MCP tools, provider abstraction
    • groups/<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