OMR 100 Reader
The outcome · A local tool that reads answer sheets, flags uncertain marks for review, and exports the data needed for individual student feedback.
Near the end of the semester I asked our IT department to keep the exam-scoring software running through finals. They declined, having found it was no longer supported. The first move was to ask. After that was refused, I still needed digital answer data to give students individualized exam reports, so I decided to build it.
Student responses could not be uploaded to an outside service, which ruled out the convenient answers and GenAI alike. And reliable was not the whole requirement. I needed something I could audit myself, so that nothing went out as a grade until I had checked it. All I actually had to obtain was the digital answer data. That decided the shape of the tool before a single feature did.
An optical mark reader for a custom 100-question sheet, running entirely in the browser with Python compiled to run there rather than on anyone’s server. It registers each page from its four corners, adapts its threshold to the scan, and catches multiple marks. Before any grade goes out it flags blanks, double marks, and low-confidence reads, so a person reviews the doubtful ones first. A guided roster step at the front means every sheet arrives already carrying a name, and captured page images stay in the session rather than being stored.
I did not need a perfect replacement. I needed a local, testable, good enough one.
Thanks to the CSV this app generates, I was able to build an individualized student report in Excel. One page per student, built from the export rather than typed in by hand, so every student gets back not just a score but the question-by-question picture of where they actually stand.