Inspiration
Buying for someone you love but don't share tastes with is hard. You know your brother loves AC/DC and watches Bluey with his kids, but that doesn't tell you what to get him. Ask a chatbot and you get the same list everyone gets: a band T-shirt, a mug, a gift card. We wanted gift ideas that start from what the person already loves and reach into things they'd probably love but don't own yet. That's exactly what a taste graph knows and a language model doesn't.
What it does
- Describe the person in plain words: favourite bands, shows, books, games, brands, hobbies, a budget, and optionally where they live.
- The agent plans. It pulls out the named favourites, the hobbies, the budget and the location, and picks 3–5 gift categories that suit this person (music, books, brands, TV, games, podcasts, local places).
- Qloo resolves the favourites to exact entities, shown on the page as "Qloo matched: AC/DC (musician), Bluey (TV show)".
- Qloo explores each category in parallel: what do fans of these things also love?
- The agent writes the gifts. Every idea must cite a Qloo entity from those results, or the server drops it. Each gift tag shows the Qloo match, its affinity score, and which favourites it links back to.
- Steer it. Cheaper, more experiences, less obvious, or your own words. The list is rewritten from the same Qloo results.
- Check my ideas. Already have a shortlist? Qloo ranks your own options against the same taste profile.
Example from the live demo, "My brother, 30s. Loves AC/DC, Bluey with his kids, and fishing off the rock wall. Lives in Mackay. About $80 for his birthday.": Cold Chisel's East on vinyl, an Australian Crawl greatest-hits album, a Vans tee, a Levi's trucker cap, a dinner-and-drinks voucher at a Mackay venue Qloo matched, and a Kipper DVD to watch with the kids.
What makes it Qloo-powered
- No Qloo, no gift. Ideas only come from entities Qloo returned for this person's tastes, and the server checks every idea against that candidate list. Without Qloo the app has nothing to recommend.
- Qloo workflows used:
qloo_describeresolves favourites to entity IDs.qloo_recommendis called per category withsignals,signal_tags(hobbies),demographic, andfilter_locationfor local experiences.qloo_rankscores the giver's own shortlist.
- Cross-domain taste. Music fans lead to brands, TV fans to books, and a home town leads to local venues. A generic LLM can't make those links with evidence.
- Shown, not hidden. Every gift shows its Qloo match and affinity score, and Show Qloo calls lists every call live.
How we built it
- Qloo:
- The official
@qloo/qloo-harnessMCP server (qloo mcp) runs as a long-lived child process of the Node server. - It's called through the MCP SDK client, against the hackathon base URL.
- The official
- Agent:
- OpenAI's Responses API with strict JSON schemas handles two steps: a plan step (what to search) and a compose step (gifts from the Qloo results).
- The server validates the compose output against Qloo's candidates.
- Resilience:
- When Qloo says a name is ambiguous, the agent takes its most popular candidate.
- When a category still fails, it loosens step by step: first the age group, then the vague hobby tags, then extra favourites.
- Category searches run in parallel and stream to the page.
- Privacy: the planner strips personal names. Only cultural favourites are sent to Qloo. Sessions live two hours in memory, and there's a per-IP rate limit.
- App: a plain Node.js 22 server, plus vanilla HTML, CSS and JS. The design is a stack of kraft gift tags.
- Hosting: Render (Blueprint in the repo).
- Tests: agent tests against a mock Qloo layer, plus a live check script for real Qloo.
Challenges we ran into
- Ambiguity is normal. "Bluey" or a hobby tag often has several candidates, so the harness asks for clarification. We resolve it automatically by choosing the most popular candidate, and the page shows what was matched.
- Some inputs sink a whole request. An age group Qloo can't resolve, or a vague hobby tag, can make a category return nothing. Loosening the request step by step keeps every category useful.
- Keeping the model honest. It's tempting for a model to invent a gift. Making every idea cite a Qloo entity, and checking that on the server, keeps it grounded.
Accomplishments that we're proud of
- Every gift on the page is traceable to a real Qloo result, with its affinity score.
- Taste carries across categories: one sentence about a person turns into music, brands, TV, books and local experiences.
- It's useful in about 20 seconds.
What we learned
Taste graphs and language models are good at different things. Qloo knows what fans of something tend to love. The model is good at turning "fans of AC/DC also like Cold Chisel" into "Cold Chisel's East on vinyl, about $45". Neither one makes good gift ideas alone.
What's next
- Live prices and stock from Australian retailers.
- Gift history, so the same person doesn't get the same idea twice.
- Group gifting: one link where family members add what they know about the person.
Try it (for judges)
- Open the live demo. It's a free instance, so the first load can take up to a minute.
- Tap an example (e.g. "Mum, a mystery reader") or describe someone, then tap Find gift ideas. Results stream in about 20–30 seconds.
- Open Show Qloo calls to see each Qloo call. Each gift tag shows its Qloo match and affinity.
- Try Steer it (Cheaper / More experiences / Less obvious).
- Under Already have a few ideas?, list a few titles of one kind (e.g. musicians: Cold Chisel, The Wiggles, Midnight Oil) and tap Rank my ideas.
Built by Treyn at AppForge Digital (Mackay, Queensland) with Claude as an AI coding partner. Taste data from Qloo. MIT licence.
Built With
- css3
- html5
- javascript
- model-context-protocol
- node.js
- openai
- qloo
- render
Log in or sign up for Devpost to join the conversation.