AD
All projects
Mobile2026

SpendWise

Offline-first expense tracker that reads your bank SMS

GitHub Personal project

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.

Tech Stack

FlutterProviderDriftSQLitelocal_authfl_chart