Inspiration
Every group chat has the same message: "gym tomorrow, for real this time." Nobody goes, and nothing happens. Resolutions fail because breaking them is free.
Behavioral economics has an answer called a commitment contract: put money on the line and you follow through far more often. We wanted to add the one thing those contracts usually lack, which is your friends watching. So we built an app where flaking costs you money and your reputation.
What it does
ShamePool is a group accountability app. Skip the task, lose the cash.
- Commit: You and your squad each set a goal with a location, a schedule, a deadline and a penalty, such as "gym 4x a week, $5 if I miss."
- Prove it: Check-ins are verified by GPS (you have to stay inside the radius for a minimum time) and by a photo that Grok checks. A selfie from the couch gets rejected with a roast.
- Pay up: Miss the deadline and you are charged automatically. The penalty doubles for every flake in a row, up to a cap.
- Get shamed: The money lands in a shared squad pool. A live leaderboard crowns the "Flake of the Week," and Squad Bot roasts you in the group chat over iMessage and reads it out loud.
- Spend it together: When the pool hits its goal (say, "Pizza night, $60"), the squad votes to cash out.
It is not gambling. Nobody wins anyone else's money, and nobody profits from your failure. Your friends just eat pizza on it.
How we built it
- Frontend: Next.js 15 (App Router), TypeScript and Tailwind CSS, with Framer Motion for the celebrations and Leaflet for the location picker. It is mobile web first, plus a projector view for the live leaderboard.
- Realtime backend: SpacetimeDB holds all state and game logic in reducers, runs a scheduled deadline check, and pushes every change to all phones through live subscriptions.
- Money: Capital One Nessie moves penalties from each member's account into the pool account. All money is stored as integer cents.
- Photo verification: Grok vision judges whether the photo matches the goal.
- Squad Bot: Photon puts the bot in the squad's iMessage group chat, and ElevenLabs gives its roasts a voice.
- Architecture: The UI only talks to a typed contract of hooks and actions. We built a full mock backend first (in-browser store with cross-tab sync), then implemented the same contract with real services. The pure rules live in one shared file, so mock and live cannot disagree.
- Deploy: Vercel, at
shamepool.vercel.app.
Challenges we ran into
- Never charging twice. A deadline can be evaluated by the scheduler, a retry, and a manual trigger at the same moment. We made penalties idempotent with one key per goal per date, so a second attempt returns the existing charge.
- Time is hard. Deadlines follow the squad's timezone, not the device's, and they have to survive daylight saving changes. If nobody opens the app at the deadline, the scheduler catches up on missed days in order, with the correct escalation.
- Indoor GPS. Location is unreliable inside buildings, so we added accuracy slack, a wider radius, and periodic re-checks during the stay timer without punishing a temporary signal drop.
- Money edge cases. What happens when the penalty is bigger than your balance? We charge what is there, record the shortfall, and never let a balance go below zero.
- External services inside a real-time database. Bank transfers, AI calls, and messages go through an outbox with retries, so a failed API call never corrupts the state.
Accomplishments that we're proud of
- The full loop works end to end: commit, check in, flake, get charged, get roasted, and cash out by vote.
- A flake on one phone shows up on every screen and the projector within seconds.
- A long list of edge cases is handled and covered by tests, including a tested invariant that the pool always equals the penalties charged minus the cash-outs paid.
- A mock mode good enough to be our backup on stage if the wifi dies.
- Flakey, our original mascot, who melts every time you let your squad down.
What we learned
- Building against a contract and a mock first let us work on the frontend and the backend in parallel, and swap in real services without touching a single screen.
- Moving money, even sandbox money, forces discipline: integer cents, idempotency keys, and typed results for every action.
- Loss aversion plus social pressure is a much stronger motivator than a streak counter alone.
- Scoping to the two-minute demo kept us honest about what to build and what to cut.
What's next for ShamePool
- Real payments with real bank accounts and proper authentication.
- Native apps with background location and push notifications, so check-ins need less effort.
- Multiple squads per user, plus an appeals flow for sick days and honest mistakes.
- More ways to verify goals beyond location, such as study sessions, sleep, and screen time.
- Smarter Squad Bot that nudges you before the deadline instead of only roasting you after it.
- Group management, so squads can invite and remove members, assign admins, and set their own rules.
Built With
- css3
- elevenlabs
- html5
- motion
- nessie
- next.js
- photon
- spacetimedb
- tailwind
- typescript
- vercel
- vscode
Log in or sign up for Devpost to join the conversation.