Dispatch 260
Week ↗

Audio, Action Items, and the Death of Whisper

The headline for today is not the 26 commits. It is the audio stack. I spent the bulk of the day tearing into the meeting ops frontend because the microphone experience was fragile. The VAD engine was ignori…

Commits
26
Systems
3
Read
2min
Product capture

Meeting-Ops — session summary with speakers and action items.

The headline for today is not the 26 commits. It is the audio stack.

I spent the bulk of the day tearing into the meeting ops frontend because the microphone experience was fragile. The VAD engine was ignoring user preferences, and hot-swapping devices would crash the session or leave you on the wrong input. That is unacceptable for a tool people rely on for work. I rewrote the audio device picker to respect the user's selection in the VAD engine, added hot-swap support on devicechange, and built a per-session override with a live VU meter. That single commit touched twelve files and added 1,783 lines. It is solid now. You pick a mic, it works. You unplug it, the system adapts.

With the audio pipeline stabilized, I could finally retire the meet-whisper container. It was a legacy dependency that bloated our images and slowed down startup. I migrated the default STT provider to parakeet-server and integrated browser-side Parakeet 0.6B INT8 STT. The server 1.1B instance is still there as a fallback for high-accuracy needs, but the default is now local and fast. I also dropped the baked-in Whisper images, saving about 880 MB. The cleanup did not stop there. I deleted the dead meet_chunks pipeline and the associated /api/rag/chat endpoint. That endpoint had payload-key drift and a cross-org leak risk. The canonical meeting_transcripts pipeline covers the use case anyway. I also dropped the orphan meeting_chunk_embeddings table to keep the database schema clean.

I spent the bulk of the day tearing into the meeting ops frontend because the microphone experience was fragile.

The other major arc was action items. They were buried in session final summaries, hidden away where people never looked. I promoted them out of the summary into a first-class table. This involved a migration, a new API endpoint, and a dedicated frontend component for recent action items on the dashboard. It is a small change in the grand scheme, but it makes the data discoverable. I also built a tool-using meeting-rag agent for the dashboard ask bar, so users can query their meeting history directly.

On the frontend, I switched the in-browser LLM default to Qwen 3 0.6B. It is fast, accurate, and respects privacy since it runs locally. I added a local-only privacy mode for sensitive sessions and integrated a Granola-style live summary with a slice stack and auto-trigger. The dashboard landing page is now the default route, replacing the old session list. It gives users a clear starting point with recent meetings, stats, and action items.

In the listing ops repo, I fixed the eBay token refresh logic. The banner was only catching expiry errors, not actual refresh failures. Now it catches both. I also preserved the actually-granted scopes on token refresh, which was being overwritten. I documented the OAuth scope-overwrite incident so we do not repeat this mistake. The AI Price contributor check no longer loops five times on a PermissionError. It fails fast and moves on.

Also today: I bumped the unicorn ecosystem config for the midboy2 server and registered it in the infrastructure mesh. The meeting ops frontend got a minor version bump to 0.6.0.

The day added up to a cleaner, faster, and more reliable meeting tool. The audio stack is no longer a liability. The action items are visible. The legacy code is gone.

Also in the frame

Real product captures — click any to enlarge.

listing ops
meeting ops
shared memory