Omni

Guide

Channels Guide

Connect Omni to 21 messaging platforms. Route incoming messages to extensions with bindings.

Overview

Channels are messaging platform integrations that let your Omni agent send and receive messages through external services. Each channel runs as an independent plugin with its own connection lifecycle, authentication, and message format.

Key concepts:

01
Channel PluginAn adapter that speaks a specific platform's protocol (e.g., Discord WebSocket, Telegram polling).
02
Channel InstanceA configured connection to a platform. You can have multiple instances of the same type (e.g., two Discord bots).
03
Channel BindingA routing rule that maps incoming messages from a channel to a specific extension.
04
Compound KeyEvery instance is identified by a compound key in the format type:instance_id (e.g., "discord:production").

Supported Channels

Omni supports 21 messaging platforms. All channels are free to use — no premium tiers or paid APIs required.

Channel
Auth
Protocol
Limit
Features
Discord
Bot token
Serenity WebSocket
2,000 chars
DM, Groups, Media, Reactions
Telegram
Bot token
Teloxide long-polling
4,096 chars
DM, Groups, Media, Reactions
WhatsApp Web
QR code pairing
Baileys sidecar
65,536 chars
DM, Groups, Media, Read Receipts
Slack
Bot token / OAuth
Webhook + Events API
40,000 chars
DM, Groups, Media, Reactions
Teams
Azure Bot Service
Bot Framework
28,000 chars
DM, Groups, Media
Google Chat
Service account
Google API
4,096 chars
DM, Groups
Matrix
Access token
Matrix protocol
65,536 chars
DM, Groups, Media, Reactions
IRC
Server + nick
IRC protocol
512 chars/msg
Groups
Twitch
OAuth token
IRC/TMI
500 chars
Groups
Signal
QR code pairing
Signal protocol
65,536 chars
DM, Groups, Media, Read Receipts
LINE
Channel token
Messaging API
5,000 chars
DM, Groups, Media
Mattermost
Bot token
Webhook API
16,383 chars
DM, Groups, Media, Reactions
Feishu
App credentials
Feishu API
4,096 chars
DM, Groups, Media
Nostr
Private key (nsec)
Nostr protocol
65,536 chars
DM, Groups
Nextcloud Talk
App password
REST API
32,000 chars
DM, Groups
Synology Chat
Bot token
Webhook API
4,096 chars
DM, Groups
Twitter/X
OAuth 1.0a
X API v2
280 chars
DM, Mentions
BlueBubbles
Server URL + password
REST API
20,000 chars
DM, Groups, Media, Read Receipts
iMessage
BlueBubbles bridge
BlueBubbles API
20,000 chars
DM, Groups, Media, Read Receipts
Zalo
App credentials
Zalo API
2,000 chars
DM, Groups, Media
WebChat
None (local)
WebSocket
Unlimited
DM

Connecting a Channel

Channels can be connected through the UI or pre-configured in omni.toml.

Via the UI

01

Open Settings → Channels

02

Click Add Instance and select a channel type

03

Enter an instance ID (e.g., "production") and optional display name

04

Enter authentication credentials (bot token, API key, etc.)

05

Click Connect — the channel status indicator turns green when ready

Via Config File

omni.toml

[channels.instances."discord:production"]

channel_type = "discord"

display_name = "Main Server"

auto_connect = true

 

# Credentials are provided at connect time, not stored in config

Connection Lifecycle

Disconnected

No active connection

Connecting

Establishing connection

Connected

Ready to send/receive

Reconnecting

Recovering from a drop

Error

Connection failed

Multi-Instance Support

You can run multiple instances of the same channel type simultaneously. Each instance has its own credentials, connection state, and message stream. Instances are identified by compound keys.

compound keys

# Format: {channel_type}:{instance_id}

 

"discord:production" # Discord, production instance

"discord:staging" # Discord, staging instance

"telegram:alerts" # Telegram, alerts bot

"telegram:support" # Telegram, support bot

 

# Bare type defaults to "default" instance:

"discord""discord:default"

Use cases: separate bots for production and development, multiple Telegram bots for different teams, or different Slack workspaces connected at once.

Message Routing & Bindings

Channel bindings route incoming messages from a channel instance to a specific extension. Without a binding, messages from a channel are not forwarded to any extension.

Binding Fields

Field
Required
Description
channel_instance
Yes
Compound key of the channel instance (e.g., "discord:production").
extension_id
Yes
Reverse-domain ID of the extension to route to.
peer_filter
No
Glob pattern matching sender usernames. "*" matches all.
group_filter
No
Glob pattern matching group/channel names. "support-*" matches support-general, support-vip, etc.
priority
No
Integer priority for conflict resolution. Higher values take precedence.
enabled
No
Toggle the binding on or off without removing it.

Resolution Order

When multiple bindings match an incoming message, Omni resolves the conflict using:

01

Priority — higher priority bindings are preferred

02

Specificity — more specific glob patterns (fewer wildcards) win over broader ones

03

First match — if still tied, the first registered binding wins

omni.toml

# Route all Discord support channels to the support bot

[[channels.bindings]]

channel_instance = "discord:production"

extension_id = "com.example.support-bot"

group_filter = "support-*"

priority = 100

 

# Catch-all for everything else on Discord

[[channels.bindings]]

channel_instance = "discord:production"

extension_id = "com.example.general-bot"

peer_filter = "*"

priority = 10

Channel Features

Each channel reports which features it supports. Extensions can query these features to adapt their behavior.

Direct Messages

1-on-1 conversations

Group Messages

Multi-user channels and rooms

Media Attachments

Images, files, and other media

Reactions

Emoji reactions on messages

Read Receipts

Delivery and read confirmations

Typing Indicators

Show when someone is typing

Authentication Methods

Channels use different authentication flows depending on the platform.

Bot Token

Discord, Telegram, Slack, Mattermost, Synology Chat

Create a bot on the platform's developer portal, copy the token, and paste it into Omni. The token is stored securely and used for all API calls.

QR Code Pairing

WhatsApp Web, Signal

Omni displays a QR code in the UI. Scan it with your phone's app to link the session. No bot account needed — messages appear as coming from your personal account.

OAuth / API Key

Twitter/X, LINE, Google Chat, Feishu, Zalo

Register an application on the platform's developer console, obtain API keys or OAuth credentials, and enter them in Omni.

Server URL + Password

BlueBubbles, iMessage, Nextcloud Talk

Point Omni to a self-hosted server (e.g., BlueBubbles on a Mac) with its URL and password.

Troubleshooting

Channel stuck on "Connecting"

Check your credentials and internet connection. For bot-token channels, verify the token hasn't been revoked. For QR code channels, try disconnecting and re-scanning.

Messages not arriving

Ensure a binding exists for the channel instance. Without a binding, incoming messages are received but not routed to any extension. Check Settings → Channels → Bindings.

"Permission denied" when sending

The extension needs the channel.send capability. Check the extension's manifest or grant the permission when prompted.

WhatsApp Web disconnects frequently

WhatsApp Web sessions can expire if the phone loses internet or the app is force-closed. Keep the phone connected and the WhatsApp app running in the background.

Next Steps

Channels — Discord, Telegram & 19 More | Omni AI Agent Builder