A beautiful, fully offline personal finance tracker built with Flutter.
Track your income and expenses, manage accounts, set budgets, and grow your savings — all in one place, with your data never leaving your device.
| Category | Details |
|---|---|
| 💰 Transactions | Log income & expenses with categories, notes, and dates |
| 🏦 Accounts | Manage multiple accounts (cash, bank, mobile money) |
| 📊 Budgets | Set monthly category budgets with real-time alerts |
| 🎯 Goals | Create savings goals and track your progress |
| 📈 Reports | Visual spending charts and financial summaries |
| 🔔 Notifications | Daily reminders & budget overspend alerts |
| 🔐 Biometric Lock | Fingerprint / Face ID app protection |
| 🌙 Dark Mode | Full dark & light theme support |
| 🗂 Categories | Fully customizable spending categories |
| 📤 Export | Export all transactions to CSV and share via any app |
| Splash | Dashboard | Transactions |
|---|---|---|
![]() |
![]() |
![]() |
| Accounts | Budgets | Goals |
|---|---|---|
![]() |
![]() |
![]() |
| Categories | Reports | Settings |
|---|---|---|
![]() |
![]() |
![]() |
SpendWise follows a clean, feature-first architecture with a clear separation of concerns.
lib/
├── main.dart
├── app.dart # App root, theme & router wiring
│
├── core/
│ ├── constants/ # Colors, strings, sizes
│ ├── extensions/ # DateTime & double helpers
│ ├── router/
│ │ └── app_router.dart # GoRouter with biometric & onboarding guards
│ ├── theme/ # Light & dark ThemeData
│ └── utils/ # Currency & date formatters
│
├── database/
│ ├── app_database.dart # Drift DB definition
│ ├── tables/ # Transactions, accounts, categories, budgets, goals
│ └── daos/ # Type-safe query objects per table
│
├── features/
│ ├── splash/ # Animated motion splash screen
│ ├── onboarding/ # First-run setup flow
│ ├── dashboard/ # Balance card, recent transactions, spending chart
│ ├── transactions/ # Full transaction CRUD
│ ├── accounts/ # Account management
│ ├── budgets/ # Budget creation & progress tracking
│ ├── goals/ # Savings goals
│ ├── reports/ # Charts & financial reports
│ ├── categories/ # Category management
│ └── settings/ # App settings, lock screen
│
└── shared/
├── widgets/ # Reusable UI components
└── models/
└── app_result.dart # Success/Failure wrapper
Key patterns used:
- Feature-first folder structure — each feature is self-contained with
data/,domain/,presentation/, andproviders/ - Repository pattern — data sources abstracted behind repository classes
- AsyncNotifier from Riverpod 3 — for all async state management
- GoRouter with
refreshListenable— stable router that re-evaluates guards without recreating itself
| Layer | Technology |
|---|---|
| UI Framework | Flutter 3.x |
| State Management | Flutter Riverpod 3.x |
| Navigation | GoRouter 17.x |
| Local Database | Drift (SQLite, type-safe) |
| Authentication | local_auth 3.x (Fingerprint / Face ID) |
| Notifications | flutter_local_notifications 21.x |
| Animations | flutter_animate |
| Charts | fl_chart |
| Fonts | Google Fonts (Poppins) |
| Persistence | shared_preferences |
| Code Generation | Freezed + Drift Dev |
- Flutter SDK
>=3.x - Dart SDK
>=3.11.1 - Android Studio / Xcode (for device deployment)
-
Clone the repository
git clone https://github.com/EngFred/spendwise.git cd spendwise -
Install dependencies
flutter pub get
-
Run code generation (required for Drift & Freezed)
dart run build_runner build --delete-conflicting-outputs
-
Generate app icons
dart run flutter_launcher_icons
-
Run the app
flutter run
Ensure android/app/src/main/kotlin/.../MainActivity.kt extends FlutterFragmentActivity (required for biometric auth):
import io.flutter.embedding.android.FlutterFragmentActivity
class MainActivity : FlutterFragmentActivity()The following permissions are declared in AndroidManifest.xml:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.USE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>The following keys are required in ios/Runner/Info.plist:
<key>NSFaceIDUsageDescription</key>
<string>SpendWise uses Face ID to keep your financial data secure.</string>App Launch
│
▼
[/splash] ──────────────────────────────────────────────────────────┐
│ │
├─ Onboarding incomplete? ──► [/onboarding] ──► [/dashboard] │
│ │
├─ Biometric lock enabled? ──► [/lock] ──► [/dashboard] │
│ │
└─ All clear? ───────────────► [/dashboard] │
│
[/dashboard] [/transactions] [/accounts] │
[/budgets] [/goals] [/reports] ◄──────────────┘
▲
│ ShellRoute (bottom nav)
- Biometric authentication is handled by
local_authv3 using device-native APIs (Fingerprint, Face ID, device PIN fallback) - The session unlock state is held in memory only (
sessionUnlockedProvider) — never persisted to disk - The app automatically locks when backgrounded (
AppLifecycleObserver) and requires re-authentication on resume - All financial data is stored locally on device using SQLite via Drift — no cloud sync, no data leaves the device
Click to expand full dependency list
dependencies:
flutter_riverpod: ^3.3.1
go_router: ^17.1.0
drift: ^2.32.0
sqlite3_flutter_libs: ^0.6.0+eol
freezed_annotation: ^3.1.0
json_annotation: ^4.11.0
intl: ^0.20.2
uuid: ^4.5.3
flutter_local_notifications: ^21.0.0
permission_handler: ^12.0.1
local_auth: ^3.0.1
share_plus: ^12.0.1
path_provider: ^2.1.5
csv: ^7.2.0
shared_preferences: ^2.5.4
google_fonts: ^8.0.2
fl_chart: ^1.2.0
flutter_animate: ^4.5.2
lottie: ^3.3.2
flutter_svg: ^2.2.4
gap: ^3.0.1
timezone: ^0.11.0
dev_dependencies:
drift_dev: ^2.32.0
freezed: ^3.2.5
json_serializable: ^6.13.0
build_runner: ^2.12.2
flutter_launcher_icons: ^0.14.3Contributions are welcome! Please follow these steps:
- Fork the repository
- Create your feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
Please make sure your code follows the existing architecture patterns and passes flutter analyze with no warnings.
- CSV export
- Local data backup & restore
- Recurring transactions
- Multi-currency conversion
- Widget (home screen balance card)
- iCloud / Google Drive backup
- Debt tracker
This project is licensed under the MIT License — see the LICENSE file for details.
Built with ❤️ using Flutter
⭐ Star this repo if you found it useful!









