National Education Management Information System (EMIS)
Ministry of Education & Sports, Uganda
Backend / Full-Stack Engineer — SMS ONE (U) Limited
- 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 same child could be registered several times across districts, school levels and academic years without anything catching it. The ministry could not state with confidence how many learners were in the system.
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 always a step behind reality — and never quite reconcilable with each other.
- 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 a schema capable of modelling the entire sector without needing to be rebuilt as policy changes.
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 the ministry actually makes decisions on, and a public-facing register that opens school data to citizens.
- 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 verification directly into the ingestion layer. That placement is the whole design: records are validated at the moment of entry rather than reconciled in a cleanup pass afterwards, so duplicates are rejected before they ever enter the register instead of being hunted down later.
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 Admin Units module gave structured school-to-location mapping across every administrative unit — the mapping national reporting depends on. The Infrastructure module captured school facility data countrywide and fed capital planning for the 2025/26 financial year, and a Water & Sanitation module extended the reporting surface to school utilities without compromising scalability.
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 delivery team. Modelled learners, staff, schools, administrative units, facilities and examination records with constraints, referential integrity and validation enforced at the database layer rather than left to application code, and established migration and versioning discipline so structural change shipped predictably across development, staging and production.
Built the cross-agency integrations as services in Laravel, Go and Python FastAPI, connecting NIRA for identity, UNEB (the Uganda National Examinations Board) for examinations, TMIS (the Teacher Management Information System) for teacher management, and the Office of the Prime Minister and Ministry of Finance — agencies that had never exchanged data before. Because those endpoints are undocumented and inconsistent, the clients are deliberately tolerant: retries, timeouts, idempotency keys and reconciliation routines, so a partner being down degrades a sync rather than corrupting local data.
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 authentication and audit logging on sensitive operations. Opened the register to the public with a search across more than 90,000 school records — unauthenticated and read-only, so it had to stay fast under open traffic while exposing only what the ministry had cleared for publication — alongside the application flows that let schools and the public submit through the same platform.
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; the district education officer reviews it, raises queries back to the school and approves or rejects it before anything aggregates upward. Errors are therefore caught by the officer closest to the school, while the record is still correctable, rather than surfacing as an anomaly in a national report months later. Every decision is stamped with who approved what and when, so the ministry has an audit trail behind each published number.
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 state and cache invalidation out of component code and reduce user error at source. List and report views are tuned with server-side pagination, filtering and query optimisation so screens stay responsive against tables holding tens of millions of rows, and long-running imports, exports and notification workloads run on queue-backed background processing so they never block the request cycle.
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 revisited years later without re-litigating it from memory. Alongside them sit entity-relationship diagrams and a data dictionary for the 1,000+ table schema, the software requirements specification, API contracts and the glossary that keeps ministry terminology consistent across agencies. On a platform that will outlast every engineer currently on it, that record is the difference between extending the system and guessing at it.
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 district reporting is served from one system instead of being reconciled by hand across several.
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 — measurably improving both data integrity and delivery speed.
- Laravel
- Go
- Vue 3
- TanStack Query
- PostgreSQL
- FastAPI
- RBAC
- Data Validation
- Architecture Decision Records
