Home / Docs / Channel Setup

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.

Copy-Paste Task Cards

Secure API Access

Enable API auth and create a key before exposing ports beyond localhost.

zubo config set auth.enabled true
zubo auth create-key my-app

Set Local Model Fallback

Keep responses available during provider outages or API quota issues.

zubo config set failover '["openai","ollama"]'
zubo config set providers.ollama.model llama3.3

Common Errors

401 Unauthorized / Missing Bearer token

If auth.enabled is true, all /api/* calls require Authorization: Bearer <key>. Create a new key if needed.

curl -H "Authorization: Bearer YOUR_KEY" http://localhost:3000/api/dashboard/status
Provider Timeout / Upstream unavailable

Use failover and switch temporarily to a responsive provider or smaller model. Check logs for repeated timeout patterns.

zubo model openai/gpt-4o-mini
zubo logs --follow
Missing local model (Ollama/LM Studio)

If local providers fail, ensure the runtime is running and a model is installed.

ollama serve
ollama pull llama3.3

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>.

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

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts to create a new bot. BotFather will give you a bot token (e.g., 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11)
  3. Add the token to your Zubo config:
    zubo config set channels.telegram.botToken "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
  4. (Optional) Restrict access to specific Telegram users by their numeric user ID:
    {
      "channels": {
        "telegram": {
          "botToken": "123456:ABC-DEF...",
          "allowedUsers": [12345678]
        }
      }
    }
  5. 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

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the Telegram channel
botTokenstringBot token from BotFather
allowedUsersnumber[][]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

  1. Go to the Discord Developer Portal
  2. Click New Application and give it a name
  3. Go to the Bot section in the left sidebar, then click Reset Token to generate a bot token. Copy and save it.
  4. Still in the Bot section, scroll down to Privileged Gateway Intents and enable Message Content Intent
  5. Go to OAuth2 → URL Generator in the left sidebar. Select the bot scope, then check the Send Messages and Read Message History permissions.
  6. Copy the generated URL at the bottom and open it in your browser to invite the bot to your server
  7. Add the token to your Zubo config:
    zubo config set channels.discord.botToken "MTk4NjIz..."
  8. Restart Zubo: zubo restart

Config Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the Discord channel
botTokenstringBot token from the Discord Developer Portal
allowedUsersstring[][]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

  1. Go to api.slack.com/apps and click Create New App. Choose "From scratch" and select your workspace.
  2. In the left sidebar, go to Settings → Socket Mode and enable it
  3. When prompted, generate an App-Level Token with the connections:write scope. Copy this token (it starts with xapp-).
  4. Go to OAuth & Permissions in the left sidebar. Under Bot Token Scopes, add: chat:write, app_mentions:read, im:history, im:read, im:write
  5. Click Install to Workspace at the top of the page and authorize. Copy the Bot User OAuth Token (it starts with xoxb-).
  6. Add both tokens to your Zubo config:
    {
      "channels": {
        "slack": {
          "botToken": "xoxb-...",
          "appToken": "xapp-...",
          "allowedUsers": []
        }
      }
    }
  7. Restart Zubo: zubo restart

Config Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the Slack channel
botTokenstringBot User OAuth Token (starts with xoxb-)
appTokenstringApp-Level Token (starts with xapp-)
allowedUsersstring[][]Slack user IDs allowed to message. Empty array means anyone in the workspace can message.

WhatsApp

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

  1. Add WhatsApp to your Zubo config:
    {
      "channels": {
        "whatsapp": { "enabled": true }
      }
    }
  2. Start (or restart) Zubo. A QR code will appear in your terminal.
  3. On your phone, open WhatsApp → Settings → Linked Devices → Link a Device
  4. Scan the QR code displayed in the terminal
  5. Once linked, Zubo will respond to incoming WhatsApp messages

Config Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the WhatsApp channel
authDirstringautoDirectory where WhatsApp authentication credentials are stored. Defaults to a directory inside ~/.zubo.
allowedNumbersstring[][]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

  1. Install signal-cli on your system:
    # macOS
    brew install signal-cli
    
    # Linux (download from GitHub releases)
    # See: https://github.com/AsamK/signal-cli/releases
  2. Register your phone number with Signal:
    signal-cli -u +1234567890 register
  3. Verify the number with the SMS code you receive:
    signal-cli -u +1234567890 verify 123-456
  4. Add Signal to your Zubo config:
    {
      "channels": {
        "signal": {
          "phoneNumber": "+1234567890",
          "signalCliPath": "/usr/local/bin/signal-cli",
          "allowedNumbers": ["+1987654321"]
        }
      }
    }
  5. Restart Zubo: zubo restart

Config Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the Signal channel
phoneNumberstringYour registered Signal phone number in international format
signalCliPathstringautoPath to the signal-cli binary. Zubo will attempt to find it automatically if not specified.
allowedNumbersstring[][]Phone numbers allowed to message. Empty array means anyone can message.

Email

Connect Zubo to an email account via IMAP/SMTP so it can receive and reply to emails. Great for workflows like processing incoming emails, auto-replies, or email-based task management.

Prerequisites

Setup Steps

  1. Gather your IMAP and SMTP server details from your email provider (host, port, username, password)
  2. Add the email channel to your Zubo config:
    {
      "channels": {
        "email": {
          "enabled": true,
          "imap": {
            "host": "imap.gmail.com",
            "port": 993,
            "user": "you@gmail.com",
            "password": "your-app-password",
            "tls": true
          },
          "smtp": {
            "host": "smtp.gmail.com",
            "port": 587,
            "user": "you@gmail.com",
            "password": "your-app-password",
            "tls": true
          },
          "pollIntervalSeconds": 60,
          "allowedSenders": ["boss@company.com", "team@company.com"],
          "fromName": "Zubo Assistant"
        }
      }
    }
  3. Restart Zubo: zubo restart

Config Fields

FieldTypeDefaultDescription
enabledbooleantrueEnable or disable the Email channel
imap.hoststringIMAP server hostname (e.g., imap.gmail.com)
imap.portnumber993IMAP server port
imap.userstringIMAP login username (usually your email address)
imap.passwordstringIMAP login password or app password
imap.tlsbooleantrueUse TLS for the IMAP connection
smtp.hoststringSMTP server hostname (e.g., smtp.gmail.com)
smtp.portnumber587SMTP server port (587 for STARTTLS, 465 for implicit TLS)
smtp.userstringSMTP login username (usually your email address)
smtp.passwordstringSMTP login password or app password
smtp.tlsbooleantrueUse TLS for the SMTP connection
pollIntervalSecondsnumber60How often (in seconds) to check for new emails. Minimum is 10.
allowedSendersstring[]Email addresses allowed to message. If omitted or empty, all incoming emails are processed.
fromNamestring"Zubo"Display name used in the From header of outgoing replies

Security note — allowedSenders: If set, only emails from the listed addresses will be processed. All other incoming emails are marked as read and skipped. If allowedSenders is omitted or empty, Zubo will process every incoming email — use this only for private or low-traffic mailboxes.

Gmail setup: Gmail requires an App Password for third-party IMAP/SMTP access. To create one, go to Google Account → Security → App Passwords (requires 2-Step Verification to be enabled). Generate a new app password, then use that 16-character password in both the imap.password and smtp.password fields above.

Running Multiple Channels

Zubo is designed to run all channels simultaneously. There is no limit to how many channels you can enable at once.

Channel Security

Controlling who can interact with your agent is critical, especially for public-facing deployments.

Best Practices