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.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.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.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.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)