EduGrade
A multi-tenant school platform for managing students, classes, scores, grading, and printable report cards.
- Category
- SaaS Platform
- Timeline
- Q2 2025
- Stack
- Next.jsTypeScriptFirebaseTailwind CSSshadcn/ui+3 more
Overview — read the full write-up
EduGrade helps schools manage academic records, configure their own grading systems, and generate report cards from a single platform. Parents can access their child's results through a school-specific portal, while each school's data remains isolated within the shared application.

The product in action
Screenshot 1 of 9

The story in three parts
01 — The Challenge
One Platform, Different School Rules
Read moreShow less
02 — The Strategy
Multi-Tenancy Built Around Configuration
Read moreShow less
03 — The Impact
A Complete Digital Results Workflow
Read moreShow less
System Architecture
One Application, Isolated School Data
Ctrl + scroll to zoom
Tenant-Isolated Data
Each school's students, scores, classes, and configuration live under its own Firestore namespace. This allows a single deployment to serve multiple schools while keeping their academic records separated.
Configurable Grading
Assessment weights and grade bands are stored per school instead of being embedded in application logic. The same grading engine can therefore handle different academic conventions without changes to the codebase.
Realtime Administration
Firestore realtime listeners keep academic records and configuration changes synchronized with the administrator dashboard. Subscription cleanup was handled explicitly to prevent listeners from accumulating as users moved between views.
Managed Supporting Services
Firebase provides authentication and database infrastructure, while Cloudinary handles uploaded images and Nodemailer supports transactional email. This keeps infrastructure focused on the application's core academic workflows.
Lessons & trade-offs
Every Query Must Respect the Tenant
Building a multi-tenant system made data boundaries one of the most important architectural concerns. A query outside the tenant namespace could break the isolation model, reinforcing the need to make the school context explicit throughout the data-access layer.
Tenant isolation
Make Variable Rules Configuration
Grading requirements vary between schools, so embedding those rules directly in the code would make the system difficult to reuse. Moving assessment weights and grade bands into school-level configuration made the application adaptable without additional deployments.
Configuration over hardcoding
Realtime Features Need Cleanup
Realtime Firestore subscriptions introduced listener-management concerns during development. Binding subscriptions properly to the component lifecycle prevented unnecessary listeners from remaining active after users left a view.
Subscription lifecycle
Want something like this built?
EduGrade is one example of how I work — from architecture to shipped product. If you have a problem that needs this kind of thinking, let’s talk.

