• v0.15.0 cb62770328

    v0.15.0
    All checks were successful
    CI / build-and-test (push) Successful in 2m24s
    Release / build-and-test (push) Successful in 1m27s
    Release / release-image (push) Successful in 30s
    Stable

    Ghost released this 2026-09-24 23:19:44 -04:00 | 88 commits to main since this release

    g2gMs is 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 and enc-latency read that raw pts as running time, so the client was 164,026,163 ms off and enc-latency read −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 as wc.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. ageNeg counts negative ages (should be absent). stage.vrate has videorate's in/out/dup/drop per window.
    • Client rungs. The wc block adds g2g50/99, dLat50/99 (decode submit → output), train50/99 (first → last chunk of a frame) and disp90Mbps (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.carRel counts them.
    • Input counters at every session end. gaps/stale/dups are logged and written as input-session on 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