Most of what we build lives on the web. But a school recently needed something different: term results produced on its own computers, on deadline, whether or not the internet was working. So we built School Result Manager as a desktop program that runs completely offline on Windows and Linux.
The program is written in Python with PySide6, the Qt toolkit, and keeps everything in a single SQLite database file plus a folder of passport photos. There is no server to reach and nothing to sign up for. PyInstaller packages it into a folder that runs on a PC without Python installed, so installing it at the school is a matter of copying that folder across.
Score entry is where teachers spend their time, so it had to be quick. CA 1, CA 2 and the exam go into a grid; the total and grade appear as they type, and Enter moves to the next student. Many teachers already keep scores in Excel, so a column copied from a spreadsheet can be pasted straight in. Each teacher sees only the subjects the admin has assigned to them.
Positions are the detail parents read first, and they have to follow the convention schools use: students with the same score share a place, and the next place is skipped — 1st, 2nd, 2nd, 4th. The program ranks subject and class positions that way, and in the second and third terms each sheet also carries earlier term totals and a cumulative average.
Printing is the whole point, so result sheets are laid out as HTML and sent through Qt's print system. The same path produces a PDF of a whole class, one A4 page per student, and a class broadsheet.
Offline software has one risk the web does not: the data lives on one machine. Backup and restore sit in the File menu. Backups use SQLite's own backup mechanism rather than copying a file that may be in use, and a restore first checks that the chosen file really is a School Result Manager database before it replaces anything. Our advice to the school is simple — back up often, and keep the copies on a flash drive.
Get new articles by email
Occasional notes on building and running business software.
Related reading
One record per pupil: how our school platforms are structured
Why fees, results, hostel billing and parent messages in our school systems all hang off a single student record — and what that changes fo…
Keeping every player on the same clock with Django Channels
LiveQuiz runs multiplayer quiz rooms in real time. The design choice that makes it fair: the server, not the browser, owns the timer.