Skip to content
Tate Clothier

03

Grubr

Problem
Choosing where to eat with a group is a 40-message thread. Rating apps show lists; nobody wants a list, they want a yes.
My role
Built the Next.js/TypeScript frontend and Python backend and designed the agentic recommendation engine on Vertex AI.
Stack
Next.js · TypeScript · Tailwind · Python · Google Vertex AI (Gemini) · Vercel
Outcome
Shipped and deployed within the hackathon window; awarded Most Likely Product to Succeed in the Consumer Market, April 2026.
Grubr onboarding: dietary restriction and price range selection before the swipe deck.
01

Problem

Restaurant discovery is still a list of search results sorted by rating. That is the wrong shape for the actual question — what do I want right now, that fits my diet and budget, near here — and it is hopeless for groups.

Swiping is a better input: a yes or no on a dish photo takes half a second and carries more preference signal than a star rating.

02

What I built

Grubr onboards you with dietary restrictions (vegetarian, vegan, gluten-free, nut-free, dairy-free, halal, kosher) and a price range, then shows one restaurant at a time with its food photographed. Swipe right to save, left to pass.

Behind each card is an agent loop on Google Vertex AI. Gemini looks at the dish photos (vision), the embedded descriptions and your swipe history (semantic embedding search), and your stated constraints (preference reasoning), and decides what to show next. The same agent handles a chat — “something spicy under $15” — so NLP, vision and embeddings run through one loop instead of three separate features.

Next.js + TypeScript frontend (Turbopack) on Vercel
Onboarding, swipe deck, chat
Python backend
Recommendation API, swipe ingestion, session state
Google Vertex AI (Gemini)
Image understanding, text embeddings, reasoning over preferences
Embedding search
Restaurant and dish descriptions embedded once; swipe history steers the query vector
Tailwind CSS
Onboarding and card UI
03

Technical decisions

  1. 01

    One agent loop over three modalities.

    A vision model that tags photos, an embedding index that searches descriptions and a chat that parses requests would be three pipelines with three sets of bugs. Letting one Gemini agent call each as a tool meant every signal — what you swiped, what you typed, what the photo shows — fed one decision.

  2. 02

    Swipes as the preference signal, not ratings.

    Nobody rates restaurants they haven't been to. A swipe is a prediction about desire, which is exactly what a recommender needs, and it produces dozens of data points in a minute.

  3. 03

    Scope to what ships in the time box.

    Onboarding, the deck, the agent and deployment were the demo. Group sessions and reservations were left out so recommendation quality could be tuned instead of half-building features.

04

Outcome

  • Deployed on Vercel and demoed live at Innovation Hacks 2026.
  • Awarded Most Likely Product to Succeed in the Consumer Market (April 2026).
05

Stack

TypeScript
Frontend and API client types
Python
Recommendation backend
React
Swipe deck and onboarding UI
Next.js
App Router frontend with Turbopack
Tailwind CSS
Styling
REST API design
Recommendation, swipe and chat endpoints
Vercel
Hosting
Google Cloud / Vertex AI
Hosted Gemini models and embeddings
Gemini (vision + embeddings)
Dish photo understanding, text embeddings and preference reasoning
Agentic workflow design
One tool-using loop over vision, search and preference reasoning
Semantic / embedding search
Swipe-steered retrieval over embedded restaurants and dishes