Commit

c3e2102

Grant approved, thanks. Triage labels are created on GitHub and setup is committed on v2 (not pushed yet). Next: push v2, then turn your directions into a spec issue? I'd grill you on open questions first, e.g. "server-side VAD": our server, or Qwen's server_vad mode?
Please push for server-side VAD. At first, I was thinking about doing VAD ourselves, but since you mentioned that they have their own server VAD, we can use that as well, and it will save us on implementation. In the future, we may be supporting multiple transcription models.…
Bun it is: bun:sqlite, Bun.serve WebSockets, a Dockerfile with one data volume for Dokploy. Next: frontend. Default is React via Bun's HTML imports, served by the same process (no separate build server). OK?
Ok as long as we can deploy new server version robustly. Existing connection can cut, but can recover with no data loss. I also have a Sockudo instance, maybe viewers can get notified of changes through it instead? What do you think?
Good idea. Viewers stay connected while our server redeploys, and fan-out is off our process. Plan: viewer loads a snapshot over HTTP, then applies Sockudo events carrying a sequence number; on a gap or reconnect it refetches. Sender still talks WS to us directly. Sound right?
Next: should the sender's local buffer survive a tab reload or browser crash? Default: write chunks to IndexedDB, so a reopened sender page resumes uploading what the server hasn't acked, and old acked chunks get pruned.
Yes, but it is possible that we will be streaming for the whole day. So just make sure we don't run into problems with the storage space on the browser
Raw PCM is ~115 MB/hour, so a day would be over 1 GB. But acked chunks are deleted right away, so the browser only holds the unsent backlog. The sender shows the backlog size and warns as it nears the browser's quota.
Next: the transcript. Default: a list of segments, each tied to an audio time range, so any segment can be re-transcribed or LLM-cleaned later and replayed as audio. Should admins also be able to hand-edit text live?
Yes, it should also provide a simple REST-based API so that the admin can hand it over to the AI agent to edit. Let's aim for an append-only architecture so that we can recover from bad edits. To reclaim the storage space on the server, we can delete the room as a whole after…
Timestamps: qwen3-asr-flash-realtime gives none on transcripts, but its server VAD emits speech_started/stopped with audio_start_ms/audio_end_ms, so we get segment-level times. qwen-audio-3.1-asr-flash-streaming has word-level begin/end times. Both take opus input.
Clock sync idea: ignore the client wall clock. A stream gets a random id; chunk n is at stream offset n*100ms. While connected, client pings with its elapsed time since stream start (monotonic); server estimates stream start in server time from the lowest-RTT ping. Good?
Last one before I write the spec: the public viewer. Default is a live scrolling transcript (partial text shown dimmed), auto-scroll with pause on scroll-up, a fullscreen caption mode for projectors, and a text export. Anything to add or drop?
The public viewer should also contain a section on how to connect the AI agent so that it can read the transcript efficiently. Regarding Opus, I wonder if the client should be the one encoding Opus packets, or should it be that the client is sending raw PCM stream and the server…
Agent section in the viewer: noted. Opus: I'd encode on the client with WebCodecs AudioEncoder. That shrinks both the IndexedDB backlog and upload on venue wifi by ~10x, which is where robustness matters most. Raw PCM stays as a fallback if the browser lacks it. Server stores…
Correction: opusscript is itself an Emscripten build, not a native addon, so it already is the safe choice. No need to swap it.

commit c3e2102

Ok good. By the way, in contrast to Matt Pocock's skills, I will not be using multiple separate sessions to implement stuff. But I will use this long-running session for most of the work, but you should feel free to delegate to sub-agents to work autonomously.