Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Add new capabilities or modify NanoClaw behavior. Use when user wants to add channels (Telegram, Slack, email input), change triggers, add integrations, modify the router, or make any other customizations. This is an interactive skill that asks questions to understand what the user wants.
.claude/skills/nanocoai-customize/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 83% | 0% |
This skill helps users add capabilities or modify behavior. Use AskUserQuestion to understand what they want before making changes.
/add-telegram, /add-slack, /add-discord, /add-whatsapp, /add-signal, /add-imessage, and the rest of the /add-<channel> family./manage-channels./manage-mounts./add-opencode, /add-codex, /add-ollama-provider./add-ollama-tool, /add-atomic-chat-tool.CLAUDE.md, or core code).Customizations route through the v2 entity model: users → messaging groups → agent groups → sessions. A messaging group is one chat/channel on one platform; an agent group holds the workspace, personality, and container config; a wiring links a messaging group to an agent group with a session mode and trigger rules. Inspect and edit all of this with the ncl admin CLI. See docs/isolation-model.md for the three isolation levels.
| File | Purpose | |------|---------| | src/index.ts | Entry point: init DB, migrations, channel adapters, delivery polls, sweep, shutdown | | src/router.ts | Inbound routing: messaging group → agent group → session → inbound.db → wake | | src/delivery.ts | Polls outbound.db, delivers via adapter, handles system actions | | src/session-manager.ts | Resolves sessions; opens inbound.db / outbound.db; heartbeat path | | src/container-runner.ts | Spawns per-agent-group containers with session DB + outbox mounts, OneCLI ensureAgent | | src/channels/ | Channel adapter infra (registry, Chat SDK bridge); specific adapters install from the channels branch | | src/config.ts | Process-level config (assistant name, paths, timeouts) read from .env | | data/v2.db | Central DB: users, roles, agent_groups, messaging_groups, wirings, container_configs | | data/v2-sessions/<session>/ | Per-session inbound.db (host→container) + outbound.db (container→host) | | groups/<folder>/CLAUDE.md | Per-agent-group memory/persona and instructions |
For ad-hoc DB queries, use pnpm exec tsx scripts/q.ts <db> "<sql>".
Questions to ask:
Implementation:
/add-telegram, /add-slack, …). It fetches the adapter from the channels branch, wires the registration import, installs the pinned package, and builds./manage-channels (or use ncl messaging-groups + ncl wirings) to create the messaging group, choose the isolation level, and wire it to an agent group with a session mode and trigger rules.Questions to ask:
Implementation:
/add-<service>-tool skill exists, run it — it wires the MCP server and routes credentials through OneCLI so no raw keys reach the container.--command <cmd> [--args <json-array>] [--env <json-object>] for stdio or --url <url> for Streamable HTTP (HTTPS, or plain HTTP for localhost / host.docker.internal): ncl groups config add-mcp-server --id <group-id> --name <name> .... Then run ncl groups restart --id <group-id> to take effect. From inside a container the agent uses the add_mcp_server self-mod tool, which requires one admin approval.Questions to ask:
Implementation:
groups/<folder>/CLAUDE.md — edit that file for the target group.container_configs table: ncl groups config get/update --id <group-id>.Questions to ask:
Implementation:
groups/<folder>/CLAUDE.md.ncl wirings update --id <wiring-id> ....Questions to ask:
Implementation:
.env / config.Always tell the user.
Run from your NanoClaw project root:
bash# Rebuild and restart pnpm run build source setup/lib/install-slug.sh # macOS: launchctl unload ~/Library/LaunchAgents/$(launchd_label).plist launchctl load ~/Library/LaunchAgents/$(launchd_label).plist # Linux: # systemctl --user restart $(systemd_unit)
User: "Add Telegram as an input channel"
/add-telegram to install the adapter, wire its registration, and build./manage-channels (or ncl messaging-groups create + ncl wirings create) to create the messaging group and wire it to the chosen agent group with a session mode and trigger rules.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,404 | 7,916 | +46% | 1 | 1 | 0% | 882 | 2,202 | +150% | 0 | 0 | — |
case-11 | fail→pass | 7,321 | 2,458 | -66% | 1 | 1 | 0% | 1,143 | 2,056 | +80% | 0 | 0 | — |
case-02 | fail→fail | 9,856 | 5,142 | -48% | 1 | 1 | 0% | 1,677 | 2,459 | +47% | 0 | 0 | — |
case-03 | fail→fail | 6,145 | 7,153 | +16% | 1 | 1 | 0% | 900 | 1,943 | +116% | 0 | 0 | — |
case-04 | fail→fail | 11,970 | 3,385 | -72% | 1 | 1 | 0% | 1,666 | 2,198 | +32% | 0 | 0 | — |
case-05 | fail→fail | 10,245 | 4,145 | -60% | 1 | 1 | 0% | 1,594 | 2,353 | +48% | 0 | 0 | — |
case-06 | fail→fail | 12,034 | 3,352 | -72% | 1 | 1 | 0% | 1,965 | 2,253 | +15% | 0 | 0 | — |
case-07 | fail→pass | 11,181 | 4,522 | -60% | 1 | 1 | 0% | 1,659 | 2,374 | +43% | 0 | 0 | — |
case-08 | fail→pass | 10,306 | 5,014 | -51% | 1 | 1 | 0% | 1,501 | 2,290 | +53% | 0 | 0 | — |
case-09 | fail→pass | 9,676 | 2,394 | -75% | 1 | 1 | 0% | 1,630 | 1,990 | +22% | 0 | 0 | — |
case-10 | fail→pass | 6,771 | 2,653 | -61% | 1 | 1 | 0% | 1,087 | 1,989 | +83% | 0 | 0 | — |
case-12 | fail→pass | 11,895 | 2,996 | -75% | 1 | 1 | 0% | 1,702 | 2,152 | +26% | 0 | 0 | — |
case-13 | fail→pass | 8,796 | 4,408 | -50% | 1 | 1 | 0% | 1,392 | 2,383 | +71% | 0 | 0 | — |
case-14 | fail→pass | 10,588 | 4,123 | -61% | 1 | 1 | 0% | 1,797 | 2,306 | +28% | 0 | 0 | — |
case-15 | pass→pass | 7,199 | 2,045 | -72% | 1 | 1 | 0% | 986 | 1,905 | +93% | 0 | 0 | — |
case-16 | fail→pass | 13,069 | 5,406 | -59% | 1 | 1 | 0% | 1,958 | 2,386 | +22% | 0 | 0 | — |
case-17 | fail→pass | 11,855 | 2,301 | -81% | 1 | 1 | 0% | 1,981 | 2,028 | +2% | 0 | 0 | — |
case-18 | pass→pass | 9,121 | 2,994 | -67% | 1 | 1 | 0% | 1,598 | 2,083 | +30% | 0 | 0 | — |
case-19 | pass→pass | 3,142 | 2,540 | -19% | 1 | 1 | 0% | 457 | 1,935 | +323% | 0 | 0 | — |
case-20 | pass→pass | 18,612 | 11,384 | -39% | 1 | 1 | 0% | 3,395 | 3,743 | +10% | 0 | 0 | — |
case-21 | pass→fail | 12,952 | 5,357 | -59% | 1 | 1 | 0% | 2,584 | 1,937 | -25% | 0 | 0 | — |
case-22 | pass→pass | 15,645 | 8,794 | -44% | 1 | 1 | 0% | 2,499 | 2,589 | +4% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/12/2026 | +36% |
Other measured skills in the registry, with their headline benchmark lift.