Live streaming in LevelChat is a room with type: "broadcast". The publisher experience is
identical to a meeting; the viewer side scales horizontally via cascade SFU and falls back to
LL-HLS / CMAF at the long tail.
When to use broadcast vs. hybrid
- broadcast — fixed number of publishers (1–10) and a viewer count that can grow into the thousands. Viewers can't promote to publishers without a new token.
- hybrid — start as a meeting, promote on demand:
TypeScript
await room.promote('broadcast', {
capacity: 50_000,
region: 'eu',
distribution: 'av1-svc', // or "vp9-svc" for broader hardware support
});Distribution tiers
LevelChat picks the right transport for each viewer based on count and latency target:
| Viewer count | Transport | Latency |
|---|---|---|
| 1 – 100 | direct WebRTC SFU | 80 ms |
| 100 – 5 000 | cascade SFU mesh | 250 ms |
| 5 000 – 50 000 | edge fanout + LL-HLS | 1.5 s |
| 50 000+ | LL-HLS / CMAF | 4 s |
You don't choose this — the SFU does. You can pin a minimum transport via the room config:
TypeScript
config: {
distribution_floor: 'webrtc';
} // never fall back beyond direct WebRTCWHIP from OBS
OBS Studio 30+ ships native WHIP. Point it at:
text
Server: https://api.levelchat.io/v1/whip/<roomId>
Bearer: <a publisher room JWT>…and you're publishing in seconds, no SDK required.
Recording while streaming
TypeScript
await room.record({
compose: 'speaker', // tracks | grid | speaker
codec: 'av1-pro',
outputs: ['mp4_av1', 'hls'],
webhook: 'https://your-app.example/lc-rec',
});The recording runs out-of-band on a recorder-svc worker — it does not add latency to the
live distribution.
Quality + cost
- AV1-SVC publish gives you 30–40% better viewer-side bitrate at the same quality vs. VP9.
- LevelChat bills viewers as
viewer_hours, not participant-minutes — see Pricing for the breakdown.