Experiment · Student products
NEETprep Labs
The problem
The main NEETprep app is the production platform, and production work there goes to engineering. There was no place to put a student-facing experiment in front of people who already had an account, and no way to tell whether they used it.
What I built
I built NEETprep Labs myself and shipped it. It is a hub of experimental study products, live, reachable from the main NEETprep app, at neet-compete.pages.dev. Students sign in with their existing NEETprep account; the hub takes the session from the main app. Signed-in students can upvote or downvote each product and send private feedback, which lands in a queue the team works through.
Four products are live on it. NEET Compete is the substantial one: students challenge a friend or get matched into a quick game, and answer timed multiple-choice questions for points based on speed and accuracy. There are friend requests, profiles, ratings, and a question-by-question review of past matches. The front end is React and TypeScript. The back end runs on Cloudflare Workers, with a serverless SQLite database, and Durable Objects holding each game room and coordinating both players over WebSockets. Answers are written as they happen, so a player who disconnects or whose room is evicted comes back to the right state. Players can also play at their own pace instead of waiting on each other. The other three are Recall (spaced-repetition flashcards), NEET Copilot (practice tracking and a chapter study planner), and Time Tracker (study session logging).
I also built the thing that measures it. Each product has its own analytics property. A small collector service does a nightly rollup, and there is an adoption dashboard for the owner. It answers a funnel (hub view, card click, product view, sign-in, first real action), weekly and monthly actives per product, and repeat use per product.
What changed
It was an experiment, and it reached production and real students. Once it was instrumented, the headline active-users number was mostly backend sync. Use of one product was much lower than the dashboard had implied. I found that by measuring it, and it changed what I worked on next.
What I'd do differently
I would have defined an active user as someone who completed a real action, from the first dashboard, so backend sync could not inflate the count.