Status: building now. Started 21 Oct 2026 for the Qloo Agentic Hackathon. Submission due 31 Oct 2026. Live: sapor-nu.vercel.app
"Where should we go?" is the most asked and worst answered question in every group chat. Ratings tell you what is popular, not what suits these particular people. Usually the loudest person picks, and someone sits through a meal that was never for them.
People are bad at describing their food taste in the abstract and very good at naming things they love. So Sapor (Latin for taste) starts there:
Everyone names a film, show or artist they love. Sapor reads the taste behind those picks with Qloo, finds one real place nearby that suits the whole table, and says what each person should order there, with the evidence for every line.
Rank by the person it suits least
The interesting decision in Sapor is not the AI. It is one line of arithmetic.
My first version ranked venues by Qloo's affinity score for the whole table. It picked a venue Qloo loved even when one guest matched it at 35%. Averages hide the person who is left out. So the ranking now looks at the weakest seat first:
table score = 0.60 × weakest person's match + 0.25 × average match + 0.15 × Qloo affinity for the venue - A match (0 to 1) is how much of one person's Qloo taste profile, cuisines and kinds of room, the venue's own Qloo tags carry. It is not a probability that they will enjoy it, and the app says so.
- Qloo's affinity sits in a narrow band among nearby candidates, so at 15% it can only settle near-ties. It can never outweigh a 25-point gap in the weakest match.
- Ties go to the better weakest match, then the better average, then the name, so the same input always gives the same answer.
The 35% counterexample is a unit test now, next to a strict maximin baseline.
A real run
The sample table: Riya loves BTS and Squid Game. Arjun loves A. R. Rahman and Pushpa, and is vegetarian. Meera loves Prateek Kuhad and Before Sunrise. Coffee, in Jubilee Hills, Hyderabad.
Qloo reads very different crowds behind those picks. Riya's leans Korean, Thai and Chinese, in hip rooms. Arjun's leans Indian, in comfortable rooms. Meera's leans Indian, in serene ones.
The search returned 30 venues; 2 were set aside because they had no food data at all (Qloo's cafe filter sometimes returns gyms). Terra Cafe & Bistro won with Riya at 99, Arjun at 100 and Meera at 83: weakest 83, average 94. The runner-up had a higher Qloo affinity, but its weakest match was 74, so it lost.
Then the orders, from Terra's own menu highlights in Qloo: Korean chicken bao for Riya, pav bhaji bruschetta for Arjun (vegetarian by name, flagged "confirm with staff"), paneer Korean bao for Meera.
Guardrails, again in code
- Ambiguity stops the agent. "Dune" is a film, a book and a German techno group, each drawing a different crowd. If two candidates are close, Sapor asks instead of guessing.
- Vegetarians are protected by name. A vegetarian seat only gets dishes whose names carry no meat, fish or egg.
- The one-line explanations are validated. Groq writes a short reason per person from the evidence alone. A validator rejects any line that addresses the reader, praises food with words not in the data, or leaks a seat letter, and falls back to a template.
- Privacy by design. Names never leave the browser. The server sees seats as A, B and C, and Qloo only ever receives entity ids, tag ids and a place name.
A full plan costs about one Qloo call per person plus one venue search, with a six-hour cache for repeats.
Still to do before 31 Oct
- The demo video and the submission write-up
- More test tables, because the link from a dish name to a cuisine is my own keyword map, not Qloo data, and that is the part most likely to be wrong
Repo (MIT): github.com/victorisaacchinta-eng/sapor
I wrote this with AI assistance, working from the repo. The run above is the app's sample table, measured with live Qloo calls on 21 Oct 2026.

