Inspiration

Group plans die in group chats. Someone proposes a plan, a few people react with an emoji, and nobody actually commits — because nobody wants to be the first "yes" if everyone else bails. We wanted to remove that social friction: what if you couldn't see who else said yes until enough people were already in?

What it does

Alibi lets you create a plan with a few candidate times and a reveal threshold. You share one link. Invitees RSVP yes/no/maybe — but every response stays sealed. Nobody can see who's responded or what they said, not even that a response exists, until the threshold is hit. Once enough "yes" responses come in, the plan unseals all at once and everyone sees the full list simultaneously. If the deadline passes without hitting threshold, the plan expires and offers a one-click way to propose a new plan pre-filled with the same details.

How we built it

Vanilla HTML/CSS/JS, no frameworks or build step, deployed on Vercel with GitHub auto-deploy. Plan and RSVP data is stored as JSON via Vercel Blob storage, accessed through Vercel serverless functions (/api/create-plan, /api/plan, /api/rsvp). No accounts or auth — identity is just whatever name someone types when they RSVP, kept intentionally frictionless.

Challenges we ran into

Storage was the big one. We originally built against Vercel KV, but discovered mid-build that Vercel KV now requires a paid Redis Cloud plan rather than a free tier — so we re-architected the storage layer around Vercel Blob instead, which meant rewriting the data access layer without touching the API routes above it. We also hit a subtle bug where the RSVP form's DOM cleanup logic was accidentally detaching the main content container from the page, which silently broke re-rendering after a submit with no visible error — that took careful console/network debugging to isolate since it failed silently rather than throwing.

Accomplishments that we're proud of

Getting the anonymous-reveal mechanic to actually work end-to-end — sealed state, live threshold tracking, simultaneous reveal, and expiration with a working "propose a new time" flow that pre-fills the original plan's details. All with zero dependencies and zero build tooling.

What we learned

Cloud provider free tiers shift — what's free changes over time, and it's worth verifying a service's current pricing before architecting around it. Also: DOM manipulation bugs that fail silently (no thrown error, just a detached node) are far harder to catch than ones that throw, and are worth defensive-coding around.

What's next for Alibi

Group-level features — letting a plan have a name-list of expected invitees so the creator can see response counts without full identities, richer time-conflict resolution across candidate times, and possibly SMS/email nudges as the deadline approaches.

Built With

Share this project:

Updates