Inspiration

Planning something together is deceptively hard. Not because there's nothing to do, but because the why behind taste is invisible. Two people can both love Interstellar and Dune without ever realizing what they actually share is a craving for cinematic grandeur, atmospheric immersion, and experimental sound, and that this overlap points directly to a specific jazz bar or art-house cinema neither of them would have Googled.

That's the gap TasteMatch was built to fill: not a recommendation engine, but a cultural translator. Something that takes what two people explicitly say they like and surfaces the hidden aesthetic DNA underneath.

The Qloo API was the catalyst. Most tools treat recommendations as lookup tables. Qloo's behavioral taste graph operates at a different layer entirely, connecting preferences across domains using trillions of real behavioral signals. Seeing what was possible with /v2/insights and cross-domain affinities made the core idea immediately obvious.


What it does

You describe what two people love in plain natural language: films, music, food, places, brands. TasteMatch runs a four-agent pipeline and returns:

  • A Cultural Bridge: the deeper aesthetic territory connecting both profiles, not just "you both like sci-fi" but the why underneath
  • An Unexpected Match: one recommendation neither person asked for that sits precisely at the intersection of both taste profiles
  • A concrete shared plan for the day or evening, grounded in Qloo data
  • A match score and reasoning chain so you can see exactly how the conclusion was reached

How we built it

Stack

  • Next.js 16 (App Router) with React 19 for the frontend and API routes as the agent backend
  • TypeScript throughout
  • Gemini 1.5 Flash via @google/generative-ai for all LLM reasoning steps
  • Qloo Taste AI (/search + /v2/insights) for entity resolution and cross-domain affinities
  • Framer Motion for the agent progress animation
  • Tailwind CSS v4 for styling

Agent pipeline

The pipeline runs server-side, keeping all API keys off the client:

The key design choice: Gemini reasons over Qloo data, not instead of it. Resolved entity IDs, insight entities, shared tags, and bridge recommendations are passed directly into every LLM prompt. Qloo does the cultural heavy lifting; Gemini does synthesis and narration.

For each person, Agent 2 calls /v2/insights four times in parallel across urn:entity:movie, urn:entity:artist, urn:entity:place, and urn:entity:brand. For bridge recommendations, both people's entity IDs are combined into a single cross-profile /v2/insights call for urn:entity:place.


Challenges we ran into

Qloo API response shape quirks. The /v2/insights response nests affinity inside entity.query.affinity rather than at the top level. The /search response uses entity_id in some contexts and id in others. Building a resilient client layer that normalized both without dropping data required careful inspection of live responses.

The LLM collapses to the obvious. Early versions of the Cultural Bridge prompt returned boring results like "they both like sci-fi." The fix was explicit prompt engineering, instructing the model that restating the genre is a failure mode and that the goal is to surface the aesthetic layer beneath the explicit preference. Feeding Qloo's shared tag names (e.g. cinematic, atmospheric, experimental) into the prompt gave the LLM concrete vocabulary to anchor its reasoning.

Graceful Qloo degradation. The app needs to work even when the Qloo API is unreachable. All Qloo calls are wrapped in a try/catch that detects QlooError with status 401/403/5xx, sets qlooAvailable = false, and lets the pipeline continue on a purely LLM-driven path. The UI surfaces a clear "Qloo offline" badge so it's always transparent what data source is powering the result.

Parsing latency. Calling /api/parse on button click added a noticeable delay before the agent animation started. The fix was to run both parse requests in parallel on Find Match click, then transition to the animated loading state immediately so the user sees feedback while the real work happens behind it.


Accomplishments that we're proud of

The Unexpected Match is the feature we're most proud of. It's easy to build something that confirms what people already know they share. It's much harder to find the recommendation neither person would have reached alone but that feels, on reflection, inevitable. That works as well as it does almost entirely because of Qloo's cross-domain behavioral graph. Without it, you'd get "you both like movies, here's a cinema." With it, you get the intimate cocktail bar with live ambient music that neither person asked for.

We're also proud of how clean the agent separation is. Each agent has one job, a narrow interface, and a verifiable output.


What we learned

Qloo's cross-domain behavioral graph is genuinely different from anything achievable with LLM embeddings alone. The connections it surfaces are empirical behavioral patterns derived from real human actions, not linguistic co-occurrence in training data.

Multi-agent pipelines are most effective when each agent has a narrow, verifiable job: extraction, resolution, synthesis, narration. Mixing concerns degrades output quality significantly.

Prompt design for specificity is its own engineering discipline. The difference between "find a recommendation" and "find something surprising yet inevitable, the kind where someone says I never would have thought of that, but yes" produces dramatically different results.


What's next for TasteMatch

  • Group mode: extend the pipeline to 3+ people, where the Cultural Bridge becomes harder to find and more valuable when it appears
  • Persistent profiles: save a taste profile once and match against others without re-entering preferences
  • Real venue resolution: pipe the Unexpected Match through Qloo's place search to return an actual named venue with an address
  • Shareable results: generate a link so both people can view the match without being in the same browser session
  • Deeper Qloo domains: expand to urn:entity:podcast, urn:entity:tv_show, and urn:entity:destination for a wider cultural surface area

Built With

Share this project:

Updates

Submission history