Sportify
Real-time sports event coordinator — live scores, organizer dashboard, instant participant sync.
The problem
Local sports events are coordinated in WhatsApp groups — scores get lost, schedules drift, and new participants can't catch up. Organizers needed a single source of truth.
What I built
A platform for organizing and following local sports events. Live score broadcasts via Socket.io, an organizer dashboard for event setup, and a TypeScript-first backend with Prisma and PostgreSQL.
- Prisma schema modeling events, teams, participants, and score updates
- Socket.io layer for live score broadcasts — no polling, no refresh needed
- TypeScript-first backend with Zod validation on every route
- Organizer dashboard for event setup and participant management
Tech decisions worth mentioning
Picked PostgreSQL over Mongo this time because event relationships (event → teams → players → scores) are inherently relational. Prisma gave me type-safe queries end-to-end with TypeScript, which caught several schema drift bugs at compile time.
What I learned
Moving from JavaScript + Mongoose to TypeScript + Prisma was a much bigger jump than I expected — the types forced me to think through edge cases I'd been hand-waving over in JS.
What I'd do differently
I'd set up Socket.io rooms per-event from day one instead of broadcasting globally. Also want to explore using Postgres LISTEN/NOTIFY for fanout before reaching for a separate pub/sub.