Umroo's Music Mixer
From “something for the ride home” to a playlist that feels like you.

- MY ROLE
- Design & development
- PROJECT TYPE
- Personal project / AI playlist maker
- EXPLORE THE PROJECT
- Source on GitHub Live Website
01 / The idea
A playlist starts with a feeling.
Sometimes I know exactly what I want to listen to, but I cannot name the songs. It might be something warm for the ride home, an energetic mix for a long work session, or a familiar sound with a few unexpected discoveries. A search box understands an artist or a song title. Describing a feeling is a different kind of starting point.
I built Umroo’s Music Mixer to explore that gap: could a small app turn a plain-language request into a playlist that feels intentional? I wanted the listener to spend less time assembling a queue and more time enjoying it, while still having the final say over what ends up in their Spotify account.
02 / The experience
Your words in. A mix to make your own.
The experience begins with a prompt. Describe the mood, mention a reference artist, or ask for a particular number of songs. The app interprets that request, finds candidates, and builds a preview with playlist artwork. You can inspect the result before choosing to save it.
There are two entry points. The public demo searches Spotify’s live catalog without requiring login; it cannot read your library or save to your account. Invited Spotify users can connect their account, bring their listening taste into the mix, and save a playlist after reviewing it. A seeded catalog keeps local development usable when Spotify credentials are missing.
This is a playlist maker, rather than an audio-mixing desk. The product arranges recordings into a listening experience; it does not stream, edit, or download Spotify audio.
03 / The build
From one big question to smaller steps.
The interesting engineering problem is how to connect a flexible request to real recordings. Asking a model to invent a complete track list leaves too much room for guesses. The current implementation divides the work: AI interprets the listener’s own words, music services supply evidence, and application code selects and orders the tracks.
The frontend uses Next.js, React, TypeScript, and Tailwind CSS. Convex supports persistent account history and a shared enrichment cache. The Vercel AI SDK connects the planning layer to an OpenAI-compatible provider. Groq is the primary planner, with Cloudflare planning and local heuristics available as fallbacks.
I would describe the journey as a series of smaller questions: what does the listener mean, which songs actually exist, which ones fit, and how should they flow together? Giving each question its own stage makes the behavior easier to inspect and gives the app a way to keep working when an optional service is unavailable.
04 / Under the hood
A little AI. A lot of deliberate decisions.
Planning comes first. The listener’s prompt becomes a structured plan with search queries and constraints, including an explicit song count when requested. Spotify retrieves candidate recordings, while a connected listener’s library can provide familiarity signals. Spotify library data is kept out of AI planning inputs.
The next stage adds musical evidence. ReccoBeats supplies audio features and recommendations, Last.fm contributes community tags and reference similarity, and MusicBrainz helps resolve recordings where evidence is missing. These lookups are bounded and cached so repeated work does not have to start from scratch.
Local scoring then evaluates the candidates against the request. Code enforces constraints such as artist scope, clean content, energy, and library preferences. Deduplication, familiarity balancing, and artist-run sequencing shape the final mix. When too few recordings qualify, the preview shows the shortfall instead of filling the playlist with unrelated songs.
Artwork generation runs alongside selection. Cloudflare Workers AI generates a cover, and Sharp adds the playlist name, a readability overlay, and a watermark. The finished preview brings the music and artwork together. Spotify is changed only after the listener approves saving the playlist.
05 / Product decisions
Make discovery feel approachable.
The interface gives the prompt room to breathe. A calm background, expressive typography, and a clear invitation make the first step feel like describing something to a friend. The goal is to help people try an idea without needing to understand the pipeline behind it.
The demo matters because it offers a way to explore before connecting an account. Account access and catalog access have different responsibilities, and the interface makes that distinction visible. History follows the same principle: connected mixes belong to the Spotify account, while demo history stays in the visitor’s browser.
06 / Looking back
The part I want to keep exploring.
My biggest takeaway from this project is that a useful AI feature needs more than a clever prompt. It needs reliable inputs, clear boundaries, a way to handle missing evidence, and a preview that lets the person make the final decision. Those surrounding details are what turn a suggestion into something usable.
Next, I would like to study how people describe a good mix and where the results miss their intent. Better feedback, clearer explanations for track choices, and more thoughtful sequencing are directions worth exploring. For now, this project is an experiment in making music discovery feel a little more personal.
Built with intention.
Thanks for reading.
