Case study · EdTech · System
Offline CBT System
A computer-based testing system built for JAARC in Ogbomoso, running entirely over a local network. One machine acts as the exam server, students sit at terminals connected by LAN, and no internet connection is needed at any point. More than 1,000 students have sat exams and tests on it, and they can access their report sheets afterwards.
- Role
- Full-stack engineer
- Type
- EdTech · System
- Status
- Live and in use
- Scale
- 1,000+ students
- Stack
- React · Node.js · PostgreSQL · Framer Motion
THE PROBLEM
Exams can’t depend on an internet connection that might drop halfway through a paper. And every student has to be graded fairly, even when a whole room starts and submits at the same moment.
Terminals also lose power. A student whose machine goes off shouldn’t lose their answers or their time.
KEY DECISIONS
- 01
Answers are saved where the student is
The risk · Sending every click to the server would make a busy room compete for the same machine.
- Answering and moving between questions happen entirely in the browser. Each click is written to that terminal’s own storage, so nothing collides and the interface stays instant.
- 02
Every student gets their own exam
The risk · Starting an exam is the one moment the whole room hits the server together.
- Start Exam creates a separate session for each student, with their own shuffled question order. The only shared data is the read-only question bank.
- Early on, some students saw “cannot load exam” when everyone started at once. Reworking the start step around a confirmed start time fixed it.
- 03
A timer that survives a reboot
The risk · A countdown that lives only in the browser resets if the machine restarts.
- The timer is calculated from the session’s real start time instead of a ticking counter.
- If a terminal loses power, the student logs back in with their PIN on the same machine: same question order, answers restored from local storage, and a clock that shows the true time remaining.
- 04
Fair grading when everyone submits at once
The risk · A room of simultaneous submissions can overwhelm a server or mix up results.
- Each submission runs in its own database transaction on a pooled connection; under heavy load, requests queue instead of crashing.
- Grading happens on the server, so students can’t influence their own score or anyone else’s.
- Per-question analytics use an atomic increment, so simultaneous submissions are all counted correctly.
OUTCOME
Used by more than 1,000 students for exams and tests.
Exams run with no internet at all, and students can access their report sheets afterwards.
A power cut on a terminal costs the student neither their answers nor their time.
WHAT’S NEXT
Moving to a backup terminal mid-exam: today, answers reach the server only at submit, so a student who switches machines keeps their question order and clock but not their answers.
The fix: debounced autosave checkpoints to the server, with versioned, newest-wins writes so a late request never overwrites a fresher answer.
Alongside it: one active terminal per session, invigilator approval to switch machines, and the option to add back lost minutes.
Have something that needs to work in the real world?