Dispatch 256
Week ↗

Routing everything through midboy1 and getting the sessions to behave

Friday started with a infrastructure shuffle that turned out to be the only thing that mattered. I moved all the STT and summarizer workloads to the midboy1 P40. Previously, the routing was scattered, but no…

Commits
14
Systems
1
Read
2min
Product capture

Meeting-Ops — live session surface.

Friday started with a infrastructure shuffle that turned out to be the only thing that mattered. I moved all the STT and summarizer workloads to the midboy1 P40. Previously, the routing was scattered, but now every meeting-ops LLM call goes through midboy1 Qwen. It is a cleaner topology. I also exposed the dynamic model dropdown from the system pipeline API so the frontend can actually see what models are available.

That infrastructure change forced a cascade of fixes. The TTS endpoints needed to accept UUIDs, so I added a rename flow and updated the database models to support it. I also had to route the reprocess endpoint to accept UUIDs and render FastAPI error bodies properly instead of just dumping raw exceptions on the UI. If the error handling is broken, the UI looks like it is broken, and nobody wants that.

The real story though is the session management arc. I spent a good chunk of time making the sessions page actually usable. I added a markdown summary renderer and a .md export button. That is 1757 lines of changes across seven files because I had to wire up the batch export, the simple recording DB, and the speaker service. I also auto-seeded the speaker tagger so it is ready to go when a session loads.

The TTS endpoints needed to accept UUIDs, so I added a rename flow and updated the database models to support it.

Speaking of the speaker tagger, I tuned the pyannote service to behave more like the Meeting Minutes Mac app. It now honors speaker hints. If the user knows who is talking, the system listens. I also added a re-detection feature for sessions with multiple speakers. The card titles clamp to a sensible length so they do not break the layout.

The UI needed some TLC to handle all these new features. The detail header now allows long auto-generated titles to wrap instead of truncating them into oblivion. I fixed a bug where KeywordTrend objects were not being coerced to .word before rendering I also added a module-level cache for the AI insights on the session row. The subsequent loads are instant now because we stop hitting the LLM for every refresh.

To keep the system transparent, I built a dynamic Agent and Pipeline Status panel. It pulls real-time data from /api/system/pipeline so I can see what is happening without digging into logs. I also stopped the frontend from polling the pipeline endpoint on auth expiry. That was just noise.

There were smaller wins too. I added cascade delete for session children so cleaning up old data does not leave orphaned records. I extracted fenced JSON for the auto-title generator to make parsing more robust. I also updated the Alembic migration to handle the cascade constraints properly.

The code churn was significant. 14 commits in one day. The biggest single change was the markdown export and speaker tagger seed, but the routing changes set the tone. Everything flows through midboy1 now. The system feels tighter. The sessions page is finally where it needs to be.

Also in the frame

Real product captures — click any to enlarge.

meeting ops