In-room chat is a side panel for text, reactions, polls, and images without leaving the call.
Open and send
- Open the chat panel from the meeting controls.
- Send a text message — other participants receive it.
- Opening or closing the panel must not kill camera or microphone tracks.
Message grouping and timestamps should look correct even on burst sends.
Emoji
- Reaction on a message — both sides update reaction counts.
- Emoji picker in the composer inserts emoji into the draft text.
Polls
- Create a poll from chat.
- Everyone sees the poll bubble.
- Participants vote; results update (results modal if the UI provides one).
Images and files
- Attach an image within server size and dimension limits.
- The meeting client pre-checks file size and image dimensions before upload using limits from public settings (
chatUploadMaxBytes,chatUploadMaxDimension). - Oversize files or oversized dimensions are rejected with a clear error (client first; server is still authoritative —
413/400onPOST /api/room/:roomId/chat/upload). - Recipients can open a lightbox for images.
Defaults: 10 MiB per file, 8192×8192 max dimension (when unset).
Operators set limits via:
chat.uploads.maxBytes/chat.uploads.maxDimensionin Configuration- Admin Chat Uploads tab (
chatUploadMaxBytes,chatUploadMaxDimension) in the Admin Dashboard - Per-user / global storage quotas under
chat(maxUploadBytesPerUser, disk/S3 backends)
Retention (client-side)
LiveKit does not persist data-channel chat on the server the way a chat product would. Bedrud applies client-side retention hints:
| Setting | Default (typical) | Meaning |
|---|---|---|
chat.maxMessageCount | 10000 | Cap messages kept in memory / session storage |
chat.messageTTLHours | 2160 (90 days) | Age-based trim |
Env overrides: CHAT_MAX_MESSAGE_COUNT, CHAT_MESSAGE_TTL_HOURS.
After a reload mid-room, history follows that product policy (session restore or clean start) without crashing.
Related
- Meeting Controls
- Joining a Meeting
- API Handlers —
POST /room/:roomId/chat/upload