Golang
Google's compiled backend language
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.
Golang
Google's compiled backend language
Fiber
Express-like Golang web framework
Docker
Containerization platform for applications
SQLite
World's most used database engine
Astro
Content-driven website Framerwork
TailwindCSS
A utility-first CSS framework
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.
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 | 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 |
┌───────────────────────────────────────────────────┐
│ 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 | -