This week was about polish and protection. Co-host sessions went from an 8-minute ceiling to 45 minutes. The episode generation pipeline got quieter, more reliable audio. And a deep security audit closed several cross-tenant holes before they could cause trouble.
New features
Co-host sessions up to 45 minutes
The co-host used to cap at 8 minutes. Recording worked fine past that point, but the assembly step would reject the audio with a 422 error. That's fixed. You can now pick 8, 12, 20, 30, or 45 minute sessions, and the assembly pipeline handles all of them. Behind the scenes, longer sessions are stitched in per-segment chunks to stay within memory limits, then concatenated into the final episode.

Intro and outro directions in prompt-mode episodes
When you generate an episode from a custom prompt, you can now include directions for how the intro or outro should sound. Write something like "open with a cold-open teaser about the surprise statistic" or "close with a teaser for next week" in your episode brief, and the AI will follow those instructions. Directions override the default intro/outro style but never break the word limit, host-label format, or anti-AI-speech rules. If you don't include any guidance, the defaults kick in as before.

Redesigned co-host curation review
After a co-host session, the assembly review screen got a visual overhaul. Each segment now shows a numbered take card with talking points, an include/exclude toggle, and the AI's reasoning for why it kept or set aside each segment. A tone-graded episode shape bar at the top shows the runtime breakdown. The fixed proceed bar at the bottom updates live as you toggle segments in or out.
Improvements
Intro music no longer cuts over the host
Custom intro music used to start playing right as the host began speaking, so the first words got buried under the music. A 400ms silent lead-in now separates the intro asset from the first spoken segment. The gap is tunable via environment variable if you need more or less breathing room, and it only applies when dialogue follows the intro.

Jingle loudness balanced against voice
Custom intro, outro, and transition audio files are now normalized to match the loudness of the TTS voice tracks before stitching. Previously, the final program-level normalization couldn't fix the relative mismatch, so jingles often sounded too loud or too quiet compared to the host. Each asset is cached per feed, and normalization fails open so a missing audio file never blocks generation.
Faster transcription
Episode transcription now runs chunk-by-chunk in parallel instead of sequentially. The whole transcript pipeline also moved to its own background job, so episode generation no longer blocks at 92-96% waiting for speech-to-text to finish. You'll see the progress bar complete faster, and the transcript arrives shortly after.
Co-host pacing and transition fixes
The AI co-host got better at knowing when to move on. A veto system prevents premature topic transitions if the segment is less than 60% covered. Transitions fire at the agent's natural turn boundary instead of interrupting mid-sentence. The co-host also introduces itself properly now, greeting the creator by name and previewing the episode arc before jumping into the first topic.
Episode structure as a single source of truth
The section order for episodes (intro, Q&A call-to-action, segments, Q&A, outro) used to be duplicated across five separate call sites. It's now defined once in a tested function and consumed everywhere. This eliminates a category of bugs where the order could drift between the generation pipeline and the assembly step.
Bug fixes
Scheduled episode generation no longer dies at 95% when transcription takes too long. The transcript timeout was raised, and if the single-shot transcription still fails, it falls back to the chunked path instead of killing the entire run. Episodes that took 30 minutes to generate no longer get thrown away because of a timeout in the last 5%.
Episodes now track transcript status directly. If transcription fails after exhausting retries, the failure is recorded in the database instead of disappearing into Sentry. Auto-publishing to Buzzsprout and Mato now waits long enough for the transcript to finish, and double-checks the database after the timeout window closes.
A stale normalized jingle cache could cause a replaced jingle to keep playing the old audio. Changing your intro or outro music now clears the cached version so the new file gets re-normalized.
The generation progress dialog no longer gets stuck when a job fails with a null error message. Canceling a job that finishes right before the cancel arrives now closes cleanly instead of showing an error toast.
A security audit identified and fixed several issues: test and debug API routes are now blocked in production, admin cover-template endpoints require super-admin access, RSS and URL scraping are protected against server-side request forgery, and HTML sanitization strips control characters before checking for dangerous URL schemes.
