school management system

a distributed web application for educational institutions. built to replace the spreadsheets and paper registers that most schools around here still rely on.

three separate dashboards — one for students, one for teachers, one for administrators. each role sees only what they need to. students check their grades, attendance, and fee status. teachers manage their classes, mark attendance, and enter grades. admins get the full picture — student records, staff management, fee collection, reports.

the tech stack: node.js on the backend with express, react on the frontend, mongodb for the database. chose mongo because the data structures vary quite a bit between institutions — some track things others don't — and a flexible schema made it easier to accommodate that.

went with a microservices architecture. separate services for authentication, student management, attendance, grades, and fee records. each service has its own database and communicates through rest apis. this made development easier to manage and meant i could update one service without touching the others.

role-based access control was critical. implemented jwt-based authentication with refresh tokens. each api endpoint checks not just whether you're logged in, but whether your role has permission to access that specific resource. teachers can't see fee records. students can't modify grades. admins can do everything.

the rest api design followed standard conventions. proper http methods, meaningful status codes, pagination for list endpoints, filtering and sorting where it made sense. documented everything with swagger so that anyone extending the system would know what's available.

attendance tracking works in real-time. teacher marks attendance on their dashboard, students and parents see it immediately. same with grades — enter them once, and they flow through to report cards, transcripts, and analytics.

deployment uses docker containers. each microservice gets its own container, orchestrated with docker compose. makes it straightforward to spin up the whole system on a new server, and keeps the environments consistent between development and production.

the hardest part wasn't the code — it was understanding how different schools actually work. every institution has slightly different processes, and building something flexible enough to accommodate that without becoming overly complex was the real design challenge.