National Education Management Information System (EMIS)
Ministry of Education & Sports, Uganda
Backend / Full-Stack Engineer — SMS ONE (U) Limited
Read the full case studyHide the full case study
- Situation
Uganda's education sector ran on data that could not be trusted. National identity records and learner records lived in separate systems with no verification at the point of entry, so the sector could not trust its own numbers or act confidently on them.
The reporting problem sat on top of the data problem. Staffing, enrolment and district performance were held in different places and reconciled by hand, which meant the figures behind budget and policy decisions were late, inconsistent and easy to question.
- Task
Build the learner and workforce backbone of the national platform: a learners module that registers every child in the country against a verified identity, an HR module covering the teaching workforce, and the foundational infrastructure for national education reporting.
Around that, deliver the access control that decides who may see and change what across a multi-agency platform, the validation that keeps the data correct under national load, the reporting layer that turns operational records into public and ministry-facing dashboards, and the integration framework for the agencies that share education data.
- Action
Built the national learners module in Laravel and Vue 3 on a PostgreSQL schema exceeding 1,000 tables, and integrated NIRA (the National Identification and Registration Authority) national identity and registration services directly into the platform.
Extended the same foundation across the sector. The HR module centralised nationwide staff records and integrated national workforce management, work permit and refugee data sources. The architecture also included national reporting and validation services used by the ministry and district teams.
Designed and documented the data model, the 1,000+ table schema, the SRS (Software Requirements Specification) and the system architecture that became the reference specification for the deployment and delivery model.
Built the cross-agency integrations as services in Laravel, Go and Python FastAPI, connecting NIRA for identity, UNEB for examinations, TMIS for transport and school management, and the operational data that made the platform usable in practice.
Implemented role and permission management so ministry headquarters, district officials and individual schools each see and edit only their own scope, secured with OAuth 2.0 and token-based access patterns.
Built the DEO (District Education Officer) data validation workflow that stands between a school's submission and the national figures. A school enters its own enrolment, staffing and facility data, and the validation layer rejects or flags mismatches before the national system trusts it.
Delivered the interfaces ministry staff and district officers use daily: data-heavy dashboards and validated bulk-entry forms built in Vue 3 with Pinia and TanStack Query, which keep server interactions predictable and the UI performant under national load.
Laid the documentation foundation the platform is still built on. Architecture decision records capture why each load-bearing choice was made and what was rejected, so a decision can be traced later and new engineers don't have to rediscover context in tribal knowledge.
Result
30M+ learner records registered across every school level in Uganda, with duplicate registrations eliminated at source rather than cleaned up downstream. Learner, staffing, facility and programme data are now centrally represented and able to support national decisions.
More than 90,000 school records are searchable by the public, and the schema and architecture documentation became the reference specification new engineers join the platform through — meaning the system was not only built, but also made explainable and maintainable.
- Laravel
- Go
- Vue 3
- TanStack Query
- PostgreSQL
- FastAPI
- RBAC
- Data Validation
- Architecture Decision Records
