Selected Case Studies

National Education Management Information System (EMIS)

Ministry of Education & Sports, Uganda

Backend / Full-Stack EngineerSMS ONE (U) Limited

Situation
National identity records and learner records lived in separate systems with no verification at the point of entry. Registrations were duplicated across districts and school levels, so the ministry had no reliable count of who was actually in the education system — and no single place to see staffing, enrolment or district performance together.
Task
Build the learners and HR modules, a public search over more than 90,000 school records and the application flows behind it, the access-control layer that governs who may see and change what across the ministry, and the validation and reporting the whole platform depends on.
Action
Built the learners module in Laravel and Vue on a PostgreSQL schema exceeding 1,000 tables, integrating NIRA national identity verification directly into the ingestion layer so records are validated at the moment of entry rather than reconciled afterwards. Extended the same foundation with an HR module covering teacher and staff records, deployment and establishment across schools. Implemented role and permission management so ministry headquarters, district officials and individual schools each see and edit only their own scope, and built the reporting layer that aggregates enrolment and staffing into the figures policy decisions are actually made on. Opened the register to the public with a search over 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 — together with the application flows that let schools and the public submit through the same platform. Wrote the data validation and verification pipelines enforcing all of it under concurrent load, and worked on the infrastructure the platform runs on.

Result

30M+ learner records registered across every school level in Uganda, with duplicate registrations eliminated at source rather than cleaned up downstream. Learner, staffing and district reporting are served from one system, and more than 90,000 school records are searchable by the public.

  • Laravel
  • Vue
  • PostgreSQL
  • REST APIs
  • 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 operations, fleet, billing and accounting across disconnected tools. Each operator is licensed by a different city authority and must be reported on separately, and no single product covered the whole operation for this market.
Task
Build a multi-tenant, multi-territory platform where each operator runs its entire business on its own subdomain, under a control plane that onboards and bills tenants.
Action
Built a Go modular monolith on Chi across 44 domain modules — operations, scheduling, fleet, billing, payments, procurement, payroll and accounting — exposing 471 routes behind a generated OpenAPI 3.1 contract. Isolated tenants with schema-per-tenant PostgreSQL backed by row-level security, authenticated through Keycloak OIDC with one organisation per tenant, and used a transactional outbox onto Pub/Sub for cross-module events. Implemented a native double-entry general ledger that is multi-currency, tax-aware and billing-source-agnostic, with per-country fiscalisation for EFRIS and MRA, plus Mobile Money settlement. Deployed on Cloud Run in africa-south1 for on-continent data residency.

Result

A tenant runs its entire operation — customers, scheduling, fleet, billing, payments and accounting — on its own subdomain, with the ledger and fiscalisation correct per country. Structured so Payments, Telematics and the shared premise registry can be carved out as independent services without a rewrite.

  • 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 needed to reach very large contact bases reliably, on a platform where a failed dispatch is visible institutionally. Naive per-message delivery collapses at that volume, and bulk uploads at this scale cannot be processed synchronously.
Task
Build ingestion and delivery capable of absorbing tens of millions of contacts and dispatching against them without degrading the platform — and make the pipeline observable enough to prove it is healthy.
Action
Built structured bulk ingestion for large contact uploads and moved delivery onto Kafka, decoupling ingestion from dispatch so neither blocks the other and a consumer backlog degrades throughput instead of losing messages. Instrumented the pipeline with Prometheus metrics and built Grafana dashboards over ingestion rate, consumer lag and delivery outcomes, so saturation is visible before it becomes failed delivery rather than after.

Result

45M+ contacts ingested, on an architecture designed for 100,000+ concurrent users.

  • Laravel
  • Go
  • Kafka
  • PostgreSQL
  • Redis
  • Prometheus
  • Grafana

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

More projects on GitHub

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 Computer Science & Engineering — Sail 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.