Home Ledger is a modern, responsive Flutter application designed to make managing and splitting household finances effortless. It calculates net income after savings, and dynamically splits bills and groceries among household members, accounting for unequal "grocery head" consumption.
- Dynamic Income Tracking: Calculates total disposable income after savings and optional miscellaneous donations.
- Fair Splits: Automatically splits Bills and Groceries according to member counts. Calculates extra "grocery heads" seamlessly (e.g., if there are 2 bill payers but 3 grocery eaters, it assigns the extra grocery cost logically).
- Live Summary: Instantly computes a per-person financial breakdown.
- Local Persistence: Data is automatically saved to your device using
shared_preferences. - High Performance: Implements state debouncing and targeted UI rebuilding (via Riverpod) ensuring buttery-smooth 120fps text input.
- Share Capability: Easily copy or share the final per-person split breakdown to WhatsApp or iMessage.
- Framework: Flutter (Material 3)
- State Management:
flutter_riverpod3.x (using modernNotifierand.select()) - Data Persistence:
shared_preferences - Fonts & UI:
google_fonts(DM Mono, Syne) and a custom dark-mode aesthetic.
The app is built using a Feature-First Architecture to ensure it can easily scale from a local offline app to a cloud-synced Firebase app.
lib/
├── core/
│ ├── theme/ # Colors, typography, theme data
│ ├── utils/ # Formatters, helpers
│ └── widgets/ # Reusable UI components (Custom Cards)
├── models/ # AppState, ExpenseItem models
├── repositories/ # Interface for data storage (Local_Storage_Repository)
├── features/
│ ├── home/ # Main UI, Riverpod Providers, and specific Widgets
└── main.dart # Entry point
Important Dev Notes:
- To add Firebase later, we only need to write a
FirebaseRepositoryand swap it out instorageRepositoryProvider. The UI and State Notifiers will require zero changes. - Typing performance is preserved by decoupling the Riverpod Watchers. List inputs manage their state locally and debounce updates to the global state.
- Flutter SDK installed.
- iOS Simulator or Android Emulator.
Clone the repository and install the dependencies:
cd home_ledger
flutter pub getTo run the app in debug mode on your simulator/emulator:
flutter runTo build a highly optimized Release APK to share with Android users:
For Apple Silicon (M1/M2/M3) Mac Users:
Because building for the old 32-bit Android architecture (android-arm) requires Rosetta 2 on Apple Silicon, you might encounter a gen_snapshot error. To bypass this and build purely for modern 64-bit phones, run:
flutter build apk --release --target-platform android-arm64The generated APK will be available at:
build/app/outputs/flutter-apk/app-release.apk