Try it: open https://thooq.onrender.com/?lang=en → Try the live demo → Build the plan (about a minute). No sign-up needed. Arabic is the default; the language button switches at any time.

Inspiration

Planning a Saudi gathering (عزيمة) is rarely as simple as picking a popular restaurant. The host has to balance a grandmother who needs a calm place, children under six, a cousin who loves K-pop and another who only wants a good burger, usually through a long and inconclusive group chat. Generic "top 10" lists ignore the people actually coming. I wanted a planner that starts from each guest's taste and is honest about who a place suits.

What it does

Thooq (ذَوق, "taste") is an Arabic-first AI agent that turns a group's cultural favourites into a gathering plan everyone can enjoy.

  1. The host describes the occasion: city, group size, who is coming (children, seniors), budget and other constraints.
  2. Each guest answers three quick prompts: favourite shows/music/films, favourite places or brands, and the mood they want.
  3. Thooq matches every favourite to Qloo, finds places in the city for each guest and for the whole group, and ranks one shortlist against each guest separately.
  4. A planning agent turns moods and constraints ("quiet", "kids play area", "comfortable seating") into Qloo tags, searches again when needed, re-checks group fit, and writes a 1–3 stop plan.
  5. Every place shows who it suits, for example "Fits 3 of 4 guests", and which favourites connect it to them. Guests can rate the shared plan, and their votes adjust the next plan.

The one-click demo is a Riyadh family weekend lunch with four guests, including a grandmother and two small children.

What makes it Qloo-powered

Qloo is the core of the product, not a garnish. Without it there is no group fit:

  • Resolve: each guest's favourites (TV, music, film, brands, restaurants) become Qloo entities.
  • Recommend: Qloo finds restaurants, cafés, dessert shops, parks and malls in the event city (filtered with Qloo place-type tags) for each guest's taste and for the combined group.
  • Rank per guest: Qloo ranks the same shortlist using only one guest's favourites at a time, and Thooq orders each ranking by taste beyond popularity (Qloo affinity compared with Qloo popularity), so famous places don't fit everyone by default. A place "fits" a guest when it is in the top 40% of their ranking, and places are ordered by 0.5 × average + 0.5 × least-happy guest, so a place loved by one person and disliked by the rest doesn't win.
  • Tags: the agent maps moods and constraints to Qloo tags that filter the next search.
  • Evidence: the fit counts and connecting favourites shown to the host all come from Qloo.

How I built it

  • Node.js server with a small JSON store and same-origin API; plain HTML/CSS/JavaScript front end with full Arabic (RTL) and English modes.
  • Qloo through the official Qloo Harness, run in-process on the server (the browser never sees a key).
  • Gemini function calling as the planning agent, with tools find_tags, search_places, score_group_fit and finalize_plan, each with a small budget.
  • Guardrails: the server owns every tool. The city filter is fixed, only places and tags returned by Qloo can be used, fit numbers are recomputed by the server, and guest names are never sent to the model. If the model fails, the fit-ranked places are shown instead, and every step is listed under "How did Thooq reach this plan?".
  • Hosted on Render, with 30 automated tests. I designed and directed Thooq myself, and used AI coding assistants (OpenAI Codex and Claude) to help write, test and debug the code.

Challenges I ran into

  • Popularity bias in Riyadh: I found that for mainstream tastes, Qloo's Riyadh rankings mostly follow popularity, so different groups got the same famous places, and my fairness rule made it worse. Thooq now ranks places by taste beyond popularity (Qloo affinity compared against Qloo popularity) and only considers places a group goes out to, using Qloo's place-type tags. Now a traditional Saudi family, a luxury couple and a group of anime fans each get a different plan.
  • Arabic names and ambiguity: "Friends" or "Umm Kulthum" can match several Qloo entities. Taking the first candidate once matched a grandmother's favourite singer to a Turkish DJ, so the demo now only accepts a match whose name fits, and for real gatherings the host picks from Qloo's candidates or skips the name.
  • Bursts: planning makes many Qloo calls at once. I added a small concurrency limit and retries.
  • One bad option breaks a ranking: on the live server, one shortlisted place could not be looked up as a rank option, which blocked the ranking for every guest. Thooq now drops and remembers such places and ranks the rest.

Accomplishments that I'm proud of

  • Per-guest group fit that is visible and explainable, not a single opaque score.
  • An Arabic-first experience that feels natural for Saudi hosts, with an equal English mode.
  • An agent that stays grounded: it can only recommend real places Qloo returned.

What I learned

Group recommendation is a fairness problem: optimizing for the average guest leaves someone unhappy, and combining the average with the least-happy guest gives plans people actually accept. Cultural taste across music, TV and brands says a lot about the places a person will enjoy.

What's next

  • More cities across the Gulf, and occasions such as weddings, Ramadan gatherings and corporate events.
  • Booking and maps integration, and a WhatsApp-friendly guest flow.
  • Learning from guests' votes across gatherings.

Built With

Share this project:

Updates

Submission history