Skip to content
Ratnesh's notebook
All projects
ReactNode.jsExpressMongoDBZustand2023

SeenJeem — Real-time Quiz Platform

A live quiz platform serving an active user base in Kuwait. I owned the full React frontend — leaderboard, quiz flows, credit transactions — plus the Express APIs behind auth and pagination. Monthly active users grew 25% over six months.

Overview

SeenJeem is a real-time quiz app built for the Kuwaiti market. Players compete in timed rounds, spend credits to enter, and watch a leaderboard update as results come in. I owned the frontend end to end and built the API surface it runs on.

It was the first project where I was responsible for a product that real people used every day, in a market I’d never worked in. That changes how you think about edge cases.

What I built

  • The complete React frontend — quiz flows, the live leaderboard, credit purchase and transaction history, and the account screens around them.
  • State with Zustand. Quiz state is genuinely tricky: a timer, an in-flight answer, an optimistic score, and a server that is the final word on all three. Zustand kept that legible without the ceremony of a larger store.
  • Express REST APIs for authentication and pagination, including the JWT flow and the cursor logic the leaderboard pages through.

Things worth remembering

Real-time is mostly about disagreement. The interesting work wasn’t pushing updates — it was deciding what to show when the client and server disagreed about the score. Optimistic updates feel instant right up until they’re wrong, and then they feel broken. Being deliberate about which state was allowed to be optimistic made the whole app feel steadier.

Pagination is a product decision. The leaderboard is the thing people care about most, so how much of it you load, and when, is not merely a performance question. Getting the page size right mattered more than any amount of query tuning.

Growth came from the boring parts. MAU rose 25% over six months, and the changes that moved it were unglamorous — faster first load, fewer dead ends, clearer error states when a round failed to start.

Back to all projects