Case Study · Offline-first POS
Shoppleet
A native desktop business platform for East African retailers — POS, inventory, IMEI tracking, finance and reporting — built on one rule: the till never waits for WiFi.

The problem
Retail that can't trust the internet
Small and medium retailers across Uganda, Kenya, Tanzania and Rwanda run on unreliable power and intermittent connectivity. Cloud-only point-of-sale tools fail exactly when they matter most: a dropped connection means the till stops, the queue grows, and the sale walks out the door.
These shops also carry real operational complexity — multi-branch stock, phone dealers who must track every IMEI, five regional currencies, and owners who need a trustworthy audit trail — none of which the generic imported POS tools handled well.
The approach
Offline-first, generated from one schema
Shoppleet is a real native binary (not a packaged browser) for Windows, macOS and Linux. Every till keeps selling on a local SQLite store; a sync outbox queues each transaction and replays it the instant a bar of signal returns — 99.9% sync reliability, with idempotency keys so nothing double-posts.
The whole platform is scaffolded end-to-end by Grit, a framework I built that generates the Go API, TypeScript types, React Query hooks, desktop forms and mobile screens from a single schema definition. One source of truth drives the backend, the desktop app, the mobile companion and the marketing site — which is how one engineer ships and maintains all four.
Architecture
One backend, every surface
| Backend API | Go · Gin · GORM · PostgreSQL · Redis · Asynq |
| Desktop app | Wails 2 · React 19 · Vite · TanStack Router + Query · local SQLite |
| Sync engine | Outbox pattern · Postgres savepoints · idempotency keys |
| Mobile companion | Expo · React Native · shared API contract |
| Marketing site | Vite · React 19 · GSAP · Lenis · MDX |
Performance budget held in production: <80ms API p50, <200ms screen-to-screen, and ~1000 rows / 30s bulk import.
What's inside
Nine modules, 175+ permissions
Every screen lives in one of nine numbered modules, each with its own permissions, a permanent audit trail (before/after snapshots) and printable reports. A cash sale takes six keystrokes.
The outcome
Live in 280+ shops
Shoppleet runs today in 280+ shops across East Africa, having tracked 1.4M+ IMEIs cumulatively across five currencies (UGX, USD, KES, TZS, RWF). It is strictly multi-tenant and branch-aware, with a permanent audit trail on every change of state — the trust layer owners asked for.
Honest scope
What it deliberately doesn't do
Part of shipping something real is being clear about its edges. Shoppleet is a focused back-office system, so it intentionally leaves out:
- Online storefront / e-commerce — it's a back-office system, not a webshop
- Online card processing — cash, mobile money and bank are built; cards aren't
- Marketplace integrations (Jumia, Kilimall) — not yet
- QuickBooks / Xero double-entry export — coming, not shipped
Want something built like this?
I build production software that ships and runs where the internet doesn't — from offline-first desktop apps to Go backends and payments.


