Inspiration

Every Eid, birthday and graduation, I end up in the same place: I know exactly who the person is, but I have no idea what to buy them.

I know my sister plays Fairuz every morning, can't start her day without matcha, and will rewatch Casablanca on any rainy afternoon. That is a vivid picture of a person, yet no store can do anything with it. Recommendation engines need purchase history, and when you are buying for someone else there is none. That makes gifting a pure cold-start problem.

So I tried asking a chatbot. It suggested a scented candle, a nice mug and a gift card: answers that would fit anyone, which means they fit no one. An LLM on its own knows about Fairuz, but it doesn't know what people who love Fairuz, matcha and old films actually have in common.

That is precisely what Qloo's taste graph knows. So I built Taste Gifts to answer one question: can three favourites from completely different worlds become a gift that feels personal, with a reason you can trust?

What it does

You describe someone the way you'd describe them to a friend:

"Gift for my sister, she loves Fairuz, matcha and old films, under $50."

About fifteen seconds later you get:

  • Five picks from a real store, such as an Arabic calligraphy print, a stuffed Medjool dates box, a finjan cup set and a hand-thrown matcha bowl. Each has a fit score and one sentence explaining why: "Its flowing Arabic letterforms suit Fairuz's love of Arabic heritage, and the Casablanca seed points toward Maghreb culture."
  • A taste map showing what Qloo sees in her taste. Her favourites appear on one side and the concrete interests they lead to on the other (Arabic music, tea, classic cinema, Arabic & Gulf heritage), with line widths showing which favourite drives which interest. Below it are mood, look and lifestyle signals, and "across culture, she'd also like" films, music and books.
  • "Why this pick" on every card: the exact Qloo evidence, which favourites drove it (Fairuz 72%, Casablanca 22%, Matcha 6%), the vibe signals it shares with her brands, and a plain-English line such as "this product's vibe fits her 2.2× better than it fits a typical shopper."
  • One-click refinement ("More like this", "Not their style", "Too expensive") and a real cart and checkout on Shopify.
  • A visible agent. A "How we got here" strip shows every step the agent took and why. In the example above, its first search for "classic old films" returned No Country for Old Men, so it reasoned that the results were modern titles and re-anchored on Casablanca. You can watch it correct itself.

If you'd rather not type a description, Pick their favourites mode lets you select exact entities from Qloo's catalog (films, artists, books, shows, brands, games or tastes like "matcha") with no LLM involved at all.

Remove Qloo and the app cannot make a single pick. The LLM never chooses products. It plans the Qloo calls and turns Qloo's facts into a sentence; everything in between is Qloo.

How we built it

Qloo is the engine, used as a graph rather than a lookup. Each profile chains around 20 Qloo calls:

  1. Resolve the seeds. /search across films, TV, artists, books, brands, games and podcasts, plus /v2/tags for tastes that aren't entities ("lo-fi hip hop", "Arabic coffee").
  2. Give tags reach. /v2/insights with filter.tags finds the entities most representative of a tag, so "Arabic coffee" leads to real cafés and from there to brands like Bateel.
  3. Find concrete interests. Tag insights (audiences, interests, genres, keywords) combine with each seed's own Qloo tags into a two-level interest profile (Music › Arabic music, Film › Classic cinema). Every tag is weighted by how distinctive it is against 13 baseline taste profiles. That is how "Jazz" beats "Music" and "Anime" beats "Fiction".
  4. Read the vibe. Brand insights in six gift lanes (accessories, apparel, beauty, home, treats, play) surface emotional tone, aesthetic and lifestyle, measured as lift over a 725-brand baseline.
  5. Attribute everything. feature.explainability=true tells us which favourite drove each signal. This powers the taste map, the "which favourites drove it" bars and the agent's quality checks.
  6. Score style and price. Each product names one or two reference brands, and Qloo predicts how strongly this taste likes them. Price ranges of the brands she gravitates to set her comfort zone.
  7. Speak Qloo's language. The 70-product catalog is tagged with a 1,031-term vocabulary built from Qloo's own property values, so matching happens on Qloo signals and never on product names.

Ranking is transparent and shown in the UI: 55% interest match, 25% vibe, 10% style references and 10% price fit. Hard thresholds mean weak matches are never shown. If only three products truly fit, it says "We found 3 strong matches" rather than padding the list.

The agent is Claude Haiku 5.5 with five tools: search_entities, search_tags, build_profile, recommend and refine. It runs searches in parallel, reads a quality report after every profile (too few strong matches, one seed dominating, a seed that barely mattered) and decides whether to retry. It is capped at 6 tool calls and a time budget. If the LLM is unavailable, the app falls back to matching the words to Qloo directly, so a judge never hits a dead end.

Stack: Nuxt 3 and TypeScript on Netlify, a Shopify store via the Storefront API, and Unsplash photography credited on every card. Every Qloo response is cached by request hash in Netlify Blobs, and the trace shows the cache hits. A safety layer excludes alcohol, tobacco, gambling, finance, telecom, weapons, adult content and pork through both Qloo filter.exclude.tags and a local screen, because the app is built with Gulf shoppers in mind.

Challenges we ran into

  • Popular is not personal. Raw Qloo results lean toward what everyone likes. Almost every profile "loves" Music and Fashion. Building baseline profiles and scoring distinctiveness instead of raw affinity was the turning point in quality.
  • One loud favourite. A strong seed like Fairuz could pull all five picks into one domain. Qloo's explainability let me measure each seed's share, show it to the user and teach the agent to detect and fix it.
  • Words are ambiguous. "Old films" can resolve to a 2021 thriller called Old. I rank entities and tags by how well their names fit, keep the shopper in control in favourites mode, and let the agent re-search when a match looks wrong.
  • Speed on a cold cache. A fresh profile means about 20 Qloo calls plus several LLM turns. Parallel tool calls, response caching, per-call timeouts and an agent time budget brought cold runs to around 15 seconds and cached runs to a few.

Accomplishments that we're proud of

  • Every pick can be traced end to end. You can follow any gift back to the favourite, the Qloo signal and the score that produced it.
  • It's honest. It shows three strong matches instead of five mediocre ones, and it labels a "broader pick" when a match is loose.
  • The agent shows its work. You can see it notice a bad search result and recover.
  • It's a complete product, not a notebook: a real catalog, cart and checkout, mobile-friendly, and usable with or without an LLM.

What we learned

The magic of Qloo is in chaining: seed → tags → representative entities → brand vibes → products. Each hop adds context an LLM can't invent. I also learned that distinctiveness beats popularity: comparing a person's taste with a baseline is what turns generic data into something that feels like it knows them. Finally, the best role for the LLM was a narrow one: plan, call tools and explain facts, but never decide.

What's next for Taste Gifts

  • Any Shopify store, plug and play: auto-tag a merchant's catalog with the Qloo vocabulary so every store gets taste-matched gifting.
  • Occasions and relationships: Eid, Ramadan, weddings, a colleague versus a partner.
  • Group gifts: blend several people's tastes into one shared pick.
  • An Arabic interface for the GCC shoppers who inspired it. ## Inspiration

Every Eid, birthday and graduation, I end up in the same place: I know exactly who the person is, but I have no idea what to buy them.

I know my sister plays Fairuz every morning, can't start her day without matcha, and will rewatch Casablanca on any rainy afternoon. That is a vivid picture of a person, yet no store can do anything with it. Recommendation engines need purchase history, and when you are buying for someone else there is none. That makes gifting a pure cold-start problem.

So I tried asking a chatbot. It suggested a scented candle, a nice mug and a gift card: answers that would fit anyone, which means they fit no one. An LLM on its own knows about Fairuz, but it doesn't know what people who love Fairuz, matcha and old films actually have in common.

That is precisely what Qloo's taste graph knows. So I built Taste Gifts to answer one question: can three favourites from completely different worlds become a gift that feels personal, with a reason you can trust?

What it does

You describe someone the way you'd describe them to a friend:

"Gift for my sister, she loves Fairuz, matcha and old films, under $50."

About fifteen seconds later you get:

  • Five picks from a real store, such as an Arabic calligraphy print, a stuffed Medjool dates box, a finjan cup set and a hand-thrown matcha bowl. Each has a fit score and one sentence explaining why: "Its flowing Arabic letterforms suit Fairuz's love of Arabic heritage, and the Casablanca seed points toward Maghreb culture."
  • A taste map showing what Qloo sees in her taste. Her favourites appear on one side and the concrete interests they lead to on the other (Arabic music, tea, classic cinema, Arabic & Gulf heritage), with line widths showing which favourite drives which interest. Below it are mood, look and lifestyle signals, and "across culture, she'd also like" films, music and books.
  • "Why this pick" on every card: the exact Qloo evidence, which favourites drove it (Fairuz 72%, Casablanca 22%, Matcha 6%), the vibe signals it shares with her brands, and a plain-English line such as "this product's vibe fits her 2.2× better than it fits a typical shopper."
  • One-click refinement ("More like this", "Not their style", "Too expensive") and a real cart and checkout on Shopify.
  • A visible agent. A "How we got here" strip shows every step the agent took and why. In the example above, its first search for "classic old films" returned No Country for Old Men, so it reasoned that the results were modern titles and re-anchored on Casablanca. You can watch it correct itself.

If you'd rather not type a description, Pick their favourites mode lets you select exact entities from Qloo's catalog (films, artists, books, shows, brands, games or tastes like "matcha") with no LLM involved at all.

Remove Qloo and the app cannot make a single pick. The LLM never chooses products. It plans the Qloo calls and turns Qloo's facts into a sentence; everything in between is Qloo.

How we built it

Qloo is the engine, used as a graph rather than a lookup. Each profile chains around 20 Qloo calls:

  1. Resolve the seeds. /search across films, TV, artists, books, brands, games and podcasts, plus /v2/tags for tastes that aren't entities ("lo-fi hip hop", "Arabic coffee").
  2. Give tags reach. /v2/insights with filter.tags finds the entities most representative of a tag, so "Arabic coffee" leads to real cafés and from there to brands like Bateel.
  3. Find concrete interests. Tag insights (audiences, interests, genres, keywords) combine with each seed's own Qloo tags into a two-level interest profile (Music › Arabic music, Film › Classic cinema). Every tag is weighted by how distinctive it is against 13 baseline taste profiles. That is how "Jazz" beats "Music" and "Anime" beats "Fiction".
  4. Read the vibe. Brand insights in six gift lanes (accessories, apparel, beauty, home, treats, play) surface emotional tone, aesthetic and lifestyle, measured as lift over a 725-brand baseline.
  5. Attribute everything. feature.explainability=true tells us which favourite drove each signal. This powers the taste map, the "which favourites drove it" bars and the agent's quality checks.
  6. Score style and price. Each product names one or two reference brands, and Qloo predicts how strongly this taste likes them. Price ranges of the brands she gravitates to set her comfort zone.
  7. Speak Qloo's language. The 70-product catalog is tagged with a 1,031-term vocabulary built from Qloo's own property values, so matching happens on Qloo signals and never on product names.

Ranking is transparent and shown in the UI: 55% interest match, 25% vibe, 10% style references and 10% price fit. Hard thresholds mean weak matches are never shown. If only three products truly fit, it says "We found 3 strong matches" rather than padding the list.

The agent is Claude Haiku 5.5 with five tools: search_entities, search_tags, build_profile, recommend and refine. It runs searches in parallel, reads a quality report after every profile (too few strong matches, one seed dominating, a seed that barely mattered) and decides whether to retry. It is capped at 6 tool calls and a time budget. If the LLM is unavailable, the app falls back to matching the words to Qloo directly, so a judge never hits a dead end.

Stack: Nuxt 3 and TypeScript on Netlify, a Shopify store via the Storefront API, and Unsplash photography credited on every card. Every Qloo response is cached by request hash in Netlify Blobs, and the trace shows the cache hits. A safety layer excludes alcohol, tobacco, gambling, finance, telecom, weapons, adult content and pork through both Qloo filter.exclude.tags and a local screen, because the app is built with Gulf shoppers in mind.

Challenges we ran into

  • Popular is not personal. Raw Qloo results lean toward what everyone likes. Almost every profile "loves" Music and Fashion. Building baseline profiles and scoring distinctiveness instead of raw affinity was the turning point in quality.
  • One loud favourite. A strong seed like Fairuz could pull all five picks into one domain. Qloo's explainability let me measure each seed's share, show it to the user and teach the agent to detect and fix it.
  • Words are ambiguous. "Old films" can resolve to a 2021 thriller called Old. I rank entities and tags by how well their names fit, keep the shopper in control in favourites mode, and let the agent re-search when a match looks wrong.
  • Speed on a cold cache. A fresh profile means about 20 Qloo calls plus several LLM turns. Parallel tool calls, response caching, per-call timeouts and an agent time budget brought cold runs to around 15 seconds and cached runs to a few.

Accomplishments that we're proud of

  • Every pick can be traced end to end. You can follow any gift back to the favourite, the Qloo signal and the score that produced it.
  • It's honest. It shows three strong matches instead of five mediocre ones, and it labels a "broader pick" when a match is loose.
  • The agent shows its work. You can see it notice a bad search result and recover.
  • It's a complete product, not a notebook: a real catalog, cart and checkout, mobile-friendly, and usable with or without an LLM.

What we learned

The magic of Qloo is in chaining: seed → tags → representative entities → brand vibes → products. Each hop adds context an LLM can't invent. I also learned that distinctiveness beats popularity: comparing a person's taste with a baseline is what turns generic data into something that feels like it knows them. Finally, the best role for the LLM was a narrow one: plan, call tools and explain facts, but never decide.

What's next for Taste Gifts

  • Any Shopify store, plug and play: auto-tag a merchant's catalog with the Qloo vocabulary so every store gets taste-matched gifting.
  • Occasions and relationships: Eid, Ramadan, weddings, a colleague versus a partner.
  • Group gifts: blend several people's tastes into one shared pick.
  • An Arabic interface for the GCC shoppers who inspired it.

Built With

  • anthropic
  • claude
  • netlify
  • netlify-blobs
  • nuxt
  • qloo
  • shopify
  • shopify-storefront-api
  • tailwindcss
  • typescript
  • vue
Share this project:

Updates

Submission history