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
- Public marketplace — products, services, shops and buyer requests, with fast search and SEO-friendly pages.
- Fere — the merchant workspace: products and stock, point of sale, orders, customers, suppliers, branches, and reports. It is the largest service (~33k lines).
- Three clients on one API — an Angular web app (server-side rendered), a Flutter app on Google Play, and an Angular back office for the team. Every feature ships on web and mobile together.
Architecture
Simplified: the backend has 10+ Spring Boot services; the four groups above carry most of the traffic.
How code reaches production
Every service follows the same path, so releasing is boring — which is the goal:
- Jenkins builds and tests the service, then pushes an image to a private registry.
- The pipeline updates the image tag in that service's deploy repo (Kubernetes manifests with Kustomize).
- 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
- Backups: PostgreSQL and MongoDB are backed up to object storage every 30 minutes with a 14-day retention; product photos are mirrored every night with a 7-day trash.
- Monitoring: an automated health report checks the production every 30 minutes and flags problems before users do.
- Resilience: a standby cluster, and a real failover drill to prove it can take over (no data lost).
- Incidents: each one gets a short written post-mortem — what broke, why, and the fix that stops it from happening again.
What I learned
- Fewer, bigger services win early. I started with too many small services and merged several of them (users into auth, notifications into real-time) — fewer moving parts, faster deploys, same features.
- Automate the boring path. One identical pipeline for every service made releases routine instead of risky.
- Design for the real user. Low-end Android phones and expensive data shaped every choice: server-side rendering, small images, French first.