Case study · Built in 1 day
PrelimsDaily
A 10-minute daily habit for UPSC Prelims, from empty repo to tested app in a day.
- Role
- Solo: product, design, code
- Timeline
- 1 day · Oct 2026
- Platforms
- Android and web (Expo)
- Stack
- Expo, TypeScript, Zustand, Reanimated



- Problem
- UPSC aspirants don't fail for lack of material, but for lack of consistency.
- Built
- An offline daily-practice app with streaks, XP and reminders that adapt, in one day.
- Result
- 72 passing tests, every trade-off written down, and an installable Android build.
01 — The brief
A habit, not a question bank.
Most aspirants don't fail for lack of material. They fail for lack of consistency.
I built PrelimsDaily in a single day as part of a startup application: one focused question set a day, streaks with freezes, a daily target ring, XP and levels, and reminders that adapt to your streak. It runs fully offline on Android and the web.
The rules live in pure, unit-tested functions, state is persisted with a versioned schema that falls back safely if anything is malformed, and a root error boundary means a render crash shows a Retry screen, never a white screen.

Profile
Accuracy, best streak, level and per-subject stats.

Smart reminders
Reminders that skip the days you've already finished.
02 — Decisions
Small app, real engineering.
Every trade-off is written down in the README.
- 01
Local dates, never UTC
Days come from the device's local calendar. With UTC, an Indian student practising before 5:30 AM would land on “yesterday” and could lose their streak.
Trade-off: All day maths goes through small helpers, tested across month, year and leap-year boundaries.
- 02
A deterministic daily set
The set is seeded by the local date (FNV-1a → mulberry32), so it's identical all day, even after a reinstall. Once there's enough data, about half the picks come from your two weakest subjects.
Trade-off: With a small bank, repeats come back eventually, in a predictable order.
- 03
Reminders that know you're done
A repeating trigger can't skip today or change its copy, so the app re-schedules seven one-off reminders on every relevant change. Offline, no server.
Trade-off: The app has to be opened at least once a week to top up the queue.
- 04
60fps on the UI thread
Reanimated drives the ring with animated props and the XP bar with scaleX instead of width, so animations skip layout and the JS thread.
Trade-off: A little more setup than plain layout animation.
03 — Quality
72 tests in a one-day build.
72tests
Unit tests in 5 suites, covering local-date maths, streak transitions (continue, freeze, reset, earning freezes), XP and level curves, the daily set’s determinism, weak-subject weighting and recency rules, and loading saved state safely. Strict TypeScript and lint on top.