Skip to content
AAlpha.
All projects
In development

Mezgeb – Offline mobile-money ledger for Ethiopian shops

Under active development. Builds and tests pass in CI; not yet published on the Play Store.

Three Mezgeb Android screens showing the daily view, ledger and reports
Source: Alphaguyasa/Mezgeb docs/media, captured from the app's demo mode
  • Mezgeb's Today screen: the day's captured payments, in and out
    Source: Alphaguyasa/Mezgeb docs/media/screen-today.png, demo mode
  • Mezgeb's Ledger screen: every transaction, grouped and filterable
    Source: Alphaguyasa/Mezgeb docs/media/screen-ledger.png, demo mode
  • Mezgeb's Customers screen: who owes the shop, and for how long
    Source: Alphaguyasa/Mezgeb docs/media/screen-customers.png, demo mode
  • Mezgeb's Reports screen: totals by channel and category
    Source: Alphaguyasa/Mezgeb docs/media/screen-reports.png, demo mode
  • Mezgeb's review queue: messages no rule could read yet
    Source: Alphaguyasa/Mezgeb docs/media/screen-review.png, demo mode
  • Mezgeb's teach-a-rule screen: a new parsing rule induced from a real message
    Source: Alphaguyasa/Mezgeb docs/media/screen-teach.png, demo mode

The problem

Small shops in Ethiopia take payment through mobile money and bank apps, and the confirmations arrive as notifications nobody reconciles against who owes the shop.

The approach

A notification listener captures payment notifications, because Google Play does not grant READ_SMS to finance apps. A JSON-defined rule engine parses them into a ledger. When no rule matches, the message goes to a review queue, and the shopkeeper teaches a new rule by highlighting the amount.

Results

  • 375 unit tests on the Play flavor, 382 on the sideload flavor, 83 on the parser module.
  • No INTERNET permission in either flavor, checked against the merged release manifest.
  • Release APK is 3.07 MB.

What broke and what I learned

  • The parser scores 100.00% on its holdout (23/23), and the README says plainly that this is worth less than it looks: all samples come from 3 senders and 13 message templates from one person's account.
  • RECEIVE_SMS was carried for several sessions and then removed, because nothing used it. A restricted permission has to be justified, not kept just in case.
  • Coverage is 36.1% instruction / 46.1% line, reported rather than gated.