Signal

Same tools, same access model. No bot API, so the plumbing is different.

Signal runs as a provider next to Telegram and Discord, or on its own. There is no bot API: hotline talks to a locally running signal-cli daemon, linked to your Signal account as a secondary device.

signal-cli is a third-party client, not an official Signal product. This is the part an official hosted product structurally can't ship, and the reason hotline covers Signal at all.

Setup

  1. Install signal-cli. On macOS: brew install signal-cli. On Linux, download a release from github.com/AsamK/signal-cli/releases (it is not in apt) and put signal-cli on your PATH. Java 17+ required.

  2. Link it to your account as a secondary device:

    signal-cli link -n hotline

    It prints a sgnl://linkdevice?... URI. Render it as a QR code (qrencode -t ansiutf8 'sgnl://...') and scan it from your phone under Settings → Linked Devices. Registration stays on your phone; hotline never touches it.

  3. Run the daemon and keep it running (tmux, or a systemd user service with ExecStart=signal-cli -a +15551234567 daemon --http 127.0.0.1:8080):

    signal-cli -a +15551234567 daemon --http 127.0.0.1:8080
  4. Point hotline at it in the shared .env:

    # ~/.claude/channels/tele-go/.env
    SIGNAL_ACCOUNT=+15551234567           # the linked account, E.164
    SIGNAL_DAEMON_URL=http://127.0.0.1:8080   # optional, this is the default
    SIGNAL_ACCOUNT_WORK=…                 # signal:work, if you run named instances
  5. Enable the provider and run:

    HOTLINE_PROVIDERS=telegram,discord,signal hotline

    In a Claude Code setup, HOTLINE_PROVIDERS belongs in the env block of your .mcp.json; see Multiple providers.

  6. Message the account from another Signal account. Unknown senders get a pairing code; approve it from your terminal:

    hotline pair <code> --provider signal

--provider signal points pair/deny/status at the Signal state (<stateDir>/signal/); named instances use --provider signal:work with state under <stateDir>/signal/instances/work/.

Behavior notes

next: Discord →