JB logo
CoffeeyOUTUBE
Back to products

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.

280+shops running it
1.4M+IMEIs tracked
9core modules
<80msAPI p50 latency
Shoppleet desktop application interface

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 APIGo · Gin · GORM · PostgreSQL · Redis · Asynq
Desktop appWails 2 · React 19 · Vite · TanStack Router + Query · local SQLite
Sync engineOutbox pattern · Postgres savepoints · idempotency keys
Mobile companionExpo · React Native · shared API contract
Marketing siteVite · 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.

DashboardSales (POS)PurchasesInventoryIMEI trackingFinanceReportsAuditingAdministration

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.