Session active · Kampala, Uganda · UTC+3

Kitandwe
Arthur

I build the software that sells internet access in East Africa: the portal a customer sees, the mobile-money payment behind it, the router that lets them through, and the ledger that has to stay right.

1,807commits, sole author
214klines: web, mobile, backend
152test files
83schema migrations
97.3%less bytes to first data
2RADIUS sites, failover proven

The work

PesaFii

A multi-tenant platform for people who sell WiFi. Business owners run hotspots; customers pay by mobile money and get online. I am the only engineer on it, and it has been in production since February 2026.

In production ReactReact Native Node · ExpressPostgreSQL RedisFreeRADIUS MikroTik RouterOSWireGuard
What happens when someone buys an hour of internet
Customer phone captive portal MikroTik router hotspot · RouterOS v7 VPS API · FreeRADIUS · workers PostgreSQL wallet ledger · sessions Online MTN · Airtel Wi-Fi WireGuard tunnel RADIUS accounting mobile money

Customers were being charged twice

When the captive portal lost its payment intent ID mid-flow, initiation could run again and take a second payment. I made initiation idempotent against the intent, so a retry settles onto the same charge instead of creating a new one.

Real money, real customers, no way to unsee it in the ledger.

The portal was slow where it mattered most

The package request went out 83.9 KB into the document. I moved it to 2.3 KB, a 97.3% cut, and opened DNS, TCP and TLS at parse time with preconnect, removing about 330 ms of handshake. Returning devices now paint from cache with no network at all.

Customers are on cheap phones and thin signal. Bytes are the product.

A revoked session could come back to life

Caching "is this session valid?" in Redis is what makes the hot path fast, and also what lets a stale yes outlive a revocation. I fenced revocation so a cached positive can never resurrect a dead session, and reconciled outstanding fences at startup. PostgreSQL stays the only authority.

Fast is worth nothing if it is fast and wrong.

One site was a single point of failure

I brought a second RADIUS site up in Belgium and proved failover end to end, then fixed disconnects to be site-aware, so a router is reached over the tunnel it is actually attached to, not the one that happened to report it.

Verified by taking the primary away, not by reading the config.

Also built

Client work and products

Duya Discoveries

2025 to now

A tourism platform for Uganda, rebuilt from a static HTML site into a typed, server-rendered application. Multi-language with next-intl so visitors read it in their own language, and a GSAP motion layer tuned to stay smooth on low-end phones.

Next.js · TypeScript · Neon Postgres · GSAP · Zod

Pearl Trails

2026

Lodge and campsite booking. Deployed to Cloudflare Workers through OpenNext, chosen deliberately, so a site serving visitors from anywhere runs at the edge and costs almost nothing at launch traffic.

Next.js · Cloudflare Workers · Drizzle · Neon

PesaFii mobile

2026

The operator's app: 16 feature areas covering sales, vouchers, agents, wallet, routers and live sessions. Built so an owner can run the whole business from a phone, because most of them do.

React Native · Expo SDK 54 · Zustand · EAS Build

Agrinal Enterprises

2026

Company platform on a Radix-based component system, with Zod-validated forms and motion used sparingly enough that it still feels like a business, not a demo.

Next.js · TypeScript · Drizzle · Framer Motion

Stack

Where I work in the system

Listed by layer rather than as a wall of logos, because knowing where a thing sits is most of knowing how to use it.

What the customer touches
React · Next.js (App Router) · TypeScript · React Native · Expo · Tailwind · Radix & shadcn · MUI · GSAP · Framer Motion · Recharts
What answers the request
Node.js · Express · REST design · JWT · TOTP two-factor · Redis · background workers · idempotency · rate limiting
Where the truth lives
PostgreSQL · Drizzle · Neon · Supabase · schema migrations · multi-tenant isolation · wallet ledgers · query tuning
What it all runs on
Cloudflare Workers · Vercel · Linux VPS · PM2 · nginx · WireGuard · FreeRADIUS · MikroTik RouterOS v7 · Git · CI/CD

About

Two years, one very deep system

I am a full-stack engineer in Kampala. Most engineers with two years behind them have touched a lot of small things; I have gone a long way down one large one. 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, and made every one of those a place where being wrong costs somebody money or their connection.

That has shaped how I work. I read the system before I change it, I decide what must not break before I write anything, and I verify by taking the thing away rather than by reading the config and believing it.

Based
Kampala, Uganda · UTC+3
Available
Immediately, remote contract or full-time
Hours
Flexible, reliable overlap with Europe and the US
Education
Certificate in Computer Science, YMCA Comprehensive Institute (2026)
Certified
freeCodeCamp: Relational Databases; Responsive Web Design

Get in touch

Available now

Open to remote engineering work. The fastest way to reach me is email.