add-anydoc
Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word,…
Add Signal channel integration via signal-cli device-link. Native adapter — no Chat SDK bridge.
$ npx -y skills add nanocoai/nanoclaw --skill add-signal --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/add-signalContext preview
The summary Claude sees to decide when to auto-load this skill.
Add Signal channel integration via signal-cli device-link. Native adapter — no Chat SDK bridge.
name: add-signal description: Add Signal channel integration via signal-cli device-link. Native adapter — no Chat SDK bridge.
Adds Signal support via a native adapter that speaks JSON-RPC to a [signal-cli](https://github.com/AsamK/signal-cli) daemon — no Chat SDK bridge, only Node.js builtins. NanoClaw links to Signal as a *secondary device* on your existing phone: no new number, no bot API. Your assistant sends and receives as the number on the phone that scans the link.
NanoClaw talks to Signal through signal-cli, which has no bot API of its own. Install it if it isn't on PATH yet — Homebrew on macOS, the native release binary on Linux (neither needs Java). If it's already installed this is a no-op:
command -v signal-cli >/dev/null 2>&1 || bash setup/install-signal-cli.sh
Fetch the `channels` branch and copy the Signal adapter and its registration test into `src/channels/` (overwrite — the branch is canonical):
src/channels/signal.ts src/channels/signal-registration.test.ts
Append the self-registration import to the channel barrel (skipped if the line is already present). This one line is the skill's only reach-in into core:
import './signal.js';
The device-link step renders the linking URL as a terminal QR via `qrcode`. Pinned to exact versions — the supply-chain policy rejects ranges and `latest`:
qrcode@1.5.4 @types/qrcode@1.5.6
The adapter itself consumes only Node.js builtins, so there is no adapter package to install — `qrcode` is purely for rendering the link during setup.
Build first: it guards the adapter's typed core-API consumption. Then run the one integration test.
pnpm run build
pnpm exec vitest run src/channels/signal-registration.test.ts
`signal-registration.test.ts` imports the real channel barrel and asserts the registry contains `signal`. It goes red if the `import './signal.js';` line is deleted or drifts, or if the barrel fails to evaluate — so the channel genuinely would not register. The adapter has no npm dependency to guard; its typed core-API consumption is covered by the build. End-to-end delivery against a real Signal account is verified manually once the service runs.
This is the whole credential step. signal-cli opens a device-link handshake, prints a `sgnl://linkdevice…` URL, and renders it as a scannable QR. You scan it once from the phone that already runs Signal; that phone's number becomes the account NanoClaw sends and receives as — no number is registered.
The device-link runs signal-cli, so it must be reachable first — on `PATH`, or at `$SIGNAL_CLI_PATH`. If step 1's install didn't land, the link step has nothing to drive; confirm it's present before linking (re-run step 1 if this fails):
command -v signal-cli >/dev/null 2>&1 || [ -x "$SIGNAL_CLI_PATH" ]
Tell the user:
Link NanoClaw to your Signal account: 1. On the phone that runs Signal, open Signal → Settings → Linked Devices → Link New Device. 2. Scan the QR code shown below — or open the `sgnl://linkdevice…` link printed under it on that phone. 3. Wait for confirmation. The linking URL expires after ~3 minutes; re-run this step for a fresh one.
Run the device-link. It blocks until you scan, then reports the linked phone number back as the account — that number is both your owner handle and the conversation address the wiring step needs:
pnpm exec tsx setup/index.ts --step signal-auth
`owner_handle` and `platform_id` both come back as the bare phone number (e.g. `+15551234567`). Your assistant reaches you through Signal's Note to Self, so the owner conversation is addressed by your own number — not a per-contact UUID.
Store the linked number so the adapter binds the right account on start, then sync it into the container env:
SIGNAL_ACCOUNT={{platform_id}}Restart the service so it loads the Signal adapter and binds the account you just linked, and wait for its CLI socket before wiring:
bash setup/lib/restart.sh
After the service starts, send any message to the Signal number from your personal Signal app. The router auto-creates a `messaging_groups` row. Then:
pnpm exec tsx scripts/q.ts data/v2.db \ "SELECT id, platform_id FROM messaging_groups WHERE channel_type='signal' ORDER BY created_at DESC LIMIT 5"
Pass the `id` to `/init-first-agent` or `/manage-channels` to wire it to an agent group.
Add the Signal number to a group from your phone, send any message, then wire the resulting row the same way. Each group gets its own session with the default `shared` mode (one session per agent + messaging group). Create the wiring with `ncl` — **the host service must be running** (`ncl` connects to it over a Unix socket):
# Engage mode/pattern default to the Signal adapter's declared channel defaults ncl wirings create --messaging-group-id mg-GROUPID --agent-group-id ag-AGENTID
New Signal users (including the owner's Signal identity) are silently dropped with `not_member` until granted access. After the user's first message appears in `messaging_groups` (host service running):
ncl users create --id "signal:UUID" --kind signal --display-name "<name>" ncl roles grant --user "signal:UUID" --role owner ncl members add --user "signal:UUID" --group ag-AGENTID
Find the UUID from `messaging_groups.platform_id` or the `users` table.
If you're in the middle of
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
Repo: nanocoai/nanoclaw
Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word,…
Convert an attached Word document, presentation, spreadsheet, OpenDocument file, RTF, EPUB, CSV, or text-based PDF into local Markdown. Use when a message…
Add Atomic Chat MCP server so the container agent can call local models served by the Atomic Chat desktop app via its OpenAI-compatible API.
Add clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ships pre-wired…
Use Codex (OpenAI's codex app-server) as a full agent provider — planning, tool orchestration, MCP tools, server-side history, session resume — alongside or…
Add a monitoring dashboard to NanoClaw. Installs @nanoco/nanoclaw-dashboard and a pusher that sends periodic JSON snapshots.