Skip to main content
The Signal channel enables IronClaw to send and receive messages via Signal Private Messenger using the signal-cli daemon.

Features

  • Direct messages - Private 1:1 conversations
  • Group chats - Multi-party conversations (with allowlist)
  • DM pairing - Approve unknown users before they can message
  • Typing indicators - Shows when agent is thinking
  • Attachment support - Send files within ~/.ironclaw/ sandbox
  • Thread continuity - Conversation history persists across restarts
  • Privacy mode - Works with users who hide their phone numbers (UUID-based)

Prerequisites

  • signal-cli daemon with HTTP/JSON-RPC API mode
  • A registered Signal account for the bot
  • IronClaw installed and configured

Setup

1. Install signal-cli

macOS (Homebrew):
Linux (Manual):

2. Register Signal Account

Link to existing account (recommended):
Or register new number:

3. Start signal-cli Daemon

Or use systemd:

4. Configure IronClaw

Environment variables:
Or via config file:

Configuration

Set via environment variables or .env file:

Configuration Options

DM Policies

open

Allow all DMs from anyone.

allowlist

Only accept DMs from pre-approved senders. Silent drop for others.

pairing (default)

Combines allowlist with interactive pairing. Unknown users receive a pairing code:

Group Policies

disabled

Ignore all group messages.

allowlist (default)

Only process messages from allowed groups AND allowed senders.

open

Process messages from allowed groups (any sender).

Pairing

DM Pairing

When an unknown user sends a DM with dm_policy: "pairing":
  1. User sends a message
  2. Bot replies: To pair with this bot, run: \ironclaw pairing approve signal ABC12345“
  3. You run: ironclaw pairing approve signal ABC12345
  4. User is added to the persistent allow list

Commands

Privacy Mode (UUID-based)

Signal users can hide their phone numbers. For these users:
  • sourceNumber is empty
  • source contains a UUID (e.g., abc-123-def-456)
  • Use uuid:abc-123-def-456 in allowlists
Example:
The channel automatically normalizes uuid: prefixes when matching.

Attachments

The channel supports sending attachments from the ~/.ironclaw/ sandbox:
Paths outside ~/.ironclaw/ are rejected to prevent path traversal attacks.

Thread Continuity

The channel generates deterministic UUIDs for thread IDs:
  • DMs with privacy users - Use Signal’s source_uuid
  • DMs with regular users - Generate UUID from phone number
  • Groups - Generate UUID from group ID
This ensures conversation history persists across restarts and works with the agent’s maybe_hydrate_thread feature.

Status Updates

The channel sends status updates to Signal:

Typing Indicators

When the agent is thinking, a typing indicator is sent via sendTyping RPC.

Status Messages

  • ApprovalNeeded - Sends approval prompt with request ID
  • JobStarted - Notifies about sandbox jobs
  • AuthRequired - Extension authentication prompts
  • Tool execution - Shown in debug mode (toggle with /debug)

Debug Mode

Toggle verbose tool output with the /debug command:

signal-cli JSON-RPC API

The channel uses signal-cli’s HTTP/JSON-RPC API:

Receive Messages (SSE)

Returns Server-Sent Events stream:

Send Message

Send to Group

Troubleshooting

signal-cli daemon not running

Messages not received

  1. Check SSE connection - Logs should show “Signal SSE connected”
  2. Verify account - Ensure SIGNAL_ACCOUNT matches the daemon’s account
  3. Check allowlist - Verify sender is in SIGNAL_ALLOW_FROM
  4. Check policy - Ensure SIGNAL_DM_POLICY isn’t blocking messages

Pairing not working

  1. Check policy - Ensure SIGNAL_DM_POLICY=pairing
  2. HTTP allowlist - Verify the channel can send messages
  3. Logs - Look for “Pairing request upserted” or “Failed to send pairing reply”

Group messages ignored

  1. Check group policy - Ensure SIGNAL_GROUP_POLICY isn’t disabled
  2. Group ID - Verify group is in SIGNAL_ALLOW_FROM_GROUPS
  3. Sender allowlist - Check sender is in SIGNAL_GROUP_ALLOW_FROM (or SIGNAL_ALLOW_FROM if empty)

Attachments rejected

  • Ensure attachment paths are absolute
  • Verify paths are within ~/.ironclaw/ sandbox
  • Check file exists and is readable

High memory usage

The channel uses an LRU cache (10,000 entries) for reply targets. If you have millions of messages, consider restarting periodically.

Source Code

  • Implementation: ~/workspace/source/src/channels/signal.rs
  • HTTP helpers: ~/workspace/source/src/channels/http.rs

Example Usage

Simple DM

Group Chat

Debug Mode