PortLevchevron_rightBuild Logschevron_rightPodcast Publishing OS
buildBuild Log #009

How I Built
The Podcast OS
in Three Weeks

A Portfolio Executive's walkthrough of the Claude Code native production OS for The AI Wage Gap podcast. Drop a Riverside recording in a folder; six agents do the VA work. Show notes, clips, thumbnails, Transistor, YouTube, beehiiv and LinkedIn. From one slash command.

YK

Yuri Kruman

Host, The AI Wage Gap podcast · Jun 2026

$0.65

marginal cost per episode

$0

/mo Castmagic + Buffer + n8n replaced

0h

human time per episode

0

subagents in the pipeline

bolt

The 30-Second Version

The Podcast Publishing OS is a Claude Code native production system. Each episode is a folder under episodes/ep_NNN/. You drop a Riverside recording into raw/ and run /podcast-build ep_NNN. Six subagents fan out in parallel and write the full content kit: show notes, blog, LinkedIn carousel, tweets, newsletter, YouTube description, titles, vertical clip picks, thumbnails. /podcast-qa runs a 12-dimension review. /podcast-distribute schedules Transistor + YouTube + beehiiv + LinkedIn for next Tuesday 06:00 ET.

report

The Problem

Solo podcasters paying $120+/mo for Castmagic+Buffer+n8n and still doing 4 hours of VA work per episode.

memory

The Stack

Claude Code (orchestrator) + Node scripts + Anthropic SDK + Transistor + YouTube + beehiiv + LinkedIn + Opus Clip.

block

What It Doesn't Need

No Castmagic. No Buffer. No n8n. No Make. No VA. No course-platform LMS.

timer

Build Time

Three weeks: one for the agents and orchestration, two for distribution APIs.

If you are a solo podcaster who has ever sworn at Castmagic, fought a Zapier, or paid a VA to do what an agent can do, this build log is for you. The point is not that you should clone podcast-os. The point is that production OS is a folder pattern plus seven prompts, not a SaaS.

Part 1

Why a Claude Code Native OS, Not n8n

I had been running the AI Wage Gap podcast on the standard stack: Riverside for recording, Castmagic for transcripts and show notes, Buffer for scheduling, ConvertKit for email, manual upload to Transistor and YouTube. Per episode that was:

$120+/mo

Castmagic + Buffer + Riverside + ConvertKit + Opus Clip stack

3-4 hrs

per episode reformatting Castmagic output into Yuri's voice

0

platforms that let me prompt-cache a brand-voice doc

2 days

it takes a bug in Zapier to surface itself

The thing nobody at Castmagic will tell you: it's a Claude wrapper. The whole product is one prompt with a CMS UI on top. You don't need Castmagic. You need Claude with prompt caching on YOUR brand-voice doc.

  1. 1Claude Code is the orchestrator. Slash commands invoke subagents. Subagents run Node scripts. Node scripts call APIs. The orchestrator is free.
  2. 2Each episode is a folder. Everything an episode needs (raw, generated, qa, clips) lives in episodes/ep_NNN/. State transitions are tracked in state.json.
  3. 3Brand voice is prompt-cached. 5-minute TTL cache on the brand-voice doc makes each subagent call ~80% cheaper.
starThe Single Most Important Design Call

Voice rules are a hard-failing build gate, not a vibe.

Every content file goes through scripts/lib/voice-rules.js before it is written to generated/. Em dashes, Oxford commas and the 18 AI-tell phrases hard-fail the build. The episode does not ship until the voice passes. Without this gate, AI cliches creep in and the brand decays. With this gate, every episode sounds like me at compounding return on a $0.65 cost.

Part 2

The Stack (and Why Each Piece)

Click each layer for the reasoning.

terminal

Orchestrator

Claude Code (slash commands + subagents)

expand_more

7 slash commands wired in .claude/commands/. 7 subagents in .claude/agents/. settings.json tool-allowlist locks down what each agent can do.

psychology

Reasoning

Opus 4.7 + Sonnet 4 + Haiku 4 (per agent)

expand_more

Show notes, blog, newsletter use Opus (high-stakes long-form). QA, voice humanizer, title judge use Sonnet. Clip metadata + thumbnail brief use Haiku. Right tool for each task. Brand-voice doc cached on every Anthropic call.

videocam

Recording

Riverside (local-recording, Co-Creator)

expand_more

4K + WAV. Local-recording mode means even bad WiFi doesn't ruin the take. Co-Creator cuts fillers and normalizes audio before you download. The OS only consumes the post-Co-Creator master files.

podcasts

Distribution

Transistor + YouTube + beehiiv + LinkedIn

expand_more

Transistor: $19/mo flat, REST API for episode upload + scheduling. YouTube: Data API v3 + OAuth refresh token (one-time consent). beehiiv: REST API for newsletter scheduling. LinkedIn: personal-profile API (no native scheduling; cron fires Tuesday 07:00 ET).

cut

Vertical Clips

Opus Clip API (or manual drop)

expand_more

Opus Clip's enterprise API generates 9:16 vertical clips with auto-captioning. Fallback: drop manually-clipped MP4s + clip_metadata.json into clips/; clip-curator-agent ranks and picks top 5 either way.

rule

Voice Lint

scripts/lib/voice-rules.js

expand_more

Hard fail on em dash, Oxford comma, AI openers ("certainly", "great question"). Soft warn on "delve", "tapestry", "navigate" (verb), "leverage" (verb), "It's not X, it's Y", "Here's the thing". On hard fail, retry once with stricter prompt. Second fail halts and surfaces.

Part 3

The Six-Phase Build Sequence

Each phase is ~2-4 days. The voice rules are written BEFORE the first generation agent or you ship em dashes on day one.

FolderVoiceBuildQAShipAmplify
1
~6 HOURS

The Per-Episode Folder Pattern

Every episode is a self-contained folder under episodes/ep_NNN/. State is a single state.json file. Stages transition: init → raw_ready → building → qa_pending → qa_passed → scheduled → aired.

episodes/ep_001/ layout
episodes/ep_001/
  state.json              // {stage, guest, drop_date, ...}
  raw/
    master.mp4
    master.wav
    transcript.json
    guest.json
  research/
    brief.md
  generated/
    show_notes.md
    blog_post.md
    linkedin_posts.md
    tweets.md
    newsletter.md
    youtube_description.md
    titles.json
    thumbnails/01.png 02.png 03.png
  clips/
    clip_01.mp4 ... clip_NN.mp4
    clip_metadata.json
    top_5.md
  qa/
    qa_report.md
  build_summary.md
  amplify_kit.md
  social_queue.json
  publish_log.jsonl

No global state. Every artifact for every episode is in one folder. Catastrophic recovery is "copy that folder."

Part 4

What I'd Do Differently Today

1

Skip Opus Clip's enterprise API in v1

$29/mo for an API tier was a lot of dev for partial reliability. Manual clipping plus the clip-curator-agent ranking metadata works fine for the first 20 episodes. Add the API later if volume justifies.

2

Settle YouTube OAuth in week one, not week three

The YouTube refresh-token flow is the most annoying setup in the whole stack. Do it on day 1 while you have patience. Doing it on day 18 when you want to ship is a recipe for skipping YouTube entirely.

3

Auto-trigger on file drop via PostToolUse hook

A .claude/hooks/settings.json PostToolUse hook can fire /podcast-build the moment a new master.mp4 lands. I shipped without it. Adding it cut another 5 minutes of human time per episode.

4

Plan for multi-show from commit #1

The single-show assumption is in too many places. Copying the repo for a second show works but is brittle. A shows/{slug}/ dimension would have been a 1-hour decision in week 1, a 1-day refactor in month 6.

Part 5

Adapt This for YOUR Recurring Long-Form Production

The architecture (folder → voice gate → parallel build → QA → distribute → amplify) is the template for any recurring long-form production pipeline. Five adaptations off the same skeleton:

ProductionRaw InputGenerated KitDistribution
YouTube channelRaw video + transcriptTitle, description, chapters, tags, end-cardYouTube + Shorts
Webinar seriesRecording + slidesBlog recap, LinkedIn carousel, lead magnetSite + LinkedIn + email
Course moduleLecture video + transcriptLesson, quiz, exercise, slide deckMaven / Skool
Customer case studyInterview recordingStory long-form, sales one-pager, socialSite + sales + LinkedIn
AI Wage Gap podcastRiverside master + transcriptShow notes, blog, newsletter, social, clips, thumbsTransistor + YT + beehiiv + LinkedIn
Part 6

Starter Prompts for Claude / Cursor

If you want your production OS shipping next week, these four prompts get you there.

PROMPT 1Folder + state contract

"Write scripts/init-episode.js (or init-EPISODE_NOUN.js) that scaffolds episodes/ep_NNN/ with subfolders raw/, research/, generated/, clips/, qa/, plus a state.json with {stage: 'init', episode_id, slug, guest, drop_date}. Define the stage enum: init → raw_ready → building → qa_pending → qa_passed → scheduled → aired. Each stage transition appends to episodes.jsonl as a global event log."

PROMPT 2Voice lint + brand voice

"Write prompts/_brand_voice.md as the single source of truth for [HOST] voice: 3-5 sentence essence, 10 verbatim phrases to keep, 18 phrases to ban (em dash, Oxford comma, AI tells). Write scripts/lib/voice-rules.js exporting lint(text) and tryRetryPrompt(violations). Anthropic prompt-cache the brand-voice doc on every call with 5-min TTL. Include a unit test that fails on at least 5 banned-phrase examples."

PROMPT 3Parallel build subagents

"Set up .claude/agents/ with 6 subagents for podcast production: notes-agent (show_notes.md + blog_post.md, Opus), amplify-agent (linkedin_posts.md + tweets.md + newsletter.md, Opus), title-judge-agent (Sonnet), voice-humanizer-agent (Sonnet), clip-curator-agent (Sonnet), thumb-agent (Haiku brief + OpenAI gpt-image-1). Set up .claude/commands/podcast-build.md as a fan-out slash command that runs all 6 in parallel against episodes/ep_NNN/raw/. Each agent reads transcript.json; each writes to generated/."

PROMPT 4Distribute slash command

"Write scripts/5-publish-transistor.js, 6-publish-youtube.js and 7-schedule-beehiiv.js. Each takes an episode_id, reads episodes/ep_NNN/, and POSTs to the platform's API with status=scheduled, scheduled_at=next Tuesday 06:00 ET. YouTube needs the OAuth refresh-token flow documented inline. beehiiv reads newsletter.md and sends as scheduled with send_at=Tue 07:30 ET. All three append a line to publish_log.jsonl and update state.json stage to 'scheduled'."

What the Podcast OS Is Not

It is not a recording platform. It does not replace Riverside. It is not a hosting platform; Transistor stores the audio. It is not a VA service; it replaces what a VA would do, but it does not replace your judgment on the Tuesday-morning amplify pass.

What it is: a production OS that lives where you already work — Claude Code, with folders and slash commands. The narrowness is the point. Podcast tools that try to also be the recording, hosting, CRM and CMS become Castmagic. Production OS that does ONE thing — turn a recording into a publishable kit — compounds.

The question is not
"can I publish a podcast?"

The question is:

"What is the marginal cost of MY next episode, and what would it take to drop it under $1 without giving up voice or quality?"

Answer that and you have a folder pattern. The next three weeks are the agents and the distribution. Then it ships every Tuesday at a price you can stop thinking about.

This walkthrough is part of the Portfolio Leverage Co. Build Bench series. For the cohort where we build these together, apply here.