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
@yelplets 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
@yelpin‑chat recommendations and follow‑ups using Yelp’schat_idsession 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.
- Yelp AI Chat API for
- 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.
@yelpchat sessions that persist context per group using Yelp’schat_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
- gemini
- next.js
- postgresql
- shadcn-ui
- socket.io
- tailwindcss
- yelpai
Log in or sign up for Devpost to join the conversation.