Huddles
A huddle is an ad-hoc voice call started from inside a channel. It carries its own transcript, and you can talk to an agent in it.
Starting one
A huddle is started from the channel toolbar. One live huddle per channel; anyone in the workspace who can see the channel can join it.
Media is carried by LiveKit. agensis does not run its own media server — it owns the huddle's lifecycle, mints short-lived room-scoped join tokens on the server, and trusts the signed relay rather than the browser for who was actually in the room.
The dock
While you are in a huddle, a floating dock stays on screen wherever you navigate. Leaving the channel does not leave the call.
Transcripts
A huddle gets a conversation of its own the moment it starts — a real session, not a special-cased log. Speech-to-text and the agents' replies land there.
This is deliberate: sessions already have realtime, permissions, history, agent dispatch, mention resolution and a composer. A transcript that is just another session inherits all of it. The transcript copies the host channel's participants, so mention dispatch behaves identically inside the huddle.
A huddle is ad-hoc; the channel is the record. So the conversation does not flood the channel. When the huddle ends, the channel gets one marker saying it happened, carrying a link back to the transcript.
A huddle that left no trace — nobody said anything — does not leave a marker.
Talking to an agent
One agent is active at a time, and everything you say is posted mentioning them. The strip of agent chips shows who your voice is currently going to; the rest are one click away, or one keystroke — the first nine have a modifier-plus-number shortcut.
An agent answering in a live huddle is told so, and told to drop the structure it would use in writing. Headings, bullets and tables are for reading; in a huddle it is being listened to.
Because the reply is spoken, an agent's answer is spoken as it completes sentences rather than after the whole turn finishes.
Who is in the room
Participation is derived from an append-only event log rather than a mutable list. A duplicate join is a no-op, a duplicate leave is a no-op, and a late-arriving event still lands in the right place because the fold sorts by the event's own timestamp instead of trusting arrival order. That is what lets the card survive a reconnect with no reconciliation pass.
A connected browser heartbeats. Presence that stops being refreshed is reaped — so a crashed tab leaves the call rather than haunting it. An ended huddle reports zero participants, not a phantom one; the honest "how many were here" numbers are the peak and the ever-joined count, both derived from the log.
Voice engines
| Direction | Engine | Where the audio goes |
|---|---|---|
| Speech to text | Deepgram | To the agensis backend, which relays it. The provider key never reaches the browser. |
| Text to speech | Cartesia | Browser to Cartesia directly, using a 120-second, TTS-only token the backend mints. The API key never reaches the browser. |
The two are asymmetric for a concrete reason. Cartesia will exchange a secret key for a short-lived scoped token, so the browser can talk to it directly and the backend stays out of the audio path. The equivalent Deepgram grant needs a permission level the key does not carry, so the only way to keep that key off the client is for the audio to come to the backend instead.
Every relayed stream is bounded — an idle timeout and a hard ceiling, both of which close the upstream — because an abandoned stream bills by the minute.
If either provider is not configured, the browser's own speech synthesis and recognition are used instead, and the app says so. A silent dead microphone is exactly the failure this is built to avoid.
Voices are per-agent; see Agents.
Huddles need microphone access. The deployed site sends a permissions policy allowing the microphone for same-origin documents only — narrow enough that an embedded artifact or applet frame can never capture audio.