03
Grubr
- 2026
- Full-stack build · agentic recommendation engine
- AWARDED · INNOVATION HACKS 2026
- Live (opens in new tab)
- 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.

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.
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
Technical decisions
- 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.
- 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.
- 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.
Outcome
- Deployed on Vercel and demoed live at Innovation Hacks 2026.
- Awarded Most Likely Product to Succeed in the Consumer Market (April 2026).
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