Loading case study...
Loading case study...
PesaFlow is an offline-first mobile finance tracker purpose-built for the Tanzanian money ecosystem. It listens for mobile money and bank transaction SMS alerts, parses them in real time, and logs income, expenses, and savings pacing against a fully local database — so sensitive financial data never leaves the user's device.

Problem Space
Managing money across Tanzania's fragmented ecosystem is a manual nightmare. Users juggle M-Pesa, Tigo Pesa, Airtel Money, Halopesa, Selcom Pesa plus CRDB, NMB and NBC bank accounts — each sending its own SMS format — making it nearly impossible to see total income, spending, and true account balances in one place.
Transaction alerts arrive in wildly inconsistent formats across 8 different carriers and banks
Conventional finance apps rely on cloud sync, exposing sensitive financial data to third parties
Manual expense logging is tedious and routinely abandoned within days
Provider fees, government levies, and VAT make naive balance math drift from reality
Unreliable mobile connectivity renders cloud-dependent trackers useless in rural areas
Process
I treated the SMS inbox as the primary data source and designed around a single constraint: everything must work with the network off. I built a provider-matching pipeline first, then layered a regex parser engine, deduplication, auto-categorization, and balance reconciliation on top of a reactive local store.
Chose Flutter for true cross-platform reach with native background telephony access
Adopted Riverpod for compile-safe, testable reactive state and stream-driven UI updates
Used Drift (SQLite) for type-safe relational queries and reactive local data streams
Locked wallet balances to the carrier's own post-transaction `Salio` to absorb fees and VAT automatically
Ruled out cloud sync entirely — manual encrypted database export is the only backup path
Delivered System
PesaFlow turns the user's SMS inbox into a live, private ledger. Transaction alerts are intercepted in the background, parsed, de-duplicated, categorized, and reconciled against exact carrier balances — all without an internet connection or an account.
Background telephony listeners capture incoming transaction alerts and extract amounts, fees, reference codes, and recipients in milliseconds.
Recognizes and routes shortcodes and formats from 5+ mobile money wallets and major commercial banks simultaneously.
Reconciles each wallet to the carrier's stated ending balance, automatically absorbing service fees, government levies, and VAT.
All data lives in an on-device Drift/SQLite store. No cloud sync, no third-party APIs, no analytics — nothing ever leaves the phone.
Computes roll-over carryforwards, warning thresholds, and live spent-to-income percentages so pacing is always visible.
Home-screen widgets and push-style notifications surface safe-to-spend, spending heatmaps, and recent activity at a glance.
Technical Stack
A layered, fully local architecture: a presentation layer driven by Riverpod providers, a business-logic layer of parser, transaction, budgeting, and analytics engines, and a data layer backed entirely by Drift (SQLite). An Android background isolate handles SMS ingestion independent of the UI thread.
Measured Impact
PesaFlow replaces days of manual spreadsheet reconciliation with a private, always-on ledger that works with the network switched off — a rare combination of automation, accuracy, and total data ownership.
8
Providers supported
100%
Offline & private
0
Cloud dependencies
Real-time
SMS ingestion
TZS
Kiswahili formatting
2
Mobile platforms
Retrospective
Treating the SMS inbox as a data source demands defensive parsing — carrier formats change without warning
Deduplication at the ingest layer is essential; a single alert can be delivered more than once
Reconciling against the carrier's stated ending balance sidesteps an entire class of rounding and tax errors
Designing for zero-network operation forced a cleaner separation between UI and data layers