Case studies / Personal · Jan 2026
Learning with help, practising without it
A Nepal Engineering Council licence-exam prep app I built in four days for myself and my friends. One question bank, three levels of help: Learn explains every answer, Practice helps when asked or wrong, and a timed test gives no help until the review.
Role
Timeline
Team
Platform
Measured outcome
the key decision
Help is a mode, not a button: Learn explains even right answers, Practice helps on request or when wrong, and a timed test holds everything back until the review.
how deep do you want to go?
One question bank, two different jobs
In January 2026 I was preparing for the Nepal Engineering Council licence exam, the multiple-choice paper an engineering graduate in Nepal has to pass to register and practise. My friends were preparing for it too. We had question sets from many places, mostly documents and PDFs with the answers printed beside the questions.
Reading a set like that does two jobs badly.
- Learning. You see the answer before you commit. If you guess right, you never read why it was right, so a lucky guess teaches nothing.
- Rehearsal. Nothing tests recall under a clock. The exam is two hours long, and speed of recall matters as much as recognition.
Get the balance wrong and you pay for it either way. Help that is always on gives false confidence. No help at all means a first pass through a half-forgotten chapter produces no learning.
I built Kati Sajilo ("how easy", in Nepali) over four days, 6 to 9 January 2026, to speed up our preparation. It is a small React web app with one question bank, and it lets you choose how much help you get with it.
Who it was for, and where the questions came from
I was the user. There were no interviews or usability tests. The research was my own preparation and a group of friends preparing alongside me. Many of them used it, but I have no usage numbers, and I won't guess at them.
Three things about the exam shaped the design:
- Several sittings a year. A friend group rarely sits on the same date, so a friend who has just sat the exam is a useful source for the friends sitting next.
- Preparation lasts weeks. Progress has to be there when you come back tomorrow, on the same phone or laptop.
- Nobody signs up for a friend's side project. There is no login. History is kept in the browser's local storage.
The questions come from many sources, which I combined into one bank: chapter-wise sets, official model questions, past questions, and 55 questions I recalled myself. I memorised what I could during my own sitting and wrote the questions down afterwards. Those went to the top of the home page, marked highest priority, for friends sitting later.
I added a database, then removed it the same evening
The first version, on 6 January, already kept attempt history in local storage. On the second evening I added a hosted database, so that history would live on a server as well.
I had no experience with backend databases. Most of that evening went into getting the database to set itself up on the host, not into anything a friend preparing for the exam would see. So I removed it the same evening and went back to local storage.
What that choice gives and costs:
| Gives | Costs |
|---|---|
| No setup, no sign-up, nothing for friends to create | History is per browser: no sync between phone and laptop |
| Nothing to run or maintain for a four-day build | Clearing the browser clears your history |
| A test stores its full paper, so review and same-paper retake work without a server | Storage is small, and a save that fails does not tell you yet |
The practical lesson was simple. A piece of infrastructure has to earn its place in the product. Two hours of setup work had produced no feature. Removing it made the app simpler, and the decision became visible in the product as "No login required".
What happens when you switch tabs?
A timed test is only a rehearsal if it can't be paused for free. On a phone, though, a notification, a call or a quick app switch is normal. So the question is: what should happen when the test tab is hidden?
When I read the code again in 2026, I found that it answers that question twice, in two different ways:
- The timer is built to survive. When you come back, it recalculates the time left from the real clock, so time spent away still counts.
- The test page is built to end. When the tab is hidden it asks for confirmation, and if the window has no focus it ends the test straight away and goes to the review.
One part prepares to resume and the other ends the attempt. In practice the page usually wins. This comes from reading the code, not from a reproduced bug, and it still needs a test on real phones. But it is an unresolved policy, and I'd rather decide it than leave two answers in place.
Option (d) turns leaving into information rather than punishment. A real exam doesn't stop its clock, and a rehearsal shouldn't either. But an interrupted phone session shouldn't throw away an hour of answers.
What happened, and what I learned
Status: a personal tool. I used it for my own preparation, and many friends used it for theirs. It is live at necmcq.vercel.app.
Measured outcome: none. I have no counts of users, sessions or scores. I don't know whether it changed anyone's result, and I don't claim it did.
What the four days did show is how priorities moved as the exam came closer. Chapter practice came first, then timed tests and review, then Learn mode, then the official and past sets. My recalled questions were added last, after my own sitting. The home page was reordered to match: recalled questions first, official and past questions second, chapter study after that.
Asset to add
Screenshot (run locally, phone width): home page with the four cards, recalled questions card first with its highest-priority badge
Three lessons I took from it:
- Decide what the learner may know, and when, before styling a screen. The three-mode contract is the product. The screens follow from it.
- Infrastructure has to earn its place. The database added setup work and no feature. Local storage was simpler, and simple enough to ship before the exam.
- Every exit is a design decision. Finish, time running out and leaving the tab should produce the same kind of record. Writing the rule down once would have made the conflict obvious.
States and edge cases
The same question on three screens
Asset to add
Screenshot (run locally, desktop and phone): timed test running, question navigator open, countdown visible, one answer selected with no feedback
Asset to add
Screenshot (run locally): review after Finish, summary tiles (total, correct, incorrect, not attempted, accuracy, time) and one question with your answer against the key
States that exist
- Loading: a spinner with "Loading questions…" or "Loading exam…".
- Error in Learn: an error card with Retry and Back to Home.
- Empty: "No questions available for chapter N", "Question not found", and in the review, "Session not found" with a way back to attempts.
- Confirmations: before a retake ("This will start a new session"), before leaving a running test, and the browser's own prompt before closing the tab.
- Denied: none, because there are no accounts.
What I found reading the code again (not yet reproduced)
In September 2026 I read the source again for this write-up. These are findings from reading, not bugs anyone reported, and I'd confirm each one in a browser before calling it reproduced.
| Finding | Why it matters | Fix |
|---|---|---|
| The three exits record the test differently. Finish and time-out count unanswered questions as wrong; leaving the tab leaves them "not attempted" | The same paper gives differently shaped reviews depending on how it ended | One way to complete a test, with the reason stored |
| Question numbers restart in each chapter, and an attempt is matched by number alone | In a mixed test, two different "question 12"s can overwrite each other's attempt | Identify a question by chapter and number together |
| A failed save to storage is not shown | You could lose history without knowing | A visible notice, and an export of your history as a file |
| One chapter's Learn set sat outside the list of chapters Learn shows | 50 questions were unreachable in Learn | Build the chapter list from the data |
| If a test fails to load, the spinner stays | No way forward except reloading | An error state like the one Learn already has |
Accessibility
All core actions work from the keyboard (number keys to pick, arrows to move, a key each for hint, explanation and next), and navigator cells have labels. Still to do: right and wrong are shown by colour alone, the phone drawer does not trap focus, and the countdown isn't announced to screen readers.
The question bank, and what I'd test next
Combining sources
The sets came in different shapes. Some files were one list of questions, some were grouped by chapter, and a few were long enough to be split in two. The loader accepts each shape, skips a question that is missing its text, options or answer, and repairs common formatting damage from copying out of documents, such as curly quotes and stray line breaks.
That repair makes a file readable. It does not make it correct. A readable question can still have a wrong key, a weak explanation or a place in the wrong chapter. Checking that is a separate job, and the app doesn't do it yet.
- 01
Readable
The file can be opened and parsed, with formatting repaired where needed.
- 02
Well-formed
Every question has text, options and an answer. Anything without them is skipped.
- 03
Correct
The key and the explanation are right. This needs a person, and it is the next step.
What I'd test next
- Answer-key check. Compare a sample of each set against the official model answers, and log corrections per set.
- Mode comprehension. Five engineering graduates, think-aloud. Before answering, can they predict what each mode will show them? That tests whether the contract is clear.
- Interruption test. On Android and iPhone, trigger a notification, an app switch and a screen lock during a short test. Record which exit happens and what the review shows. The result decides the leave policy.
- Record integrity. Answer all 100 questions in a full test and check that the review counts 100.
Next changes, in order: choose and write down the leave policy; identify questions by chapter and number; add an optional weighted "official format" test; allow exporting and importing history as a file, as the no-account answer to sync.
Notes on sources
- Dates, modes and rules come from the app's source and its history (6 to 9 January 2026).
- Use by friends is my own account. I have no usage figures.
- Exam format details come from public guides and the council's published scheme, which differ on the split of one- and two-mark questions. That is why I describe the Full Test as a simulation, not a replica.
- The recalled questions are my own. I wrote them down after my sitting.
- All questions shown on this page are fictional.
- Screenshots will be taken from the live site at necmcq.vercel.app.