Channels
v1 status: hand-written from
src/channels/mod.rsand per-channel module sources. Will be generated by introspecting the channel registry in a later iteration. The canonical reference in the upstream repo isdocs/channels-reference.md.
Built-in channels
Slugs below match [channels.<slug>] blocks in config.toml exactly.
| Slug | Status | Cargo feature | Transport |
|---|---|---|---|
dingtalk | Always-on | (default) | WebSocket |
discord | Always-on | (default) | WebSocket gateway |
email | Always-on | (default) | IMAP + SMTP |
imessage | Always-on | (default) | macOS bridge (when present) |
irc | Always-on | (default) | IRC protocol |
linq | Always-on | (default) | HTTP webhook + signed |
mattermost | Always-on | (default) | WebSocket |
nextcloud_talk | Always-on | (default) | HTTP webhook + HMAC |
qq | Always-on | (default) | (per-deployment) |
signal | Always-on | (default) | signal-cli REST |
slack | Always-on | (default) | Socket Mode / Web API |
telegram | Always-on | (default) | Long-poll API |
webhook | Always-on | (default) | Inbound HTTP webhook (signed) |
whatsapp | Always-on (Cloud API) | (default) | Cloud API |
whatsapp_web | Feature-gated | whatsapp-web | Multi-device protocol via wa-rs |
lark | Feature-gated | channel-lark | WebSocket |
matrix | Feature-gated | channel-matrix | Matrix SDK with E2EE |
cliandqr_terminalare internal modules (REPL stdin/stdout and pairing UI) and are not configurable channel slugs — they have no[channels.cli]/[channels.qr_terminal]block.
There is no separate whatsapp-cloud slug — Cloud API is just whatsapp. The Web variant requires the whatsapp-web Cargo feature.
Allowlist key names
Each channel has its own [channels.<slug>] block with channel-specific keys. The allowlist key name varies:
| Channel | Allowlist key | Default behavior on empty |
|---|---|---|
telegram | allowed_users | Offline (deny-all) |
discord | allowed_users | Offline |
slack | allowed_users | Offline |
mattermost | allowed_users | Offline |
matrix | allowed_users | Offline |
irc | allowed_users | Offline |
dingtalk | allowed_users | Offline |
lark | allowed_users | Offline |
qq | allowed_users | Offline |
nextcloud_talk | allowed_users | Offline |
imessage | allowed_contacts | Offline |
signal | allowed_from | Offline |
whatsapp, whatsapp_web | allowed_numbers | Offline |
email | allowed_senders | Allow-all (exception) |
linq | allowed_senders | (per-deployment) |
Most allowlists support a wildcard entry "*" to allow-all explicitly. Email’s allowed_senders accepts both full addresses ([email protected]) and domain prefixes (@example.com).
Common config keys (per channel)
| Key | Description |
|---|---|
bot_token / app_token | Channel-specific auth credential (encrypted as enc2:<hex>) |
allowed_* | Allowlist (see above) |
enabled | Toggle the channel without deleting its config |
For complete per-channel schemas (transport-specific keys, app secrets, signing tokens), see the upstream docs/channels-reference.md until this site has its generated reference.
Notable channel-specific behavior
- Telegram supports runtime allowlist mutation —
add_allowed_identity_runtimelets the agent add an allowed user without restart. No other channel currently supports this. - Email is the only channel that allows-all on empty allowlist. Set explicit
allowed_sendersto restrict. - Discord and Slack support the channel-trait draft-update API — the agent can edit a sent message in place. Useful for streaming responses incrementally.
- WhatsApp Cloud (
whatsapp) uses Meta’sX-Hub-Signature-256HMAC verification on incoming webhooks (whenapp_secretis set). - Matrix requires the
channel-matrixfeature at build time and usesmatrix-sdkfor E2EE. - WhatsApp Web (
whatsapp_web) requires thewhatsapp-webfeature; useswa-rswith a custom rusqlite storage backend.
Channel restart behavior
Channels are supervised by the daemon with backoff:
[reliability]
channel_initial_backoff_secs = 2
channel_max_backoff_secs = 60A channel that fails to connect retries with exponential backoff up to the cap. Other channels are unaffected.