Documentation 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.
Overview
Channels are NullClaw’s abstraction layer for messaging platforms. Every channel implements theChannel vtable interface, enabling runtime-swappable transport backends.
Channel Interface
Supported Channels (18+)
Real-Time Channels
| Channel | Transport | Features |
|---|---|---|
| Telegram | Long-polling | Groups, media, inline keyboards, proxies |
| Discord | WebSocket gateway | Voice channels, threads, embeds, reactions |
| Slack | Socket mode + HTTP | Threads, blocks, app mentions, reactions |
| Signal | signal-cli JSON-RPC | E2E encryption, groups, attachments |
| Matrix | HTTP /sync | Federation, E2E encryption, rooms |
| Mattermost | WebSocket + REST | Teams, channels, threads, integrations |
| IRC | TCP socket (TLS) | Classic IRC protocol, SASL auth |
| Nostr | NIP-17/NIP-04 DMs | Decentralized, relay-based, gift wraps |
| DingTalk | WebSocket stream | Enterprise IM, China-focused |
Webhook-Based Channels
| Channel | Transport | Features |
|---|---|---|
| Meta webhook | Business API, media, templates | |
| Lark/Feishu | HTTP callback | ByteDance suite, cards, bots |
| Line | Webhook + push API | Japan/SEA market, stickers, flex messages |
| OneBot | HTTP/WebSocket | QQ protocol adapter, China IM |
| Tencent API | China’s largest IM, groups, cards | |
| IMAP/SMTP | Classic email, attachments, HTML |
Local/Direct Channels
| Channel | Transport | Features |
|---|---|---|
| CLI | stdin/stdout | Interactive terminal, REPL mode |
| iMessage | AppleScript + SQLite | macOS-only, SMS/iMessage hybrid |
| MaixCam | USB serial + JSON | Embedded AI camera, IoT |
| Web | WebSocket (local/relay) | Browser UI, E2E encryption, pairing |
Channel Message Flow
Inbound Flow
- Platform delivers event (webhook POST, WebSocket frame, long-poll result)
- Channel implementation parses platform-specific format
- Normalizes to
ChannelMessage: - Checks allowlist (sender must be in
allow_fromconfig) - Routes to agent session via message bus
- Agent processes and generates response
- Outbound delivery via
Channel.send()
Outbound Flow
- Splits long messages if platform has length limits
- Uploads media (if supported)
- Formats platform payload (JSON, multipart, etc.)
- Sends via platform API (HTTP POST, WebSocket send, etc.)
Configuration
Basic Setup
Channels are configured in~/.nullclaw/config.json:
Multi-Account Support
Run multiple accounts per channel:Security: Allowlists
Every channel enforces an allowlist for inbound messages:- Empty allowlist = deny all inbound messages
"*"= allow all (explicit opt-in)- Otherwise = exact-match allowlist (case-insensitive)
Special Cases
Nostr: Theowner_pubkey is always allowed regardless of dm_allowed_pubkeys:
Channel-Specific Features
Telegram
- Long-polling (no webhook setup required)
- Group support with
reply_in_privateoption - Media attachments (photos, documents, audio)
- SOCKS5 proxy support for restricted regions
- Inline keyboards (button responses)
Discord
- WebSocket gateway (real-time events)
- Thread-aware (creates threads for long conversations)
- Embed support (rich message formatting)
- Reaction-based UI interactions
- Voice channel presence (status only, no audio)
Signal
- E2E encryption (native Signal protocol)
- Group chats with privacy mode
- Attachments (images, files)
- Typing indicators
- Requires
signal-clibinary in PATH
Nostr
- NIP-17 gift-wrapped DMs (default)
- NIP-04 legacy DMs (fallback)
- Multi-relay rumor deduplication
- DM inbox relays (kind:10050 announcement)
- Encrypted private keys (ChaCha20-Poly1305)
- Business API (Meta webhook)
- Template messages (for initial contact)
- Media support (images, audio, documents)
- Read receipts
IRC
- TLS socket connection
- SASL authentication
- Channel join/part management
- PRIVMSG/NOTICE support
- DCC send (file transfers)
Message Splitting
Channels automatically split messages that exceed platform limits:- Respects UTF-8 boundaries (no broken multibyte chars)
- Configurable max size per platform
- Iterates chunks for sequential delivery
- Telegram: 4096 bytes
- Discord: 2000 bytes
- IRC: 512 bytes
- Signal: no enforced limit
Health Checks
- Connection state (WebSocket alive, TCP socket open)
- Authentication status (token valid, login successful)
- Recent activity (last message sent/received timestamp)
Typing Indicators
Optional vtable methods for real-time UX:Streaming Output
Channels can implementsendEvent for incremental delivery:
Channels without
sendEvent fall back to send() for .final stage and ignore .chunk.Implementation Example
Minimal Channel
Next Steps
Configuration
Full channel configuration reference
Security
Learn about allowlists and pairing