Channels connect NullClaw to messaging platforms. Each channel implements theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/nullclaw/nullclaw/llms.txt
Use this file to discover all available pages before exploring further.
Channel interface using vtable-based polymorphism for runtime dispatch.
Supported Channels
NullClaw supports 18+ messaging platforms:- CLI — Built-in stdin/stdout interface
- Telegram — Long-polling bot API
- Discord — WebSocket gateway
- Slack — Socket mode + HTTP events
- WhatsApp — Webhook-based integration
- Matrix — Long-polling /sync API
- Mattermost — WebSocket + REST API
- IRC — TLS socket connection
- iMessage — AppleScript + SQLite (macOS only)
- Email — IMAP/SMTP protocols
- Lark/Feishu — HTTP callback
- DingTalk — WebSocket stream mode
- Signal — signal-cli JSON-RPC + SSE
- Nostr — Decentralized relay protocol
- LINE — Messaging API
- OneBot — QQ bot protocol
- QQ — Native QQ integration
- MaiXCam — Hardware device messaging
- Web — HTTP/WebSocket gateway
Channel Interface
All channels implement theChannel vtable interface defined in src/channels/root.zig:
VTable Methods
Start the channel (connect, begin listening for messages)
Stop the channel (disconnect, clean up resources)
Send a message to a target (user, channel, room, etc.)
Return the channel name (e.g., “telegram”, “discord”)
Health check — return true if the channel is operational
Optional staged outbound event delivery (chunk/final). If null, runtime falls back to
send() for .final and ignores .chunkStart processing indicator for a recipient (e.g., typing status)
Stop processing indicator for a recipient
Channel Messages
Channels emit and receiveChannelMessage structs:
Configuration Pattern
Channels are configured using theaccounts pattern in config.json:
Permission Policies
Channels support fine-grained permission policies:DM Policy
Direct message permission policy:
allow— Allow all DMsdeny— Deny all DMsallowlist— Only allow DMs from senders in the allowlist
Group Policy
Group/channel message permission policy:
open— Allow all group messagesmention_only— Only respond when explicitly mentionedallowlist— Only allow messages from senders in the allowlist
Allowlist
List of allowed sender identifiers. Supports
"*" wildcard for allow-all. Case-insensitive matching.Message Splitting
Channels automatically split long messages at platform limits while respecting UTF-8 character boundaries:- Telegram: 4096 bytes
- Discord: 2000 bytes
- IRC: 512 bytes (minus prefix overhead)
Next Steps
Telegram
Long-polling bot with media support
Discord
WebSocket gateway integration
Slack
Socket mode and HTTP events
Signal
Private messaging via signal-cli
Nostr
Decentralized protocol support
IRC
Classic IRC protocol