← Channels Overview

🔒 OpenClaw + Signal

Maximum privacy — true end-to-end encryption with minimal metadata. Uses signal-cli (Java) as an external daemon. The hardest setup path, but unmatched security guarantees.

Advanced · ~30 minsignal-cli (Java)Highest privacy

🛡️ Why Signal?

AdvantageDetails
True E2E encryptionSignal Protocol — the gold standard. Even Signal's servers can't read your messages.
Minimal metadataSignal collects almost nothing: no contact lists, no message timestamps, no group metadata.
Open-source protocolEvery component is auditable. No trust-me-bro security.
No phone number sharingWith usernames enabled, contacts don't need your phone number to message you.
💡 Privacy ranking: Signal > Matrix > Telegram > WhatsApp > Discord > Slack. If privacy is non-negotiable, Signal is the only choice.

🔄 How it works

OpenClaw doesn't embed Signal directly. Instead, it connects to signal-cli, a separate Java application that implements the Signal Protocol:

┌──────────────┐  HTTP JSON-RPC  ┌─────────────┐  Signal Protocol  ┌─────────┐
│   OpenClaw   │◄──────────────►│  signal-cli  │◄────────────────►│  Signal  │
│   Gateway    │  + SSE events   │  (Java)      │                  │  Servers │
└──────────────┘                 └─────────────┘                   └─────────┘
  • OpenClaw sends commands via JSON-RPC
  • Incoming messages arrive via Server-Sent Events (SSE)
  • signal-cli handles all encryption/decryption locally
  • Your OpenClaw instance operates as a linked device on your Signal account

📋 Prerequisites

  • Java 17+ — signal-cli requires the JVM
  • signal-cli — the Signal Protocol CLI tool
  • A Signal account — either your personal number or a dedicated bot number
  • A phone with Signal — needed to link the device
# Check Java version
java -version
# Should show 17 or higher

# Install Java if needed
# macOS:
brew install openjdk@17

# Ubuntu/Debian:
sudo apt install openjdk-17-jre

📦 Install signal-cli

# Download latest release
# https://github.com/AsamK/signal-cli/releases
# Extract to a directory in your PATH

# macOS (Homebrew):
brew install signal-cli

# Linux (manual):
wget https://github.com/AsamK/signal-cli/releases/download/v0.13.x/signal-cli-0.13.x.tar.gz
tar xf signal-cli-0.13.x.tar.gz
sudo mv signal-cli-0.13.x /opt/signal-cli
sudo ln -s /opt/signal-cli/bin/signal-cli /usr/local/bin/signal-cli

# Verify:
signal-cli --version

⚙️ Configure OpenClaw

// ~/.openclaw/openclaw.json
{
  "channels": {
    "signal": {
      "enabled": true,
      "dmPolicy": "pairing",
      "allowFrom": ["uuid:123e4567-e89b-12d3-a456-426614174000"]
    }
  }
}

Signal uses UUIDs for sender identification (not phone numbers like WhatsApp). After pairing, check the logs for uuid:<id> format.

DM policies (same as all channels)

PolicyBehavior
pairingDefault — unknown senders get a code to approve (expires 1 hour)
allowlistOnly UUIDs in allowFrom can message
open⚠️ Anyone can message

🔄 Run signal-cli as daemon

JVM cold starts are slow (~5-10 seconds). Run signal-cli as a persistent daemon to eliminate startup latency:

# Start signal-cli daemon
signal-cli daemon --http --receive-mode=on-connection

# Point OpenClaw at it
{
  "channels": {
    "signal": {
      "httpUrl": "http://127.0.0.1:8080"
    }
  }
}

This keeps the JVM warm and ready. OpenClaw connects to the HTTP endpoint instead of auto-spawning signal-cli.

✅ For slow systems: Set channels.signal.startupTimeoutMs to a higher value if auto-spawning is too slow on your hardware.

✨ Supported features

FeatureStatusNotes
Text messages✅ FullChunked at 4000 chars by default
Attachments✅ FullImages, files, audio (8MB default cap)
Typing indicators✅ FullRefreshed while agent is replying
Read receipts✅ ConfigurableEnable with sendReadReceipts: true
Reactions✅ FullSend/remove reactions with emoji
Group chats✅ FullIsolated sessions per group
Slash commands✅ Full/status, /model, /reset
Voice notes⚠️ ReceiveTranscribed via STT, but sending voice not supported
Disappearing messages⚠️ RespectedSignal's disappearing timer applies

👥 Group chats

Signal groups get isolated sessions (agent:<agentId>:signal:group:<groupId>):

{
  "channels": {
    "signal": {
      "groupPolicy": "allowlist",
      "groups": {
        "*": {
          "requireMention": true
        }
      }
    }
  }
}

Group reactions require targetAuthor or targetAuthorUuid in addition to the message ID.

🔧 Troubleshooting

ProblemFix
signal-cli not foundEnsure it's in your PATH. Check which signal-cli and Java version.
Slow initial responseJVM cold start. Run signal-cli as a daemon (see above) to keep it warm.
“device not linked”Re-link: signal-cli link --name "OpenClaw" and scan QR from phone.
Messages from self are ignoredThis is loop protection — if the bot uses your personal number, it won't respond to your own messages. Use a dedicated bot number.
UUID not recognizedSignal uses UUIDs, not phone numbers. Check openclaw logs --follow for the uuid:<id> format.
Large messages truncatedSignal has a ~4000 char limit. Set chunkMode: "newline" for paragraph-aware splitting.