Channels

How to Connect OpenClaw to Signal

5 min read

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.

Setup flow

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. 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. 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.

    bash
    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
  3. 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.

    bash
    signal-cli link -n "OpenClaw"
  4. 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.

    bash
    signal-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. 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. 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. 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.

    bash
    openclaw pairing approve signal <PAIRING_CODE>
  8. 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

OptionDescriptionExample
channels.signal.enabledTurns the Signal channel on or off during gateway startup.
channels.signal.accountThe Signal bot phone number in E.164 format that signal-cli uses for this device.+15551234567
channels.signal.cliPathPath to the signal-cli binary when OpenClaw auto-spawns the daemon.signal-cli
channels.signal.httpUrlFull URL of an externally managed signal-cli daemon; overrides host and port.http://127.0.0.1:8080
channels.signal.autoStartControls whether OpenClaw auto-starts the signal-cli daemon when httpUrl is not set.
channels.signal.startupTimeoutMsMaximum time in milliseconds OpenClaw waits for signal-cli to become ready on startup.
channels.signal.receiveModeControls when the Signal channel starts receiving messages, either on-start or manual.on-start
channels.signal.dmPolicyDefines who can DM the bot on Signal, with pairing as the recommended default.pairing
channels.signal.allowFromAllowlist of phone numbers or UUIDs that can DM the bot when dmPolicy is allowlist or open.
channels.signal.groupPolicyControls whether the bot responds in groups freely, by allowlist, or not at all.allowlist
channels.signal.groupAllowFromAllowlist of group senders who can trigger the bot when groupPolicy is allowlist.
channels.signal.groupsPer-group overrides keyed by Signal group id (or "*") to control mentions and tools.
channels.signal.historyLimitMaximum number of group messages to include as context for Signal group chats.
channels.signal.dmHistoryLimitNumber of DM turns to keep in context per Signal user.
channels.signal.textChunkLimitMaximum size in characters for each outbound Signal message chunk.
channels.signal.chunkModeWhether to chunk outbound text by length only or split on blank lines first.newline
channels.signal.mediaMaxMbMaximum size in megabytes for inbound and outbound Signal media.
channels.signal.ignoreAttachmentsSkips downloading Signal attachments when set, so only text is processed.
channels.signal.ignoreStoriesIgnores Signal stories from the daemon when enabled.
channels.signal.sendReadReceiptsForwards read receipts for allowed Signal DMs when true.
channels.signal.configWritesControls whether Signal messages can write config updates via /config commands.
channels.signal.actions.reactionsEnables or disables reaction actions for Signal messages.
channels.signal.reactionLevelSets 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.

bash
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe

DMs 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.

bash
openclaw pairing list signal

Group 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.

bash
openclaw doctor --fix

Signal 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.

bash
openclaw doctor
openclaw channels status --probe
pgrep -af signal-cli
grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20

Frequently 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.

More in Channels