Signal

Signal

Signal

Reeboot connects to Signal via the bbernhard/signal-cli-rest-api Docker container, which wraps the official Signal CLI in a REST/WebSocket API.

Signal is a Tier 1 channel: messages from external senders are subject to the channel policy layer (owner verification, trust gating).

Prerequisites

  • Docker installed and running
  • A Signal account (existing phone number, or a dedicated SIM/VoIP number)

Setup

Start the container in native mode to get the linking QR code:

docker run -p 8080:8080 \
  -v ~/.reeboot/channels/signal:/home/user/.local/share/signal-cli \
  -e MODE=native \
  bbernhard/signal-cli-rest-api:latest

Open this URL in your browser:

http://localhost:8080/v1/qrcodelink?device_name=reeboot

Scan the QR code in Signal: Settings → Linked Devices → Link New Device.

Stop the container (Ctrl+C) once linking is complete.

docker run -d -p 8080:8080 \
  -v ~/.reeboot/channels/signal:/home/user/.local/share/signal-cli \
  -e MODE=json-rpc \
  --name reeboot-signal \
  bbernhard/signal-cli-rest-api:latest

json-rpc mode uses a persistent WebSocket connection — lower latency and more reliable than polling.

Step 3 — Enable in reeboot config

{
  "channels": {
    "signal": {
      "enabled": true,
      "phoneNumber": "+15551234567",
      "apiPort": 8080
    }
  }
}

Replace +15551234567 with the phone number of the Signal account the container is running on.

Step 4 — Start reeboot

reeboot start

Two Deployment Modes

Mode 1 — Note-to-Self

Leave owner_id empty. The agent responds to messages you send to yourself (note-to-self in Signal).

Mode 2 — Dedicated Account

Set owner_id to your personal phone number. The agent runs on a separate Signal account and responds when you message it.

{
  "channels": {
    "signal": {
      "enabled": true,
      "phoneNumber": "+15559876543",
      "apiPort": 8080,
      "owner_id": "+15551234567",
      "owner_only": true
    }
  }
}

Configuration Reference

FieldTypeDefaultDescription
channels.signal.enabledbooleanfalseEnable the Signal channel
channels.signal.phoneNumberstring""Phone number of the Signal account running in the container
channels.signal.apiPortnumber8080Port the signal-cli-rest-api container is listening on
channels.signal.pollIntervalnumber1000Polling interval in ms (used in polling mode; json-rpc mode uses WebSocket)
channels.signal.owner_idstring""Your personal phone number. Empty = Mode 1 (note-to-self). Non-empty = Mode 2 (dedicated account)
channels.signal.owner_onlybooleantrueWhen true, only the owner’s messages are processed
channels.signal.truststring"owner"Trust level: "owner" or "end-user"
channels.signal.trusted_sendersstring[][]Additional phone numbers whose messages bypass owner_only gating

→ See Trust and Access for a full explanation of trust levels and access control.