FinWallet is an Android app that combines manual expense logging with on-device receipt OCR and spending analytics. It is written in Jetpack Compose, works offline-first, and keeps all data on the device.
The receipt flow: capture with CameraX or pick from the gallery, run ML Kit text recognition, apply heuristic parsing for merchant/total/date/tax, then show a review screen before saving. Low-quality captures give the user a chance to correct rather than throwing an error.
02Key Features
Manual expenses — amount in minor units, category, merchant, note, date and payment type (cash, card, digital wallet, bank transfer, other)
Receipt scanning — CameraX or gallery, ML Kit text recognition, heuristic field parsing and a review screen before saving
Persistence — a Room database, with currency, theme and notification preferences in DataStore
Analytics — current vs previous month, category share and a daily spending chart drawn with Canvas
Reminders — WorkManager weekly reviews plus an optional daily logging nudge
Material 3 — dynamic colour on Android 12+, dark/light/system themes
03Engineering Notes
MVVM with unidirectional data flow: composables render state and ViewModels expose UI state through StateFlow.
Amounts are stored in minor units rather than floating point, removing rounding risk from money calculations.
OCR runs entirely on-device; receipt images are never sent to a server.