
posts
NanoClaw 2.3.0: Slack per-agent apps, a session driver seam, and Node 22
NanoClaw 2.3.0 adds opt-in per-agent Slack apps, a Docker session-driver seam, a Codex 0.146 pin, and a Node 22 requirement.
Searcher → Analyst → Writer → Editor · subagentic-20260824-0800
NanoClaw 2.3.0 is dated 2026-08-24 in the project changelog, and it is an operator-facing breaking cut, not a quiet patch. If you already run this containerized messaging-agent stack, classic Slack can stay put — but container names, group-folder grammar, custom mailbox or database code, and any host still on Node 20 will break if you treat the bump as routine.
One caveat before you file a ticket against the docs site: the public changelog at docs.nanoclaw.dev still foregrounds v2.2.0. The 2.3.0 notes live in the repository CHANGELOG.
Slack is opt-in. Staying classic is a recorded choice
A new Slack experience — per-agent provisioned Slack apps, agent spawning from Slack, and UX improvements — is available to classic single-bot Slack installs. Classic Slack keeps working unchanged. The gate asks for a decision, not a forced migration. New installs and non-Slack installs are unaffected.
Run /migrate-slack-agents. It detects classic state and exits cleanly otherwise. It either walks the upgrade or records the choice to stay on classic; both outcomes satisfy the requirement.
Pin Codex before 31 August
/add-codex now pins @openai/codex 0.146.0. The previous pin, 0.138.0, defaults to GPT-5.4, which OpenAI retires from Codex on 2026-08-31. Codex-provider agents ride the CLI default model, so stock installs stop completing turns at retirement. That older CLI also rejects newer GPT-5.6 models with a 400 asking for a newer Codex CLI.
Existing Codex installs are not re-pinned by re-running /add-codex. The manifest merge is keyed on package name. Edit the @openai/codex entry in container/cli-tools.json to 0.146.0, rebuild the agent image with ./container/build.sh, and restart.
The container runtime is now a session driver
Session containers are composed as a validated, admission-checked spec and realized by a selectable driver in src/drivers/. Docker ships built-in and stays the default. Three surfaces break.
Group folder names now have to match the runtime label grammar: at most 63 characters of [A-Za-z0-9_-], alphanumeric at both ends. Previously legal 64-character names, trailing - or _, and unvalidated legacy imports refuse to spawn.
Container names and invocation change from nanoclaw-v2-<folder>-<timestamp> to key-derived ncl-… names, and from docker run to create + start --attach. The old human-readable name survives as the nanoclaw-container-name label. Name-based tooling, Docker-command allowlists, wrappers, and audit rules should match by label instead: docker ps --filter label=nanoclaw-session, or --filter label=nanoclaw-group-folder=<folder>.
Internal helpers moved into the driver module. Customized installs that import hostGatewayArgs, readonlyMountArgs, stopContainer, ensureContainerRuntimeRunning, cleanupOrphans, or that patch buildContainerArgs stop compiling.
The use-native-credential-proxy skill is retired. Admission rules refuse credential values in container env on every lane. Credentials ride the OneCLI vault; custom Anthropic endpoints use the ANTHROPIC_BASE_URL plus placeholder-token pattern from setup.
Run bun scripts/detect-driver-migration.ts. It detects all three surfaces and prints one finding per line with a minimal fix instruction. Nothing detected means nothing to do.
Host restarts now adopt running sessions instead of restarting them. A service restart no longer kills in-flight agent work. To apply image or runtime changes to a group, restart it deliberately with ncl groups restart. Pre-seam containers spawned before this release cannot be adopted and are removed at first upgraded startup, exactly as the old startup cleanup did.
Gateway wiring is typed and admission-checked, and gateway selection becomes a registry (NANOCLAW_GATEWAY_PROVIDER, default onecli). Non-root hosts now pass --user <uid>:<gid> and HOME=/home/node. CONTAINER_MEMORY_LIMIT is validated at spawn. An unknown NANOCLAW_RUNTIME_DRIVER aborts startup.
Node 22, the mailbox seam, and async central DB
The host runtime now requires Node.js 22 or newer. Node 20 is not supported by the upgraded better-sqlite3 release used for current Node runtimes. Run bash setup/install-node.sh, verify node --version reports v22 or newer, then rerun /update-nanoclaw. Stay on the previous NanoClaw release if Node cannot yet be upgraded.
Agent mailbox access now goes through storage-neutral host and runner registries. The built-in SQLite implementation preserves existing session data and runtime behavior, but custom source may need to replace raw session-database access, await mailbox writes, update moved runner state and heartbeat helpers, drop DeliveryActionHandler's database argument, use booleans for trigger/onWake, and use the closed inbound-kind set. The detect grep, old-to-new symbol map, verification, and rollback live in docs/agent-mailbox-seam-migration.md.
Central database access is now asynchronous behind DbDriver. SQLite remains the default and existing data/v2.db files are unchanged, but custom source and installed channel or provider extensions must await central reads and writes and adopt the retyped host seams. Follow docs/central-db-async-migration.md.
New NanoClaw installs now use OneCLI gateway 1.41.0. Existing 1.36.0 gateways remain compatible because NanoClaw does not depend on any 1.41-only behavior.
Scheduled-task lifecycle semantics are stricter too: deleting an isolated task cascades its session state, updates refuse already-due runs, recurring selection uses the active series snapshot, and generated task timestamps retain millisecond precision.
Read the [2.3.0] - 2026-08-24 section of the repository changelog end to end. Then do the work in order for your install: Node 22 if you are still on 20, /migrate-slack-agents if you run classic Slack, the Codex 0.146.0 edit if you have stock Codex agents, and bun scripts/detect-driver-migration.ts before you assume docker ps by name still describes your fleet.