NanoClaw doesn’t rely on large configuration files. Instead, customizations fall into four lanes:Documentation Index
Fetch the complete documentation index at: https://docs.nanoclaw.dev/llms.txt
Use this file to discover all available pages before exploring further.
- Code changes — for behavior baked into the orchestrator (trigger pattern, polling, timeouts)
- Wiring settings — per-messaging-group config stored in the central DB (engage mode, sender scope, session mode)
- Skills — for features and integrations (install via
/add-<name>, uninstall viagit revert) - Mount allowlist — for which host directories an agent can see
Philosophy
From the README:
NanoClaw doesn’t use configuration files. To make changes, just tell Claude Code what you want… The codebase is small enough that Claude can safely modify it.
Change the trigger word
The default is@Andy, derived from ASSISTANT_NAME in src/config.ts:
.env:
.env, restarts the service, and verifies the new pattern matches.
Environment variables
src/config.ts reads ASSISTANT_NAME, ASSISTANT_HAS_OWN_NUMBER, ONECLI_URL, ONECLI_API_KEY, and TZ from .env (with process.env taking precedence). Everything else is process.env only.
- OneCLI Agent Vault (default)
- Legacy credential proxy (opt-in)
.env.Runtime-tunable settings (process.env only)
| Variable | Default | What it controls |
|---|---|---|
CONTAINER_IMAGE | nanoclaw-agent:latest | Which image to spawn |
CONTAINER_TIMEOUT | 1800000 (30 min) | Hard upper bound on a single container run |
CONTAINER_MAX_OUTPUT_SIZE | 10485760 (10 MB) | Truncation threshold for container stdout |
MAX_MESSAGES_PER_PROMPT | 10 | How many queued inbound messages join one Claude turn |
IDLE_TIMEOUT | 1800000 (30 min) | How long a container stays alive after the last response |
MAX_CONCURRENT_CONTAINERS | 5 | Global cap on active containers |
Per-wiring behavior (engage mode, sender scope, session mode)
Every messaging group × agent group wiring (stored inmessaging_group_agents) has orthogonal settings:
| Setting | Values | Meaning |
|---|---|---|
engage_mode | mention (default) | pattern | mention-sticky | When the agent reacts: trigger-only, regex match, or trigger-and-then-sticky |
engage_pattern | regex string | Used when engage_mode='pattern'. Sentinel . means “match every message” |
sender_scope | all (default) | known | Respond to anyone vs. only users in the agent group’s member list |
ignored_message_policy | drop (default) | accumulate | What happens to messages that didn’t trigger — forgotten, or carried into the next prompt |
session_mode | shared (default) | per-thread | agent-shared | How sessions are carved: one per messaging group, one per thread, or one across multiple messaging groups |
/manage-channels skill — it reads/writes the wiring directly without requiring SQL.
Polling and delivery loops (source-verified)
If you need to tune the delivery cadence, the constants live insrc/delivery.ts and src/host-sweep.ts:
Memory and per-agent-group prompts
Agent-group memory lives ingroups/<folder>/CLAUDE.md. Edit it to change the agent’s persona, style, or pinned context:
CLAUDE.md is composed at session start — a shared base plus the per-group fragment. Per-group changes don’t affect other agent groups.
Mount allowlist
Agents only see what you mount. The allowlist lives at~/.config/nanoclaw/mount-allowlist.json (outside the project root, never mounted into containers):
groups/<folder>/container.json. The host validates each request against the allowlist before mounting. See Security model for the full picture.
The /customize skill
For guided changes without memorizing file paths:
Adding channels, providers, and features
Channels and AI providers are skills, not core features. Install from thechannels or providers branch:
git revert the skill’s commit — restores the previous state cleanly.
Customization workflow
Describe what you want
Natural language —
@Andy I want the agent to respond to every message, not just mentions — works fine.Claude suggests the change
For wiring changes:
/manage-channels + update engage_mode. For code changes: a diff against src/config.ts or elsewhere.Debugging customizations
Related
- Messaging — inbound routing and engage evaluation
- Scheduled tasks — task model and cron
- Security — sender policies, user roles
- Architecture — two-DB session model