Adom's shared voice service. Reads your AI's answers back to you while you drive, and renders perfectly-timed voiceover tracks for your demo videos, so you never record your own voice.
v1.9.57: health means can-it-speak (ready field, --probe, exit 5 when upstream refuses), upstream refusals named and retried over 35s instead of blamed on the caller, service pill reads readiness (issue #8)
v1.9.54: one surface open per drain (10s debounce), re-offers logged with their reason, T13 asserts a single hbw open, fake page no longer orphans (issue #7)
v1.9.53: --rate validated up front (signed percentage, normalised), service error bodies surfaced, an identical repeated 5xx is no longer called service flapping (issue #6)
v1.9.51: desktop surface (Hydrogen Desktop's own window via the bridge) with automatic fall-through from webview when no editor session is connected, surface recorded per clip (issue #5); pronunciation contributions target this repo, gallia path retired (PR #1)
v1.9.48 — queue management (issue #4 §2): 'queue clear --mine <thread>|--all' drops WAITING clips only (unscoped is refused), 'queue drop <clip|req>' drops one, 'control skip' ends the playing clip with verdict skipped and no retry; dropped/skipped clips go to History; ACCEPTED hint carries a queue-ahead ETA. ralph-test T12 (24/24).
v1.9.47 — scripts + markers for live demos (issue #4): 'load' pre-synthesizes and prefetches every marker onto the player, 'cue <script> <n>' plays exactly one marker instantly (no synthesis, no download, nothing auto-advances), 'cue-status' gives honest per-marker state. ralph-test T11 (17/17).
v1.9.46 — issue #4 (a): both enqueue paths (say --play and play) warn at SEND time when the player is paused and name 'adom-tts control play'; previously only offline audiences warned, and only on say
v1.9.45 — completes #3: status no longer claims playback is human-only (names 'adom-tts control play'), UNCONFIRMED distinguishes PAUSED from buffering, and the user skill teaches control in the canonical hands-free pattern
v1.9.44 — closes #3: every failure/poll path now surfaces the control commands an AI can drive itself. A started-then-stalled clip reports PAUSED explicitly and names 'adom-tts control play'; surface evidence includes the paused state.
v1.9.43 — FIX: a newly-arrived clip was killed on arrival by the PREVIOUS clip's telemetry. The page moved curClipId synchronously while <audio> still held the old clip during blob download, so done/position from clip A were attributed to clip B (cut off ~3s in, falsely reported ok). Page now tracks loadedClipId + sends loaded=0 with zeroed telemetry while downloading and resets the element synchronously; drainer ignores telemetry unless loaded=1. ralph-test T10 reproduces the race (11/11).
v1.9.41 — 2026-08 naming cutover per adom/definitions: pup surface now shells adom-bridge-cli with pup_* verbs (adom-desktop browser_* is gone), ADOM_BRIDGE_TARGET pins the target (legacy var read as fallback), all skills/hints say Bridge (ab)
v1.9.40 — tab flash discipline: alert set with --duration 600 (10-min hard cap survives drainer death) + actively cleared the moment audio finishes, after replays, and at idle close. A flashing tab never outlives its reason.
v1.9.39 — ralph-test harness (tools/ralph-test.sh, 10 field regressions) + adom-tts-test dev skill; restart refuses mid-clip/paused (--force); idle drainer honors History replays; orphans land in History as interrupted; audio_ms fixes the snapshot-blinded stale guard; hash metadata recovery kills garbage headers; adom-tts settings (set surface pup|webview); pup player opens visible (occluded windows cannot play audio)
v1.9.38 — clip freshness moved from header to a pill by the transcript, with the canonical hover tooltip (adom-ui-design/tooltips: body-appended fixed div, cursor-anchored, edge-clamped). Replay-button fix: a watched player no longer idle-closes, so History replay always has a live server.
v1.9.37 — clip freshness: every clip shows WHEN ITS AUDIO was synthesized + how long ago (teal fresh, red when days old); removed the wall clock (the age of the CLIP is what matters, not the current time)
v1.9.36 — player UI shows a live clock + each clip's synthesized date/time and age (red when ancient); drainer refuses to speak audio older than the freshness TTL (stale-audio guard). Root of the June-16-clip-in-August surprise.
v1.9.35 — never auto-replay heard audio (retry only reached==0 no-playback + i_own_lock); restart keeps the portfile so the page never strands on a dead port. Fixes the supersede-replay + port-wedge.
v1.9.32 — fix pup wedge: stable player port across drainer respawns; surface-unavailable names hydrogen; check reads History fallback; skills default to hydrogen