Yembi
[ LIVE ]Mobile money tracking for Burkina Faso, built at DOKAL-Africa. Parses Orange Money and Moov Money SMS into structured, searchable finances, fully offline. I led it from first commit to Play Store.
- Kotlin
- Jetpack Compose
- Room + SQLCipher
- Hilt
- Node.js/TypeScript
- MySQL
- Docker/AWS ECR
- Angular/Ionic
The problem
In Burkina Faso, your mobile money “statement” is a pile of SMS. Orange Money and Moov Money move billions of FCFA a year, and the only record users get is raw text messages in reverse chronological order. No categories, no totals, no history you can search.
Yembi fixes that. It intercepts operator SMS on-device, parses them into structured transactions, and gives users a real financial dashboard: balances per account, spending by category, full searchable history. No bank integration, no API, no internet required.
My role
Yembi is DOKAL-Africa’s flagship consumer product, and I was its only engineer from the first commit until well after launch, when we hired a second developer I now onboard and review. That covered the whole surface:
- the Android app (Kotlin, Jetpack Compose, Room with SQLCipher encryption)
- the management backend (Node.js/TypeScript, MySQL, Docker images deployed to AWS ECR)
- the admin web application (Angular/Ionic) used to operate the product
- the ML-assisted tooling used to train and score the SMS parser
- the Play Store listing, release process, and store assets
How it works
A BroadcastReceiver intercepts operator messages in real time. A parser pipeline,
tuned per operator and transaction type against a corpus of real anonymized
messages, extracts amount, counterparty, transaction ID, balance and type. It
covers seven transaction types today, from agent withdrawals to merchant payments,
at 99%+ measured accuracy.
Everything lands in an encrypted local database, so the app works with zero connectivity. Sync to the backend is an enhancement, not a dependency. Burkinabè phones routinely carry two SIMs across operators, so SIM detection maps each message to the right account and tracks balances independently.
Sync itself is built for 2G connections that drop mid-request: a persistent queue, SHA-256 idempotency keys, and exponential backoff. A retry can never create a duplicate transaction, because duplicates cannot be represented.
What it taught me
Operator SMS formats change without notice. The parser is config-driven, so a format change ships as a data update instead of an app release; I can react to a new Orange template in about an hour. And the database is indexed for the questions users actually ask (“what did I spend on bills last month?”), which is what keeps date-range queries under 50ms on tables past a million rows, on mid-range Android hardware.
Live on the Play Store since March 2026.