Inspiration
Imagine finishing Interstellar and wanting to discover music that captures something about the experience. Not necessarily its soundtrack, or even the same genre. Just something that resonates in a similar way. How do you search for that? Most music platforms expect you to already know what to look for: an artist, a song, or a genre. But taste isn't that neatly separated. The movies I love, games I play, and stories I remember all influence what I enjoy listening to. That was the starting point for TasteProbe. I wanted to build a music-discovery experience that starts with something you already love, uses cultural connections to find new music, and gradually learns from your reactions. The idea was simple: you shouldn't need to know the name of your next favorite song to find it.
What it does
TasteProbe turns cultural interests into a personalized music-discovery journey.
1. Start anywhere. Choose a movie, music artist, TV show, video game, or podcast. TasteProbe uses Qloo's Taste AI API to discover music artists connected to your selection.
2. Narrow down your taste. The system asks up to three preference questions. These aren't randomly generated; a question-selection algorithm uses the available candidates and their attributes to identify useful distinctions. Gemini can assist with the decision.
3. Actually listen. TasteProbe finds real recordings associated with the recommended artists, verifies their attribution, and lets you hear a short preview or the full recording through YouTube's official player.
4. React, and watch the recommendations change. You can Love a recording, select Not for me, move to the Next song, or express preferences about an artist. Every meaningful reaction updates the recommendation state. The system decides what to play next, whether that means another recording by the same artist or exploring someone new.
5. Go beyond the original recommendations. This is where the Adaptive Taste Walk comes in. Instead of staying within the artists initially connected to your starting point, TasteProbe can use artists supported by your listening choices as new seeds for Qloo queries. It explores their cultural neighborhoods, discovers additional artists, and folds those results back into the recommendation pool. The journey becomes: Starting Interest → Qloo Discovery → Listening → Feedback → New Cultural Connections → Further Discovery
6. Keep what you discover. Your Sound Passport saves recordings you want to revisit, along with the cultural context that led you there. It works locally in your browser without requiring an account.
How I built it
The application uses Next.js 16, React 19, TypeScript, Qloo, Gemini, YouTube, and Upstash Redis. The interesting part is how these components work together.
Qloo: Finding the connections
Qloo is the foundation of TasteProbe's discovery system. I use Qloo Search to resolve the user's starting interest and Qloo Insights to retrieve culturally related music artists. But a single API call wasn't enough for the experience I wanted. I implemented several retrieval strategies: initial recommendations, preference-conditioned queries, tag-based exploration, pagination, exclusions, and multi-seed discovery. When candidates come from different queries, their rankings need to be combined without assuming the raw relevance scores are directly comparable. For part of this process, I use reciprocal-rank fusion:
$$ \operatorname{RRF}(a)=\sum_{q\in Q_a}\frac{1}{60+r_q(a)} $$
Here, (r) is artist (a)'s rank in query (q). This combines evidence from multiple Qloo queries while avoiding direct comparisons between differently scaled scores. The taste-walk component additionally weights relationships according to the listener's evolving interests. Most importantly, Qloo isn't used only once at the beginning. It remains part of the discovery process as user feedback introduces new directions.
Building my own recommendation engine
Qloo helps discover relevant artists. The next problem is deciding which actual recording to recommend. I built a contextual ranker that considers the original cultural interest, question answers, feedback history, artist affinity, novelty, and recent exposure. In simplified form, its objective looks like:
$$ S(c)=w_aA(c)+w_qQ(c)+w_tT(c)+w_nN(c)+w_gG(c)+E(c)-P(c) $$
Where:
- (A(c)) measures cultural relevance.
- (Q(c)) measures agreement with question answers.
- (T(c)) captures preference transfer from previous reactions.
- (N(c)) rewards novelty.
- (G(c)) represents bounded Gemini-assisted ranking evidence.
- (E(c)) encourages exploration.
- (P(c)) penalizes repetition and excessive artist exposure.
The actual implementation uses explicit coefficients, feedback-dependent weights, and additional artist-affinity signals. One problem I spent considerable time on was balancing familiar recommendations with exploration. I introduced a lightweight Thompson-sampling component, maintaining positive and negative evidence for different exploration buckets:
$$ \theta_b\sim\operatorname{Beta}(1+p_b,\;1+n_b) $$
Here, (p_b) and (n_b) represent accumulated positive and negative evidence for bucket (b). This gives the system a principled way to explore less-tested directions without simply choosing random artists.
Gemini assists with several decisions:
- Selecting useful preference questions.
- Evaluating artist affinity from feedback.
- Comparing verified recording candidates.
- Planning the next step of the Qloo taste walk.
I deliberately kept the model's authority limited. Gemini receives structured context and a set of valid candidates. Its outputs are constrained and validated by the backend. It cannot invent a Qloo artist or an arbitrary YouTube video and insert it into the recommendation feed. When the model fails or its response is invalid, the deterministic system takes over. This separation between LLM reasoning and deterministic verification was an important design decision.
Turning artist recommendations into playable music
Finding a relevant artist doesn't guarantee that a suitable recording can be found. I built a YouTube resolution layer that combines reviewed mappings, dynamic searches, attribution checks, caching, and playback eligibility checks. It supports legitimate artist releases as well as appropriately credited recordings from publishers and labels. The application uses YouTube's official IFrame player for previews and full playback.
Keeping the experience reliable
TasteProbe is stateful: each reaction can change what happens next. I use Upstash Redis to store session state, recommendation history, feedback, and API usage counters. Sessions use signed tokens and atomic revision-controlled updates to prevent stale or repeated requests from corrupting the discovery journey. I also implemented rate limiting, provider budgets, bounded retries, caching, and fallback behavior.
Challenges I faced
The two-artist problem
One of the most revealing bugs appeared when I was exploring music starting from Dua Lipa. Even after several reactions, the recommendations kept returning to a small group of artists, particularly Camila Cabello and Harry Styles. Initially, it looked like a ranking problem. But I realized there were several connected issues: candidate supply, recording availability, artist exposure, and how feedback triggered further discovery. Simply changing ranking weights wouldn't solve it. I had to improve how the system maintained playable recordings, penalized repeated exposure, and explored new Qloo neighborhoods. That experience shaped much of the final architecture.
Verification versus availability
My early YouTube verification was also too restrictive. Many legitimate recordings are published through record labels, film-music publishers, or distributors rather than an artist's personal channel. I needed to broaden coverage without accepting covers, misleading uploads, or incorrectly attributed recordings. This led to a layered verification system with different sources of evidence and explicit filtering rules.
Making feedback actually matter
A recommendation system can appear adaptive simply by showing different results after every click. I wanted something more meaningful. I had to ensure positive and negative reactions updated the ranking state, previously presented recordings weren't silently recycled, and the system could find new candidates when the existing pool became narrow. I also learned that a model's ability to produce a convincing explanation isn't the same as its ability to make a better recommendation. That's why I kept the algorithm measurable and the LLM's decisions constrained.
Accomplishments I'm proud of
The biggest accomplishment is that TasteProbe is a working, deployed product, not just an architecture or prototype. During a real production test, I started with Interstellar. Qloo returned 50 music artists connected to that starting point. After a preference answer, another retrieval introduced 34 additional artists. The listening experience began with a recording by Sylvain Chauveau. A Not for me reaction moved the recommendation to Max Richter. Further interactions surfaced Jóhann Jóhannsson, Ólafur Arnalds, and Nils Frahm, including a discovery reached through the evolving taste walk. It was a small example, but it demonstrated the behavior I had spent so much time trying to achieve: the system could follow a user's reactions into new cultural territory. I also put substantial effort into testing:
- 622 automated tests passed, with four optional live tests skipped.
- Production build, TypeScript, and lint checks passed.
- Browser tests covered discovery, multi-round sessions, playback, and Sound Passport persistence.
- Real preview and full YouTube playback were verified in production.
- Automatic recommendation advancement was tested on the deployed website.
- The source is publicly available under the MIT license.
These results establish that the system works technically. I haven't yet conducted a formal user study to measure whether its recommendations outperform existing platforms.
What I learned
Three things stood out. First, cultural context is a useful starting point for discovery. A person may struggle to describe their musical taste while having no trouble naming a film or game they love. Second, a good ranker needs a good candidate pool. No amount of sophisticated scoring helps if only two artists have playable recordings. Third, agentic AI works better when responsibilities are clear. Qloo discovers cultural relationships, Gemini helps reason over choices, and deterministic code handles identity verification, state changes, ranking constraints, and reliability. I spent as much time fixing the interactions between these systems as I did building the individual components.
What's next
There are several directions I'd like to explore:
- Recording-level musical understanding: Move beyond artist metadata using independently validated musical features.
- Personalized Taste Reports: Summarize what a listener's actual choices reveal about their preferences.
- Daily Mix: Curate a short playlist from verified recordings using the complete listening journey.
- Smarter previews: Identify meaningful musical moments instead of relying on timing-based excerpts.
- Human evaluation: Compare adaptive discovery against static recommendations using real listeners.
For now, TasteProbe is my attempt to answer a question I found genuinely interesting: What if discovering music could begin with everything else you love?
Built With
- gemini
- next.js
- qloo
- react
- redis
- typescript
- youtubeapi
Log in or sign up for Devpost to join the conversation.