# Signal Moltis can receive and send Signal messages through an external [`signal-cli`](https://github.com/AsamK/signal-cli) daemon. The Moltis process talks to the daemon over local HTTP JSON-RPC for outbound messages and Server Sent Events for inbound messages. ## How It Works ``` Signal Network │ ▼ signal-cli daemon ── HTTP JSON-RPC + SSE ── moltis-signal │ │ └──────── linked Signal account ──────┴── Moltis Gateway ``` Moltis does not embed libsignal directly. The Signal account, device link, and Signal protocol state stay inside signal-cli, which keeps the Moltis integration smaller and avoids coupling releases to Signal's native protocol internals. ## Prerequisites Install and configure signal-cli first: ```bash signal-cli -u +15551234567 register signal-cli -u +15551234567 verify 123456 signal-cli --account +15551234567 daemon --http 127.0.0.1:8080 ``` You can also use signal-cli's linked-device flow instead of registering a new number. Keep the HTTP daemon reachable only from trusted local services. ## Configuration Add a `[channels.signal.]` section to `moltis.toml`: ```toml [channels.signal.personal] account = "+15551234567" http_url = "http://127.0.0.1:8080" dm_policy = "allowlist" allowlist = ["+15557654321", "550e8400-e29b-41d4-a716-446655440000"] group_policy = "disabled" mention_mode = "mention" otp_self_approval = true otp_cooldown_secs = 300 text_chunk_limit = 4000 ``` Make sure `"signal"` is included in `channels.offered` if you customize that list. It is included by default. ## Fields | Field | Required | Default | Description | |-------|----------|---------|-------------| | `account` | no | account ID | Signal account loaded in signal-cli, usually an E.164 phone number | | `account_uuid` | no | not set | Optional Signal account UUID for allowlist matching | | `http_url` | no | `http://127.0.0.1:8080` | signal-cli daemon HTTP URL | | `dm_policy` | no | `allowlist` | `open`, `allowlist`, or `disabled` | | `allowlist` | no | `[]` | Allowed sender phone numbers, UUIDs, or normalized identifiers | | `group_policy` | no | `disabled` | `open`, `allowlist`, or `disabled` | | `group_allowlist` | no | `[]` | Allowed Signal group IDs | | `mention_mode` | no | `mention` | `mention`, `always`, or `none` | | `ignore_stories` | no | `true` | Ignore story events from signal-cli | | `otp_self_approval` | no | `true` | Let unknown DM senders self-approve with a PIN challenge | | `otp_cooldown_secs` | no | `300` | Cooldown after 3 failed OTP attempts | | `text_chunk_limit` | no | `4000` | Maximum UTF-8 bytes per outbound text chunk | ## Current Limits Signal support currently handles text DMs and group text messages. Outbound media uses the text fallback, and inbound attachments are surfaced as an attachment placeholder until attachment ingestion is added.