The Signal channel enables IronClaw to send and receive messages via Signal Private Messenger using the signal-cli daemon.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/nearai/ironclaw/llms.txt
Use this file to discover all available pages before exploring further.
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):2. Register Signal Account
Link to existing account (recommended):3. Start signal-cli Daemon
4. Configure IronClaw
Environment variables:Configuration
Set via environment variables or.env file:
Configuration Options
| Variable | Type | Default | Description |
|---|---|---|---|
SIGNAL_HTTP_URL | string | http://127.0.0.1:8080 | signal-cli daemon HTTP endpoint |
SIGNAL_ACCOUNT | string | required | Bot’s phone number or UUID |
SIGNAL_ALLOW_FROM | string | "" | Comma-separated phone numbers/UUIDs. * allows all. Empty = deny/require pairing |
SIGNAL_ALLOW_FROM_GROUPS | string | "" | Comma-separated group IDs. * allows all groups. Empty = deny all groups |
SIGNAL_DM_POLICY | string | "pairing" | open, allowlist, or pairing |
SIGNAL_GROUP_POLICY | string | "allowlist" | open, allowlist, or disabled |
SIGNAL_GROUP_ALLOW_FROM | string | "" | Sender allowlist for group messages. Empty = inherit from ALLOW_FROM |
SIGNAL_IGNORE_ATTACHMENTS | boolean | false | Drop attachment-only messages |
SIGNAL_IGNORE_STORIES | boolean | true | Drop story messages |
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 withdm_policy: "pairing":
- User sends a message
- Bot replies:
To pair with this bot, run: \ironclaw pairing approve signal ABC12345“ - You run:
ironclaw pairing approve signal ABC12345 - User is added to the persistent allow list
Commands
Privacy Mode (UUID-based)
Signal users can hide their phone numbers. For these users:sourceNumberis emptysourcecontains a UUID (e.g.,abc-123-def-456)- Use
uuid:abc-123-def-456in allowlists
uuid: prefixes when matching.
Attachments
The channel supports sending attachments from the~/.ironclaw/ sandbox:
~/.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
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 viasendTyping 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)
Send Message
Send to Group
Troubleshooting
signal-cli daemon not running
Messages not received
- Check SSE connection - Logs should show “Signal SSE connected”
- Verify account - Ensure
SIGNAL_ACCOUNTmatches the daemon’s account - Check allowlist - Verify sender is in
SIGNAL_ALLOW_FROM - Check policy - Ensure
SIGNAL_DM_POLICYisn’t blocking messages
Pairing not working
- Check policy - Ensure
SIGNAL_DM_POLICY=pairing - HTTP allowlist - Verify the channel can send messages
- Logs - Look for “Pairing request upserted” or “Failed to send pairing reply”
Group messages ignored
- Check group policy - Ensure
SIGNAL_GROUP_POLICYisn’tdisabled - Group ID - Verify group is in
SIGNAL_ALLOW_FROM_GROUPS - Sender allowlist - Check sender is in
SIGNAL_GROUP_ALLOW_FROM(orSIGNAL_ALLOW_FROMif 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