OpenClaw Signal Integration: Private AI Agent Messaging
Signal is the gold standard for private messaging. End-to-end encrypted, no metadata harvesting, open protocol. If you're building an AI agent that needs to be reachable over a secure, private channel — one that isn't logged by a corporation and doesn't expose your messages to third-party servers — Signal is the right answer.
OpenClaw has native Signal support via signal-cli, an open-source Java/native CLI that speaks the Signal protocol directly. Once configured, your AI agent can receive DMs, participate in group chats, send reactions, handle file attachments, and reply — all over Signal's encrypted channel.
This guide covers everything: installation, registration, access control, group policies, and production configuration. By the end, you'll have an AI agent reachable on Signal that only talks to people you explicitly authorize.
Why Signal for AI Agent Messaging?
Most people set up their OpenClaw agent on Slack, Discord, or Telegram. Those platforms work great. But there are real use cases where Signal makes more sense:
- Privacy-sensitive workflows. Legal, medical, financial, or personal data you don't want sitting on Slack servers.
- Team comms without a company Slack. Small teams or contractors who already use Signal personally.
- Offline-first personal agents. You want your AI reachable from your personal phone without installing yet another app.
- Security-conscious operators. If you're running an agent that touches sensitive infrastructure, you want the messaging layer to be as locked down as possible.
Signal's end-to-end encryption means only your device and the recipient's device can read the messages. OpenClaw processes them on your own hardware — nothing hits a cloud intermediary.
How It Works Under the Hood
OpenClaw's Signal integration is built on signal-cli — an external CLI tool that implements the Signal protocol. OpenClaw auto-spawns signal-cli as a daemon and communicates with it over HTTP JSON-RPC + SSE (Server-Sent Events).
The flow looks like this:
- A message arrives on Signal (DM or group).
signal-clireceives it and pushes it to OpenClaw via SSE.- OpenClaw normalizes it into a standard channel envelope.
- Your agent processes it and generates a reply.
- OpenClaw sends the reply back through
signal-clito Signal.
This is deterministic: replies always route back to the originating number or group. The bot's identity is a Signal phone number, and all messages are encrypted end-to-end just like regular Signal messages.
Prerequisites
Before you start, you need:
- OpenClaw installed and running (gateway up).
signal-cliinstalled on the same host as the gateway.- A phone number for the bot (E.164 format, e.g.
+15551234567). A dedicated bot number is strongly recommended — don't use your personal number. - Java (JRE 25+) if you use the JVM build of
signal-cli. The native build skips this requirement.
The native Linux build is the easiest path. Here's how to install it:
VERSION=$(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 Verify it's working:
signal-cli --version Keep signal-cli updated. The Signal server APIs can change, and old signal-cli releases can break without warning when upstream updates their protocol.
Two Setup Paths: Register vs. Link
There are two ways to get your bot account onto Signal:
Path A: QR Link (Recommended for Most)
This links a secondary device to an existing Signal account. Easiest if you already have a Signal number you want to use as your bot identity (or a spare phone/SIM):
# Link using QR code (simpler — uses existing Signal account)
signal-cli link -n "OpenClaw"
# Scan the QR in your Signal app Scan the QR code in your Signal mobile app (Settings → Linked Devices → Link New Device). Done. Your bot account is now linked and signal-cli can send and receive on its behalf.
Path B: SMS Registration (Dedicated Bot Number)
Use this when you want a fresh, dedicated bot number — no existing Signal app attached:
# Register your bot number
signal-cli -a +15551234567 register
# If captcha is required:
signal-cli -a +15551234567 register --captcha 'signalcaptcha://...'
# Verify with SMS code
signal-cli -a +15551234567 verify 123456 A few things to know about Path B:
- Signal may require a captcha during registration. Open
https://signalcaptchas.org/registration/generate.html, complete it, copy thesignalcaptcha://...link from the "Open Signal" button, and pass it via--captcha. - Run registration from the same external IP as your browser session when using captcha — token validation is IP-tied.
- Captcha tokens expire quickly. Copy and run the command immediately after completing the captcha.
- Registering a number with
signal-cliwill de-authenticate the Signal mobile app for that number. Use a dedicated bot SIM to avoid conflicts.
Minimal OpenClaw Config
Once signal-cli is set up and your bot account is registered or linked, configure OpenClaw:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
} Key fields:
account: your bot number in E.164 format.cliPath: path tosignal-cli. Use"signal-cli"if it's on yourPATH.dmPolicy: set to"pairing"— unknown senders get a one-time code they must provide before the agent responds. This keeps your bot private.allowFrom: phone numbers or UUIDs that are pre-approved to DM without pairing.
Restart the gateway after editing config:
systemctl --user restart openclaw-gateway
# Confirm it's running
openclaw status
openclaw channels status --probe Access Control and Pairing
The default dmPolicy: "pairing" is Signal's recommended access model for private bots. Here's how it works:
- Unknown sender messages the bot number.
- The bot sends back a pairing code (valid for 1 hour).
- You approve the code on the server side.
- That sender is now in
allowFromand can message freely.
# List pending pairing requests
openclaw pairing list signal
# Approve a sender
openclaw pairing approve signal <PAIRING_CODE> UUID-based senders (identified by sourceUuid) are stored as uuid:<id> in your allowFrom list. You can also pre-populate allowFrom with phone numbers for senders you know in advance — they skip the pairing step entirely.
Group Chat Access
For Signal groups, the defaults are conservative: groupPolicy: "allowlist" requires senders to be on your groupAllowFrom list. You can also configure per-group overrides with requireMention (so the bot only responds when explicitly tagged) and per-sender tool restrictions.
Production Config
Here's a fuller config for a production-ready Signal agent:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "allowlist",
allowFrom: [
"+15557654321",
"uuid:123e4567-e89b-12d3-a456-426614174000"
],
groupPolicy: "allowlist",
groupAllowFrom: ["+15557654321"],
sendReadReceipts: true,
textChunkLimit: 4000,
},
},
} What's added here:
allowFromwith both a phone number and a UUID — both formats work.groupPolicy: "allowlist"— only approved senders can trigger the bot in groups.sendReadReceipts: true— the bot marks messages as read when it processes them.textChunkLimit: 4000— long replies are chunked at 4000 characters (Signal's practical limit).
External Daemon Mode
By default, OpenClaw auto-spawns signal-cli as a daemon. If you prefer to manage it yourself (useful for containerized setups, slow startup JVM builds, or shared hosting), run the daemon separately and point OpenClaw at it:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false,
},
},
} With autoStart: false, OpenClaw skips spawning and connects directly to the running daemon at the specified URL. This gives you full control over the daemon lifecycle.
Reactions and Typing Indicators
OpenClaw's Signal integration supports the message features you'd expect from a real agent:
- Typing indicators: The bot sends typing signals while processing a reply, so you know it's working. These refresh automatically for long replies.
- Read receipts: When
sendReadReceipts: true, the bot marks your messages as read when it processes them. - Reactions: You can react to Signal messages from the agent using the
messagetool withaction=react. Targets can be E.164 phone numbers, UUIDs, or group IDs. - Attachments: Inbound media is supported (images, files) up to
mediaMaxMb(default 8 MB).
The Number Model — One Important Detail
This is where people get tripped up: the bot needs a separate Signal number from your personal one. Here's why:
OpenClaw ignores messages that come from the same account it's running as (loop protection). If you configure the bot to use your personal Signal number, it will receive your messages but ignore them all. The fix is simple: use a dedicated bot number — a cheap SIM, a Google Voice number, or any number that can receive an SMS verification.
Once the bot is on its own number, save it as a contact on your phone. Signal shows "Unknown contact" for numbers not in your contacts, and that's confusing when the bot replies.
Troubleshooting
If the Signal channel isn't working, run this diagnostic ladder:
# Diagnose any issues
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
# Check pairing state
openclaw pairing list signal Common issues:
- No replies to DMs: Sender is pending pairing approval. Run
openclaw pairing list signaland approve. - Group messages ignored: Check
groupPolicyandgroupAllowFrom. Default policy is allowlist-only. - Daemon not starting: Check
signal-cliis on PATH and account is properly registered/linked. - Config validation errors: Run
openclaw doctor --fix. - Signal missing from diagnostics: Confirm
channels.signal.enabled: truein config.
For log-level debugging:
grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20 Signal vs. Other Channels
How does Signal compare to the other channels OpenClaw supports?
- vs. Telegram: Both are well-supported. Telegram is easier to set up (no CLI dependency), but Signal has stronger privacy guarantees. Telegram bots have public usernames; Signal bots are reachable only by phone number.
- vs. Slack/Discord: Those platforms are better for team workflows with multiple agents, threads, and channels. Signal is better for private, encrypted personal access to your agent.
- vs. WhatsApp: Both use phone numbers, but Signal's open protocol and
signal-climake the integration more reliable and fully self-hosted. WhatsApp's API is business-tier only. - vs. iMessage: Similar private-messaging use case. iMessage is Mac/Apple-only; Signal works cross-platform.
Signal is the right choice when privacy is non-negotiable. For everything else, Telegram or Slack is usually more practical.
Multi-Account Setup
If you need multiple Signal bot numbers (different agents, different contexts), OpenClaw supports channels.signal.accounts with per-account config:
{
channels: {
signal: {
accounts: {
personal: {
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
},
team: {
account: "+15559876543",
cliPath: "signal-cli",
dmPolicy: "allowlist",
allowFrom: ["+15557654321"],
},
},
},
},
} Each account gets its own daemon instance and pairing state. Messages route to the correct account based on which number received them.
Security Considerations
A few things worth keeping in mind for production deployments:
signal-clistores account keys locally at~/.local/share/signal-cli/data/. Back this up before server migrations or rebuilds — you'll need it to recover the account.- Keep
dmPolicy: "pairing"unless you have a specific reason to open access. It's the only mechanism that controls who can reach your agent via Signal. - SMS verification is only needed for initial registration. Losing control of the bot number can complicate re-registration — keep a record of the SIM or number provider.
- The agent processes messages on your hardware. End-to-end encryption covers the transport layer; your own server security covers the rest.
Putting It Together
Signal is OpenClaw's most privacy-preserving channel option. It takes a bit more setup than Telegram or Slack — you need signal-cli installed and a dedicated bot number — but once it's running, you have an AI agent reachable over end-to-end encrypted messaging that only responds to people you authorize.
The pairing system handles access control cleanly. The daemon mode gives you flexibility for containerized or shared deployments. And the full feature set — typing indicators, read receipts, reactions, attachments — makes it feel like a real Signal contact, not a bot.
If you're already running OpenClaw and want to add a private, encrypted access point, Signal is the move.
Want the complete guide? Get The OpenClaw Playbook — $9.99