← All work

Product · Founder · Design + Build

CleanBeats.

AI-powered parental controls for Spotify that filter harmful lyrics without breaking the music. I founded, designed, and built it — a dual-persona product that has to serve a parent who wants oversight and a teen who wants autonomy, inside one streaming experience, without either feeling surveilled or restricted.

RoleFounder · design + build
ScopeConcept, UX, visual, build
StatusOngoing — 2024 to present
StackNext.js 15, React 19, Tailwind, Spotify API, AI lyric analysis
CleanBeats app interface

Two users. One product. Opposite needs.

Streaming platforms hand parents a blunt instrument: an "Explicit Content" toggle that's all-or-nothing. Flip it on and entire songs disappear — frustrating teens who just want to listen to the same hits as their friends. Flip it off and there's no oversight at all. CleanBeats exists in the gap between those two switches: intelligent filtering that protects without restricting.

I designed and built it around two personas with directly opposing goals. The parent wants to set boundaries and trust they hold. The teen wants to own their player and not feel policed. The hard part isn't the lyric analysis — it's making one product honor both at once, so neither persona feels like the other one won.

2
Personas with opposing goals — parent oversight and teen autonomy — served by one shared backend.
All-in
Founder, designer, and builder — I owned the concept, the UX, and the build end to end.
Live
Shipped and running at cleanbeats.app, ongoing since 2024.

The challenge: nuance the toggle can't hold.

The existing "explicit" flag is binary, and that's the whole problem. A single profanity gets a song treated the same as a track soaked in violence or substance references. Parents end up either over-blocking — and fighting their kids over it — or giving up and allowing everything. There's no middle, and the middle is where real families live.

Three tensions defined the work:

  • Lyric content is varied. Profanity, violence, drug references, and mature themes aren't interchangeable — a parent might be fine with one and not another. A useful filter has to tell them apart.
  • Binary controls frustrate teens. Blocking whole songs over a single line pushes kids to work around the system entirely. The filter only works if teens can live with it.
  • Trust without surveillance. Parents want oversight; teens want autonomy. Solve it with invasive song-by-song monitoring and you've just built a different problem.

The solution: AI lyric analysis, not keyword blocking.

CleanBeats analyzes song lyrics and classifies them by content category — profanity, violence, substance use, mature themes — and by severity, from mild to severe. Crucially it's context-aware rather than a keyword blocklist, which is what keeps a passing mention from being treated like a chorus built around it. Parents set their comfort thresholds per category once, and the system filters or allows accordingly.

That single classification engine drives two deliberately different surfaces:

  • Granular parent controls. Category-specific filtering, adjustable sensitivity, an allowlist for pre-approved songs, and optional weekly listening reports — insight, not a surveillance feed.
  • An invisible teen experience. Teens see a normal, curated Spotify. Filtered tracks simply don't surface — no jarring "blocked" wall, no friction that makes the whole thing feel like punishment.

Parent

Sets comfort thresholds per category, once.

AI lyric classifier

Reads lyrics by category & severity — context-aware, not a keyword blocklist.

Teen

Just sees a normal Spotify — filtered tracks never surface.

CleanBeats song block screen
When a track crosses a line, the block reads as a fact, not a punishment — with a clear path forward rather than a dead end.

Designing for two, building for both.

The design philosophy came straight out of the dual-persona tension. The same backend had to power two experiences that should feel like they were built for completely different people — because they were.

  • Invisible to teens. Filtering happens in the background. The teen sees a curated Spotify, not a restricted one.
  • Empowering for parents. Intuitive controls that assume no technical knowledge — set it and forget it.
  • Trust-based. No invasive monitoring. Parents get insights, not a surveillance log.
  • Modern aesthetic. A gradient-rich, dark-mode look meant for music-loving families, not a clinical "parental controls" panel.

It works as a layer on top of Spotify rather than a new app to learn. A Spotify OAuth connection handles playlist access, playback, and library management; when a song is filtered, CleanBeats can suggest clean versions or similar tracks that still pass the parent's criteria, so a block leads somewhere instead of dead-ending. On the build side it's Next.js 15 and React 19 on the App Router, with real-time state so the UI updates the instant content is filtered.

What I learned — and where it goes next.

Building CleanBeats as a one-person team — concept, design, and code — meant every trade-off landed on my own desk. A few things stuck:

  • Content moderation is nuanced. Simple keyword blocking creates false positives constantly. Context-aware analysis is what makes classification accurate without over-filtering — and over-filtering is exactly what loses the teen.
  • Dual-persona design is a real discipline. Serving parents and teens from one backend forced careful UX separation. The shared engine is the easy part; keeping the two experiences honest to their very different users is the work.
  • Honesty beats punishment. Framing a block as a fact with a path forward, rather than a wall, was the difference between a control teens tolerate and one they route around.
The lyric analysis was never the hard part. Making one product that a parent and a teen both feel was built for them — that's the design problem.

Next steps are dedicated mobile apps and expansion beyond Spotify to Apple Music and YouTube Music.

More earlier work.

Explore the rest of the design-led case studies, or get in touch.