Channel Setup
Zubo connects to multiple messaging platforms simultaneously. All channels share the same agent personality, memory, tools, and skills. Messages from any channel are routed through the unified agent loop — so your agent behaves consistently whether someone messages it on Telegram, Discord, Slack, WhatsApp, Signal, or the built-in web chat.
Web Chat (Always On)
The web chat channel is enabled by default and requires no configuration. When Zubo starts, it serves a full-featured chat interface and dashboard at http://localhost:<port>.
- No setup required — web chat is active out of the box
- Port — auto-assigned (
0) by default, or set a specific port via config - Features — streaming responses, file upload, voice input, tool status indicators, full conversation history
- Dashboard — the same URL serves the Zubo dashboard with analytics, memory management, skills, and settings
Configuration:
{
"channels": {
"webchat": { "enabled": true, "port": 3000 }
}
}
Or set the port via CLI:
zubo config set channels.webchat.port 3000
Telegram
Connect Zubo to Telegram so you can chat with your agent from the Telegram app on any device.
Setup Steps
- Open Telegram and search for @BotFather
- Send
/newbotand follow the prompts to create a new bot. BotFather will give you a bot token (e.g.,123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11) - Add the token to your Zubo config:
zubo config set channels.telegram.botToken "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" - (Optional) Restrict access to specific Telegram users by their numeric user ID:
{ "channels": { "telegram": { "botToken": "123456:ABC-DEF...", "allowedUsers": [12345678] } } } - Restart Zubo:
zubo restart
Getting your Telegram user ID: search for @userinfobot on Telegram and send it any message. It will reply with your numeric user ID.
Config Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Enable or disable the Telegram channel |
botToken | string | — | Bot token from BotFather |
allowedUsers | number[] | [] | Telegram user IDs allowed to message. Empty array means anyone can message. |
Discord
Add Zubo as a Discord bot so it can respond to messages in your server.
Setup Steps
- Go to the Discord Developer Portal
- Click New Application and give it a name
- Go to the Bot section in the left sidebar, then click Reset Token to generate a bot token. Copy and save it.
- Still in the Bot section, scroll down to Privileged Gateway Intents and enable Message Content Intent
- Go to OAuth2 → URL Generator in the left sidebar. Select the
botscope, then check the Send Messages and Read Message History permissions. - Copy the generated URL at the bottom and open it in your browser to invite the bot to your server
- Add the token to your Zubo config:
zubo config set channels.discord.botToken "MTk4NjIz..." - Restart Zubo:
zubo restart
Config Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Enable or disable the Discord channel |
botToken | string | — | Bot token from the Discord Developer Portal |
allowedUsers | string[] | [] | Discord user IDs allowed to message. Empty array means anyone can message. |
Slack
Connect Zubo to your Slack workspace using Socket Mode for real-time communication without exposing a public URL.
Setup Steps
- Go to api.slack.com/apps and click Create New App. Choose "From scratch" and select your workspace.
- In the left sidebar, go to Settings → Socket Mode and enable it
- When prompted, generate an App-Level Token with the
connections:writescope. Copy this token (it starts withxapp-). - Go to OAuth & Permissions in the left sidebar. Under Bot Token Scopes, add:
chat:write,app_mentions:read,im:history,im:read,im:write - Click Install to Workspace at the top of the page and authorize. Copy the Bot User OAuth Token (it starts with
xoxb-). - Add both tokens to your Zubo config:
{ "channels": { "slack": { "botToken": "xoxb-...", "appToken": "xapp-...", "allowedUsers": [] } } } - Restart Zubo:
zubo restart
Config Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Enable or disable the Slack channel |
botToken | string | — | Bot User OAuth Token (starts with xoxb-) |
appToken | string | — | App-Level Token (starts with xapp-) |
allowedUsers | string[] | [] | Slack user IDs allowed to message. Empty array means anyone in the workspace can message. |
Zubo connects to WhatsApp using the Baileys library, which provides an unofficial WhatsApp Web API. No Meta Business account or phone number API is required — it works by linking as a companion device to your existing WhatsApp account.
Setup Steps
- Add WhatsApp to your Zubo config:
{ "channels": { "whatsapp": { "enabled": true } } } - Start (or restart) Zubo. A QR code will appear in your terminal.
- On your phone, open WhatsApp → Settings → Linked Devices → Link a Device
- Scan the QR code displayed in the terminal
- Once linked, Zubo will respond to incoming WhatsApp messages
Config Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Enable or disable the WhatsApp channel |
authDir | string | auto | Directory where WhatsApp authentication credentials are stored. Defaults to a directory inside ~/.zubo. |
allowedNumbers | string[] | [] | Phone numbers allowed to message, in international format (e.g., "+1234567890"). Empty array means anyone can message. |
Signal
Connect Zubo to Signal using signal-cli, a command-line interface for the Signal messenger.
Setup Steps
- Install signal-cli on your system:
# macOS brew install signal-cli # Linux (download from GitHub releases) # See: https://github.com/AsamK/signal-cli/releases - Register your phone number with Signal:
signal-cli -u +1234567890 register - Verify the number with the SMS code you receive:
signal-cli -u +1234567890 verify 123-456 - Add Signal to your Zubo config:
{ "channels": { "signal": { "phoneNumber": "+1234567890", "signalCliPath": "/usr/local/bin/signal-cli", "allowedNumbers": ["+1987654321"] } } } - Restart Zubo:
zubo restart
Config Fields
| Field | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Enable or disable the Signal channel |
phoneNumber | string | — | Your registered Signal phone number in international format |
signalCliPath | string | auto | Path to the signal-cli binary. Zubo will attempt to find it automatically if not specified. |
allowedNumbers | string[] | [] | Phone numbers allowed to message. Empty array means anyone can message. |
Running Multiple Channels
Zubo is designed to run all channels simultaneously. There is no limit to how many channels you can enable at once.
- Shared state — all channels share the same memory, personality, tools, skills, and session. Your agent has one unified brain regardless of which platform a message comes from.
- Automatic routing — when a message arrives from Telegram, Discord, or any other channel, it goes through the same agent loop. The response is automatically sent back to whichever channel the message originated from.
- Proactive messages — scheduled tasks, alerts, and proactive triggers can broadcast to all connected channels simultaneously, or target a specific channel.
- Per-channel formatting — while the agent personality is shared, each channel adapter handles platform-specific formatting (Markdown for Telegram, embeds for Discord, blocks for Slack, etc.).
Channel Security
Controlling who can interact with your agent is critical, especially for public-facing deployments.
- Access control — use
allowedUsersorallowedNumberson each channel to restrict who can send messages. When the list is empty, anyone on that platform can message your agent. - Rate limiting — the web chat channel enforces rate limits per IP address. Other channels enforce rate limits per user ID. Configure limits via
rateLimit.chatPerMinutein your config. - API authentication — enable bearer token auth for the web chat HTTP endpoints by setting
auth.enabled: truein your config. See the Security & Auth guide for details. - Tool confirmation — destructive tools like
shell,file_write, andsecret_deleterequire explicit user confirmation before executing, regardless of channel.
Best Practices
- Always set
allowedUsersfor public-facing channels — without it, anyone who finds your bot can interact with your agent and its tools - Start with web chat only, then add channels one at a time as needed. This makes it easier to debug connection issues.
- Disable without removing — use
zubo config set channels.telegram.enabled falseto temporarily disable a channel without deleting its configuration - Check logs if a channel is not connecting:
zubo logswill show connection errors and status updates for each channel adapter - Monitor from the dashboard — the Settings → Channels page shows real-time connection status for every enabled channel
- Keep tokens secure — bot tokens grant full control over your bot. Never share them or commit them to version control. Zubo stores them in
~/.zubo/config.jsonwith restricted file permissions. - Test incrementally — after adding a new channel, send a simple test message before relying on it for important tasks