In-room chat is a side panel for text, reactions, polls, and images without leaving the call.

Open and send

  1. Open the chat panel from the meeting controls.
  2. Send a text message — other participants receive it.
  3. 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

  1. Create a poll from chat.
  2. Everyone sees the poll bubble.
  3. 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 / 400 on POST /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.maxDimension in 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:

SettingDefault (typical)Meaning
chat.maxMessageCount10000Cap messages kept in memory / session storage
chat.messageTTLHours2160 (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.