I was struggling with the post-production bottleneck of my own podcast. I loved recording and editing the audio, but the moment the episode was finalized, the dread set in. Writing show notes, crafting a catchy title, and formatting transcripts took hours. I was spending more time on administrative tasks than on actual content creation. I looked at existing tools, but they were either too expensive, locked behind massive enterprise SaaS platforms, or just didn't understand the specific nuance of audio content. So I decided to build something.
The Context Switching Problem
The core issue with podcast post-production isn't just the time it takes; it's the context switching. When you finish recording, you're in a creative flow. Shifting gears to write SEO-optimized descriptions, generate script outlines for future episodes, or format timestamps breaks that flow entirely. For independent creators, this friction often leads to delayed uploads or, worse, burnout.
The cost of ignoring this friction is a stalled content pipeline. If the administrative overhead of publishing outweighs the joy of creating, the podcast eventually dies. I needed a way to automate the tedious parts without sacrificing the quality and structure that listeners expect from professional shows.
Architecting for the Edge
When I started designing PodCrisp, I had a major architectural decision to make: where should the AI inference happen? Traditional setups route everything back to a central origin server or rely on third-party API wrappers that add unnecessary latency. For a tool processing long transcripts and generating structured show notes, latency and context window management are critical.
I chose to build the entire backend on Cloudflare Workers, leveraging their AI inference capabilities at the edge. This means the heavy lifting of processing transcripts and generating content happens in data centers physically closer to the user, reducing round-trip times and keeping data processing localized.
Let's look at how the show notes generation pipeline actually works under the hood. Instead of just dumping a raw transcript into a large language model and hoping for a coherent summary, I designed a specific prompt structure to enforce consistent, usable output.
// Show notes generation pipeline (Cloudflare Workers + AI)
export default {
async fetch(request, env) {
const { transcript } = await request.json();
// Call AI model for structured show notes at the edge
const response = await env.AI.run('@cf/meta/llama-3-8b-instruct', {
messages: [
{
role: 'system',
content: `Convert podcast transcripts to show notes:
## Episode Summary (2-3 sentences)
## Key Takeaways (5-7 bullet points)
## Timestamps (estimate from content flow)
## Resources Mentioned`
},
{ role: 'user', content: transcript }
],
max_tokens: 800,
});
return new Response(JSON.stringify(response), {
headers: { 'Content-Type': 'application/json' },
});
},
};
The worker intercepts the incoming request, parses the transcript, and passes it to a model running on Cloudflare's edge network. Notice the system prompt. It doesn't just say "summarize this." It explicitly defines the markdown structure: Summary, Key Takeaways, Timestamps, and Resources. This structural enforcement is what turns a raw AI response into a usable podcast asset.
I applied a similar philosophy to the title generation. It's not just about summarizing; it's about curiosity and hooks. I built a dedicated prompt engineering module that forces the model to adhere to strict length and style rules, ensuring the titles make someone actually want to click play, without crossing the line into misleading clickbait.
Another architectural choice was integrating SEO keyword suggestions directly into the episode description writer. By analyzing the transcript first, the system can extract relevant terms and naturally weave them into the metadata, helping podcast pages rank better without sounding robotic. When generating episode script outlines, the iterative nature of planning requires multiple back-and-forth API calls. By keeping the inference at the edge, the latency penalty for these multiple calls is minimized, allowing creators to refine their outlines in real-time.
Practical Results and Trade-offs
Moving to the edge architecture completely changed the performance profile of the application. The time it takes to generate a full set of structured show notes from a long transcript is significantly faster than a centralized setup. I also noticed that running the inference at the edge provided a more consistent experience globally. Users in different regions weren't experiencing the massive latency spikes we used to see when routing everything back to a single US-based origin server.
What surprised me most was how much the explicit system prompts reduced hallucinations. By forcing the model to estimate timestamps based on content flow rather than inventing them out of thin air, the output became instantly usable for creators.
If I were to change one thing about the current architecture, I would implement streaming responses for the UI. Right now, the worker waits for the full JSON response before returning it. Streaming the markdown tokens as they are generated would make the interface feel even more responsive, though it adds complexity to the client-side parsing and state management.
Try the Title Generator
If you're a podcaster looking to streamline your workflow and test out some of this prompt engineering, I've packaged the title logic into a free tool. You can try the Podcast Title Generator on the PodCrisp site to see how the architecture translates into actual episode hooks.
Full disclosure: I'm the developer of PodCrisp. I built this because I needed it myself.
Top comments (0)