- Constraint
- Two near-simultaneous final votes could otherwise reveal and broadcast the same round twice.
- Decision
- Make the voting-to-revealed transition atomic in the repository boundary.
- Why it mattered
- Every connected client receives one authoritative transition, even under concurrency.
- Trade-off
- The server owns more lifecycle logic instead of treating sockets as simple relays.
Real-time · Collaborative SaaS
Independent productScrum Poker
A real-time planning room with hidden voting, atomic reveals, live roles, round history, and a clean handoff after estimation.
Read this first
The system at a glance.
- What I built
- A collaborative estimation product for distributed engineering teams, usable with or without an account.
- My contribution
- End-to-end product and system delivery across room UX, real-time state, persistence, identity, and billing.
- Core challenge
- Keep every participant synchronized while preventing vote anchoring and duplicate reveal transitions.
- Key technologies
- React, Vite, Socket.IO, PostgreSQL, Drizzle, Better Auth, Stripe
Capability flow
How the system works.
Each step connects a user action to the system capability behind it.
-
Open a room
Authenticated teams or capped guest sessions create a persistent planning space.
-
Synchronize participants
Facilitator, voter, and spectator roles update as people join, leave, or transfer control.
-
Vote without anchoring
The server broadcasts who has voted but never exposes a value while the round is active.
-
Reveal atomically
The final eligible vote can reveal once, with average, median, range, and mode calculated for the room.
-
Carry the decision forward
Final estimates, revotes, and round history preserve the planning outcome for the next workflow.
Engineering judgment
Decisions that shaped the system.
- Constraint
- The first visible estimate can bias everyone who has not voted yet.
- Decision
- Broadcast participation state during voting, but withhold values until reveal.
- Why it mattered
- The interface supports independent estimates without hiding team progress.
- Trade-off
- Clients need separate active-round and revealed-round payloads.
Technical evidence
Skills backed by this system.
Open any skill to see the other products and professional work connected to it.
- React Renders the room, role controls, deck interactions, results, and history as one responsive workflow.
- Vite Builds the fast single-page product surface and its route-based feature delivery.
- WebSockets Keeps room membership, round state, votes, and facilitator changes synchronized live.
- Socket.IO Defines explicit client/server events for joining, voting, revealing, closing, and role changes.
- PostgreSQL Persists rooms, participants, rounds, votes, sessions, and the history behind revotes.
- Drizzle Keeps the relational schema and ordered migrations shared between API services and tests.
- Better Auth Supports sessions, password flows, magic links, and optional Google sign-in around persistent rooms.
- Stripe Connects the optional Pro subscription to product capabilities after the core estimation loop.
Technology stack
- React
- Socket.IO
- PostgreSQL
- Drizzle
- Better Auth
- Stripe