Product note

Behind the New Radio Milwaukee Playlist

Why we rebuilt it, what it does for listeners and music directors, and the part where an AI assistant did most of the typing.

If you've poked around radiomilwaukee.org/playlist lately, you might have noticed it looks different. Faster. Cleaner. There's also a new tool quietly living behind the scenes that our music directors use every day. We've been building both, together, for a few months, and it's at the point where it's worth telling you about.

The thing about NPR music stations

Most public radio in America runs on Grove, NPR's content management system. Grove is a fine one for news organizations: long-form articles, podcasts, calendar events, donor management. That covers most of public radio.

Then there's a smaller corner of public radio that programs music. KEXP in Seattle. KCRW in LA. MPR's The Current in St. Paul. Us at Radio Milwaukee. We're a different animal. Our content isn't articles, it's a continuous stream of songs. The thing our audience cares about isn't "what did you publish today," it's "what's playing right now? What did you spin last week? Who am I supposed to listen to next?"

Grove, sensibly, was not built to answer those questions. So we built our own. The version you're seeing now is v2.

What listeners get

Real-time updates. When a song changes on air, the playlist on the page changes too, within a second or two. No refresh button. The track you just heard on the radio is the track at the top of the list.

The see-them-live row. When a song plays by an artist who's performing locally in the next 90 days, a small amber card appears beneath their play row pointing you at the show. Public radio's job is partly to introduce you to artists. The other half is helping you decide what to do about it. Cool song to want to see them should be a two-second journey, not three browser tabs and a search.

Album art that actually loads. About 95 percent of tracks show real cover art. The other 5 percent, mostly local releases that don't exist on streaming services yet, get a station-branded fallback image.

A search that searches the whole playlist, not just the last 20 tracks.

Embeddable. Any partner station can drop the same widget on their own site with one line of code, and it takes on their fonts automatically.

Designed for older listeners. Public radio audiences skew older. That's not a problem to design around, that's the audience. Every text pair meets a 4.5:1 contrast ratio, every interactive element has a 44-pixel tap target, and there's no autoplay, ever.

What our music directors see

The other half of this project is a tool the public never sees.

Music directors run four streams. They have to keep all of them flowing around the clock, sort out the lookups that came back wrong, and file playlist reports to SoundExchange, the organisation that collects music royalties. Before, all of that lived in spreadsheets and emails and memory.

Now it's one dashboard. A wall of status showing all four streams. A queue that groups the failures by reason, so one click fixes a batch instead of three minutes of surgery per row. The morning ritual takes 90 seconds now, not 30 minutes. And the quarterly report is pick a station, pick dates, click download, which used to take half a day.

How we built it

An AI tool wrote most of this code. Specifically Claude Code, Anthropic's coding assistant.

I'm the digital director here at Radio Milwaukee. I'm not a software engineer. I have enough tech knowledge to be dangerous. I know what makes a good product. I can read code well enough to ask reasonable questions. I cannot, by myself, build a real-time music platform from scratch in a few months.

But I can build it with Claude. I have an idea or notice a problem, I describe it in plain English, and Claude turns out the code. We argue about choices. I push back on the stuff that feels overcomplicated. Claude flags edge cases I'd never think of.

The AI is fast at typing. It's not the one with the taste.

The hardest parts were the design decisions. What should the interface prioritise? Where does the live event row go? When a track fails to resolve, what's the right operator workflow? Those came from twenty years of paying attention to what music directors actually do.

But the typing was the bottleneck for a one-person product team at a public radio station. Removing that bottleneck is what made any of this possible.

A model for other public music stations

We think this is replicable. Public music stations everywhere have the same gap we did, and they've all worked around it the same way: duct tape, spreadsheets, a developer hired for two months whose code nobody understands now.

The pieces here aren't proprietary in any way that matters. If another station wants to adopt this, we'd love to talk.

The bigger story isn't actually about playlists. It's about what's possible when AI coding assistants meet someone with twenty years of domain knowledge and no formal engineering training. Five years ago a project like this needed a six-figure contract and an eighteen-month timeline. Today it's a digital director and Claude.

About this project

PlaylistFM

The music director's morning went from half an hour of cleanup to about ninety seconds.

More