- 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>
- Signals travel as Mumble plugin data (compressed, chunked under Murmur's
1000 byte limit); the picture goes directly to each viewer over WebRTC
- Toolbar button with a source picker in the desktop app, an indicator next to
people who share, click to watch, a view above the chat with full screen
- Late joiners learn about running streams; moving, stopping or disconnecting
ends them for viewers
- A note about IP addresses before the first use, optional STUN server setting
- Unit tests for the signal codec and an E2E with two app instances
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Browser version
- Self-hosted proxy (server/) that serves the web build and bridges WebSocket
connections to Mumble servers over TLS, with a server allowlist or allow-any mode
- WebSocket transport and a browser platform layer; identities live in the browser
- npm run build:web, dev:web, proxy and test:e2e:web; proxy unit tests
Interface
- Toolbar next to mute and deafen: description editor, settings, expand or collapse all
- Channels with a description show a marker; resting on the row previews it
- Collapse all keeps channels with people open
- Hints (title tooltips) can be switched on in a new Accessibility settings tab
- New identities can set the username suggested when connecting
- Own user information tells the client address from the one the server sees
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Public servers: connect arrow and add button per row, sortable column headers
- Mute and deafen stay available while disconnected; the choice carries to the next connect
- Server information dialog, opened from a button next to mute
- Stacked layout: mute bar on top, without the profile
- Settings that need the upload host are disabled until it is set; link previews show the mode in effect
- YouTube links are plain links by default
- Composer has a border and matches the sidebar bar height
- Regenerate README screenshots
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- electron-builder packaging: AppImage, deb and tar.gz for Linux, NSIS
installer for Windows, app icon, desktop entry
- Gitea workflow builds Linux and Windows on version tags and attaches
the files to the release
- Layout setting in Appearance: Modern, Classic (chat left, channels
right) and Stacked (channels on top, chat below, resizable split),
like the desktop Mumble client
- No message box while not connected; Manage identities on the welcome
page
- Public list: a list that arrives after the source changed no longer
replaces the new one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Port of Mumble's CryptStateOCB2 (XEX* counter-measures, late/lost/replay
handling, nonce resync), verified against Mumble's OCB2 test vectors
- UDP channel per connection in the main process, to the address the TLS
connection reached; used only while the server answers UDP pings, falls back
to the TCP tunnel automatically; "voice over TCP only" setting
- Voice statistics show the live transport
- Information dialog no longer infers the transport from ping counters
- Message box: no padding, input fills the bar; Edit HTML only in descriptions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Channels: create, edit, delete, link and move (drag and drop for channels and
people), right-click on free space in the channel list
- Permission editor with inherited rules, allow/deny per permission, groups and
members; menus grey out actions the server does not allow
- Notification sounds for connection, channel, chat, mute and push-to-talk events;
custom files and TeamSpeak 3 style sound packs (settings.ini), stored in IndexedDB
- Color schemes: Dark, Light, Midnight, Frost and Windows 95
- Public server list with live UDP ping, fetched through Chromium's network stack
- Kick, ban and connection-lost card with Reconnect
- Right-click menus for text fields, links, images and message authors
- Formatting toolbar in the message box, shared with the description editor
- Resizable channel list, menu headers, registration from the self menu only
- Fix: client-side pacing now mirrors Murmur's whole-second leaky bucket exactly,
so quick actions are no longer dropped silently
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Link previews for web links in chat, fetched by the f0ckm upload host by
default (linked sites never see the user's IP), or directly, or off
- Voice channel tiles above the chat on windows too narrow for the member list
- Per-person volume slider in the user context menu
- Profile panel: channel on its own line under the name, no Guest badge,
voice actions moved to the context menu
- User information dialog refreshes every second
- Rate limiting mirrors Murmur's whole-second bucket leak, so irregular
bursts are queued instead of dropped
- CHANGELOG.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Electron desktop app with a Svelte 5 interface for any Mumble server.
- Mumble protocol core: TLS, handshake, channels, users, text, plugin data,
client-side pacing of Murmur's rate limits
- Voice: WebCodecs Opus over the TCP tunnel, voice activity, push to talk,
always-on, devices, per-user volume and local mute
- Several servers at once, voice on one; server rail with icons and ordering
- Chat: channels, direct messages, side chat, file sharing through f0ckm,
inline images without it, click-to-play YouTube
- Profiles with rich descriptions, registration, rename, nicknames,
connection information and moderation menus
- Identity wizard, multiple identities, PKCS#12 import/export, desktop
Mumble certificate import, certificate pinning and viewer
- Tray icon with voice state
- Unit, server and end-to-end tests against a real Murmur
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>