Fixes ticket 0001 (fedora chrome cannot hear speakers) — fox 2026-06-07
telemetry ruled out the sink hypothesis from 0f36e02 and pinned two
coupled defects:
(A) tracks=0 race in handleRemoteSfuTrack mic branch — ev.streams[0]
can be empty at handler-time even when ev.track is live; the
silent <audio> fallback ate the listener.
(B) Mesh ontrack swapped the worklet to the mesh stream even when
the mesh track was still muted, orphaning the SFU receiver and
trapping the listener on a silent mesh source.
Mic now mirrors screen/camera/game (new MediaStream([ev.track])) and
the mesh swap waits for 'unmute' / restores SFU after a mute window.
Source commit: caa0548 in zebra-report.git
Pulls in two upstream zebra-report commits:
0ce1339 prefix-match in flushSfuStreams (kills the silent
fedora-chrome listener: ontrack races peer-joined, cache
keyed by 16-char streamID prefix, flush's strict-equality
matcher never resolved short→full, listener heard nothing
from anyone already in the room).
5e8cdad send 'bye' on pagehide for listeners even when
persisted=true (kills the closed-firefox-phone roster
zombies sitting through the 120s readTimeout window).
Server-side backstop (60s listenerAliveTTL) ships separately in
proxy.unturf.com main; the client fix above stands on its own for
the common bye-arrives case.
Fox 2026-06-06: "rebooting fedora chrome blanka because it never
could hear any speakers for days now".
Mirror of zebra-report 3ca9042 + proxy.unturf.com bc04362.
- moderation: boot failures now log to the moderator's page instead
of looking like the button did nothing (stale uuid case).
- diagnostic: watchFirstFrame fires 'still black after 2500ms — no
keyframe?' if a fresh SFU video tile never decodes a first frame.
- proxy-side companion: longer keyframe-burst on subscriber attach
so a dropped PLI no longer leaves the tile permanently black.
Mirror source 2fd2ac3 — fixes mobile autoplay so phone listeners
actually see the video pixels (was a black tile because mobile blocks
autoplay of unmuted audio).
New page: zebra-spaces.html — multi-party voice rooms (host, 2 co-hosts,
speakers, listeners) with persistent Ed25519 identity, password-vault
backup/restore, hand-raise → mic-invite → accept flow, and signed role
transitions enforced server-side. Pairs with the new zebra-spaces-signal
relay on cors-proxy.uncloseai.com.
Other pages (chat.html → index.html, zebra-audio.html, how-it-works.html,
host-your-own.html) refreshed because their integrity stamps rolled
today; nav links to zebra-spaces added on zebra-audio and host-your-own.
Deploy zebra-audio puppet console (triple-click footer seal: type -> TTS at
speech.ai.unturf.com -> into the call, send/stop) and the new host-your-own
page, plus nav links from chat (index) and how-it-works.
mirrors web/chat.html from the zebra-report repo. adds a
BroadcastChannel-based loopback gated on ?loopback=1 so two
tabs of a same browser can round-trip frames without zebrad,
useful for UX validation while a real PulseAudio introspector
daemon stays in progress.
yellow warning banner makes dev mode obvious when active.
single self-contained page at /zebra-report/. ports recovered web/chat.html
from git.unturf.com/engineering/unturf/zebra-report into this site's layout.
changes vs source:
* @font-face points at /css/chunkfive/ instead of bundled fonts dir,
so a single chunkfive copy serves a whole site.
* back link points at / instead of ./ which looped to self.
* "recovered rx.c" link points at git.unturf.com repo instead of ./.
what it does:
* web audio GainNode modulator drives PulseAudio sink-input volume
between MARK (0.80) & SPACE (0.20) per bit, 50 baud handshake,
higher rates after benchmark + OFFER/READY exchange.
* passphrase mode (PBKDF2 600k iter → AES-GCM-256 group key) or
pubkey mode (ECDH P-256 → AES-GCM-256 pairwise). toggle in UI.
* no chat content crosses a network packet. wireshark blind.
* RX path requires a local zebrad introspector at ws://127.0.0.1:7777,
documented inline on a page. without it, page transmits but cannot
receive.
dual use posture:
* page leads with threat model + mitigation panel citing
foxhop.net/linux-audio-ipc-attack-surface whitepaper.
* "what this does not protect against" explicit on a page.
CI publishes via .gitlab-ci.yml on master → deploy-www.sh runner.