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 school census was only as good as the weakest handoff.
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 and weakly grounded.
- 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 facilities that support it, and the shared data structures that keep every agency on one truth model.
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 stack that turns raw inputs into operational decisions, and a process that can survive the realities of public-sector rollout without breaking on change requests.
- 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 at the point of record creation so the classroom roster is anchored to a real person rather than a spreadsheet guess.
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 Admissions and examinations modules tied school-level operations directly to the ministries that rely on them, while the national data-validation workflow prevented inconsistent districts from shipping bad figures upward.
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. Every agency on the platform works from the same canonical definitions, which is how the ministry can trust what it sees.
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 staffing, and multiple ministry datasets that were previously impossible to reconcile in real time.
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 that are easy to audit and harder to misconfigure.
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 checks it before it becomes authoritative at district or national level, which keeps bad submissions from silently polluting the reports.
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 load predictable even when the platform is under national reporting pressure.
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 and changed without re-deriving the whole system from scratch.
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 records flow into one national model instead of into a set of reconciled spreadsheets with a different truth in each office.
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 is not just operational, but maintainable and understandable long after the first rollout.
- Laravel
- Go
- Vue 3
- TanStack Query
- PostgreSQL
- FastAPI
- RBAC
- Data Validation
- Architecture Decision Records
