← Home
Case study
Climber
A JEE preparation platform I built for my son: a real question bank, custom tests, an exam-like test engine, and analytics on where he loses marks.
- Built for
- My son's JEE preparation, and my own learning of full-stack product work with AI
- Time
- 7 Aug – 18 Oct 2026 (about 10 weeks, 304 commits)
- AI tools
- Claude Code with Claude Fable 5 and Sonnet; the design docs live in the repo so every session starts from them
- Stack
- TypeScript, Node.js 22, Hono, React 19 + Vite, PostgreSQL, Drizzle, KaTeX, Vitest, Playwright, Docker
User stories
- As a JEE aspirant, I want a real question bank to build custom tests from, so that I practise what I need rather than what a book happens to include.
- As a student, I want a test screen that behaves like the real exam, so that exam day feels familiar.
- As a student, I want to see where I lose marks and time, so that I know what to work on next.
- As the parent who built it, I want every test recorded in detail from day one, so that the data stays useful across years of preparation.
Situation & constraint
I built Climber to give my son structured JEE practice with honest analytics, and to learn how far I could take a full-stack product with AI. It is invite-only and used by a small group. Like my other Labs, it is a learning project and not a commercial product.
Architecture
- Five loosely coupled modules: Question Bank, Test Generator, Test Engine, Telemetry, and Results & Analytics.
- Analytics only ever reads the event log, never the test engine's state, so every report can be rebuilt from the recorded events alone.
- One shared question renderer is used both when entering questions and inside the test engine, so a question can't look right while being entered and render differently mid-test.
- One TypeScript codebase: a Hono JSON API and a React + Vite single-page app. PostgreSQL through Drizzle, with the event write path in plain SQL.
- Runs in Docker on a single machine, exposed through a Cloudflare Tunnel, with nightly database backups.
Decision & trade-off
I designed in order of irreversibility, not the obvious order: the telemetry event contract first, then the data model, then the stack, then hosting. A badly chosen stack costs about a week to redo, but tests recorded under a wrong event schema are permanently degraded.