Personal budget management application built with Flutter 3.19+, supporting both iOS and Android.
π‘ Note: This repository contains the Flutter mobile client for ZenBudget. The application is powered by a robust .NET API built with Clean Architecture. If you are looking for the backend source code, please visit the ZenBudget Backend Repository.
- About
- Tech Stack
- Getting Started
- Project Structure
- Environment Variables
- Features
- Testing
- Build & Distribution
ZenBudget is a personal finance application that helps users track their income and expenses, analyze their spending habits, and reach their savings goals.
Supported Platforms:
- π iOS 12+
- π€ Android 8.0+ (API 26+)
Highlights:
- OCR-powered receipt/invoice scanning via camera (Google ML Kit)
- Voice command support (Speech-to-Text)
- Biometric authentication (Face ID / Touch ID / Fingerprint)
- Interactive charts and spending analytics
- Offline support (Hive local database)
- Push notifications (FCM)
- PDF report generation and sharing
- 10 language support (TR, EN, DE, ES, FR, PT, IT, JA, KO, AR)
| Category | Package | Version |
|---|---|---|
| Framework | Flutter SDK | 3.19+ |
| Language | Dart | 3.3+ |
| State Management | Riverpod | 2.5.0 |
| Networking | Dio + Retrofit | 5.4.0 / 4.1.0 |
| Local Storage | Hive | 2.2.3 |
| Secure Storage | flutter_secure_storage | 9.0.0 |
| Charts | fl_chart | 0.66.0 |
| OCR | google_mlkit_text_recognition | 0.11.0 |
| Voice Recognition | speech_to_text | 6.6.0 |
| Authentication | firebase_auth | 4.16.0 |
| Biometrics | local_auth | 2.1.0 |
| Notifications | firebase_messaging | 14.7.0 |
| Calendar | table_calendar | 3.0.0 |
| pdf + printing | 3.10.0 / 5.11.0 | |
| Error Tracking | sentry_flutter | 7.14.0 |
| Analytics | firebase_analytics | 10.8.0 |
- Flutter SDK 3.19+ (Stable channel)
- Dart 3.3+
- Android Studio (for Android development)
- Xcode 15+ (for iOS development β macOS only)
- Firebase CLI
# 1. Clone the repository
git clone https://github.com/your-username/zenbudget-mobile.git
cd zenbudget-mobile
# 2. Check Flutter version
flutter --version
# 3. Install dependencies
flutter pub get
# 4. Run code generation (Retrofit, JSON serialization, Riverpod)
dart run build_runner build --delete-conflicting-outputs
# 5. Add Firebase configuration files
# google-services.json β android/app/
# GoogleService-Info.plist β ios/Runner/
# 6. Run the app
flutter runflutter doctorMake sure all items show β before proceeding.
lib/
βββ main.dart
βββ core/
β βββ constants/ # Constants, colors, theme
β βββ errors/ # Error classes
β βββ network/ # Dio client, interceptors
β βββ router/ # GoRouter navigation
β βββ utils/ # Helper functions
βββ features/
β βββ auth/ # Authentication (login, register, biometric)
β βββ dashboard/ # Home screen, summary cards
β βββ transactions/ # Income/expense CRUD
β βββ categories/ # Category management
β βββ budgets/ # Budget plans
β βββ reports/ # Charts, PDF reports
β βββ ocr/ # Receipt scanning (ML Kit)
β βββ voice/ # Voice commands
β βββ ai_insights/ # Gemini AI recommendations
β βββ notifications/ # FCM + local notifications
β βββ settings/ # Profile, language, theme settings
βββ l10n/
β βββ *.arb # Localization files for 10 languages
βββ shared/
βββ widgets/ # Shared widgets
βββ models/ # Shared data models
βββ providers/ # Global Riverpod providers
assets/
βββ images/
βββ icons/
βββ animations/ # Lottie JSON files
βββ fonts/
test/
βββ unit/
βββ widget/
βββ integration/
The project uses different configurations per environment. Create an env.dart file under lib/core/constants/:
// lib/core/constants/env.dart
class Env {
static const String apiBaseUrl = String.fromEnvironment(
'API_BASE_URL',
defaultValue: 'https://localhost:7001/api/v1',
);
static const String geminiApiKey = String.fromEnvironment('GEMINI_API_KEY');
static const String sentryDsn = String.fromEnvironment('SENTRY_DSN');
}To run with environment variables:
# Development
flutter run --dart-define=API_BASE_URL=https://localhost:7001/api/v1
# Production
flutter run --dart-define=API_BASE_URL=https://api.zenbudget.app/api/v1 \
--dart-define=SENTRY_DSN=https://your-sentry-dsnFirebase configuration:
android/app/google-services.jsonβ Download from Firebase Consoleios/Runner/GoogleService-Info.plistβ Download from Firebase Console
Automatically extracts the amount, date, and category from receipts and invoices by taking a photo with the camera or selecting from the gallery. Powered by Google ML Kit Text Recognition.
Processes natural language commands such as "Add a grocery expense of 150 for today" and automatically creates the transaction.
- Monthly income/expense comparison (line chart)
- Category-based spending breakdown (pie chart)
- Budget goal progress bars
- Calendar-view spending heatmap
Personalized savings recommendations and spending anomaly detection powered by the Google Gemini API.
- Firebase Authentication (Email, Google, Apple, Phone)
- Biometric lock (Face ID / Touch ID / Fingerprint)
- Encrypted local storage (flutter_secure_storage)
# Run unit tests
flutter test test/unit/
# Run widget tests
flutter test test/widget/
# Run integration tests (requires connected device)
flutter test integration_test/
# With coverage report
flutter test --coverage
genhtml coverage/lcov.info -o coverage/htmlTesting Tools: flutter_test Β· mockito Β· integration_test
# Debug APK
flutter build apk --debug
# Release APK
flutter build apk --release --dart-define=API_BASE_URL=https://api.zenbudget.app/api/v1
# AAB for Play Store
flutter build appbundle --release# Debug
flutter build ios --debug
# Release (requires Archive via Xcode)
flutter build ios --releasefirebase appdistribution:distribute build/app/outputs/flutter-apk/app-release.apk \
--app YOUR_FIREBASE_APP_ID \
--groups "beta-testers"CI/CD pipelines are defined in .github/workflows/:
ci.ymlβ Lint, test, build checksdeploy-android.ymlβ Automated upload to Play Storedeploy-ios.ymlβ Automated upload to TestFlight
Run after any model changes for Retrofit clients and JSON serialization:
dart run build_runner build --delete-conflicting-outputs
# Watch mode during development
dart run build_runner watch --delete-conflicting-outputsSupported languages: TR Β· EN Β· FR Β· ES Β· AR Β· RU Β· PT Β· IT Β· DE
To add new translations:
# Edit the ARB files
lib/l10n/app_tr.arb
lib/l10n/app_en.arb
# ...
# Generate localization code
flutter gen-l10nThis project is licensed under the MIT License.
β If you like this project, don't forget to give it a star!
ZenBudget Mobile β Financial peace, in your pocket π