ZeroClaw can receive and send messages through any combination of channels. Every channel is configured under theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/openagen/zeroclaw/llms.txt
Use this file to discover all available pages before exploring further.
[channels_config] namespace in ~/.zeroclaw/config.toml. Channels are opt-in — adding a sub-table enables that channel; omitting it leaves it disabled.
Allowlist semantics
All channels enforce a deny-by-default sender policy. The allowlist field name varies by channel, but the rules are the same everywhere:- Empty list (
[]) — deny all inbound messages. Use this for safe default startup. "*"— allow all senders. Use this only for temporary open testing, then tighten to explicit IDs.- Explicit list — allow only the listed sender IDs or identifiers.
Starting channels
- Foreground (single channel)
- Daemon (all channels)
- Background service
Delivery modes at a glance
| Channel | How it receives messages | Public inbound port required? |
|---|---|---|
| CLI | local stdin/stdout | No |
| Telegram | polling | No |
| Discord | gateway/websocket | No |
| Slack | events API | No |
| Mattermost | polling | No |
| Matrix | sync API (supports E2EE) | No |
| Signal | signal-cli HTTP bridge | No |
| WhatsApp Cloud API | webhook (/whatsapp) | Yes |
| WhatsApp Web | websocket | No |
| IMAP polling + SMTP | No | |
| IRC | IRC socket | No |
| Lark / Feishu | websocket or webhook | Webhook mode only |
| DingTalk | stream mode | No |
| bot gateway | No | |
| Nostr | relay websocket (NIP-04 / NIP-17) | No |
| iMessage | local AppleScript bridge | No |
| Webhook | gateway endpoint (/webhook) | Usually yes |
Per-channel setup
CLI
CLI
The CLI channel is enabled by default. It provides the interactive
zeroclaw agent mode and uses local stdin/stdout.Telegram
Telegram
Create a bot with @BotFather
Send
/newbot to @BotFather on Telegram and copy the token it gives you.allowed_users field accepts Telegram usernames (without @) and numeric user IDs. You can also run the bind command directly for any known ID:Discord
Discord
Create a bot in the Discord Developer Portal
Go to the Discord Developer Portal, create an application, add a Bot, enable the Message Content intent, and copy the bot token.
Invite the bot to your server
Use the OAuth2 URL generator with the
bot scope and Send Messages + Read Message History permissions.allowed_users accepts Discord numeric user IDs. Set mention_only = true to require @bot mentions in servers.Slack
Slack
channel_id (or set it to "*") to auto-discover and listen across all accessible channels.Mattermost
Mattermost
Matrix
Matrix
Matrix and Lark require compile-time feature flags (
channel-matrix, channel-lark). Default builds do not include them. Build with cargo build --features channel-matrix to enable Matrix support.allowed_users does not include the sender, the bot is not joined to the configured room, or end-to-end encryption device keys have not been shared to the bot device.Signal
Signal
Signal requires a running signal-cli HTTP bridge:
WhatsApp — Cloud API mode
WhatsApp — Cloud API mode
Cloud API mode uses Meta’s official webhook flow. It requires a public HTTPS callback URL.WhatsApp requires HTTPS, so you need an active tunnel (ngrok, Cloudflare, Tailscale Funnel).
Create a Meta Business App
Go to developers.facebook.com, create a Business app, add the WhatsApp product, and collect your access token and phone number ID.
Start the gateway with a tunnel
WhatsApp — Web mode
WhatsApp — Web mode
Web mode links ZeroClaw to your personal WhatsApp account without a Meta Business API. It requires the Start
whatsapp-web feature flag at build time.zeroclaw daemon and follow the pairing output in the terminal. On your phone, go to Settings → Linked Devices to complete the link. Keep session_path on persistent storage to avoid relinking after restarts.If both Cloud API and Web fields are present in
[channels_config.whatsapp], Cloud API mode takes priority for backward compatibility.Email
IRC
IRC
Lark / Feishu
Lark / Feishu
Both Lark and Feishu share the same connection structure. Use
[channels_config.lark] for Lark and [channels_config.feishu] for Feishu.Lark requires the
channel-lark compile-time feature. Build with cargo build --features channel-lark.DingTalk
DingTalk
QQ
Nostr
Nostr
secrets.encrypt = true (the default).iMessage
iMessage
iMessage uses a local AppleScript bridge and is only available on macOS:
Webhook (gateway endpoint)
Webhook (gateway endpoint)
The webhook channel activates the The gateway also exposes
POST /webhook gateway endpoint:GET /health (always public) and POST /pair for exchanging a one-time pairing code for a bearer token. All /webhook requests require Authorization: Bearer <token>.In-chat runtime commands
When ZeroClaw is running in channel mode, Telegram and Discord support these runtime commands from allowed senders:| Command | Effect |
|---|---|
/models | Show available providers and current selection |
/models <provider> | Switch provider for the current sender session |
/model | Show current model |
/model <model-id> | Switch model for the current sender session |
/new | Clear conversation history and start a fresh session |
Global channel options
Base timeout in seconds for processing a single channel message (LLM turn plus all tool calls). The runtime scales this by up to 4x with tool-loop depth to avoid false timeouts on slow local models. Values below 30 are clamped to 30. For cloud providers (OpenAI, Anthropic), you can reduce this to 60 or lower.
Validation workflow
Configure one channel with an open allowlist
Set
allowed_users = ["*"] (or the equivalent field) for initial testing.