v0.2.0
LatestReleased on September 15, 2026
OpenSchool v0.2.0 delivers a major backend architecture refactor and improves the project’s reliability, developer experience, and documentation. The backend is now organised as a modular monolith, with each feature owning its routes, business logic, database access, and API contracts. This release also adds broader integration testing, stronger CI checks, and fixes API compatibility issues found in the frontend.
OpenSchool is self-hosted - clone the repository and follow the Setup Guide to run this release.
This release includes the following improvements and new functionality:
- NIC-based default passwords for teacher/guardian accounts and index-number defaults for students, plus a universal self-service password reset and forced first-login password change
- Class medium (language of instruction) support, wired into the setup wizard and promotion's auto-distribution logic
- Analytics dashboard covering student, staff, academic, and school-wide aggregates
- PDF report export for attendance and marks
- Staff management, including non-academic staff records and staff attendance
- Expanded student profile portfolio including progress reports, activities, leadership roles, awards, and disciplinary records
- In-app position/leadership hierarchy including Principal, Vice Principal, Section Head, Class Teacher, and Subject Teacher, layered on top of the base ThunderID roles
- Position-scoped notification permissions and a role-differentiated teacher dashboard
- Academic year promotion and class reassignment, including marks-based and random auto-distribution assist tools
- Full timetable module covering settings, grade sections, classrooms, subject period requirements, teacher availability, and a draft → validate → submit → review → approve/publish workflow
- In-app notification system with role/position-scoped recipient targeting and a per-user notification center
- Guardian directory with search, shared-guardian linking, and orphan filtering
- House colors and a self-balancing (least-populated-house) assignment algorithm for students and staff
- Audit log for sensitive changes, including house reassignment and attendance-lock overrides
- Attendance session locking for 24 hours with admin override
- Guardian absence notifications
- First-run onboarding with one-time admin registration and a guided School Setup wizard covering school profile, houses, grades, classes, and mediums
- Switched identity provider integration to ThunderID, previously Asgardeo, behind a provider-neutral internal/identity.Provider seam
The backend modular-monolith refactor has been completed.
Each feature now owns its:
- HTTP routes
- Business logic
- Database adapter
- API contracts
The old shared handler, service, repository, model, and route layers were removed.
This release also introduces API-wide per-IP rate limiting, which was previously limited to the first-run admin registration endpoint only.
Database connection pool sizing has also been tuned for expected load.
This release fixes several important issues and adds stronger protections:
- Fixed broken access control on attendance and term-marks endpoints
- Batched two N+1 query patterns in list endpoints
- Swagger UI is no longer served outside development builds
- Restored the snake_case JSON API fields used by class and curriculum screens
- Added audit logging for sensitive changes
- Added attendance session locking with admin override
- Added API-wide per-IP rate limiting
This release significantly expands and updates the project's documentation:
- Added docs/FEATURES.md, the current as-built feature reference
- Added docs/ARCHITECTURE.md
- Added docs/adr/ (Architecture Decision Records) for significant, easy-to-relitigate design decisions
- Added audit.md, a standing code-quality and security audit with tracked severity/status
- Added SECURITY.md
- Added CODE_OF_CONDUCT.md
- Added this changelog
- Corrected stale claims in docs/SETUP.md, including the teacher dashboard mock-data note and the "starting over" TRUNCATE TABLE table list, which was missing ~20 tables added by later migrations
- Added backend and frontend README files
- Refreshed the root README and contributor guide
- Simplified environment example files