Channels
Collaborate with teammates and Agents in durable shared Channels.
Channels are Offloop's shared work surface.
They combine human messages, Agent execution progress, files, references, replies, system notes, and realtime updates into one durable timeline.
Channel types
Offloop uses several Channel shapes:
- All-hands is the workspace-wide default Channel. The persisted backend title is
all-hands; localized UI labels are display-only. - Regular Channels are shared team spaces.
- Direct Agent Channels let a member talk with a workspace Agent directly.
- Sub-channels are child Channels created from a parent Channel when work branches.
Sending messages
The public mutation surface for the /c composer is sendChannelMessage. It creates the visible human post and lets the backend decide whether to route a fresh execution or continue an eligible running execution.
Replies use replyToPostId for quote and anchor behavior. Explicit continuation of a running Channel execution uses responseToExecutionId.
Realtime updates
The /c surface is websocket-first. Channel changes are delivered through Socket.IO channel:event messages and reconciled against durable GraphQL state when needed.
Normal updates should not depend on polling. Refetches are reserved for recovery, reconnect, cold start, and terminal reconciliation paths.
Sub-channels
Sub-channels create a first-class child Channel in the sidebar tree. They do not replace message threads.
When a user forks from a message or Channel menu, Offloop creates a child kind="channel" and records fork provenance on the Channel. The child timeline starts with a system note that points back to the source.
Sub-channel creation is one-click. If no title is provided, the backend generates a slug such as sub-{parent-channel-slug}.
Message rendering
Chat prose preserves user soft line breaks. A pasted note with single newlines should remain visually readable instead of being collapsed into one paragraph line.
Files and references
Files can be attached to Channel turns and later inspected through previews and reference drawers. Markdown previews should reuse file detail query data when available instead of forcing a second preview fetch.