OpenClaw Signal Channel
Connect OpenClaw to Signal using signal-cli — a third-party, open-source command-line interface for the Signal protocol. This integration provides privacy-first AI messaging with full end-to-end encryption. OpenClaw communicates with a signal-cli daemon over HTTP JSON-RPC and Server-Sent Events, allowing your AI assistant to send and receive messages on Signal. A dedicated phone number is required for the bot account.
Signal Supported Features
Text Messages
Supported
Media & Files
Supported
Reactions
Supported
Threads
Not Supported
Voice Messages
Not Supported
Group Chat
Supported
Signal Prerequisites
- A dedicated phone number for the Signal bot account (separate from your personal number)
- Java Runtime Environment (JRE 25+) installed on your server
- signal-cli installed and accessible in your PATH
- OpenClaw Gateway running and configured
- An existing Signal account to link the bot from (or a new registration)
Signal Quick Setup
Install signal-cli
Download and install signal-cli from the official GitHub repository. It requires Java 25 or later. Verify the installation by running 'signal-cli --version' in your terminal.
Link or register a Signal account
Link signal-cli to an existing Signal account by running 'signal-cli link -n "OpenClaw"' and scanning the QR code from another device. Alternatively, register a new account with 'signal-cli -a +15551234567 register'. Use a dedicated number — running on your personal account will cause self-message loops.
Add Signal channel config
Add the Signal channel configuration to ~/.openclaw/openclaw.json. Set the 'account' field to your bot's E.164 phone number and configure the dmPolicy (pairing, allowlist, or open) to control who can message your assistant.
Start Gateway and send a test message
Launch the Gateway process. OpenClaw will automatically start the signal-cli daemon. Send a message to the bot's number from another Signal account. If using the default pairing policy, approve the sender via 'openclaw pairing approve signal <code>'.
Signal Configuration Example
{
"channels": {
"signal": {
"enabled": true,
"account": "+15551234567",
"dmPolicy": "pairing"
}
}
}
Signal Deep Dive
Architecture Overview
Signal Account Setup
{
"channels": {
"signal": {
"account": "+15551234567",
"cliPath": "/usr/local/bin/signal-cli"
}
}
}
External Daemon Mode
{
"channels": {
"signal": {
"account": "+15551234567",
"httpUrl": "http://127.0.0.1:8080/api/v1/rpc"
}
}
}
DM Policies
{
"channels": {
"signal": {
"dmPolicy": "allowlist",
"allowFrom": ["+15551234567", "uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890"]
}
}
}
Group Chat Management
{
"channels": {
"signal": {
"groupPolicy": "open",
"historyLimit": 50
}
}
}
Privacy & End-to-End Encryption
Reactions
{
"channels": {
"signal": {
"reactionLevel": "minimal"
}
}
}
Media & Attachments
{
"channels": {
"signal": {
"mediaMaxMb": 8,
"ignoreAttachments": false
}
}
}
Typing Indicators & Read Receipts
{
"channels": {
"signal": {
"sendReadReceipts": true
}
}
}
Text Chunking & Delivery
{
"channels": {
"signal": {
"textChunkLimit": 4000,
"chunkMode": "newline"
}
}
}
Signal Configuration Reference
| Key | Type | Default | Description |
|---|---|---|---|
| enabled | boolean | true | Enable or disable the Signal channel |
| account | string | "" | Bot's phone number in E.164 format (e.g., +15551234567). Required |
| cliPath | string | "signal-cli" | Path to the signal-cli executable |
| httpUrl | string | "" | Full URL of an external signal-cli daemon. When set, disables auto-start |
| httpHost | string | "127.0.0.1" | Host address for the auto-started signal-cli daemon to bind to |
| httpPort | number | 8080 | Port for the auto-started signal-cli daemon to bind to |
| autoStart | boolean | true | Whether to automatically spawn the signal-cli daemon on Gateway startup |
| startupTimeoutMs | number | 30000 | Maximum time (ms) to wait for the signal-cli daemon to become available. Max 120000 |
| dmPolicy | string | "pairing" | Controls who can DM the bot. Options: pairing, allowlist, open, disabled |
| allowFrom | string[] | [] | Phone numbers (E.164) or uuid:<id> identifiers allowed to message the bot |
| dmHistoryLimit | number | 50 | Number of recent DM messages to include as AI context per conversation |
| groupPolicy | string | "disabled" | Group chat policy. Options: disabled, allowlist, open |
| groupAllowFrom | string[] | [] | Phone numbers or UUIDs allowed to trigger the bot in groups (when groupPolicy is allowlist) |
| historyLimit | number | 50 | Maximum group messages included as AI context. Set 0 to disable |
| sendReadReceipts | boolean | false | Whether to forward read receipt signals for approved DM contacts |
| textChunkLimit | number | 4000 | Maximum characters per outbound message before chunking |
| chunkMode | string | "length" | Text chunking mode. Options: length (hard split), newline (paragraph-aware) |
| mediaMaxMb | number | 8 | Maximum media file size in megabytes for inbound/outbound attachments |
| ignoreAttachments | boolean | false | Skip downloading inbound media attachments |
| ignoreStories | boolean | false | Ignore Signal story events entirely |
| receiveMode | string | "" | Message receive mode. Options: on-start (fetch on startup), manual |
| configWrites | boolean | true | Allow /config commands to modify channel settings at runtime |
| reactionLevel | string | "ack" | Bot reaction capability. Options: off, ack, minimal, extensive |
Enable or disable the Signal channel
Bot's phone number in E.164 format (e.g., +15551234567). Required
Path to the signal-cli executable
Full URL of an external signal-cli daemon. When set, disables auto-start
Host address for the auto-started signal-cli daemon to bind to
Port for the auto-started signal-cli daemon to bind to
Whether to automatically spawn the signal-cli daemon on Gateway startup
Maximum time (ms) to wait for the signal-cli daemon to become available. Max 120000
Controls who can DM the bot. Options: pairing, allowlist, open, disabled
Phone numbers (E.164) or uuid:<id> identifiers allowed to message the bot
Number of recent DM messages to include as AI context per conversation
Group chat policy. Options: disabled, allowlist, open
Phone numbers or UUIDs allowed to trigger the bot in groups (when groupPolicy is allowlist)
Maximum group messages included as AI context. Set 0 to disable
Whether to forward read receipt signals for approved DM contacts
Maximum characters per outbound message before chunking
Text chunking mode. Options: length (hard split), newline (paragraph-aware)
Maximum media file size in megabytes for inbound/outbound attachments
Skip downloading inbound media attachments
Ignore Signal story events entirely
Message receive mode. Options: on-start (fetch on startup), manual
Allow /config commands to modify channel settings at runtime
Bot reaction capability. Options: off, ack, minimal, extensive
Signal Frequently Asked Questions
Signal Troubleshooting
Java is not installed, or the installed version is too old. signal-cli requires Java 25 or later.
The account field may be incorrect, the signal-cli daemon may not be running, or the sender hasn't been approved via pairing.
The sender may not be in the allowFrom list (when using allowlist policy), or the sender's identifier format may not match.
groupPolicy is set to 'disabled' (default), or the group is not in the allowlist.
The signal-cli daemon is not running, the URL is incorrect, or a firewall is blocking the connection.