Auth model
signal-cli linked device + local service paths + account identity
Private messaging with stronger trust expectations and more infrastructure ceremony.
Signal for OpenClaw: signal-cli setup, linked-device or dedicated-number decisions, daemon health, DM and group policy, and the recovery posture privacy-focused operators should expect.
Auth model
signal-cli linked device + local service paths + account identity
Safety stance
Treat device linking, number ownership, and state persistence as first-class operational controls.
Verification ritual
Validate send, receive, daemon health, and restart recovery after the linked-device setup is complete.
Rollout mode
35–50 min setup
Signal via signal-cli
Signal runs through `signal-cli` over HTTP JSON-RPC and SSE, with pairing by default and a separate bot number strongly preferred.
Watch the number model
Signal issues often stem from device state, daemon health, or number model confusion rather than the message content path itself.
Signal is the privacy-first lane in OpenClaw, but it asks for more infrastructure honesty than most messaging surfaces. You are not only configuring a channel; you are choosing a number model, a device model, and a daemon model. That is why Signal setups should be documented like operator runbooks, not lightweight “connect your bot” tutorials.
Signal is rarely the fastest channel to stand up. It is often the most intentional.
You choose Signal when you care about:
But you pay for that clarity with extra operational ceremony:
signal-cli must exist and stay healthy,Before OpenClaw matters, you need to know what account model this lane uses.
Typical questions:
If this layer is fuzzy, every other configuration decision becomes fragile.
signal-cli and daemon healthOpenClaw talks to Signal through signal-cli over HTTP JSON-RPC + SSE, so map the resulting knobs to the baseline document in /guides/openclaw-configuration before you tune DM policy.
That means the channel depends on:
signal-cli installation,This is why Signal failures often feel infrastructural rather than “chat platform” specific.
Only after account ownership and daemon health are correct does OpenClaw policy take over:
dmPolicyallowFromgroupPolicygroupAllowFromIf Signal is connected but messages are ignored, this is often the layer that decides whether the silence is intentional or not.
This is the defining Signal choice.
A dedicated number gives you:
It is usually the cleanest production story.
Linked-device mode can be appropriate when you need to keep an existing Signal account model, but it comes with a more delicate maintenance story.
You must document:
If this information is tribal knowledge, the lane is not production-ready.
A strong first Signal posture looks like this:
pairing by default{
channels: {
signal: {
enabled: true,
cliPath: 'signal-cli',
dmPolicy: 'pairing',
},
},
}
Why this works well:
There are two valid setup paths.
This is the lower-friction path if you already operate a Signal identity and want OpenClaw to attach as a device.
Typical flow:
This is often the better long-term production story, but it is a stronger commitment because the number and the runtime become part of the assistant’s operational identity.
Important upstream warning:
Registering a phone-number account with
signal-clican de-authenticate the main Signal app session for that number.
That is why a dedicated bot number is usually the safest production decision.
Signal is not “done” when signal-cli is installed.
You need to know whether the gateway will:
httpUrl.This is the simplest story if the gateway host is stable and you want a single-box deployment, and it should be paired with the restore playbook in /guides/openclaw-backup-and-rollback so keying state can be recovered quickly.
Use external daemon mode when:
signal-cli,Either way, the important thing is not which mode you pick; it is whether the team can explain why that mode exists and how to recover it.
pairingSignal is a strong fit for pairing because the channel often exists precisely for deliberate, trusted conversations.
{
channels: {
signal: {
dmPolicy: 'pairing',
},
},
}
Useful commands:
openclaw pairing list signal
openclaw pairing approve signal <CODE>
This gives you a conservative default without requiring you to pre-load every possible sender, and the decision flow in /troubleshooting/solutions/control-ui-pairing-required shows the operator signals you need around approvals.
allowlist when you already know the participantsIf the lane is strictly for known users, allowlist is more durable than relying only on past pair approvals.
{
channels: {
signal: {
dmPolicy: 'allowlist',
allowFrom: ['+15551234567'],
},
},
}
Signal has no casual username model here, so prefer explicit phone numbers or UUIDs.
Signal groups are not just “DMs with more people.”
They have their own:
groupPolicy,groupAllowFrom,A clean starting rule is:
If group behavior matters to your rollout, write that policy down explicitly instead of assuming DMs and groups should behave the same way.
Signal needs a more serious verification drill than most channels.
Before testing messages, confirm the daemon model is actually healthy.
Useful checks:
openclaw status
openclaw gateway status
openclaw channels status --probe
openclaw logs --follow
If the daemon layer is wrong, message tests are just noise.
If you use pairing, verify the trust story explicitly:
Restart the gateway and verify the lane again:
openclaw gateway restart
If replies disappear after restart, the lane is not operationally ready.
Only after daemon and DM flow are stable:
A lot of Signal pain does not come from syntax errors. It comes from missing operational ownership.
If no one can answer these questions quickly, the lane is still fragile:
That is why Signal documentation needs more runbook energy than most channels.
signal-cli not found or daemon will not startThis is the foundational Signal failure. If the host cannot run or reach signal-cli, the lane never really came up, which is precisely the scenario documented in /troubleshooting/solutions/signal-cli-not-found-or-daemon-wont-start.
Start here:
Signal group IDs are case-sensitive enough that sloppy handling can break targeting.
Start here:
This is often not transport failure. It is usually pairing or allowlist policy doing exactly what you configured it to do.
Check:
openclaw pairing list signal
This often points to group sender gating or group policy assumptions rather than a broken Signal transport layer.
Re-check:
channels.signal.groupPolicychannels.signal.groupAllowFromIf you want the least surprising Signal deployment, use this posture:
| Surface | Recommendation | Why |
|---|---|---|
| Identity | Dedicated bot number if possible | Clean ownership and easier recovery |
| DMs | pairing by default | Conservative and privacy-aligned |
| Groups | Add later and intentionally | Keeps debugging layered and understandable |
| Daemon | Choose local or external on purpose | Avoids invisible host assumptions |
| Recovery | Document relink / migration on day one | Signal pain is usually operational, not cosmetic |
Signal is best when the channel itself is part of the trust story.
That makes it a strong fit for:
A practical mix is often:
That keeps Signal focused on the conversations where its extra ceremony is justified.
Verification & references
References