feat(huddle): ad-hoc audio huddles in text channels (LC-493) #490
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/LC-493-huddles"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
LC-493 - Huddles: lightweight ad-hoc audio in any text channel
One-click ephemeral audio in a group text room, reusing the entire enclave-voice WebRTC stack (full-mesh, presence, mute/screen, device picker, ICE) rather than provisioning a voice channel.
How it reuses the voice stack
The mesh is already room-id-generic: the hub keys
voice_rooms/voice_connon any room id, the signaling relays are generic, andvoice.jsbinds any[data-lc-voice-root]and drives join/leave/mute/camera/screen + the participant grid from itsdata-lc-voice-*hooks. So a huddle is just that root mounted in a text room.handle_voice_joinpreviously requiredis_voice; it now accepts any accessible non-DM room. DMs keep their dedicated 1:1 call path. The ephemeral lifecycle is free - the hub already drops a room fromvoice_roomswhen the last participant leaves, so a huddle exists only while someone is on the line.[data-lc-voice-root][data-lc-huddle]above the composer (group rooms only) with the mute/camera/screen/leave/devices controls, a count chip, a pre-join lobby, and the tile grid - all the existing voice hooks/CSS.RoomPageseedshuddle_participantsfrom the hub so a fresh page load already shows an in-progress huddle.data-lc-voice-join) starts or joins. The bar stays hidden until the viewer joins or someone else is on the line (applyHuddleVisibilityin voice.js, called on join-state and participant changes), so an idle room shows only the header button. Voice-channel roots are unaffected (nodata-lc-huddle).Tests
just check,just test,just test-saasall green; i18n parity covers the newhuddle-*keys (en+es); Tailwind rebuilt. The audio path itself is the existing, shipped voice mesh (presence/signaling already covered); this PR adds the room attachment + in-room surface. The WebRTC media path is browser-driven and not exercised by the Rust test suite (same as the existing voice channels).Not operator-visible (no env/config/contract change; reuses
LETS_CHAT_ICE_SERVERS).Follow-ups (not in this slice)
A persistent "huddle active" indicator in the sidebar/room list, transcription in huddles (omitted to keep the bar light), and a per-room/per-enclave disable toggle if operators want to gate it.
🤖 Generated with Claude Code