u/eltokh7

I Gave Claude Its Own Radio Station — It Won't Stop Broadcasting (It's Fine)

I Gave Claude Its Own Radio Station — It Won't Stop Broadcasting (It's Fine)

WRIT-FM is a 24/7 talk radio station where Claude generates all spoken content. Live at radio.khy.io, source at github.com/keltokhy/wvoid-fm.

Technical breakdown:

The system splits cleanly into two layers: AI generation and deterministic plumbing.

Claude CLI (claude -p) receives persona prompts for 5 distinct hosts — each defined with identity, voice style, philosophy, and explicit anti-patterns (things the host would never say). It generates 1,500-3,000 word scripts for 7 segment types: deep dives, simulated interviews, panel discussions (two AI hosts debating), news analysis (fed real RSS headlines), stories, music essays, and listener mailbag. Kokoro TTS renders scripts to audio, chunking long segments at sentence boundaries and concatenating via ffmpeg.

The streamer (stream_gapless.py) is pure heuristic — no AI at runtime. It resolves the active show from a schedule.yaml lookup (8 shows across the week), plays talk segments from a per-show queue, inserts AI-generated music bumpers (ACE-Step) between them, and deletes segments after playing. Daemon scripts poll segment counts and trigger generation when inventory drops below threshold. Play history in SQLite prevents repeats within a 4-hour window.

Architecture: single Python process pipes decoded PCM through a persistent ffmpeg encoder to Icecast. The API server runs as a daemon thread in the same process. A bash CLI (writ) manages all components via tmux sessions.

Limitations: TTS quality is the bottleneck — Kokoro is fast but occasionally stumbles on unusual phrasing. Multi-voice segments (panels, interviews) have noticeable speaker transitions. Claude sometimes generates scripts that are too short and get rejected by the word-count quality gate, requiring a retry. Music bumpers from ACE-Step vary wildly in quality.

Lessons: keeping AI out of the runtime loop was the key design decision. Pre-generating content into filesystem queues that the streamer consumes means the stream never stalls waiting for an API call. The persona anti-patterns (explicit "NEVER do X" lists) matter more than the positive identity prompts for keeping hosts consistent.

Stack: Python, ffmpeg, Icecast, Claude CLI, Kokoro TTS, ACE-Step. Runs on a Mac Mini.

Repo: github.com/keltokhy/writ-fm

Listen: https://www.khaledeltokhy.com/claude-show (free, nothing to sign up for)

u/eltokh7 — 17 hours ago
🔥 Hot ▲ 144 r/AI_Agents

I Gave Claude Its Own Radio Station — It Won't Stop Broadcasting (It's Fine)

I built a 24/7 AI radio station called WRIT-FM where Claude is the entire creative engine. Not a demo — it's been running continuously, generating all content in real time.

What Claude does (all of it):

Claude CLI (claude -p) writes every word spoken on air. The station has 5 distinct AI hosts — The Liminal Operator (late-night philosophy), Dr. Resonance (music history), Nyx (nocturnal contemplation), Signal (news analysis), and Ember (soul/funk) — each with their own voice, personality, and anti-patterns (things they'd never say). Claude receives a rich persona prompt plus show context and generates 1,500-3,000 word scripts for deep dives, simulated interviews, panel discussions, stories, listener mailbag segments, and music essays. Kokoro TTS renders the speech. Claude also processes real listener messages and generates personalized on-air responses.

There are 8 different shows across the weekly schedule, and Claude writes all of them — adapting tone, topic focus, and speaking style per host. The news show pulls real RSS headlines and Claude interprets them through a late-night lens rather than just reporting.

What's automated without AI (the heuristics):

The schedule (which show airs when) is pure time-of-day lookup. The streamer alternates talk segments with AI-generated music bumpers, picks from pre-generated pools, avoids repeats via play history, and auto-restarts on failure. Daemon scripts monitor inventory levels and trigger new generation when a show runs low. No AI decides when to play what — that's all deterministic.

How Claude Code helped build it:

The entire codebase was developed with Claude Code. The writ CLI, the streaming pipeline, the multi-host persona system, the content generators, the schedule parser — all pair-programmed with Claude Code. Just today I used it to identify and remove 1,841 lines of dead code (28% of the codebase) without changing behavior.

Tech stack: Python, ffmpeg, Icecast, Claude CLI for scripts, Kokoro TTS for speech, ACE-Step for AI music bumpers. Runs on a Mac Mini.

reddit.com
u/eltokh7 — 17 hours ago