Context
We use LiveKit’s Ingress (RTMP and WHIP) in a production setup where multiple automated sources join and leave rooms dynamically — mostly for live events, multilingual panels, and hybrid sessions.
In these cases, we often need participants to join muted by default, especially when the Ingress is created automatically by backend orchestration (e.g., when a panel starts or a remote feed reconnects).
Currently, Ingress participants always start with audio and video tracks active immediately upon join.
There’s no option in CreateIngressRequest (or anywhere else) to set a default mute state.
Muting afterward via RoomServiceClient.mutePublishedTrack() or similar calls works, but it’s reactive — a few audio frames usually leak before the mute applies.
Current Behavior
- Ingress participants (RTMP, WHIP, WHEP) always publish audio/video immediately after joining.
- The only workaround is to listen for the
participant_joined webhook and mute via RoomServiceClient.
- This approach introduces a race condition and doesn’t guarantee clean silence at join time.
- SDKs like
livekit-react and livekit-client already allow joining muted (audio: false in connect()), but Ingress has no equivalent configuration.
Related issue for reference:
👉 [#370 “how to mute audio via ingress”](#370) — similar request from another user, focused on post-join muting rather than pre-join state.
Proposed Behavior
Allow a configuration flag in CreateIngressRequest to define whether Ingress participants start muted.
Example (API level):
message CreateIngressRequest {
...
bool mute_on_join = 10; // default: false
bool disable_video_on_join = 11; // optional, same behavior for video
}
Optionally, support a global or room-level config:
room_defaults:
ingress_mute_on_join: true
When mute_on_join is true, the Ingress should attach tracks with the muted flag already set before starting media publication.
Why it matters
- Prevents open-mic or unwanted audio leaks in production environments.
- Simplifies automation and orchestration for platforms managing dozens of live sources.
- Makes Ingress consistent with SDK-level connection behavior (
audio: false, video: false).
- Reduces the need for backend-side race conditions handling.
- Improves UX and safety for event moderation pipelines.
This is particularly relevant for multi-room event systems or translation pipelines (e.g., interpreters joining via WHIP), where each Ingress should only go live when explicitly unmuted by the controller.
Context
We use LiveKit’s Ingress (RTMP and WHIP) in a production setup where multiple automated sources join and leave rooms dynamically — mostly for live events, multilingual panels, and hybrid sessions.
In these cases, we often need participants to join muted by default, especially when the Ingress is created automatically by backend orchestration (e.g., when a panel starts or a remote feed reconnects).
Currently, Ingress participants always start with audio and video tracks active immediately upon join.
There’s no option in
CreateIngressRequest(or anywhere else) to set a default mute state.Muting afterward via
RoomServiceClient.mutePublishedTrack()or similar calls works, but it’s reactive — a few audio frames usually leak before the mute applies.Current Behavior
participant_joinedwebhook and mute viaRoomServiceClient.livekit-reactandlivekit-clientalready allow joining muted (audio: falseinconnect()), but Ingress has no equivalent configuration.Related issue for reference:
👉 [#370 “how to mute audio via ingress”](#370) — similar request from another user, focused on post-join muting rather than pre-join state.
Proposed Behavior
Allow a configuration flag in
CreateIngressRequestto define whether Ingress participants start muted.Example (API level):
Optionally, support a global or room-level config:
When
mute_on_joinis true, the Ingress should attach tracks with themutedflag already set before starting media publication.Why it matters
audio: false,video: false).This is particularly relevant for multi-room event systems or translation pipelines (e.g., interpreters joining via WHIP), where each Ingress should only go live when explicitly unmuted by the controller.