Inspiration

Group dining is a social problem disguised as a logistics problem: different cravings, budgets, dietary needs, vibes, and “I’m down for anything” paralysis. We wanted to build something that makes planning feel like a fun group moment instead of a coordination tax. Yelp has the best local business data, and chat is where these decisions already happen; so we built Cravemate around those two truths.

What it does

Cravemate is a group‑dining chat app that helps friends go from “I’m hungry” to “reservation confirmed” quickly.

  • Onboarding captures location, dietary preferences, and favorites, then runs a short “vibe game” based on real Yelp review snippets.
  • Vibe report generates a one‑liner summary of a user’s dining personality.
  • Group chat with @yelp lets anyone ask Yelp AI questions inside the chat, with follow‑ups that retain context per group.
  • Leaderboards let groups rank local favorites (Elo‑style battles) and share winners directly into chat.
  • Smart invites turn a decision into a pinned plan with a date/time picker and clear RSVP rules.
  • Group profile shows each member’s preferences + vibe report, and stores a collective “group context” used for better recommendations.
  • Realtime updates deliver a true multi‑client chat experience via a dedicated Socket.IO server.

How we built it

  • Frontend: Next.js (App Router) + React, styled with Tailwind CSS and shadcn/ui components.
  • Auth: NextAuth with Google OAuth plus email/password credentials.
  • Database: Postgres + Prisma for user profiles, groups, messages, invites, and leaderboard models.
  • Integrations
    • Yelp AI Chat API for @yelp in‑chat recommendations and follow‑ups using Yelp’s chat_id session memory.
    • Yelp Search + contextual reviews to power onboarding’s vibe game with real review snippets (without showing business names).
    • Gemini (Google GenAI SDK) for vibe report generation and a lightweight “aggregator” layer that helps orchestrate responses.
    • Mapbox Search Box for location autocomplete everywhere we accept a location.
  • Realtime: Socket.IO client in the Next.js app, and an always‑on Socket.IO server deployed separately (Render). The server authenticates clients using short‑lived JWTs minted by the app and restricts room access to a user’s group memberships.

Challenges we ran into

  • True realtime on serverless: Vercel’s serverless runtime isn’t a good fit for long‑lived websocket servers, so we separated realtime into a dedicated service.
  • Auth for sockets: securing the realtime server required issuing short‑lived tokens and enforcing room‑level access based on group membership.
  • Data consistency + UI state: keeping chat, leaderboards, and modals responsive without redundant fetches was tricky, especially when navigating between pages.
  • External API behavior: rate limits, latency, and response shapes (especially nested Yelp review snippets) required careful parsing and caching/fallback patterns.
  • Schema evolution: adding “group context” and onboarding fields required migrations and attention to existing DB state.

Accomplishments that we're proud of

  • A polished, end‑to‑end flow: onboarding → vibe → group chat → decision → invite.
  • @yelp chat sessions that persist context per group using Yelp’s chat_id.
  • Leaderboards that feel like a game (battles + ranking) but stay practical (share to chat, route back to the group).
  • A secure realtime setup that’s deployable on a free/low‑cost tier.
  • Location autocomplete and “City, State” formatting for a smoother UX everywhere.

What we learned

  • Product scope matters: the “decision loop” is the core; everything else should reduce friction around it.
  • Serverless is amazing for APIs, but websockets need different infrastructure (or a managed pub/sub layer).
  • Small UX details (modals that don’t reopen, inputs that don’t spam APIs, consistent theming) have outsized impact.
  • “Context” is a feature: aggregating group preferences and session state makes the AI outputs feel dramatically more relevant.

What's next for Cravemate

  • Better personalization: use group context + interaction history to rank results more intelligently.
  • Notifications: invite reminders, “decision locked” alerts, and async updates.
  • Deeper leaderboards: sharing, filtering, and “best of” rollups across neighborhoods.
  • Mobile experience: PWA polish and touch‑first interactions.
  • Trust & safety: abuse prevention for invites, rate limiting, and auditing for AI requests.

Built With

Share this project:

Updates