Commit Graph
62 Commits
Author SHA1 Message Date
kibi dc12d092b9 Merge pull request 'Screen sharing' (#17) from screen-sharing into main
Reviewed-on: #17
2026-10-01 23:01:00 +00:00
kibiandClaude Opus 5.5 06a185d778 Switch between cameras while sharing
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>
2026-10-02 01:00:04 +02:00
kibiandClaude Opus 5.5 c990593f9f Own camera is not mirrored in the large view
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:44:37 +02:00
kibiandClaude Opus 5.5 e41a2cfd70 Own camera: mirror consistently in preview, tile and large view; not a camera facing away
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:42:40 +02:00
kibi 2a5213c80c Merge pull request 'Screen sharing' (#16) from screen-sharing into main
Reviewed-on: #16
2026-10-01 22:39:02 +00:00
kibiandClaude Opus 5.5 fdf6c12afa Camera tiles show the whole picture in its own shape
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:38:37 +02:00
kibiandClaude Opus 5.5 5d43b8e4ae Built-in Opus codec for browsers without one; cameras on by default with per-person hide
- 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>
2026-10-02 00:36:43 +02:00
kibi 7ce351c46a Merge pull request 'Screen sharing' (#15) from screen-sharing into main
Reviewed-on: #15
2026-10-01 22:28:56 +00:00
kibiandClaude Opus 5.5 6368e63b0e Camera: fall back to plain constraints, explain a silent refusal; show voice failures above the chat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:28:08 +02:00
kibiandClaude Opus 5.5 2700a4ec3d Relay: clients of the same relay reach each other behind a 1:1 NAT; logging and extra relay addresses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:20:39 +02:00
kibi 645f83545d Merge pull request 'Camera rounds: several people's cameras at once in the voice tiles' (#14) from screen-sharing into main
Reviewed-on: #14
2026-10-01 22:16:16 +00:00
kibiandClaude Opus 5.5 1e4bda4e74 Camera rounds: several people's cameras at once in the voice tiles
- 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>
2026-10-02 00:14:22 +02:00
kibi 909d756e56 Merge pull request 'Share dialog: say why the screen cannot be shared on phones' (#13) from screen-sharing into main
Reviewed-on: #13
2026-10-01 21:59:56 +00:00
kibiandClaude Opus 5.5 817f822771 Share dialog: say why the screen cannot be shared on phones
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:58:26 +02:00
kibi a0550834dc Merge pull request 'Camera sharing, and the proxy's relay for the desktop app' (#12) from screen-sharing into main
Reviewed-on: #12
2026-10-01 21:54:59 +00:00
kibiandClaude Opus 5.5 819db06bc6 Camera sharing, and the proxy's relay for the desktop app
- 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>
2026-10-01 23:52:18 +02:00
kibi cbd71216a8 Merge pull request 'Add a stream relay (TURN) to the proxy for browsers that cannot connect directly' (#11) from screen-sharing into main
Reviewed-on: #11
2026-10-01 21:35:34 +00:00
kibiandClaude Opus 5.5 08aa5268d0 Add a stream relay (TURN) to the proxy for browsers that cannot connect directly
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>
2026-10-01 23:30:09 +02:00
kibi 2498cf0d2d Merge pull request 'Screen sharing' (#10) from screen-sharing into main
Reviewed-on: #10
2026-10-01 21:14:33 +00:00
kibiandClaude Opus 5.5 98e44d7082 Settings: choose a STUN server from Google, Cloudflare or a typed address
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:13:40 +02:00
kibiandClaude Opus 5.5 0a290de229 Channel menu: Send message to channel opens the side chat ready to type
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:12:10 +02:00
kibiandClaude Opus 5.5 2510633538 Images in chat and descriptions open large on click
The channel description preview stays open underneath while an image from it
is shown.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:07:24 +02:00
kibiandClaude Opus 5.5 e7b317313a Server rail: the server with voice is shown on top
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:04:53 +02:00
kibiandClaude Opus 5.5 f9e7042a73 Stacked layout: no chat title bar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:03:22 +02:00
kibiandClaude Opus 5.5 7d1ad5423f Voice tiles fill the stage exactly at every size
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>
2026-10-01 23:00:37 +02:00
kibiandClaude Opus 5.5 b80eeafcc2 Web E2E: check the stream view at a phone-sized window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:55:28 +02:00
kibi 873ee236dd Merge pull request 'Streams: long-press menu on touch screens, show connecting and failure over the picture' (#9) from screen-sharing into main
Reviewed-on: #9
2026-10-01 20:54:42 +00:00
kibiandClaude Opus 5.5 9832ba2749 Streams: long-press menu on touch screens, show connecting and failure over the picture
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>
2026-10-01 22:52:16 +02:00
kibi f9718e80a1 Merge pull request 'Screen sharing' (#8) from screen-sharing into main
Reviewed-on: #8
2026-10-01 20:40:25 +00:00
kibiandClaude Opus 5.5 950a1afad7 Stacked layout: drag the chat taller under a stream, never below its minimum
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:37:59 +02:00
kibiandClaude Opus 5.5 b5dda4e1c2 Add pop-out and full screen to the stream's right-click menu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:35:52 +02:00
kibiandClaude Opus 5.5 e0e900625d Drop the hover time in the message margin; the date at the right edge replaces it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:34:35 +02:00
kibiandClaude Opus 5.5 e59c6804cb Show a message's full date at the right edge on hover
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:33:26 +02:00
kibiandClaude Opus 5.5 5cc379417b Stacked layout: the chat keeps about five lines under a stream
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:31:35 +02:00
kibiandClaude Opus 5.5 68f68d1d76 Screen sharing: stats for nerds on right-click of the stream
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>
2026-10-01 22:28:41 +02:00
kibi d0543688cd Merge pull request 'Screen sharing' (#7) from screen-sharing into main
Reviewed-on: #7
2026-10-01 20:27:09 +00:00
kibiandClaude Opus 5.5 a402d1c035 Streams open large by default; tiles never carry the picture
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:19:51 +02:00
kibiandClaude Opus 5.5 63d77c2bce Stacked layout stays stacked at any width and shows streams as a plain picture
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:17:35 +02:00
kibiandClaude Opus 5.5 9880ef840f Screen sharing: sounds for streams and viewers, viewer count as status
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:13:32 +02:00
kibiandClaude Opus 5.5 71b90ef80a Fall back to picture-in-picture when the stream window is refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:10:05 +02:00
kibiandClaude Opus 5.5 23833b1c8b Screen sharing: resizable tile stage, streams first, pop-out window
- 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>
2026-10-01 22:09:34 +02:00
kibiandClaude Opus 5.5 5a7f243c1d Reword the screen sharing notice
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:55:01 +02:00
kibi 260080b474 Merge pull request 'Make the compose file work with older docker-compose' (#6) from screen-sharing into main
Reviewed-on: #6
2026-10-01 19:50:56 +00:00
kibiandClaude Opus 5.5 e649062d67 Make the compose file work with older docker-compose
List the variables instead of an optional env_file; the proxy treats empty
variables as unset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:46:45 +02:00
kibi fa5b92b906 Merge pull request 'Screen sharing' (#5) from screen-sharing into main
Reviewed-on: #5
2026-10-01 19:43:38 +00:00
kibi f8608a09db Merge pull request 'Server info and ui polish' (#4) from server-info-and-ui-polish into main
Reviewed-on: #4
2026-10-01 19:43:18 +00:00
kibiandClaude Opus 5.5 5159d8a518 Add a Docker image and compose file for the web proxy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:41:42 +02:00
kibiandClaude Opus 5.5 826542ed8a Add a STUN responder to the proxy for screen sharing between browsers
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>
2026-10-01 21:38:42 +02:00
kibiandClaude Opus 5.5 13b7013004 Say that both sides need a STUN server for streams across the internet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:30:17 +02:00
kibiandClaude Opus 5.5 3b23f69a5f Screen sharing: start dialog, sound, video tiles and a meeting view
- 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>
2026-10-01 21:19:29 +02:00