Kitandwe Arthur · Full-stack engineer · Kampala, Uganda
Thoughtful interfaces.Dependable systems.
I design and build the screens people use and the systems behind them — from a captive portal on a cheap phone to the payment, router session and ledger entry it triggers.
Lodges, campsites and experiences across Uganda: travellers discover a stay and request a booking; staff review and act on it in an operations console.
Built: Live availability, a planner, and an ops console where only legal booking moves are offered and every change is recorded.
What happens when someone buys an hour of internet
A customer’s phone reaches a MikroTik router, which talks over a WireGuard tunnel to the API and FreeRADIUS. PostgreSQL holds the sessions and the wallet ledger; MTN and Airtel settle the money.
Customers could be charged twice
Problem
If the captive portal lost its payment-intent ID mid-flow, initiation could run again and take a second payment.
Decision
Made payment initiation idempotent against the intent, so a retry settles onto the same charge.
Result
A repeated request can no longer create a second charge.
The portal was slow where it mattered most
Problem
Customers on cheap phones and thin signal waited for a package request that started 83.9 KB into the document.
Decision
Moved the request to 2.3 KB into the document and opened DNS, TCP and TLS at parse time with preconnect.
Result
About 330 ms of handshake removed from the critical path, and returning devices paint from cache.
A revoked session could come back
Problem
Caching session validity in Redis makes the hot path fast, and lets a stale “yes” outlive a revocation.
Decision
Fenced revocation so a cached positive can never resurrect a dead session, and reconciled fences at startup.
Result
PostgreSQL stays the only authority on whether a session is valid.
One RADIUS site was a single point of failure
Problem
Every login authorised through one site.
Decision
Brought up a second site and made disconnects site-aware, so a router is reached over the tunnel it is attached to.
Result
Failover verified by taking the primary away, not by reading the configuration.
Capabilities
What I deliver
01
Web interfaces and customer journeys
Responsive, accessible front ends with motion that serves the content — search, galleries, baskets, multi-step forms.
React · Next.js · TypeScript · GSAP
02
Full-stack products
From the data model to the screen: APIs, authentication, roles and the operational tools staff actually use.
Node · Express · PostgreSQL · Drizzle
03
Mobile applications
Operator apps that carry the whole business, built on the same API and rules as the web.
React Native · Expo
04
Payments and data integrity
Idempotent payment flows, wallet ledgers, PIN and OTP authorisation, and audit trails that explain every balance.
Mobile money · ledgers · idempotency
05
Infrastructure and integrations
Routers, RADIUS, tunnels and edge deployments, verified by failure rather than by configuration.
FreeRADIUS · MikroTik · WireGuard · Cloudflare
About
How I work
I’m a full-stack engineer in Kampala. Most of my last two years went into one large system: PesaFii put me in the same week across a React dashboard, a React Native app, an Express API, a PostgreSQL ledger, RADIUS accounting and a router’s own configuration.
Understand the system first. I read the code and data before changing either.
Protect the invariants. I decide what must never break — a balance, a session, a charge — before writing anything.
Test the critical flows. Focused tests on the paths that move money or access, and verification by taking things away.
Refine the experience. Then the interface: fast on cheap phones, clear on every screen size, honest about what it does.
Based
Kampala, Uganda · UTC+3
Education
Certificate in Computer Science, YMCA Comprehensive Institute (2026)
Certified
freeCodeCamp: Relational Databases; Responsive Web Design
Contact
Let’s build something dependable.
Open to remote engineering work. Email is the fastest way to reach me.