Channels
How to Connect OpenClaw to Signal
Browse more in Channels.
All channels guides →This guide walks you through connecting OpenClaw to Signal using the official signal-cli integration. You’ll set up a dedicated Signal bot number or link an existing account, wire it into the OpenClaw gateway, and lock down who can DM or use groups.
By the end, your OpenClaw agent will send and receive Signal messages reliably from your server.
Prerequisites
- ✓OpenClaw installed on your server (Linux flow below tested on Ubuntu 24).
- ✓`signal-cli` available on the host where the gateway runs.
- ✓A phone number that can receive one verification SMS (for SMS registration path).
- ✓Browser access for Signal captcha (`signalcaptchas.org`) during registration.
Steps
- 1
Decide whether to link an existing Signal account or register a bot number
Before you touch config, decide if this OpenClaw instance should run on a separate bot number or your existing Signal account. The gateway connects to a Signal device (the signal-cli account), and if you run it on your personal account it ignores your own messages for loop protection, so use a dedicated bot number if you want to text the bot directly.
text* Use a **separate Signal number** for the bot (recommended). * **Path A (QR link):**`signal-cli link -n "OpenClaw"` and scan with Signal. * **Path B (SMS register):** register a dedicated number with captcha + SMS verification. - 2
Install signal-cli on the OpenClaw host
Install signal-cli on the same host where the OpenClaw gateway runs so it can talk to Signal over HTTP JSON-RPC and SSE. The native Linux build avoids JVM cold starts, but if you use the JVM tarball you must install JRE 25+ first and keep signal-cli updated because old releases can break when Signal changes server APIs.
bashVERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\/v//') curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz" sudo tar xf "signal-cli-${VERSION}-Linux-native.tar.gz" -C /opt sudo ln -sf /opt/signal-cli /usr/local/bin/ signal-cli --version - 3
Link an existing Signal account with QR (Path A)
If you want to reuse an existing Signal account, link it as a new device via signal-cli. 164 account number in OpenClaw so replies route correctly.
bashsignal-cli link -n "OpenClaw" - 4
Register a dedicated Signal bot number with SMS (Path B)
For a clean bot identity, register a dedicated phone number with signal-cli using SMS (and captcha if required). Be aware that registering a number with signal-cli can de-authenticate the main Signal app for that number, so prefer a fresh bot number; run the captcha and verification commands from the same external IP and quickly, because captcha tokens expire.
bashsignal-cli -a +<BOT_PHONE_NUMBER> register signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>' signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE> - 5
Configure the Signal channel in OpenClaw
Wire Signal into OpenClaw by adding a signal channel block to your gateway configuration. 164 format, point cliPath at the signal-cli binary, and use dmPolicy "pairing" plus an allowFrom list so only approved numbers can DM the agent until you explicitly open it up.
json{ channels: { signal: { enabled: true, account: "+15551234567", cliPath: "signal-cli", dmPolicy: "pairing", allowFrom: ["+15557654321"], }, }, } - 6
Restart the OpenClaw gateway and verify the Signal channel
After editing the config, restart the gateway so it picks up the Signal settings, then run the built-in diagnostics. The doctor and channels status probe confirm that the gateway can reach signal-cli and that the Signal channel is healthy before you start pairing users.
bash# If you run the gateway as a user systemd service: systemctl --user restart openclaw-gateway.service # Then verify: openclaw doctor openclaw channels status --probe - 7
Pair your Signal DM sender with the bot
With the channel live, you need to pair each DM sender so OpenClaw accepts their messages under the default pairing policy. Send a first DM to the bot number, then approve the pairing code on the server; this prevents random numbers from driving your agent while still making it easy to onboard trusted contacts.
bashopenclaw pairing approve signal <PAIRING_CODE> - 8
Optionally run signal-cli as an external daemon
If you prefer to manage signal-cli yourself (for example in its own service or container), run it as a daemon and point OpenClaw at the HTTP endpoint. Setting httpUrl and autoStart false tells OpenClaw to skip auto-spawning signal-cli and rely on your external process instead.
json{ channels: { signal: { httpUrl: "http://127.0.0.1:8080", autoStart: false, }, }, }
Configuration
| Option | Description | Example |
|---|---|---|
| channels.signal.enabled | Turns the Signal channel on or off during gateway startup. | |
| channels.signal.account | The Signal bot phone number in E.164 format that signal-cli uses for this device. | +15551234567 |
| channels.signal.cliPath | Path to the signal-cli binary when OpenClaw auto-spawns the daemon. | signal-cli |
| channels.signal.httpUrl | Full URL of an externally managed signal-cli daemon; overrides host and port. | http://127.0.0.1:8080 |
| channels.signal.autoStart | Controls whether OpenClaw auto-starts the signal-cli daemon when httpUrl is not set. | |
| channels.signal.startupTimeoutMs | Maximum time in milliseconds OpenClaw waits for signal-cli to become ready on startup. | |
| channels.signal.receiveMode | Controls when the Signal channel starts receiving messages, either on-start or manual. | on-start |
| channels.signal.dmPolicy | Defines who can DM the bot on Signal, with pairing as the recommended default. | pairing |
| channels.signal.allowFrom | Allowlist of phone numbers or UUIDs that can DM the bot when dmPolicy is allowlist or open. | |
| channels.signal.groupPolicy | Controls whether the bot responds in groups freely, by allowlist, or not at all. | allowlist |
| channels.signal.groupAllowFrom | Allowlist of group senders who can trigger the bot when groupPolicy is allowlist. | |
| channels.signal.groups | Per-group overrides keyed by Signal group id (or "*") to control mentions and tools. | |
| channels.signal.historyLimit | Maximum number of group messages to include as context for Signal group chats. | |
| channels.signal.dmHistoryLimit | Number of DM turns to keep in context per Signal user. | |
| channels.signal.textChunkLimit | Maximum size in characters for each outbound Signal message chunk. | |
| channels.signal.chunkMode | Whether to chunk outbound text by length only or split on blank lines first. | newline |
| channels.signal.mediaMaxMb | Maximum size in megabytes for inbound and outbound Signal media. | |
| channels.signal.ignoreAttachments | Skips downloading Signal attachments when set, so only text is processed. | |
| channels.signal.ignoreStories | Ignores Signal stories from the daemon when enabled. | |
| channels.signal.sendReadReceipts | Forwards read receipts for allowed Signal DMs when true. | |
| channels.signal.configWrites | Controls whether Signal messages can write config updates via /config commands. | |
| channels.signal.actions.reactions | Enables or disables reaction actions for Signal messages. | |
| channels.signal.reactionLevel | Sets how aggressively the agent uses reactions on Signal messages. | minimal |
Troubleshooting
Signal channel appears configured but the bot never replies to DMs or groups.
First run the built-in diagnostics to confirm the gateway and channel are healthy, then check that the Signal daemon is reachable and that the account/httpUrl settings match your signal-cli instance. If the daemon is up but misconfigured, OpenClaw can connect but never route replies correctly.
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probeDMs to the bot are ignored even though Signal is enabled.
dmPolicy is "pairing", so unknown senders are pending until you approve them. List pending pairings and approve the relevant code so OpenClaw starts accepting messages from that number or UUID.
openclaw pairing list signalGroup messages are ignored while the Signal channel works for DMs.
signal is missing entirely runtime falls back to groupPolicy="allowlist". Make sure your groupPolicy and groupAllowFrom (or per-group overrides) actually allow the sender and group you are testing.
After editing the Signal config, OpenClaw reports validation errors or refuses to start.
Config validation catches malformed or inconsistent Signal settings. Run the doctor with --fix to have OpenClaw point out and optionally repair common issues in your configuration file.
openclaw doctor --fixSignal does not show up in diagnostics and no Signal logs appear.
enabled is false or the block is absent. Enable the channel in config, restart the gateway, and then re-run the diagnostics and log checks to confirm it starts.
openclaw doctor
openclaw channels status --probe
pgrep -af signal-cli
grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20Frequently asked questions
Powered by Mem0
Add persistent memory to OpenClaw
Official Mem0 plugin for OpenClaw keeps context across chats and tools. Smaller prompts, lower cost, better continuity for your agents.