Skills
Messaging Official

Signal

Add Signal as a messaging channel via signal-cli. Native adapter — no Chat SDK bridge.

What it does

  • End-to-end encrypted messaging via signal-cli's TCP daemon
  • Register a dedicated number or link as a secondary device
  • Markdown formatting converted to Signal's native text styles
  • Quoted replies, typing indicators, and Note to Self routing
  • Native adapter using only Node.js builtins — no Chat SDK

What you'll need

  • NanoClaw installed and running
  • Java 17+ on the host
  • signal-cli installed (Homebrew on macOS, native binary on Linux)
  • A phone number for the bot (dedicated number recommended)

Install

/add-signal

How it works

The /add-signal skill connects NanoClaw to Signal via signal-cli, which speaks the Signal protocol from a Java daemon. NanoClaw runs a small native adapter that talks JSON-RPC to that daemon over local TCP.

Signal has no bot API, so NanoClaw registers as a real Signal account. You can either dedicate a fresh number to the bot (recommended) or link NanoClaw as a secondary device on your existing personal account.

Setup

The skill walks you through three things: installing signal-cli, registering or linking the account, and dropping the adapter into NanoClaw.

For a fresh number, registration involves solving a CAPTCHA at signalcaptchas.org, requesting an SMS or voice verification, and confirming the code. For a secondary-device link, signal-cli prints a tsdevice: URI that you scan from Signal’s “Linked Devices” screen on your phone.

Once the account is set up, the skill copies the Signal adapter from the channels branch, appends one import line, and rebuilds. No npm packages — the adapter uses only Node.js builtins.

What you get

  • Markdown formatting**bold**, *italic*, `code`, fences, strikethrough, and spoiler all map to Signal’s offset-based styles.
  • Quoted replies — replies thread correctly and the agent sees the quoted message for context.
  • Typing indicators — shown in DMs (Signal doesn’t support group typing).
  • Note to Self — messages sent from another device to your own account route to the agent as inbound with isFromMe: true.
  • Voice attachments — detected and surfaced as [Voice Message] placeholder. Add /add-voice-transcription for local transcription.
  • Echo suppression — outbound messages won’t loop back through Signal’s syncMessage stream.

Not supported yet: outbound file attachments, edit/delete messages, reactions.

Tips

  • Keep the TCP daemon bound to 127.0.0.1. It has no authentication — exposing it on a public interface would hand over your full Signal account.
  • VoIP numbers sometimes get rejected by Signal’s verification. If SMS fails, request voice verification with the same CAPTCHA token; if both fail, try a different provider or a real SIM.
  • Stop NanoClaw before running any signal-cli commands directly — the daemon holds an exclusive lock on its data directory.
  • New Signal users hit the not_member policy by default. Use /manage-channels (or /init-first-agent for the very first one) to grant access — the operator’s Signal identity is its own user record, separate from their identity on other channels.
  • A separate phone number is the safer setup. Linking to your personal account means NanoClaw can read all your messages.