Back to Freedom.Tech Back
All NanoClaw releasesAll versions
Release Sat, Aug 1, 2026 8 min read

NanoClaw 2.1.54

Original release notes

Rollup release covering v2.1.18 through v2.1.54 - everything merged since the v2.1.17 tag.

  • [BREAKING] iMessage unified into one imessage channel with two backends via /add-imessage: Local (this Mac's chat.db via the Chat SDK) or Hosted (native Photon via spectrum-ts, no Mac relay). Backend chosen at install or via IMESSAGE_BACKEND=local|hosted. The legacy Chat-SDK remote mode (IMESSAGE_SERVER_URL/IMESSAGE_API_KEY) and the separate imessage-cloud channel + /add-imessage-cloud skill are removed. See docs/imessage.md.
  • [BREAKING] Provider-agnostic memory. All providers now share one OKF v0.1-compatible memory/ tree, while persona lives in instructions.prepend.md; startup, clear, and compact reload memory automatically. Existing groups with legacy memory must run /migrate-memory before use. See memory and provider migration.
  • New groups can inherit an instance-wide default provider. DEFAULT_AGENT_PROVIDER sets the provider used when a new agent group is created without an explicit provider. Each group's stored provider still overrides it, and existing groups are unchanged.
  • [BREAKING] Channel install skills are now the single source of truth. The setup wizard installs channels by applying the same /add-<channel> SKILL.md a coding agent would follow - a deterministic engine executes the skill's mechanical steps directly from the document, so wizard and skill cannot drift, and anything the engine cannot do falls back to an agent reading the prose. Migration: the bespoke non-interactive channel installers (setup/add-<channel>.sh, setup/install-<channel>.sh) and per-channel wizard flows (setup/channels/<channel>.ts) are deleted. Anything that invoked them should apply the skill instead: interactively via /add-<channel> or the setup wizard, or programmatically via skill directives.
  • One guard for privileged actions. Every privileged action crossing the container or channel boundary now passes through guard() before execution: allow, hold, or deny. Approved replays carry the approval row as a grant and re-run checks against current state; forged, consumed, mismatched, or newly unauthorized grants fail closed. Guarded delivery actions can no longer be re-registered without their guard specification.
  • [BREAKING] whatsapp-formatting and slack-formatting moved from trunk to the channels branch. They now install with their channel, so installations without those channels no longer carry channel-specific formatting instructions in every agent's context. Migration - only if the channel is installed: re-run /add-whatsapp or /add-slack after updating. Do not run an add-skill preemptively; it installs the full adapter.
  • [BREAKING] Scheduled tasks moved from MCP tools to ncl tasks. Agents and operators now manage tasks with ncl tasks list/get/create/update/cancel/pause/resume/delete/run/append-log; task sessions are isolated from the chat session that created them. Migration: follow the scheduled-task migration guide.
  • [BREAKING] Task delivery is explicit and uses one door. Every send_message and send_file call requires a named to destination; task-session final output becomes the run summary, while only explicitly addressed tool calls deliver. Migration: rebuild the agent image, restart NanoClaw, update custom instructions that omit to, and clear or compact existing sessions. Failed pre-task scripts now back their recurring series off and auto-pause after eight consecutive failures instead of spinning.
  • [BREAKING] Chat SDK and channel adapters are pinned to 4.29.0. The bridge and adapter must use the same ChatInstance type, so exact pins replace caret ranges. Core installations without a channel are unaffected. Migration: if a channel is installed, re-run its /add-<channel> skill after updating.
  • Hardened agent images are available as an opt-in setup path. A digest-pinned, multi-architecture image can be fetched from the NanoClaw registry and retagged to the same local name used by builds; architecture, lockfile, provenance, size, and optional publisher-signature checks fail closed. Local builds remain the default and require no account. See hardened images.
  • Agent containers now start with safer defaults. New spawns always drop all Linux capabilities, set no-new-privileges, and use Docker's init process; these controls have no per-group override. A PID limit defaults to 2048 and can be changed installation-wide with CONTAINER_PIDS_LIMIT (0 disables it). The Vercel CLI is now opt-in instead of being baked into every image.
  • Agent containers can have installation-wide resource caps. CONTAINER_CPU_LIMIT and CONTAINER_MEMORY_LIMIT pass --cpus and --memory to Docker for every agent container. Both remain empty by default, so existing installations keep their current behavior.
  • Per-agent-group timezones. ncl groups config update --timezone <IANA> overrides the install timezone for that group's scheduling, run-log display, and container TZ; "" clears the override. Host-side operator display remains in the install timezone.
  • Agent templates and reusable skills expanded. Local templates can stamp persona, context, MCP configuration, and skills through ncl groups create --template; templates can also seed scheduled tasks and timezone. /learn distills a reusable skill from an existing workflow, and /add-clidash installs a read-only CLI-derived dashboard.
  • A clearer, safer ncl control plane. Verbs now declare and validate their arguments, generate deep help, preserve dashed IDs, render human-readable output on the host, and flush large responses before exit. Creating groups and wirings now provisions their required companion rows transactionally, fixing first-spawn failures and silently dropped replies.
  • Approval and agent-to-agent controls are more expressive. Connected agents can require per-message approval; rejection reasons reach the requester; OneCLI approval cards use the gateway's structured summary; and shared-channel cards retain who approved or rejected an action.
  • Delivery and provider failures stop disappearing. Missing adapters route messages into retry instead of marking them delivered, agent image builds no longer block the host, and Claude rate-limit telemetry only aborts a turn when the SDK reports a rejection. Billing exhaustion and transient rate limits remain distinct.
  • Setup and update recovery improved. Setup can parse wrapped Claude OAuth captures, offer Slack Socket Mode, and reap dead peer-service registrations. Re-applying an updated skill rebuilds the container when needed, and a missing session folder is re-provisioned so the documented reset path works.
  • Security fixes. Inbox attachment writes reject symlink escapes, approved CLI calls preserve the original caller context, command-gate checks no longer fail open, mount allowlists honor readOnly, and stale v1 secret/config mirrors were removed.
  • Documentation was refreshed across architecture, database schemas, security boundaries, provider configuration, SDK behavior, skills, and registry-branch maintenance. A Korean README is now available.

New Contributors

  • @arkjun made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2806
  • @sturdy4days made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2803
  • @moshe-nanoco made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2793
  • @cben0ist made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2859
  • @johnmathews made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2880
  • @thisdotrob made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2885
  • @leetwito made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2795
  • @Shufel83 made their first contribution in https://github.com/nanocoai/nanoclaw/pull/3003
  • @boazdori made their first contribution in https://github.com/nanocoai/nanoclaw/pull/2748

Contributors

Thanks to everyone who landed work in this release:

  • fix(setup): parse Claude OAuth token from wrapped PTY capture by @amit-shafnir in https://github.com/nanocoai/nanoclaw/pull/2805
  • docs: add Korean README by @arkjun in https://github.com/nanocoai/nanoclaw/pull/2806
  • refactor: remove dead resolveGroupIpcPath by @sturdy4days in https://github.com/nanocoai/nanoclaw/pull/2803
  • refactor: mirror .claude skills + CLAUDE.md into .agents via symlinks by @Koshkoshinsk in https://github.com/nanocoai/nanoclaw/pull/2810
  • feat(agent-to-agent): per-message approval policies on connected agents by @moshe-nanoco in https://github.com/nanocoai/nanoclaw/pull/2793
  • fix(setup): allow env-selected agent provider by @amit-shafnir in https://github.com/nanocoai/nanoclaw/pull/2811
  • chore(deps): move chat SDK + channel-adapter pins to 4.29.0 by @gabi-simons in https://github.com/nanocoai/nanoclaw/pull/2834
  • fix(update-skills): nudge into skill updates, rebuild container on re-apply by @Koshkoshinsk in https://github.com/nanocoai/nanoclaw/pull/2826
  • fix(setup): reap dead peer service registrations whose binary is gone by @amit-shafnir in https://github.com/nanocoai/nanoclaw/pull/2830
  • feat(container): per-container CPU/memory limits (opt-in) by @omri-maya in https://github.com/nanocoai/nanoclaw/pull/2856
  • feat: add /learn skill - distill or refine a reusable skill from anything by @robbyczgw-cla in https://github.com/nanocoai/nanoclaw/pull/2843
  • feat(approvals): reject with reason by @moshe-nanoco in https://github.com/nanocoai/nanoclaw/pull/2832
  • fix(migrate-v2): don't SELECT is_main from v1 registered_groups by @cben0ist in https://github.com/nanocoai/nanoclaw/pull/2859
  • fix(ncl): default messaging-groups create instance to channel_type by @omri-maya in https://github.com/nanocoai/nanoclaw/pull/2882
  • fix(security): contain inbox symlink escapes in attachment writes (#2828) by @johnmathews in https://github.com/nanocoai/nanoclaw/pull/2880
  • fix(setup): offer Slack Socket Mode in the guided setup flow by @thisdotrob in https://github.com/nanocoai/nanoclaw/pull/2885
  • feat(templates): local template loader, ncl --template, and docs by @amit-shafnir in https://github.com/nanocoai/nanoclaw/pull/2890
  • [security] fix(cli): preserve caller context after approval by @Hinotoi-agent in https://github.com/nanocoai/nanoclaw/pull/2611
  • Unregister the mock provider from the production container barrel by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2927
  • Remove the dead /workspace/global mount and untrack v1 group seed files by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2928
  • feat(approvals): render OneCLI approval requests from the gateway's structured summary by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2929
  • command-gate: restore the /start filter and remove the fail-open admin check by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2930
  • Fix ncl positional IDs for generated (dashed) identifiers by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2932
  • feat: add /add-clidash - read-only CLI-derived dashboard skill by @leetwito in https://github.com/nanocoai/nanoclaw/pull/2795
  • feat(approvals): colored buttons on approval cards (Slack primary/danger) by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2933
  • Make the security-perimeter env vars reachable under the shipped service by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2934
  • Delete dead v1 config knobs and the broken pnpm auth script by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2935
  • Clean up dead ncl CLI protocol vocabulary by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2936
  • Re-provision a missing session folder so the documented reset works by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2937
  • Delete one-DB-era @deprecated shims and dead exports by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2940
  • Fix the agent-to-agent in_reply_to stamp (cross-process no-op) by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2942
  • Mount allowlist: honor the readOnly key and stop caching parse errors by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2943
  • Rewrite the security docs to match the v2 perimeter by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2945
  • Remove the dead data/env/env secrets mirror by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2946
  • Fix stale architecture, scheduling, provider-config, and overlay docs by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2948
  • Build agent images asynchronously instead of blocking the host by @gavrielc in https://github.com/nanocoai/nanoclaw/pull/2931
  • docs: correct stale mount topology row + removed env var by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2953
  • docs: fix stale claims across README, CONTRIBUTING, CLAUDE.md and operational docs by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2961
  • docs: sync DB schema and entity docs with migrations 010-018 by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2962
  • docs: rewrite architecture.md and agent-runner-details.md to match current code by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2963
  • docs: update SDK deep-dive from 0.2.x to 0.3.197 by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2964
  • fix(agent-runner): match rate_limit_event as a top-level SDK message type by @glifocat in https://github.com/nanocoai/nanoclaw/pull/2965
  • Wizard UX + add-slack Socket Mode fixes by @Koshkoshinsk in https://github.com/nanocoai/nanoclaw/pull/2972
  • ncl CLI: verb-level args, deep help, server-rendered human view by @omri-maya in https://github.com/nanocoai/nanoclaw/pull/2980