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
- 7
- African markets
- 50K/min
- events processed
- <200ms
- p99 latency
across live platforms
one stack, seven countries
fraud-detection pipeline
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.
Also shipped
- Imarabet ↗KenyaFull-stack · sportsbook & casino
- Softbet ↗KenyaBackend · payments · streaming
- Shindapesa ↗TanzaniaBackend engineering
- Cashfasta ↗TanzaniaBackend engineering
Backend, payments and streaming work across the same platform stack.
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
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.


