Inspiration
Walk into any restaurant, café, or dining hall and you'll notice something: tables full of people eating alone, on their phones, not because they want to be isolated, but just because that's how it worked out today. Some of those people would love to meet someone new. They just don't have a way to find each other.
That feeling was the seed for The Quiet Table. Schedules don't always line up. Friends get busy. The transition from high school to college, or from college to a new city, means the people you used to grab a meal with aren't always around anymore. A quick lunch between classes or a break at work often just becomes you and your phone. What if, for those moments, you could find someone nearby who felt the same way?
A friend's observation pushed the idea further. She pointed out that most opportunities to meet new people feel high stakes. Organized mixers, networking events, icebreaker circles. The pressure to perform and make an impression makes the whole thing exhausting. What if meeting someone new could just happen? Low-key, unplanned, over food?
That shaped every design decision we made. You don't browse profiles. You don't even see someone's name or photo before matching. You don't get to hand-pick who you eat with. The anonymity isn't just a feature, it's the philosophy. It keeps the app from feeling like a dating app or a networking tool, and it keeps it safe. No targeting, no pressure. Just two people who both said yes to something unexpected, sitting down across from each other.
Some of the best stories start with a stranger across a table. We just wanted to set the scene.
What it does
The Quiet Table lets solo diners signal that they're open to company. Once you're in, there are two ways to use it.
"I have something in mind" — If you already have a place in mind, you pick a restaurant, set a time, and signal that you're available. You get placed on the live map so that anyone nearby who is open to something spontaneous can find you and send a match request.
"Open to anything" — If you're more spontaneous, you open a live map showing solo diners who are active right now at venues nearby. Tap a pin, confirm you're interested, and if they feel the same way, you're matched.
Either way, the moment both people confirm, the app generates a personalised icebreaker powered by Gemini — one warm, genuine conversation starter to break the silence — and that's where our job ends. You take it from there.
After the meal, the connection dissolves. No profile to find, no history saved, no way to look each other up. If you both want to stay in touch, you can choose to exchange contact info. If not, you part ways and the app forgets it ever happened. No feed. No followers. Just a meal and whatever comes next.
How we built it
Frontend: Next.js 16, Tailwind CSS, App Router Auth:NextAuth v5 + Google OAuth + custom backend JWT Backend: Node.js + Express, deployed on Render Database: MongoDB Atlas Maps: Google Maps API + Places Autocomplete AI: Gemini 2.5 Flash Hosting: Vercel (frontend) + Render (backend) Proximity matching uses MongoDB's geospatial index with $nearSphere queries
Challenges we ran into
- Serverless vs. persistent connections: Our first instinct was to deploy everything on Vercel. Express apps with persistent MongoDB connections don't belong in a serverless environment — the root api/ directory conflicted with Next.js's own /api/ routing and broke NextAuth entirely. The fix was separating concerns: Next.js frontend on Vercel, Express backend on Render.
- Mutual matching without identity leaks: Neither user should see the other's name or details until both have opted in. This required enforcing the mutual confirmation at the API level — not just the UI — so no information could leak in either direction before both sides confirmed.
- Making Gemini sound human: Early icebreaker prompts felt like HR interview questions. The breakthrough was reframing the prompt: instead of asking Gemini to generate "good questions," we instructed it to craft questions that Person A would naturally ask, secretly informed by Person B's profile so the questions land well without either person knowing why.
- Ephemeral by design: Building a system where the default outcome is disconnection required fighting every instinct of modern app design. No match history, no persistent profiles visible to others, sessions auto-deleted. The hardest part was resisting the urge to add just one more social feature.
Accomplishments that we're proud of
A fully mutual match flow where neither user's identity is revealed until both sides confirm — enforced at the data model level, not just the UI Gemini-powered icebreakers that feel genuinely personal without ever revealing that any profiling happened A clean two-path UX that handles both spontaneous and planned solo dining in a single cohesive app Session auto-expiry and zero persistent social data — privacy by architecture, not policy
What we learned
How to implement geospatial proximity matching in MongoDB using $nearSphere with a 2dsphere index How NextAuth v5 integrates with a custom backend JWT alongside Google OAuth The real complexity of ephemeral-by-default product design — every feature decision had to justify why it shouldn't dissolve How to prompt Gemini to produce output that feels human rather than generated
What's next for Quiet Table
SMS verification via Bandwidth for identity trust without social profiles
Venue partnerships — certifying restaurants that are trained to facilitate Quiet Table connections (reserved seats, staff awareness)
Group mode — 3 to 5 solo diners at the same venue, not just 1-on-1
Campus launch at UNC Chapel Hill with 5–10 partner venues
Log in or sign up for Devpost to join the conversation.