• 2025
  • 5 minutes

From Paper to Platform: Engineering Academic Operations at Scale

redis

A local conglomerate schools in my home-town were managing student records, grades, and subject notes through Excel spreadsheets that broke constantly. When they did, staff had to wait days for someone to fix them, blocking the entire workflow.

Uploading the notes for a single subject could take a full day. Generating a student report had to be assembled manually every time — slow, error-prone, and exhausting at the end of each period.

They platform needed to automate all of this. The catch: deployment targets were small school servers, with no dedicated IT team. It had to be easy to deploy, cheap to run, and maintenance-free.

The Stack

This stack was chosen because the system should be as small and self-contained as possible. Go compiles to a single static binary and SQLite runs embedded, allowing the Docker image of just 30 MB.

What It Does

The Staff manages students, subjects, and notes through a structured interface. The platform understands the relationships between all of them which enable to generate the student notes report automatically.

Before and After

Before After
Upload notes for all subjects ~1 day per subject ~1 hour total
Generate student report Hand-crafted manually Instant
System reliability Spreadsheets breaking, days of downtime Always up

Screenshots of the Project:

Showcase of the notes dashboard Showcase of the student report design
Backend logs showcase

 ┌───────────────────────────────────────────────────┐
 │                   Fiber v2.52.8
 │               http://127.0.0.1:5000               │
(bound on host 0.0.0.0 and port 5000)
 │                                                   │
 │ Handlers ............ 49  Processes ........... 1
 │ Prefork ....... Disabled  PID .............. 3538
 └───────────────────────────────────────────────────┘

22:07:10 | 200 |    2.021586ms | 127.0.0.1 | POST | /api/subject/get | -
22:07:10 | 200 |     168.789µs | 127.0.0.1 | POST | /api/subject/get | -
22:07:10 | 200 |     493.622µs | 127.0.0.1 | GET | /api/grade/ | -
22:07:10 | 200 |     229.291µs | 127.0.0.1 | GET | /api/student/course/11 | -
22:07:10 | 200 |     356.161µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     202.747µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     430.285µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     315.709µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     197.251µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     228.856µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     204.471µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     188.995µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     229.187µs | 127.0.0.1 | GET | /api/student/average/ | -
22:07:10 | 200 |     540.073µs | 127.0.0.1 | POST | /api/note | -
22:07:10 | 200 |     132.337µs | 127.0.0.1 | POST | /api/note | -
22:07:11 | 200 |     188.077µs | 127.0.0.1 | POST | /api/note | -