Channels
Where your team and AI think together, in real time.
Channels are persistent, shared spaces where humans and AI models participate in the same conversation. Unlike standard chats — which are personal and isolated — Channels let multiple users and multiple models interact in a single timeline. Every exchange, human or AI, becomes shared context the whole team can build on.
Why Channels?
AI as a participant, not a separate tool
Tag @gpt-4o to draft a plan, then tag @claude to critique it. Your whole team sees both responses in the same timeline with full context. No tab-switching, no copy-pasting between tools.
Persistent shared context
Every message becomes part of the record. When someone asks a question next week, the AI can draw on everything discussed before. Channels are living knowledge bases, not disposable threads.
Multiple models, one conversation
Use one model for code review, another for writing, a third for data analysis — all in the same channel. Chain them together for richer answers than any single model could produce.
Real-time collaboration
Instant updates, emoji reactions, threaded replies, pinned messages, unread indicators, and live presence dots so you always know who's online.
Channel Types
| Type | Best for |
|---|---|
Standard (#) | Topic-based rooms (#engineering, #marketing-strategy), public or private |
| Group | Team-scoped spaces with explicit membership and user-group sync |
| Direct Message | Private 1:1 or small-group conversations with real-time online/offline status |
Key Features
🤖 @model tagging | Summon any AI model into the conversation on demand |
| 👥 Shared context | Every message, human or AI, builds the collective knowledge |
| 🟢 Live presence | Online indicators on avatars — green dot for active, grey for offline |
| 📌 Pinned channels | Pin any channel to float it to the top of the sidebar |
| 🧵 Threads & reactions | Keep discussions organized with replies, pins, and emoji reactions |
| 📎 File sharing | Drop images, documents, and code. AI can see and process them |
| 🔒 Access control | Public, private, group-based, and direct message channels |
| 🧠 AI channel awareness | Models can search and synthesize across channels autonomously |
| 🔔 Unread counts | Badge shows unread message count per channel; cleared on visit |
Sidebar
The sidebar organizes all your channels into labelled sections — no flat list. Each section can collapse independently.
Sections
| Section | What appears here |
|---|---|
| Channels | Standard # channels (public and private) |
| Groups | Group channels you belong to |
| Direct Messages | 1:1 and multi-person DM conversations |
The Direct Messages header shows an online count badge (● 3 online) when contacts in that section are active.
Online presence dots
Every avatar in the sidebar reflects real-time presence:
- 1:1 DM — a pulsing green dot on the contact's avatar when they are online, grey when offline
- Group DM — each of the two stacked avatars carries its own presence dot
- Group channel — a small
● Ncount next to the channel name shows how many members are currently online
Presence updates instantly via a dedicated Socket.IO event — no polling.
Pinning channels
Hover any channel item and click the pin icon to pin it. Pinned channels float to the top of their section, above unpinned entries. Unpin the same way. The pin state is persisted per-user.
Sorting
Within each section, channels sort by:
- Pinned channels first
- Most recent activity (
last_message_at) descending
Creating a Channel
Channels is currently in Beta and must be enabled by an administrator.
- Navigate to Admin Panel → Settings → General
- Toggle Channels (Beta) on and save
- Channels appear in the sidebar — click (+) to open the creation dialog
Creation options:
| Field | Description |
|---|---|
| Name | Identifies the channel in the sidebar and #channel-name mentions |
| Description | Short summary shown in channel info and search results |
| Access | Public (any user), Private (invite-only), or group-synced |
Channel creation is restricted to administrators by default. Granular permissions can be configured per-group via environment variables.
How It Works
Talking to AI
Channels are passive by default — AI doesn't jump into every conversation. When you need input from a model, tag it:
You:
@gpt-4oHere's our Q3 revenue data. What trends stand out?(GPT-4o analyzes the data and responds with key insights)
You:
@claudeDo you agree with that analysis? What's missing?
This means your team can discuss freely without AI interrupting, and call on exactly the right model when needed.
Full chat-completion pipeline
Mentioning a model in a channel runs through the same pipeline as a standard chat. The reply is streamed in real time as the model generates it, with full access to its configured capabilities:
| Capability | What it enables in a channel |
|---|---|
| Native and default function calling | Tool calls resolve and execute mid-message |
| Built-in tools | Web search, image generation, code interpreter, calendar |
| User tools and MCP tools | Whatever the model is configured to call, it can call |
| Filters | Inlet/outlet/stream filters apply just like in chats |
| Knowledge (RAG) | Knowledge bases attached to the model are queried and injected |
| Attached documents | Images and non-image files (PDF, DOCX, etc.) uploaded in the thread are forwarded into the model's context |
In other words, a channel-summoned model is a fully-equipped agent — not a one-shot completion.
Before v1.0.0, tagging a model in a channel only forwarded images from the thread. As of v1.0.0, uploaded PDFs, DOCX, and other non-image files are forwarded identically to a direct chat.
Tagging people and linking channels
@username— notifies that teammate#channel-name— creates a clickable cross-reference to another channel
Typing indicators
While composing a message, other participants see Alice is typing… in real time. Typing state clears automatically after 5 seconds of inactivity.
Message Interactions
Hover any message to reveal its action bar:
| Action | Description |
|---|---|
| Emoji reaction | React with any emoji; reactions show grouped totals |
| Reply inline | Quotes the message and pre-fills the input |
| Thread | Opens a side panel threaded view for deep discussions |
| Pin | Marks the message as pinned; visible in channel info |
| Edit | Edit your own messages; content updates in real time for all viewers |
| Delete | Remove your own messages; rolls back instantly if the server rejects it |
Edits and deletes are optimistic — the UI updates immediately and reverts automatically if the API call fails.
AI Channel Awareness
With native function calling enabled, models can navigate your channels autonomously:
- Search channels by name or description
- Search messages across all accessible channels
- Read threads to understand full discussion context
You: What was decided in
#dev-teamabout the migration timeline?(The AI searches the channel, reads the relevant thread, and gives you a synthesized answer — all without leaving your current chat.)
This removes the need to manually bridge information between private chats and shared channels.
The Forward to Channel action adds a button to each assistant message that posts the reply (or a selection) into a channel of your choice. Useful for promoting good answers from private chats into team-visible spaces without copy-paste.
Channel Info
Click the channel name or the info icon in the header to open Channel Info. This panel shows:
- All current members with their avatars and online status
- Pinned messages
- Ability to add or remove members (group channels, if you are the manager)
Access Control
| Setting | Behavior |
|---|---|
| Public read | Any authenticated user can view messages |
| Private | Only explicitly added members can view or post |
| Group sync | Membership mirrors a user group; adding/removing group members automatically updates channel access |
| Write access | Separate from read — a channel can be read-only for some members |
Administrators always have full access to all channels regardless of access grants.
Use Cases
Team knowledge hub (#engineering)
Your team discusses architecture decisions throughout the week. Someone tags @claude to evaluate tradeoffs. The AI's analysis becomes part of the permanent record: searchable, referenceable, and available to every future conversation in that channel.
Multi-model war room (#incident-response)
Paste logs and error traces. Tag @gpt-4o to analyze the stack trace. Tag @deepseek-coder to suggest a fix. Tag @claude to draft the postmortem. Three models, one shared context, one timeline.
Project strategy (#product-launch)
Twenty messages of human brainstorming. Then: @gpt-4o Read the conversation above and create a prioritized action plan with owners and deadlines. The AI synthesizes everything discussed into a structured deliverable.
Cross-team DMs
Use 1:1 Direct Messages for private conversation with a colleague. Both parties see the live online indicator so you know if someone is around before you message. Group DMs bring up to several people into a single private thread.
API
All channel endpoints live under /api/v1/channels. Every request requires a valid Authorization: Bearer <token> header.
Channels
| Method | Path | Description |
|---|---|---|
GET | /api/v1/channels/ | List all channels the user has access to (includes unread counts, member IDs, pin state) |
POST | /api/v1/channels/create | Create a channel (name, description, type, is_private, access_grants, user_ids, group_ids) |
GET | /api/v1/channels/{id} | Get a channel with full member and access-grant detail |
POST | /api/v1/channels/{id}/update | Update channel name, description, or access grants (owner or admin) |
DELETE | /api/v1/channels/{id}/delete | Delete a channel (owner or admin) |
POST | /api/v1/channels/{id}/pin | Pin or unpin the channel for the calling user ({"is_pinned": true}) |
GET | /api/v1/channels/users/{user_id} | Get or create the 1:1 DM channel with a specific user |
Members
| Method | Path | Description |
|---|---|---|
GET | /api/v1/channels/{id}/members | List all members of a channel |
POST | /api/v1/channels/{id}/members/active | Toggle DM visibility — deactivate to hide a DM from the sidebar |
POST | /api/v1/channels/{id}/update/members/add | Add users or groups to a channel |
POST | /api/v1/channels/{id}/update/members/remove | Remove users or groups from a channel |
Messages
| Method | Path | Description |
|---|---|---|
GET | /api/v1/channels/{id}/messages | Paginated message list (skip, limit) |
POST | /api/v1/channels/{id}/messages/post | Send a message (content, data, reply_to_id) |
GET | /api/v1/channels/{id}/messages/pinned | All pinned messages in the channel |
GET | /api/v1/channels/{id}/messages/{message_id} | Get a single message |
POST | /api/v1/channels/{id}/messages/{message_id}/update | Edit message content (own messages) |
DELETE | /api/v1/channels/{id}/messages/{message_id}/delete | Delete a message |
POST | /api/v1/channels/{id}/messages/{message_id}/pin | Pin or unpin a message |
GET | /api/v1/channels/{id}/messages/{message_id}/thread | Fetch all replies in a thread |
POST | /api/v1/channels/{id}/messages/{message_id}/reactions/add | Add an emoji reaction ({"name": "👍"}) |
POST | /api/v1/channels/{id}/messages/{message_id}/reactions/remove | Remove an emoji reaction |
Webhooks
| Method | Path | Description |
|---|---|---|
GET | /api/v1/channels/{id}/webhooks | List webhooks for a channel |
POST | /api/v1/channels/{id}/webhooks/create | Create an inbound webhook |
POST | /api/v1/channels/{id}/webhooks/{webhook_id}/update | Update a webhook |
DELETE | /api/v1/channels/{id}/webhooks/{webhook_id}/delete | Delete a webhook |
POST | /api/v1/channels/webhooks/{webhook_id}/{token} | Inbound webhook endpoint — post a message via webhook URL |
Public channels are visible to all users on your instance. Do not share API keys, passwords, or sensitive data in public channels.