💜 Inspiration
It always hits around midnight.
You're lying in the dark, thumb scrolling, and everyone you know is having the best day of their lives — beaches, promotions, brunch, couples. And you just... had a day. Not a tragedy. Just heavy. The kind of heavy you can't explain, because if someone asked "what's wrong?" you'd say "nothing" — and you'd mean it. There's nothing wrong. There's just no one who gets it.
Here's the cruel part: thousands of people felt exactly that tonight. And the apps in our hands — the ones built to connect us — made every one of them feel more alone. There's no filter for "I'm fine but I'm not." So we perform "okay," scroll past everyone performing "amazing," and the most-online generation in history gets a little lonelier.
We made the internet a stage. We wanted to make it a room.
That's VibeCurve — the anti-flex network. No likes. No followers. No feed. No permanent record to perform for. Presence over permanence, connection over content, honesty over perfection.
🌊 What it does
VibeCurve matches you with strangers based on how your day actually felt — and then deletes the evidence.
- Build a permanent self. Sign in with Google and move through a playful walkthrough: define yourself in 1–2 words (we derive your emoji from it), branch through Gen-Z flashcards (your energy, your group-chat role, your comfort food, your texting style), and write a one-sentence bio. Your identity is Google-verified on the backend, but peers only ever see your emoji — identity-backed pseudonymity.
- Draw your day. Plot the shape of your day as five points across Morning → Afternoon → Evening → Night. The curve color-grades live: green where it was bright, red where it got heavy. Ten seconds, no words — because the truest things never had words.
- Find your parallel. Your interests choose the candidate pool; your curve picks the room within it. You land with someone who shares an interest and felt today most like you.
- Meet in a Parallel Room. A small, anonymous, emoji-only room with a live countdown to midnight — text, stickers, GIFs, 30-second voice notes, and a real-time peer-to-peer group voice call.
- Midnight burn. At local midnight, the room, the messages, and the curves dissolve. Your profile stays. The day doesn't. People are only honest when nothing is being kept.
🛠️ How we built it
Frontend. Next.js 15 (App Router) + React 19 + TypeScript, styled with Tailwind. The landing page is a single continuous flight: a persistent Three.js / react-three-fiber universe whose palette morphs through eight emotional "worlds" (Curious → Playful → Laughter → Confidence → Romance → Adventure → Deep Conversations → Real Connections) as you scroll, driven by GSAP + Lenis smooth scroll and Framer Motion, with a mobile DNA-helix that draws itself as you go. The curve itself is rendered with a Catmull-Rom → cubic-Bézier spline so a five-point sketch reads as a smooth, living line.
Matching. Each curve is quantized to five integers in [0,10] and reduced to a coarse L/M/H signature (low/medium/high per point) — the bucket key that pools similar days together. Within a pool, closeness is an honest Euclidean day-shape similarity, normalized so an identical day scores 1.0:
$$ \text{similarity}(a,b) \;=\; 1 \;-\; \frac{\sqrt{\sum_{i=1}^{5}(a_i - b_i)^2}}{\sqrt{5 \times 10^{2}}} $$
The number you see on a match is this real shape-similarity — lifted slightly by how deep a shared-interest branch runs — so a high % genuinely means "our days had the same shape," never a vanity score.
Backend. Amazon DynamoDB in a single-table design: a GSI1 shape-bucket index does the matching query, and the "midnight burn" is a literal DynamoDB TTL — every room, message, and curve is stamped to expire at local midnight, so cleanup is automatic, there's no cron job, and storage stays flat no matter how many people join. Auth is NextAuth (Google). The whole thing deploys to Vercel on every push to main.
Live voice. Group calls run on a WebRTC mesh — audio is peer-to-peer; only tiny signaling metadata (offers/answers/ICE candidates) ever transits the backend, delivered once and deleted.
Demo-resilience. With no AWS credentials, the app transparently falls back to an in-memory store mirroring the exact DynamoDB access patterns, so it runs anywhere with zero cloud setup. A handful of gentle "ambient companions" keep an early room from ever feeling empty during cold-start — honest scaffolding while real liquidity builds.
🧗 Challenges we ran into
- Making a number honest. Early matching showed a flat, feel-good "100%." It was a lie. We rebuilt it so the drawn curve is the headline signal and the percentage is a real normalized distance — warm, but never fake.
- Burning data without breaking the room. We wanted ephemerality enforced two ways: instantly in the app the moment the clock turns, and swept at the storage layer. Mapping that onto a single DynamoDB TTL attribute (and keeping voice blobs out of the room poll so a 1.2s refresh stays light) took real schema care.
- Peer-to-peer audio with almost no server. A WebRTC mesh means every tab negotiates with every other tab; getting presence heartbeats, stale-peer pruning, and deliver-once signaling right — over plain polling — was the hardest part.
- The cold-start paradox. A matching app is worthless on night one. Ambient companions plus widening shape-tolerance when supply is thin let a first user still land somewhere that feels real.
- A 3D world that doesn't melt phones. Keeping a persistent react-three-fiber scene smooth on mobile meant a lighter DNA-helix fallback and disciplined scroll-driven palette interpolation.
🏆 Accomplishments we're proud of
- A genuinely new social primitive — matching on the shape of a feeling, not on followers or an attention algorithm.
- Ephemerality that's a feature, not a gimmick: the burn is the soul of the product and the engine of retention and a near-zero-cost infrastructure decision, all at once.
- A landing experience that feels like an emotional journey, not a marketing page.
- An architecture where margins improve with scale — because the data evaporates every night.
📚 What we learned
- Constraints create honesty. Remove the feed, the likes, and the permanent record, and people finally tell the truth. The thing we deleted was the feature.
- Your viral loop should live inside the artifact. A color-graded curve is screenshot-native; "this was my day — draw yours" is a referral built into the product's own output.
- Ephemeral and permanent can coexist — the content burns, but the ritual (your profile, your streak of honest days) is what people come back to.
- A surprising amount of emotional design is really just timing, color, and silence.
🚀 What's next
- Timezone-by-timezone, campus-by-campus rollout (loneliness peaks at universities) so every market is dense before the next opens.
- A trust-and-safety spine that lives outside the ephemeral store: real-time toxicity filtering, one-tap report-and-eject, short-window abuse signals.
- "Post your curve" daily-prompt challenges and creator seeding.
- An anonymous, aggregate loneliness pulse — what a city felt this week — sold only as trends, never as data. The forgetting is the business model.
Built With
- amazon-dynamodb
- amazon-web-services
- framer-motion
- google-oauth
- gsap
- lenis
- next.js
- nextauth.js
- node.js
- react
- react-three-fiber
- tailwindcss
- three.js
- typescript
- v0
- vercel
- webrtc
- zustand
Log in or sign up for Devpost to join the conversation.