EdTech
Mock exam platform for competitive exams
Students sit timed, sectioned, multilingual mock exams and get a full breakdown of their performance as soon as they finish. I was the only engineer, from mockups to deployment, and built the importer that turns the client's Word question bank into live tests.
Overview
The platform is where students preparing for Indian competitive exams sit mock tests that run like the real thing: timed, split into sections, available in more than one language, with a full analysis of how they did the moment they submit. The client had a large bank of questions, thousands of them, in Word documents, and more arriving in the same format.
Those documents were the problem. Every learning platform the client looked at expected questions to be entered one at a time through a form, and their existing site, plain HTML and JavaScript, couldn’t deliver a realistic exam. I was brought in at the start and handled the whole project on my own: client communication, interface mockups, backend, frontend, and deployment.
What I built
- A Word document importer. The client’s question bank lived in ordinary Word documents, thousands of questions written the way the institution had always written them: a numbered question, its options, the answer, with images and equations mixed in. Equations need special treatment on import, so they render the way students write them on paper, with proper symbols and layout, not as typed-out text. The importer reads those files as they are, shows the content team a preview where they can fix anything that didn’t parse cleanly, and saves the questions, options, images, and answers as database records. I built the parser and the preview flow, so the team kept authoring in Word, and nothing had to be re-entered by hand.
- An exam engine. Each exam runs the way the real one does: a total time limit, time limits per section and per question, and an option to lock the sequence so candidates can’t skip ahead or go back. Questions are shuffled per candidate, so no two people see the same question at the same position, while a comprehension passage keeps its group of questions together. Candidates can switch the paper’s language mid-exam. I built the exam rules, the timers, and the state handling that keeps the interface responsive while all of that updates.
- Post-test analysis. Right after submitting, a student sees their score overall and by section, each question with their answer, the correct one, and a note explaining it, the time spent per question and section, and their rank against other candidates. Every part of this can be switched off per exam, so one test can show a full breakdown and another only a score or a rank.
- Free and paid content. Exams and courses are marked free or paid, and paid ones sit behind Razorpay. I built the payment flow and the access checks around it.
Key decisions
Parse the files the client already had instead of asking for a stricter format. We discussed a fixed template for new questions. It would have made the importer much simpler to build and fully predictable. But the client already had hundreds of documents in their own house format, and new ones would keep arriving written the same way. A template meant hand-editing every one of those files, now and for every future batch. So the importer works with the loosely formatted files as they are, and the preview step catches whatever it can’t make sense of. It was the hardest part of the project and the part the client got the most out of.
Keep the exam interface non-blocking. The interface mimics a real exam screen: candidates answer, mark a question for review, and jump between sections and questions in quick succession. Showing a loader or waiting on the server for each of those actions would have made it feel slower than the exam it was imitating. So the exam state lives in the browser, and the interface responds instantly, and the backend is kept in sync in the background at the points that matter. The trade-off was more state handling on the frontend than a page-per-question approach would have needed.
Run the admin on Django admin for the first version. A custom admin would have been a second frontend to design and build. The client didn’t plan to hire separate teams for each role any time soon, so there was no case yet for a polished admin app. Extending Django admin got the content team importing documents and configuring exams much sooner. The cost is an admin that looks and works like Django admin rather than something built around their workflow.
How it went
The platform launched and ran in production for a while. The content team imported their entire back catalogue through the importer, with nothing re-entered by hand, and kept writing new questions in Word as they always had. The client was impressed with how smoothly everything worked, the importer most of all. I was the only engineer from the first day to the last, owning client communication, mockups, backend, frontend, and deployment.
What I’m most pleased with is the importer and how closely the exam engine matched the real thing. The importer took files written for people, not machines, and turned them into live tests without anyone retyping a question. And the exam screen behaved like the one students would sit in front of on the day, down to the timers, the sequence rules, and the language switch.
- Built with
- Django, Django REST Framework, PostgreSQL, Next.js, React, Redux, AWS S3, Razorpay