Inspiration
Music services have made listening easy, but often solitary. Each person gets a different recommendation queue and controls every second. I missed radio: a host with a point of view, a show shaped by listener messages, and a shared moment that does not wait in a playlist.
CrowdFM explores how an AI-native radio station could work. For Build Week, it starts small: the app turns one listener story into a complete show, produces it locally, and schedules it fifteen seconds after it is ready.
What it does
A listener submits a radio name and a short message about their life. CrowdFM moderates the request. GPT-5.6 then chooses from a curated catalog of original songs and writes a warm host response based only on the message and verified catalog metadata.
OpenAI text-to-speech records the host's introduction and closing. CrowdFM uses FFmpeg to join those clips with an excerpt that runs from the start of the selected song to its first hook. The result is one continuous MP3. When production reaches READY, the server sets the airtime exactly fifteen seconds later.
The listener presses Tune in once to meet browser audio rules. The server clock then controls playback. The app has no pause, seek, skip, or replay controls. A late listener, or one who reloads, joins at the current broadcast offset instead of restarting the show. The same timeline moves the UI from AI host to now playing to sign-off.
How I built it
CrowdFM is a local Next.js app built with TypeScript, React, Node route handlers, SQLite, Zod, the OpenAI JavaScript SDK, and FFmpeg.
GPT-5.6 receives the sanitized listener message, a host persona, and the full eligible catalog. Strict Structured Outputs make it return an introduction, a closing, and a catalog track ID. The server rejects any ID outside the validated catalog, so the model cannot invent a song or file path. gpt-4o-mini-tts records both host segments in the same voice. OpenAI moderation runs first.
I prepared the music catalog in Suno under a Pro plan. For each of ten editorial themes, I generated two candidates and saved their prompts and source URLs. I then downloaded the masters and built a deterministic import tool that measures each file, ranks each pair, and proposes where the first hook ends. The source MP3s stay local and out of Git; the repository contains only metadata and rights records from the time of generation.
A gap-free HOST → MUSIC → HOST cue timeline describes the final audio. SQLite guards program transitions. The client derives the countdown, live offset, current cue, and ended state from server time.
How I used Codex
I used Codex throughout Build Week. It challenged the product idea, helped turn my decisions into a detailed specification, designed the production state machine and timeline contract, and helped implement each vertical slice. It also helped write failure tests, build the Suno batch analysis tool, replace several browser media sources with one assembled audio file, and verify the full browser journey.
The repository's dated commits show this work. I made the product and rights decisions: the radio format, local-only boundary, scheduling behavior, catalog themes and prompts, licensing policy, and final editorial choices.
Challenges
The hardest problem was making a local demo feel live. Browsers require a gesture before playing audio, generated speech varies in length, and listeners may reload during a show. One fixed audio file and a server-authored timeline handle all three cases without exposing playback controls.
The second challenge was letting the model choose creatively without inventing media. GPT-5.6 returns only a schema-validated catalog ID, and the server resolves every fact the app uses.
Accomplishments
- A complete message-to-broadcast flow that runs locally without accounts.
- A fixed airtime and late-join behavior instead of a disguised playlist player.
- A catalog of original songs with rights records, deterministic analysis, and repeatable metadata generation.
- Failure handling that does not leak prompts, API keys, provider responses, or source masters.
- Unit, integration, and Playwright coverage that uses mock providers and never spends API credits.
What I learned
AI works best here under clear editorial rules and technical limits. The model provides interpretation and personality. The app controls eligibility, facts, timing, state, media access, and failures. I also learned that the audio design shapes the product: one program file feels more like radio and is easier to keep in sync.
What's next
Next, I want to turn CrowdFM from a local demo into a shared station. It should accept many messages, let an AI producer plan a schedule, add human editorial review, keep many listeners in sync, and explain how it selects and creates music—all without giving up the no-skip radio experience.
Built With
- ffmpeg
- gpt-4o-mini-tts
- gpt-5.6
- next.js
- node.js
- openai-api
- openai-moderation
- playwright
- react
- sqlite
- suno
- typescript
- vitest
- zod
Log in or sign up for Devpost to join the conversation.