Two Tickets: one Indian film for two tastes

Two Tickets helps two people pick one Indian film to watch together when their tastes differ, for example when one of you loved Parasite and the other loved Mamma Mia!.

Why Indian films

India makes films in many languages, from Malayalam and Tamil to Telugu and Bangla, and people ask for Indian film picks on Reddit (r/MovieSuggestions, r/Letterboxd), often to watch with a partner or friends. When you ask a chatbot for one that two different tastes will both enjoy, though, the same few Hindi hits keep coming back.

What it does

Two Tickets asks Qloo's taste graph instead of a chatbot. It searches with both people's films as one taste, and each pick shows the evidence from Qloo behind it, e.g., how much each person's film shaped the result, the tags it shares with each film, and both ranks when the film is on both people's own lists. When one of you says "seen it" or "too long", it finds a replacement, or it says plainly that nothing else fits you both.

Each pick shows its language when Wikidata has it. When you get three picks, at least one is in another Indian language, e.g., Malayalam, Telugu or Bangla, whenever such a film fits you both, so the list isn't all Bollywood. If nothing fits both of you, the app says so and shows the closest options. It never invents a film, because every pick is a Qloo result.

Why a taste graph and not a chatbot

We asked chatbots for Indian films this pair would both enjoy 24 times, with default settings and no web search, and every prompt and answer is in the repo's baselines/ folder. Andhadhun, a film they never suggested to a Mamma Mia! fan on their own, was on 23 of the 24 lists. It was on all 14 lists we asked for in one fixed wording, which are the answers the app shows next to its picks, and on 9 of the 10 lists we asked for casually.

Chatbots also tend to splice two lists together, meaning they take part of each person's usual list instead of finding new films. Across 14 answers, 35% of their picks came from their own Parasite lists, 42% came from their Mamma Mia! lists, and 19% were new. Qloo's joint top 10 for the same pair had 2 films from Qloo's Parasite top 10 and none from its Mamma Mia! top 10, and the other 8 were on neither list, so Qloo blends the two tastes into new films.

Qloo also returns some of the famous films. Andhadhun and Gully Boy are in its joint top 10, and the agent picked Andhadhun in each of our 3 test runs. The other two picks in those runs were from other Indian languages, with Malayalam films in all three runs and one Punjabi film.

How it uses Qloo

  • /search finds the Qloo entity for each person's film.
  • /v2/insights, with both people's films as one signal, finds the joint picks. feature.explainability shows how much each person's film shaped each result. For joint picks those shares sit close to even (42% to 66% across 200 films in our test), so we show them as context and not as proof that a film suits both people.
  • Each person's own list (paged, 100 deep) is the stronger evidence, and a film on both lists is labelled with both ranks. Such films are rare for contrasting tastes (0 to 5 in each 100 we checked), so most picks show the joint search evidence instead.
  • A film counts as Indian when India is the first production country Qloo lists, and when Wikidata doesn't list it under other countries only. A plain "India" filter let in 1917 and Slumdog Millionaire, which list India among several countries.
  • Qloo has no language field, so each film's original language comes from Wikidata through the wikidata_id that Qloo returns. For our example pair, Qloo's joint list was all Hindi to #20, and other languages started at #26, so at least one pick comes from that deeper part of the list. The code refuses three Hindi picks while another film fits.
  • duration lets the app check a "too long" veto instead of guessing.

How we built it

Two Tickets is an agent loop, meaning an LLM that calls tools, over a small Qloo client, and it runs on Cloudflare Workers with a Durable Object. The model decides which tool to call next, and the code does the arithmetic and enforces the rules. We moved the "fits both" rule into code after we saw the same model, on the same data, keep 3 unverified picks in one run and 1 in the next. If the model is unavailable, the app falls back to a simpler search without the model and says so.

Challenges

  • The "fits both" rule favours famous films, because popular films sit on everyone's list. For our example pair, the Hindi films near the top were more popular than the films in other languages further down (median popularity 0.865 and 0.648 on Qloo's 0 to 1 scale). We sort the best-fitting picks so that the least popular come first.
  • Contrasting tastes can leave nothing that fits both people, and the app shows that instead of padding the list.

What we learned

  • Qloo's joint query blends the two tastes, because 8 of the joint top 10 were on neither person's own top 10.
  • Explainability shares always add up to one, so they can't show that a film fits neither person. Each person's own affinity for a film is a better signal, and we're still testing it.
  • Qloo's results don't change between runs (600 of 600 films at the same ranks on a rerun), so every test we ran can be repeated.

What's next

We want to support more than two people and other catalogues, and we want to let each person set how much their own taste should count tonight.

Try it: https://two-tickets.kazani.workers.dev (the demo needs a judge code; the "Try it out" links include a one-click link that has it filled in). Type two films you love, or use the example pair.

Code: https://github.com/kazani-351/two-tickets (MIT license)

Built With

  • cloudflare-workers
  • durable-objects
  • gpt-5.4-mini
  • javascript
  • meshapi
  • qloo-api
  • wikidata
Share this project:

Updates

Submission history