Inspiration

"What do you want to do tonight?" "I don't mind, you pick." Every couple and every group chat knows this loop. Recommenders are built for one person. Plans for two or more people get made by whoever cares most, or whoever gives in least, and over time the same person keeps compromising.

What it does

Each person names a few films, artists and restaurants they love, and tells their own agent about tonight in plain words: "something cosy, no horror, I've seen Dune, nothing pricey."

  • Grounded briefs. Truce reads the brief and grounds it in Qloo: "cosy" becomes Qloo's Cozy ambience tag, "no horror" a genre veto, "Dune" the exact film. The person sees what was understood.
  • Scouting. Each person's agent gets Qloo as a tool. It scouts for options that could work for everyone: bridges from everyone's taste together, and restaurants around the group's taste hotspot on Qloo's heatmap.
  • Negotiation. The agents negotiate round the table, trading slots ("keep the film, I'll meet you on dinner") until everyone says yes.
  • Referee. A referee in plain code checks every move. Vetoes are absolute, nobody's agent can be talked below a fair floor, and a deadlock ends in the weighted Nash bargaining solution.
  • A plan you can act on. Restaurants closed tonight never appear. The plan comes with hours, ratings, a Michelin listing when there is one, booking links, a map, IMDb and Spotify links, and a calendar event.
  • Swaps without handing the decision back. Anyone can ask to swap one item. The others vote on whether they're OK with an alternative without seeing it, and a strict majority decides. The referee only puts in something that keeps everyone above their fair floor; if nothing fair is left, the request is refused up front. "It's booked" goes to the vote too, so it can't stand in for a taste swap.
  • Fairness ledger. It remembers who gave ground and gives them more say next time. The next day, a one-tap check-in ("loved / fine / not for me") tells the ledger how the evening really went: a disappointing evening counts as ground given, and loved picks become favourites. A new evening asks tonight's questions again, because last Friday's sushi craving isn't this Friday's.
  • Receipts. The Research tab shows every Qloo call a truce made and what came back, so you can check the agents' claims yourself.
  • My evenings. A dashboard of every group you've opened: what's waiting on you, each group's stage, its last plan, its fairness ledger as a chart, and a shelf of everything people loved. It lives only in your browser, with no accounts.

It works for a couple or up to four friends.

To try it: no key or account is needed. On the landing page, Couple demo and Friends demo open a recorded truce instantly, Run live runs a real one in about a minute, and Start your own sets up your own group.

Why it needs Qloo

Without Qloo there is nothing fair to negotiate over. An LLM alone would name famous titles and guess what a group of strangers might all like. It can't say how much each person likes each option on the same scale, and fairness needs exactly those numbers.

  • Comparable scores. One shared pool is scored once per person through Insights, so the referee computes a fair evening instead of asking a model to judge fairness.
  • Bridges. Everyone's favourites go into one Insights query, so the "something for all of us" options come from a real joint signal.
  • Cross-domain taste. A love of In the Mood for Love and Radiohead pulls a particular restaurant up the list.
  • Plain words become hard filters. /v2/tags turns "cosy" or "vegetarian" into tags Insights enforces.
  • A real plan. Opening hours, price levels, ratings, Michelin listings, booking pages and IMDb/Spotify ids all come from Qloo's entities.
  • Evidence, not vibes. Explainability says which of your favourites drives each pick, and the Research tab shows every Qloo call behind a truce.

How we built it

  • Qloo taste data. /search confirms what people love, and restaurant search stays near the group's city. /v2/insights gives the candidates: each person's, and everyone's together for bridges. The same insights score one fixed pool once per person (filter.results.entities with explainability), so every person gets a comparable private scorecard. /v2/tags turns plain words into filters, tags (urn:tag) give taste portraits, and heatmaps (urn:heatmap) find the taste hotspot. Entity data gives opening hours, price levels and outside ids.
  • Agents. Claude Haiku 5.5 with structured outputs and prompt caching for each move, and a short tool-use loop for scouting. About one cent per truce.
  • The referee and ledger are deterministic TypeScript: weighted Nash bargaining generalised to groups, reservation curves that let each agent concede over time, a final-round shortlist of evenings everyone can accept (a mediator's "single negotiating text"), and a decayed concession ledger. Tests run hundreds of random worlds for groups of 2, 3 and 4, plus deliberately broken agents.
  • Server and app. Hono and SQLite on Node, live server-sent events, a React web app, one Docker image, hosted on Railway.

Challenges we ran into

  • Qloo affinities are normalised per query, so scores from different people's queries can't be compared. The fix was one shared pool, scored per person and rescaled within it.
  • Groups of three or four rarely reached a deal, because an offer has to clear everyone's minimum in a row. The referee's final-round shortlist moved agreement from about half of group truces to nearly all, without letting any agent see anyone else's scores.
  • Agent voice: early agents spoke as their person ("our tastes", "you both"). They now speak for them, to the other agents, naming people in the third person.
  • Small data surprises: tags without names, two error shapes, external ids as arrays in one endpoint and objects in another, a search radius in miles, and closing times past midnight.

Accomplishments that we're proud of

  • Fairness is computed, not vibed: every outcome is checkable, and the ledger is a formula you can read.
  • Vetoes really are hard: "I've seen it" means it never appears.
  • A plan you can actually go to tonight.

What we learned

  • Explainability makes agents honest. When an agent says why, it cites real evidence.
  • The model should choose and talk; code should enforce. Mixing the two was where every early bug lived.

What's next for Truce

Truce started as the "decide together" piece of a social taste app I'm building, so the next step is to bring it there. A couple or a group of friends would keep one long-running truce: the ledger, swaps and check-ins carry over between evenings, while tonight's wants are asked fresh each time. Beyond one evening, the same negotiation could plan a weekend away or a trip, where the trade-offs are bigger and fairness over time matters even more.

Built With

Share this project:

Updates

Submission history