SpendWise
Offline-first expense tracker that reads your bank SMS
SpendWise turns raw bank/UPI transaction SMS into structured expense records automatically, fully offline, biometric-locked, with SQL-side aggregations powering its charts. The parsing, aggregation and provider layers are covered by unit tests against an in-memory database.
The Problem
Manual expense logging fails because people stop doing it. In India, every transaction already arrives as an SMS: the data exists; it just needs parsing, locally and privately.
The Solution
A strict three-layer architecture (screens → ChangeNotifier providers → abstract services backed by Drift/SQLite) with an SMS transaction parser, monthly and category aggregations pushed down into SQL GROUP BY so charts stay fast at any data volume, and biometric device-lock via local_auth. No network permission at all.
Architecture
- Feature-first Flutter with dependency inversion: providers depend on abstract StorageService/AuthService interfaces
- Drift (SQLite) with SQL-side aggregation for chart data
- Android SMS ingestion + regex transaction parser with unit tests
- fl_chart visualizations; local_auth biometric gate
Challenges & How I Solved Them
Parsing the chaos of bank SMS formats
Every bank words debits differently; the parser is test-driven against a corpus of real formats so new banks are a test case away.
My Contributions
- Entire app, built as a deliberate architecture showcase with tests and docs
Impact
- Fully offline & private by design
- Test suite over parser, aggregations and state
Lessons Learned
Interface-driven layers make Flutter genuinely testable: the whole data layer swaps for in-memory fakes in tests.