Skip to Content
ReferenceChannels

Channels

v1 status: hand-written from src/channels/mod.rs and per-channel module sources. Will be generated by introspecting the channel registry in a later iteration. The canonical reference in the upstream repo is docs/channels-reference.md.

Built-in channels

Slugs below match [channels.<slug>] blocks in config.toml exactly.

SlugStatusCargo featureTransport
dingtalkAlways-on(default)WebSocket
discordAlways-on(default)WebSocket gateway
emailAlways-on(default)IMAP + SMTP
imessageAlways-on(default)macOS bridge (when present)
ircAlways-on(default)IRC protocol
linqAlways-on(default)HTTP webhook + signed
mattermostAlways-on(default)WebSocket
nextcloud_talkAlways-on(default)HTTP webhook + HMAC
qqAlways-on(default)(per-deployment)
signalAlways-on(default)signal-cli REST
slackAlways-on(default)Socket Mode / Web API
telegramAlways-on(default)Long-poll API
webhookAlways-on(default)Inbound HTTP webhook (signed)
whatsappAlways-on (Cloud API)(default)Cloud API
whatsapp_webFeature-gatedwhatsapp-webMulti-device protocol via wa-rs
larkFeature-gatedchannel-larkWebSocket
matrixFeature-gatedchannel-matrixMatrix SDK with E2EE

cli and qr_terminal are 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:

ChannelAllowlist keyDefault behavior on empty
telegramallowed_usersOffline (deny-all)
discordallowed_usersOffline
slackallowed_usersOffline
mattermostallowed_usersOffline
matrixallowed_usersOffline
ircallowed_usersOffline
dingtalkallowed_usersOffline
larkallowed_usersOffline
qqallowed_usersOffline
nextcloud_talkallowed_usersOffline
imessageallowed_contactsOffline
signalallowed_fromOffline
whatsapp, whatsapp_weballowed_numbersOffline
emailallowed_sendersAllow-all (exception)
linqallowed_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)

KeyDescription
bot_token / app_tokenChannel-specific auth credential (encrypted as enc2:<hex>)
allowed_*Allowlist (see above)
enabledToggle 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_runtime lets 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_senders to 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’s X-Hub-Signature-256 HMAC verification on incoming webhooks (when app_secret is set).
  • Matrix requires the channel-matrix feature at build time and uses matrix-sdk for E2EE.
  • WhatsApp Web (whatsapp_web) requires the whatsapp-web feature; uses wa-rs with 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 = 60

A channel that fails to connect retries with exponential backoff up to the cap. Other channels are unaffected.

Last updated on