Inspiration

The hardest gifts are for the people you love but don't share a world with: a sister who lives in indie folk records and film photography, a dad who "doesn't need anything", a partner who disappears into roguelike games. You know what they love. You don't know what else people with that taste love, and that's where good gifts are.

Ask a plain chatbot and you get stereotypes: "likes indie music, so a record player". I wanted gifts that come from real taste data: things the person never mentioned, but that people with their taste over-index on. Qloo's taste graph is exactly that, so I built a gift finder where Qloo does the discovering and the AI does the shopping.

What it does

  1. You describe someone as a persona: the things they love (picked as real Qloo entities: artists, films, shows, books, games, brands, people), their hobbies, and optionally age, gender, city and notes ("Just moved into her first solo apartment").
  2. Qloo maps their taste across brands, books, artists, films, TV, games and podcasts, plus local places if you give a city. Each result comes with an affinity score.
  3. Two AI agents take over. A taste strategist plans six gift ideas from the taste graph, and at least four must come through a Qloo recommendation rather than something the person already loves. A personal shopper searches Amazon for every idea and picks the best real listing.
  4. Every pick is checked. A listing check catches near misses: a book about an album is not the album, and a sewing book called "Tunic" is not the game Tunic. If an idea finds nothing valid in that Amazon store, the strategist gets one more turn to replace it, knowing why it missed.
  5. You get real gifts with the reason behind each one, plus the taste trail that led there, e.g. Hozier → Marika Hackman · 96% match → Marika Hackman, "Any Human Friend" on vinyl. Each run says how many gifts were found through Qloo by way of things the person never mentioned.

Also in the app:

  • Gifts to share. Add yourself ("This is me") and choose Gift for: Maya and you. Wrapt uses Qloo's compare endpoint to find where your tastes meet, and plans gifts you can enjoy together.
  • Compare. One click shows what the same AI model suggests without Qloo, side by side, so the difference the taste graph makes is visible.
  • Taste story. A short slideshow of the person's taste profile.
  • 10 Amazon stores. The store is detected from the visitor's location and can be switched. Budgets and prices are in local currency.
  • Optional sign-in (Google, email or guest) saves people and their recent gift runs across devices. Without sign-in, everything stays in the browser, so judges can use it without an account.
  • Sample runs for three demo personas load instantly, without waiting on the agents.

How we built it

Qloo is the discovery engine, not a garnish. Building a persona uses Qloo search, and a single gift run then makes up to 15 more Qloo calls:

  • /search (while building the persona) to pick their loves as real Qloo entities.
  • /v2/tags to map free-text hobbies ("film photography") to Qloo tags, filtered by word overlap because tag search is fuzzy.
  • /v2/insights swept in parallel over brands, books, artists, films, TV shows, video games and podcasts (and places, when a city is set). Each call is seeded with the persona's entities, hobby tags, and age and gender signals.
  • /v2/insights again on demand: the strategist agent has an explore_taste tool for deeper lookups in one domain, seeded by chosen loves or an interest keyword.
  • /v2/insights/compare for shared gifts, finding the taste tags two people have in common, which then seed the sweep.
  • Qloo metadata shapes the agents' choices. Brand keywords go into the strategist's brief. Brand industries keep car makers, airlines and social apps out of the plans. Affinity scores and images power the taste trails in the UI.

Agents. Two agents on Groq (openai/gpt-oss-120b) use OpenAI-style tool calling:

  • The taste strategist (explore_taste, submit_plan) plans from the Qloo profile. Server-side rules enforce the Qloo quota (at least 4 of 6 ideas via a Qloo entity), spread across domains, budget, and gender fit.
  • The personal shopper (search_amazon, submit_gifts) picks listings from real Amazon results (via SerpApi) and writes the reason for each gift.
  • A listing check runs reason-first JSON verdicts on every pick. Rejected listings are swapped for the next candidate, and ideas with no valid listing go back to the strategist once for a replacement.
  • Progress streams to the browser as newline-delimited JSON, driving a live agent log, so you can watch Qloo, the strategist and the shopper work.

Stack. Next.js 16 (App Router), Tailwind CSS 4, Groq, Qloo Insights API, SerpApi (Amazon), Firebase Auth and Firestore, Upstash Redis (cache), Vercel.

Challenges we ran into

  • Free-tier rate limits shaped the architecture. Groq's free tier allows 8,000 tokens per minute per key, and my first single agent died mid-run. I split the work into two agents on separate keys with failover. Later I hit Groq's daily token cap, so runs now fall back to a second model (qwen/qwen3.8-27b) with its own budget. That model also runs the listing check, where it matched gpt-oss-120b on my labelled test set. If every budget is spent, a run stops at once with a clear message instead of hanging.
  • LLMs are bad at matching products. The shopper would happily pick a book about an album, or a sewing book named after a video game. I built a labelled set of idea/listing pairs, tuned a reason-first check prompt against it, and added candidate swaps.
  • Amazon differs by country. Brands Qloo surfaces for a taste are often not sold on amazon.in, so some ideas can't be bought there. The replacement step tells the strategist what the store actually returned ("for 'Xbox controller' Amazon showed EvoFox…"), and blocks retries of a brand the store just failed on.
  • Gender and fit. Gifts gendered for the wrong person are filtered out at both the idea and the listing stage. With no gender given, only unisex listings are kept, and sized clothing is avoided unless the notes give a size.
  • Qloo quirks. Video games are urn:entity:videogame (video_game returns 400), and region tags come back from compare and say nothing about taste. Wrapt filters both.

Accomplishments that we're proud of

  • Qloo's contribution is visible on every result: a taste trail with an affinity score, a line counting gifts found through Qloo, and a one-click comparison with the same model without Qloo.
  • Shared gifts: Qloo's compare endpoint turns two people's tastes into gifts they can enjoy together.
  • Real products, really checked. On my labelled idea/listing pairs the listing check scored 60 of 63 across three runs.
  • It works for people outside the US: 10 Amazon stores, local currency, and sign-in that's optional so anyone can try it in seconds.

What we learned

  • Taste data beats demographic guessing. One artist alone surfaces brands, books and films a chatbot wouldn't connect to them, with numbers attached.
  • In agent apps the hard part is verification, not generation: checking that a listing is really the product, and that a plan respects the rules.
  • Rate limits are a design input. Splitting agents across keys, falling back across models, caching, and failing fast made the free tier usable.
  • Qloo's location signal is weaker than interest and demographic signals. Adding a country barely changed the brands for a persona with strong tastes, so store availability had to be solved in the agent loop instead.

What's next

  • Affiliate links, turning good recommendations into revenue.
  • Client and team gifting: personas for clients or colleagues, with budgets and occasions.
  • Occasion reminders that start a fresh run before a birthday, using what the person loved last time.
  • Remembering what each store doesn't carry, so plans avoid brands that keep missing in a given country.

Built With

Share this project:

Updates

Submission history