Inspiration
Every group chat hits the same wall: where do we go tonight? Someone picks the usual place and half the table is not happy. Chat assistants don't help much — they know nothing about the people, so they suggest popular, generic places, and they often name venues that are in another city, over budget, or simply not there. Then someone still has to chase everyone for money. We wanted an agent that plans for the whole group, from each person's real tastes, and closes the loop with payment.
What it does
- Add the people (2–8) and two or three things each of them loves — a band, a film, a book, a show — or just describe the plan in one sentence ("Team dinner in Milan, about €40 each. Sara: Radiohead, Murakami…").
- The agent resolves every favourite to a Qloo entity (with alternatives you can switch, e.g. Haruki vs. Takashi Murakami).
- For each person, Qloo Insights ranks real venues in the city by affinity to their taste. The agent scores every candidate for every person and ranks fairly: the least-happy person first, then the average, within the budget. It keeps only real restaurants / bars / museums using Qloo's primary genre and popularity.
- Each pick shows a per-person fit bar, the taste tags the group shares (e.g. Cinematic · Modern art · Film history for a Wes Anderson-designed bar), a grounded explanation, today's hours, what people mention, highlights, atmosphere and food — all from Qloo — plus map, website, menu and phone links.
- Side by side: the same brief answered by an LLM without Qloo, and every place it named is fact-checked against Qloo's place data — found in the city, in another city, not found, or over budget.
- Pick one and everyone pays their own share with PayPal (sandbox) — wallet or an inline card form — with a group pot and a receipt page verified live with PayPal.
Small towns work too: when Qloo can't resolve a town by name (e.g. Molfetta), the agent geocodes it with OpenStreetMap and searches within 12 km of its coordinates.
How we built it
- Qloo:
/search(artist, movie, TV show, book, author, person, podcast, video game, brand) to resolve tastes;/v2/insightswithfilter.type=urn:entity:place,filter.location.queryorfilter.location+ radius,filter.tagsandsignal.interests.entities— once per person and for the whole group (two pages);/searchwithtypes=urn:entity:placefor the fact-check. Entity properties (primary genre, popularity, hours, keywords, descriptions, images) power filtering and the venue cards. - Agent: one Netlify Function per step (understand → resolve → rank → explain → compare) so each answers within the serverless time limit and the page shows the agent's trace live.
- LLMs: OpenRouter free models in a short chain with time budgets and answer validation (
openrouter/freeas last resort). Every LLM step has a deterministic fallback — the Qloo plan never depends on a model. - Payments: PayPal Orders v2 in the sandbox, created and captured server-side; PayPal Card Fields for card payments without a PayPal account.
- Frontend: vanilla HTML/CSS/JS, no build step; all model output inserted as text.
- Quality: 31 unit tests with synthetic fixtures (no Qloo data committed), live smoke tests across Milan, Rome, London, New York, Berlin and Molfetta.
Challenges we ran into
- Qloo's tag filter also returns malls, markets, hotels and wedding venues that merely contain a restaurant: we filter on each venue's
primary_genre, drop little-known places when enough remain, and read two pages for the group pool. - Bursts of Qloo calls get HTTP 429: at most two calls in flight, retries with back-off, and a plan that survives one failed person.
- Small towns are not resolvable by name: geocoding + radius search.
- Free LLMs are often rate-limited: time budgets, fallbacks and caching.
- Fact-checking names fairly: whole-word matching, so "Ratanà" is not confused with "Ratanakorn market".
Accomplishments that we're proud of
- A complete product loop — taste → fair group plan → explanation → payment and receipt — live and usable without any key or login.
- A concrete, visible answer to "why not just ask an LLM?": the side-by-side fact-check against Qloo's place data.
- Fairness built in: nobody's taste is sacrificed for the majority.
What we learned
- Taste is personal but plans are collective: per-person affinity plus a fairness rule beats a single blended signal.
- Grounding matters: Qloo's entity data both improves recommendations and exposes LLM hallucinations.
- Serverless agents need step-sized calls, budgets and graceful degradation.
What's next for TastePay
- "All or nothing" payments: authorize each share, capture only when everyone is in.
- Paying the venue directly (PayPal for marketplaces) or the organiser who books.
- Group invites by link, so each person adds their own tastes from their phone.
- More occasions (concerts, trips with itineraries) using Qloo's other entity types.
Pre-existing work and disclosure
Built during the hackathon (October 2026) with an AI coding assistant. Uses Qloo's hackathon API, OpenRouter (free models), PayPal sandbox, OpenStreetMap Nominatim (geocoding fallback) and Netlify. No Qloo response data is stored in the repository. The demo video narration is the author's own voice cloned with ElevenLabs, and the short lifestyle clips were generated with Higgsfield (Kling); the app footage is a real recording.
Built With
- css3
- html5
- javascript
- netlify
- openrouter
- openstreetmap
- paypal
- qloo
- typescript
- vitest
Log in or sign up for Devpost to join the conversation.