Independent project: Real-time web and mobile app
Ringside: a watch-party app for live sports
A watch-party app for people who follow sports together: spoiler-safe chat, live reaction counts, polls, pick'ems and a data desk with live tables and fixtures for UFC, F1, football, college football and cricket. A web app, a Node server and an Android app share one API. Around 200 users have used it.

What it is
Watching a game with friends who are not in the room is awkward when everyone is a different distance behind the stream: someone's goal alert ruins it for someone else. Ringside is a small product built around that problem, with a lot of sports data around it.
Each person sets how far behind the stream they are, and the server holds their friends' messages until that moment. The rest of the app is what a watch party needs: reactions, polls, pick'ems, and tables and schedules for five sports.
My part
I built the web app, the real-time server, the sports-data layer and the Android app.
Independent project. It is a prototype: rooms, chat, household presence and profiles are seeded demo content, and the live part is the sports data.
Stack
- React 19
- Vite
- Express 5
- Socket.IO
- MongoDB (optional)
- Expo / React Native
What is inside
A React client and an Express and Socket.IO server, with one normalized sports API shared by the web and Android apps.
01
Real-time rooms
Socket.IO rooms carry chat, polls and reactions. Chat is scheduled per recipient using their offset, capped at 15 minutes.
02
Reaction batching
Reactions are counted in a 650 ms bucket per room, then sent as one aggregate count.
03
Sports data layer
One endpoint merges UFC.com, Jolpica (F1), ESPN (football, college football, MMA events) and ESPNcricinfo into a single response. The server caches it for five minutes, times out slow sources, and keeps the last good result for a sport when its source fails.
04
Clients
The web app and the Expo Android app read the same API and rooms, so a provider can be swapped without touching the screens.

