Skip to content

Channel Overview

Channels are how Human receives and sends messages. Each channel implements the hu_channel_t vtable.

| Method | Description | | ------------------------------ | ------------------------------------------- | | start | Start listening (e.g. long-poll, WebSocket) | | stop | Stop listening | | send | Send a message to a target | | name | Channel identifier | | health_check | Report channel health | | send_event | Optional: streaming send with stage | | start_typing / stop_typing | Optional: typing indicators |

| Channel | Build flag | Description | | ---------- | ---------------------------- | ------------------------------- | | CLI | HU_ENABLE_CLI (default ON) | Terminal chat, always available | | Telegram | HU_ENABLE_TELEGRAM | Telegram Bot API | | Discord | HU_ENABLE_DISCORD | Discord bot | | Slack | HU_ENABLE_SLACK | Slack app (Socket mode, events) | | Signal | HU_ENABLE_SIGNAL | Signal via signal-cli | | Nostr | HU_ENABLE_NOSTR | Nostr DMs (nak) | | WhatsApp | HU_ENABLE_WHATSAPP | WhatsApp Business API | | Matrix | HU_ENABLE_MATRIX | Matrix.org | | IRC | HU_ENABLE_IRC | IRC | | Line | HU_ENABLE_LINE | LINE | | Lark | HU_ENABLE_LARK | Lark/Feishu | | OneBot | HU_ENABLE_ONEBOT | OneBot protocol | | DingTalk | HU_ENABLE_DINGTALK | DingTalk | | Email | HU_ENABLE_EMAIL | Email | | Web | HU_ENABLE_WEB | WebSocket web UI | | iMessage | HU_ENABLE_IMESSAGE | Apple iMessage | | Mattermost | HU_ENABLE_MATTERMOST | Mattermost | | QQ | HU_ENABLE_QQ | QQ | | MaixCam | HU_ENABLE_MAIXCAM | MaixCam board | | Dispatch | HU_ENABLE_DISPATCH | Dispatch/router |

Enable all at once: -DHU_ENABLE_ALL_CHANNELS=ON

Channels use an allowlist for access control:

  • Empty allowlist — Deny all (no one can interact)
  • "*" — Allow all
  • List of IDs — Exact match only (e.g. Telegram user IDs, Discord user IDs)

Example (Telegram):

{
"channels": {
"telegram": [
{
"token": "123456:ABC...",
"allow_from": ["123456789", "987654321"]
}
]
}
}

allow_from empty or omitted = allow all. allow_from: ["*"] = allow all. allow_from: ["123"] = only user 123.

When using the gateway (human gateway), incoming webhooks are routed by path:

| Path | Channel | | ------------------- | ----------------- | | /webhook/telegram | Telegram | | /webhook/slack | Slack | | /webhook/discord | Discord | | /webhook/whatsapp | WhatsApp | | /webhook/line | LINE | | /webhook/lark | Lark | | /telegram | Telegram (legacy) | | /slack/events | Slack events | | /whatsapp | WhatsApp | | /line | LINE | | /lark | Lark | | /discord | Discord |

Use a tunnel (ngrok, cloudflared) to expose the gateway to the internet for webhook delivery.