Case study · 2025 – now

Sougba: a marketplace I built and run, end to end

Sougba (sougba.com) connects buyers, shops and service providers in Mali. Shops also get Fere, a workspace to manage products, stock, sales and customers. I designed the system, wrote most of the code, and operate the production myself.

The problem

Most small shops in Bamako sell through WhatsApp and a paper notebook. They need two things: to be found online, and a simple way to track stock and sales. Existing tools are built for other markets — expensive, English-only, and heavy on mobile data. Sougba puts both in one place, in French, built for low-end phones.

What I built

Architecture

Simplified: the backend has 10+ Spring Boot services; the four groups above carry most of the traffic.

BackendJava 21, Spring Boot 3, Spring Cloud Gateway, Kafka, gRPC — about 97,000 lines of Java DataPostgreSQL (one schema per service), MongoDB, Redis, Typesense Web & mobileAngular 21 with SSR and Tailwind; Flutter PlatformKubernetes (k3s), Argo CD, Jenkins, private Docker registry, Ansible, Cloudflare Tunnel, Tailscale

How code reaches production

Every service follows the same path, so releasing is boring — which is the goal:

  1. Jenkins builds and tests the service, then pushes an image to a private registry.
  2. The pipeline updates the image tag in that service's deploy repo (Kubernetes manifests with Kustomize).
  3. Argo CD sees the change and syncs the cluster. About 20 apps are managed this way, and a rollback is a git revert.

Running it

Example. A scheduled clean-up job hard-deleted 211 products and their photos one night. I restored all 211 products from the backup taken 10 minutes earlier, recovered most photos from the CDN cache, wrote the post-mortem, and added a nightly photo mirror with a 7-day trash plus a freshness check in the health report — so a photo can no longer disappear without a copy.

What I learned

← Back to all work