The picture is swapped on the running stream, so viewers stay connected. The
new camera is opened first where the device allows two at once; phones close
the old one first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- libopus in WebAssembly takes over voice where WebCodecs audio is missing
(Firefox on Android); tested for tone, timing and bitrate, and in a browser
forced onto it
- Cameras in the channel show by themselves once the IP note was confirmed;
a person's camera can be hidden from the right-click menu, all of them with
one button; an enlarged camera leaves its tile
- CSP allows wasm-unsafe-eval for the codec
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A viewer holds one screen and any number of cameras; cameras play in the
tiles (own one mirrored), a click enlarges one
- "Watch all cameras" joins the round: cameras in the channel are watched as
they come on. Turning your own camera on joins it too
- Sound, statistics and stop work per stream
- Relay quotas and port range raised: a round uses a route per pair of people
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A camera is a second source in the share dialog; streams carry their kind,
so icons and wording follow. Browsers without screen capture (phones) start
on the camera.
- Settings, Voice: the address of a mumh5 web version as relay; its STUN and
relay are then offered with every stream and take over when no direct
connection comes up.
- The proxy hands out relay credentials at GET /api/relay, readable from any
origin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vanadium forbids direct UDP for WebRTC, and mobile and company networks often
block direct connections; the only route then is a relay reached over TCP.
- server/turn.ts: STUN and TURN on one port, over UDP and TCP, with
short-lived credentials from /api/turn, quotas and a peer filter
- The browser build fetches credentials and offers the relay automatically
- Stats for nerds says when a stream is relayed and how the relay is reached
- Tests: a TURN client over UDP and TCP, and a browser limited to the relay
over TCP in the web E2E
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rows of equal tiles with the column count chosen for the best 16:9 fit; a
shorter last row stretches. In the meeting view the strip shares the width.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stream counted as live as soon as its track was announced, before any route
existed, so a viewer whose connection never came up saw a black picture.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecs, picture size and frame rate, bitrate, loss, jitter and the network
path, per viewer for the sharer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The stage above the chat is as tall as the user drags it; tiles are sized to
fill it, with a meeting-style look
- Tiles with a stream come first, at the top left
- The large picture can be moved to a separate window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The browser build uses it automatically, so no outside server is contacted.
Covered by unit tests and a two-browser step in the web E2E.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Start dialog with source list, live preview, sound and quality choices
- Sound on Linux through PipeWire: one program or everything except this
app, fed into a virtual microphone and kept linked as programs come and go;
system loopback on Windows; stereo Opus
- A sharer's tile shows the picture; clicking it opens a large view with the
other tiles as a strip. Own stream is previewed in the own tile
- Stream volume for viewers, watch and stop from the profile panel
- Unit tests for the PipeWire link planner; the proxy test no longer writes to
the root channel other tests listen in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>