Inspiration

A few frustrations collided for us.

Ratings without trust. Google Maps and every popular food app give you a number out of five, but a 4.6 from thousands of strangers tells you nothing about your taste. There is no warmth and no credibility behind it: the rating was never tailored to what you actually love. We wanted recommendations that come with a person and a reason attached, not an anonymous average.

Menu paralysis. Standing in front of a menu (or a dozen options on a map) is genuinely overwhelming. Half the time we just want someone we trust to say "get this one" based on what we're in the mood for, instead of decoding ten dishes ourselves. So we built BlindBite to take a craving and hand back one confident, AI-backed pick, the way a friend who knows the place would.

Meeting people is the gem of life. The best moments come from new connections, and they're even better when it's someone who shares your taste. Food is one of the last low-stakes, high-warmth reasons strangers still talk to each other. Dating apps optimise for swiping; maps apps optimise for star ratings; nobody optimises for the small, joyful connection of "you loved the place I sent you to."

There's also the most universal Gen Z group-chat moment: "I'm starving, where should we eat?" followed by forty messages and zero decisions. The advice that actually lands never comes from an algorithm. It comes from a friend who says "trust me, get the octopus."

BlindBite is our answer: a map-first social app where a craving becomes a recommendation, and a good recommendation becomes a friendship.

What it does

The whole experience is one tight loop:

  1. Post a craving ("best grilled octopus nearby", "cozy wine bar for date night").
  2. A full-screen map centers on you, your craving pinned with a pulsing 🔥.
  3. Recommendations drop as pins from real people and an AI co-recommender, so the map is never empty even when you're the first one there.
  4. Every pin is an AI-enriched card: a generated dish image, a one-line vibe summary, tags, and a ✨ Best match badge on the top-ranked spot.
  5. You pick one, go, then do a vibe check: 💚 Loved it or 💔 Not for me.
  6. Loved it fires a chat request to the recommender. When they accept, a chat opens with an AI icebreaker referencing the food you bonded over.

AI shows up in five places, and each one is a real driver of the experience, not decoration: pin enrichment (vibe summary + tags), AI dish-image generation, smart-match ranking, the AI co-recommender, and icebreaker generation.

How we built it

Stack: Next.js 15 (App Router) · Supabase (Postgres + PostGIS + Realtime) · GLM-4 and GLM-Image (with a Claude fallback) · Mapbox GL · Tailwind + shadcn/ui, deployed on Vercel.

We made one architectural bet that saved us: stubs first. Every one of the 10 API routes shipped returning mock data, so the frontend could build all 7 screens against a stable contract while the backend swapped in real AI behind the same interfaces. No one was ever blocked.

The second bet was one AI utility, many wrappers. All four AI layers are just different prompts to the same callAI() function, which tries GLM-4 first and falls back to Claude:

ts export async function callAI(prompt: string, systemPrompt?: string) { try { return await callGLM4(prompt, systemPrompt); } catch { return await callClaude(prompt, systemPrompt); } } ​

Nearby cravings are fetched with a PostGIS radius query instead of pulling everything and filtering client-side:

sql SELECT * FROM cravings WHERE status = 'active' AND ST_DWithin(location, ST_MakePoint($lng, $lat)::geography, $radius) ORDER BY created_at DESC; ​

Smart-match scores each recommendation $r$ against a craving $c$ on $[0, 1]$, and the displayed best match is simply

$$ r^* = \arg\max_{r \,\in\, R_c} \; \text{score}(r, c) $$

with the winning pin flagged is_best_match = true and given the golden glow. Supabase Realtime carries the magic of the demo: pin a place on one phone and it drops onto the other phone's map live, with chat syncing in real time on both sides.

Challenges we ran into

  • The pivot itself. Mid-event we threw away our v1 concept and rebuilt around the craving→connection moment. Hardest and best call we made.
  • Async AI without blocking the user. Pin enrichment and co-recommendation can take seconds, so we fire them in the background after the insert and let Realtime stream the enriched result back. The UI never feels stuck.
  • Making AI feel warm, not robotic. Tuning the icebreaker and vibe-summary prompts to sound like a friend and not a chatbot took more iteration than any other part of the build.

Accomplishments that we're proud of

  • A complete, demo-able loop end to end: craving → map → AI-enriched pins → pick → vibe check → chat unlock → AI icebreaker, all working live on two phones.
  • The map is never empty. The AI co-recommender plus a hardcoded demo-restaurant fallback means there is always something to discover, even as the very first user in an area.
  • Real-time that actually feels like magic in the demo: a pin dropped on one device appears instantly on another.

What we learned

  • Stub-driven parallelism is a superpower at hackathon speed. Agreeing the API contract early meant frontend and backend never waited on each other.
  • A good fallback is a feature, not a safety net. Always-populated maps made the demo believable and repeatable.
  • Model routing beats model loyalty. Wrapping GLM-4 and Claude behind one function gave us a primary plus a graceful degrade path with zero rewrites.
  • The product is the feeling. Our pivot taught us to cut everything that wasn't the craving→connection moment.

What's next for BlindBite

  • Smart alerts that pass the joy forward. When you love a recommendation, you become the local expert on that craving. So when another user nearby posts a similar request, BlindBite nudges you to share the spot you just fell in love with. Every great meal becomes a recommendation waiting to happen, turning satisfied diners into a self-sustaining network of trusted tips.
  • Real-time push when someone nearby craves your favourite dish, so you never miss a chance to play matchmaker between a person and a plate.
  • Taste-profile learning from your vibe-check history, so smart-match gets sharper every time you say Loved it.
  • Group cravings, so a whole friend group can finally answer "where should we eat tonight?" in one tap.

Built With

Share this project:

Updates