Selected Case Studies

National Education Management Information System (EMIS)

Ministry of Education & Sports, Uganda

Backend / Full-Stack EngineerSMS 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 on a PostgreSQL schema exceeding 1,000 tables, and integrated NIRA 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, built with Livewire, Filament and Alpine.js, 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 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 in Python FastAPI, connecting NIRA for identity, UNEB for examinations, TMIS 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.

Delivered the interfaces ministry staff and district officers use daily: data-heavy dashboards, validated bulk-entry forms in Vue, Livewire and Filament that reduce error at source, and list and report views tuned with server-side pagination, filtering and query optimisation so screens stay responsive against tables holding tens of millions of rows. Long-running imports, exports and notification workloads run on queue-backed background processing so they never block the request cycle.

EMIS ingestion pathSchool and district submissions pass through the learners module, where NIRA identity verification gates every write before it reaches PostgreSQL. HR, access control, reporting and public search read from the same store.School / DistrictLearners moduleValidateat ingestionNIRA identityPostgreSQL1,000+ tablesHR · RBAC · ReportingPublic search (90k schools)

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
  • Vue
  • PostgreSQL
  • FastAPI
  • NIRA Integration
  • RBAC
  • Reporting
  • Public Search

IMPALA LITE2 — Multi-Tenant Waste-Management SaaS

Uganda, extending to Malawi

Co-lead EngineerSMS ONE (U) Limited

Situation

Licensed private waste-collection companies ran their operations across disconnected tools — scheduling in one place, fleet somewhere else, billing and accounting in spreadsheets. No single product covered the whole operation for this market, so every operator improvised a different partial solution.

The regulatory shape made it harder. An operator works across several city authorities, each licensing and reporting on it separately, and money moves along two entirely different paths: the subscription an operator pays for the platform, and the collection fees its own customers pay it. Conflating those two is how this class of product usually goes wrong.

Task

Build a multi-tenant, multi-territory platform where each licensed operator runs its entire business — customers, scheduling, fleet, billing, payments and accounting — on its own subdomain, isolated from every other tenant.

Sit that under a control plane that onboards tenants, bills them for the platform and runs the shared infrastructure, while keeping the two money relationships strictly separate so the platform never takes custody of tenant funds.

Action

Built a Go modular monolith on Chi spanning 44 domain modules — operations, scheduling, fleet, containers, customers, contracts, procurement, payroll, HR, billing, payments, reconciliation and accounting among them — exposing 471 routes behind a generated OpenAPI 3.1 contract, so the API surface is documented by construction rather than by hand.

Isolated tenants with schema-per-tenant PostgreSQL backed by row-level security as a second line of defence, so a query bug cannot leak across tenants even if it escapes the schema boundary. Authentication runs through Keycloak OIDC with one organisation per tenant, and cross-module communication uses a transactional outbox published onto Pub/Sub — events commit in the same transaction as the data that produced them, so a crash between write and publish cannot desynchronise the system.

Implemented a native double-entry general ledger rather than bolting reporting onto invoice tables. It is multi-currency, tax-aware and billing-source-agnostic, so revenue recognised from a platform subscription and from a collection fee lands in the same books under the same rules. Per-country fiscalisation plugs into it — EFRIS for Uganda, MRA for Malawi — alongside Mobile Money settlement and UGX-first pricing, because a ledger that cannot satisfy the local tax authority is not finished.

Deployed on Cloud Run in africa-south1 for on-continent data residency, and drew the module boundaries so Payments, Telematics and the shared premise registry can be carved out into independent services later without a rewrite. A shared, resolve-only premise registry lets a customer move between operators without their address history being duplicated or lost.

IMPALA LITE2 tenancy modelA control plane onboards and bills tenants. Each tenant runs on its own subdomain over schema-per-tenant PostgreSQL with row-level security. A transactional outbox publishes to Pub/Sub, and the double-entry ledger feeds per-country fiscalisation.Control planeonboardtenant-atenant-btenant-cSchema-per-tenant PostgreSQLrow-level security · Keycloak OIDCOutbox → Pub/SubDouble-entry GLEFRIS · MRA44 domain modules471 routes

Result

A tenant runs its entire operation on its own subdomain, with the ledger balanced and the fiscalisation correct for its country, while the control plane onboards and bills operators independently of the money flowing between an operator and its own customers.

Built as a modular monolith with service boundaries already drawn, so the platform can be decomposed under load rather than rewritten.

  • Go
  • Chi
  • PostgreSQL
  • Keycloak
  • Pub/Sub
  • Vue 3
  • Flutter
  • GCP

Bulk SMS Platform — Parliament of Uganda

Parliament of Uganda

Software EngineerSMS ONE (U) Limited

Situation

Parliament of Uganda needed to reach very large contact bases reliably, on a platform where a failed dispatch is visible institutionally rather than quietly retried. Government communication has no tolerance for silently dropped messages.

The volume breaks the naive approach twice over. Per-message synchronous delivery collapses long before the contact base is exhausted, and a bulk upload of tens of millions of rows cannot be processed inside a request without the upload itself timing out.

Task

Build ingestion capable of absorbing tens of millions of contacts and delivery capable of dispatching against them without degrading the rest of the platform, under strict government security standards.

Make the pipeline observable enough to prove it is healthy — not merely to debug it after a failure, but to see saturation coming while there is still time to act.

Action

Built structured bulk ingestion for large contact uploads and a contact-management module that segments recipients by administrative unit, so a message can target a district or constituency precisely rather than being broadcast at everyone. Ingestion validates and stages rows outside the request cycle, so an upload of tens of millions of contacts never blocks the user who started it.

Moved delivery onto Kafka, decoupling ingestion from dispatch. Producers write regardless of how fast consumers drain, so a slow gateway or a burst of traffic degrades throughput instead of losing messages — the failure mode becomes a growing backlog, which is visible and recoverable, rather than silent message loss, which is neither.

Implemented and supported the delivery path itself through Kannel and SMPP gateways, diagnosing delivery failures, throughput bottlenecks and binding faults down to the gateway session level, and sustaining real-time delivery under the security standards government messaging is held to.

Instrumented the pipeline with Prometheus metrics and built Grafana dashboards over ingestion rate, consumer lag and delivery outcomes. Consumer lag is the signal that matters: it rises before delivery starts failing, so the dashboards show a problem forming rather than reporting one that has already happened.

Bulk SMS delivery pipelineBulk uploads are ingested and written to Kafka. Worker consumers dispatch to the SMS gateway independently, so a backlog degrades throughput instead of losing messages. Prometheus and Grafana observe ingest rate, consumer lag and delivery outcomes.Bulk uploadIngestion25M+ contactsKafkaWorkersdispatchSMS gatewayPrometheus → Grafanaingest rate · consumer lag · delivery

Result

25M+ contacts ingested, on an architecture designed for 100,000+ concurrent users, with delivery decoupled from ingestion so neither can take the other down.

The pipeline is observable end to end, so saturation surfaces as a rising lag graph rather than as undelivered messages discovered after the fact.

  • Laravel
  • Go
  • Kafka
  • SMPP
  • Kannel
  • PostgreSQL
  • Prometheus
  • Grafana

These platforms are proprietary and closed-source, so the code is described rather than linked.

More projects on GitHub

Testimonials

Job took ownership of our database infrastructure and kept it running without interruption. He had a habit of tracing problems to the actual cause instead of patching symptoms, and recurring issues simply stopped coming back. He also led our engineering team through a major delivery on time and on budget.
Steven TendoFounder · Eloi Ministries Inc.
Job built core parts of the national EMIS platform, including the integrations with NIRA and UNEB that validate records at the point of entry. He is careful with data at a scale where mistakes are expensive, and he documents his work so the rest of the team can rely on it.
ClintonSenior Software Engineer · SMS ONE (U) Limited
Job was among the strongest engineers I taught. He went well past the syllabus into architecture and system design, and he was already building complete production systems before he graduated.
Taqee AhmedSenior Software Engineer · Sai Pali Institute of Technology & Science

Technical Stack

Core
GoJavaTypeScriptJavaScriptPHP
Backend Engineering
LaravelGoJava / Spring BootNestJSDjangoREST API DesignMicroservicesAsynchronous Queues
Frontend Architecture
Vue.jsReactReact NativeFlutterNext.jsTypeScriptJavaScript (ES6+)Tailwind CSS
Data & Infrastructure
PostgreSQLMySQLMongoDBRedisKafkaRabbitMQDockerKubernetesTerraformAWSGCPPrometheusGrafanaElastic StackKeycloakCI/CDLinux

About

I am a software engineer based in Kampala, Uganda. I build systems where being wrong is expensive — national platforms for public institutions, and enterprise products for private companies. The public work has meant identity verification, education data and examinations. The commercial work has meant multi-tenant SaaS that runs a company end to end: operations, fleet, procurement, payroll, billing and a double-entry ledger that has to balance in every currency and satisfy each country's tax authority.

My day-to-day is Laravel, Go, Vue and React, on PostgreSQL. I care most about the parts that are hard to retrofit — schema design that survives a decade of policy change, tenant isolation you can prove rather than hope for, validation enforced at ingestion rather than patched downstream, and queue architecture that degrades gracefully instead of collapsing under load.

I work equally well embedded in a distributed remote team and on the ground with an enterprise client. I also build and maintain open-source tooling, and I write regularly about engineering practice and technology trends for the DEV Community and for TechTalk, my LinkedIn newsletter.

Diploma in Software Engineering — Sai Pali Institute of Technology & Science.

Contact

Tell me what you're building

My best work has been on systems that have to stay correct under load — records that cannot duplicate, ledgers that have to balance, messages that have to arrive. Send me a few lines about the role or the system and I will get back to you within a day. A rough outline is plenty; I would rather hear about the problem than read a finished spec.

Available for full-time remote roles, contract engagements and enterprise consultation.