Skip to content
Open to full-stack / backend roles

I build systemsthat don't fall over.

Full-stack engineer building high-throughput systems in Go, Java and Kafka for platforms serving 10M+ users across 7 African markets.

A working sketch of the fraud-detection pipeline I built — 50K+ events/min, sub-200ms p99.

  • Go
  • Java
  • Spring Boot
  • Apache Kafka
  • Apache Flink
  • PostgreSQL
  • Redis
  • Nuxt
  • Vue 3
  • TypeScript
  • Kubernetes
  • Docker
  • AWS
  • GCP
  • gRPC
  • M-Pesa
10M+
users served

across live platforms

7
African markets

one stack, seven countries

50K/min
events processed

fraud-detection pipeline

<200ms
p99 latency

at full throughput

Selected work

Platforms I've shipped and kept running

Live betting and gaming platforms serving millions of users across Africa. Three worth going deep on.

How I think about it

The same work, told as problems

Platform names are context. These are the things that were actually hard.

  • 01

    Detecting fraud at 50K events per minute

    A streaming pipeline that scores every bet, deposit and withdrawal as it happens. Kafka for ingest and replay, Flink for stateful windowed aggregation, decisions back on the wire in under 200ms at p99 — fast enough to block a transaction rather than report on it afterwards.

    • Kafka
    • Flink
    • sub-200ms
  • 02

    The night writes stopped keeping up

    Write latency degraded until support was fielding 40–50 complaints an hour. The queries hadn't changed — an unbounded table had. Traced it to row growth outpacing the index, then shipped cron-based archival that kept the hot table bounded. Complaint volume went to zero and stayed there.

    • PostgreSQL
    • archival
    • 40–50/hr → 0
  • 03

    One stack, seven currencies

    Seven markets on a single deployable platform: multi-currency ledgers, M-Pesa integrations with HMAC request signing, and English, Swahili and French throughout. Localisation lives in configuration, not in forks — adding a market is a deploy, not a rewrite.

    • M-Pesa
    • HMAC
    • EN / SW / FR
  • 04

    The consumer that wouldn't stay up

    A Kafka consumer group stuck in a crash loop: one malformed message, an aggressive auto.offset.reset, and every restart replayed straight back into the same poison record. Fixed the offset strategy, quarantined the bad payloads and made deserialisation failures survivable instead of fatal.

    • Kafka
    • consumer groups
    • poison messages

Reach

One stack, seven countries

Every market runs the same platform: multi-currency ledgers, local payment providers, and English, Swahili and French throughout. Adding a country is configuration and an integration — not a fork.

  • KEKenya
  • NGNigeria
  • UGUganda
  • TZTanzania
  • ZMZambia
  • MWMalawi
  • CDDRC

Languages

  • Go
  • Java
  • TypeScript
  • JavaScript

Backend

  • Spring Boot
  • Node.js
  • gRPC
  • REST

Frontend

  • Vue 3
  • Nuxt
  • React
  • Tailwind CSS

Data & Streaming

  • PostgreSQL
  • Apache Kafka
  • Apache Flink
  • Redis

Infrastructure

  • Docker
  • Kubernetes
  • AWS
  • GCP

Practices

  • Event-driven design
  • Payment integrations
  • i18n
  • CI/CD
Open to full-stack / backend roles

Got a system that needs to hold up under real traffic?

I'm looking for full-stack and backend roles where the hard part is the load, the latency or the money moving through it. Happy to talk through anything you're building.