-
v0.16.4
Stablereleased this
2026-09-30 17:48:34 -04:00 | 64 commits to main since this releaseSeat pair for v0.16.4. Install seat-streamer and gadgetd TOGETHER — see INSTALL.md in the archive.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.16.3
Stablereleased this
2026-09-30 17:11:50 -04:00 | 67 commits to main since this releaseSeat pair for v0.16.3. Install seat-streamer and gadgetd TOGETHER — see INSTALL.md in the archive.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.16.2
Stablereleased this
2026-09-30 16:52:22 -04:00 | 69 commits to main since this releaseSeat pair for v0.16.2. Install seat-streamer and gadgetd TOGETHER — see INSTALL.md in the archive.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.16.1
Stablereleased this
2026-09-30 15:18:15 -04:00 | 72 commits to main since this releaseWeb: low-latency playout preset;
?wtpath=wan|lan|racetransport pin, touch devices default towan. Seat:declared_hzin ctl messages. Install seat-streamer and gadgetd together (INSTALL.md in the archive).Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
released this
2026-09-27 21:23:38 -04:00 | 78 commits to main since this releaseThe stream stops inventing frames to fill the gap — on the deployed seat the single biggest cause of lag was our own duplicate fill — and a player who gets no video is now told what is actually wrong.
- The framerate cap drops excess frames, never manufactures them. A bare
videoratenormalizes in BOTH directions: a game rendering 67 fps against the 200 fps cap was FILLED to 200 fps — measured on the deployed seat asvrate {in 334, dup 668}per 5 s window, three quarters of the stream manufactured. A duplicate carries its source frame's pts, so the fill inflatedstage.ageMsp99 and hid the game's real cadence.drop-only=trueon every encoder variant; the test covers all six. - CQP sessions can no longer leave the transport unbounded.
max_frame_kb_for_qp(0)returned 0 — no quantizer floor commanded meant nothing to derive from. It now returnsMAX_FRAME_KB_CEIL, the ceiling's own "a stall, not a picture". Measured 2026-09-27 at 1440p qp-i 28: real IDRs peak 94–254 KB, five times the headroom — the bound never shapes a real keyframe. - A playout spike's hold is shed in a few windows, and bounded at 90 ms. The flat 2 ms/window fall left a one-window arrival spike holding glass-to-glass up for ~30 s after the path recovered (g2g breathing to 250 ms on a 40 ms network). The fall is proportional now — halve the remaining gap per rotation, floor
DECAY_STEP_MS— andMAX_TARGET_MS=90binds even the constructor's initial target: a 200 ms game render stall must not trade the whole tail for buffer. - The no-video banner names its cause and its fix. On 2026-09-27 Brave showed "this seat sends no RTP video" while input worked fine; the real cause was the direct UDP path to the seat being blocked (the join rides the relay, so everything works except video). Each transport state now names its own problem and its own next step,
wt-transportrecords which advert URLs failed, andtests/browser/banner-case.mjsdrives the real page and fault tick with both field states and asserts the advice differs.
Validated: 590 client unit tests, 616 workspace tests,
cargo fmtandclippy -D warningsclean, tsc zero errors on both configs, clean-checkout load check green. Runtime confirmation (vratedup = 0, IDRs bounded at the ceiling) lands with the next seat session's telemetry.No change to STUN/TURN. Client build ui80.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The framerate cap drops excess frames, never manufactures them. A bare
-
v0.15.0
Stablereleased this
2026-09-24 23:19:44 -04:00 | 88 commits to main since this releaseg2gMsis measured for the first time, and the seat now reports how old a frame is at each stage, so the ~130 ms glass-to-glass figure can be split per stage before any of it is tuned.- g2gMs fixed. The encoder shifts every output pts forward 1000 h (
min_pts); the wire pts andenc-latencyread that raw pts as running time, so the client was 164,026,163 ms off andenc-latencyread −3.6×10¹² µs. The seat now reads pts through the pad's segment. The client's clock offset also had the wrong sign; fixed. Readings outside 0–5000 ms are dropped and counted aswc.g2gBad, which is what a pre-0.15 seat produces. - Per-stage age on the seat.
stage.ageMs={src, vr, cap, encin, encout, sent}, each[p50, p99]ms: capture source → after the rate stage → after upload → encoder in → encoder out → last chunk handed to quinn.ageNegcounts negative ages (should be absent).stage.vratehas videorate's in/out/dup/drop per window. - Client rungs. The
wcblock addsg2g50/99,dLat50/99(decode submit → output),train50/99(first → last chunk of a frame) anddisp90Mbps(delivery rate on frames of 16+ chunks). - Parity carry bounded. For a source slightly faster than the panel the carry never ended, and the draw sat a frame (16.7 ms) behind on 71% of paints. It now releases after two consecutive carries;
wc.carRelcounts them. - Input counters at every session end.
gaps/stale/dupsare logged and written asinput-sessionon viewer leave, input close, and seat shutdown. They used to be written only when the viewer left.
No change to STUN/TURN. Client build
ui79.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- g2gMs fixed. The encoder shifts every output pts forward 1000 h (
-
v0.14.2
Stablereleased this
2026-09-23 12:58:17 -04:00 | 92 commits to main since this releaseThe seat learns its public address by STUN at startup and every 60 s, and that address leads the WebTransport advert. Before this, the first viewer after each launch got only the static
--wt-advertiselist, which went stale with the next DHCP lease and sent remote viewers to a dead address.The probe binds inside
--ice-ports, since only that range bypasses the LAN's VPN. Seat-side only; the orchestrator image is rebuilt with no functional change.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.14.1
Stablereleased this
2026-09-23 10:58:43 -04:00 | 94 commits to main since this releaseInput moves off the datachannel. On wifi its retransmits cost +48 to +98 ms at p99; it now rides WebTransport datagrams as full held state, so a lost frame costs at most one frame and a key cannot stick.
- Key and button changes are sent immediately instead of on the next animation frame, then once more 4 ms later.
- Gamepads are polled every 4 ms, and a change is sent at once.
- New stat
inUp(p50/p95/p99/max, ms): input's own uplink delay over its floor, from seat arrival acks.inputRttMsis a control-stream ping and does not measure input. - splitux-relay removed. Wire tags 7 (
RelaySeg) and 8 (SeatNet) are retired. app.jsno longer crashes on load (TDZ since413feea). CI now evaluates it, and tsc, clippy-D warningsandcargo fmt --checkall block.install-gadgetd.shno longer exits silently when no seat is running.
Client build
ui78. Install the seat pair together per INSTALL.md; gadgetd restarts and drops any live session.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-08-08 15:50:03 -04:00 | 172 commits to main since this releaseplaceholder, replaced below
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.9.2 — mesh-safe ICE Stable
released this
2026-07-03 06:26:30 -04:00 | 381 commits to main since this releaseseat-streamer now refuses to pair WebRTC media across the WireGuard mesh: mesh-subnet candidates (default
10.0.0.0/24,fd00::/64, override withGSE_ICE_EXCLUDE) are neither signalled to viewers nor accepted from them. Mesh-peer viewers previously formed host pairs through the tunnel — hairpinning all media via the VPS instead of going LAN-direct or through the TURN relay — regardless of relay-side denies. Viewers with a mesh VPN profile active now stream over the same clean paths as everyone else.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)