Ghosts show a 'Live on Discord' placeholder video while their Discord user is streaming #143

Open
opened 2026-10-01 20:50:47 +00:00 by robocub · 0 comments
Member

Summary

When a Discord voice member is streaming (Go Live), their ghost in the Matrix call should publish a small static placeholder video ("🔴 Live on Discord") so Matrix participants can see that a stream exists even when nothing relays its content.

Why

The bridge already sees self_stream on Discord voice states (bot-visible, no extra permissions, no ToS exposure). Today a Matrix participant has no way to know that someone on the Discord side went live. A placeholder tile on the streamer's ghost is the honest minimum: it shows who is streaming without carrying the stream.

Scope

  • Detect self_stream transitions in the voice-state handler (puppet pool) and forward "streaming on/off" per Discord user to the ghost.
  • The ghost publishes/unpublishes a static video track (a generated frame: dark background, the words "Live on Discord", optionally the streamer's display name) via livekit-rust while the user streams. A few fps is plenty; it must cost almost nothing.
  • E2EE rooms: the frame goes through the ghost's existing frame encryption like any track (keys are media-agnostic).
  • Later, an external presenter (ADR 0002, not in scope here) could replace the placeholder with the actual stream on the same ghost.

Not in scope

Relaying the stream's content. This issue is only the indicator.

## Summary When a Discord voice member is streaming (Go Live), their ghost in the Matrix call should publish a small static **placeholder video** ("🔴 Live on Discord") so Matrix participants can see that a stream exists even when nothing relays its content. ## Why The bridge already sees `self_stream` on Discord voice states (bot-visible, no extra permissions, no ToS exposure). Today a Matrix participant has no way to know that someone on the Discord side went live. A placeholder tile on the streamer's ghost is the honest minimum: it shows *who* is streaming without carrying the stream. ## Scope - Detect `self_stream` transitions in the voice-state handler (puppet pool) and forward "streaming on/off" per Discord user to the ghost. - The ghost publishes/unpublishes a static video track (a generated frame: dark background, the words "Live on Discord", optionally the streamer's display name) via livekit-rust while the user streams. A few fps is plenty; it must cost almost nothing. - E2EE rooms: the frame goes through the ghost's existing frame encryption like any track (keys are media-agnostic). - Later, an external presenter (ADR 0002, not in scope here) could replace the placeholder with the actual stream on the same ghost. ## Not in scope Relaying the stream's content. This issue is only the indicator.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nether/nether-voicebridge#143
No description provided.