Spendly is a premium, high-performance fintech application built with Flutter, designed to revolutionize how individuals and groups manage their finances. By combining personal expense tracking with powerful group settlement features, Spendly provides a seamless, real-time ecosystem for financial transparency.
Managing shared expensesβfrom roommates splitting utilities to friends on a vacationβoften leads to complexity and friction. Spendly solves this by providing a centralized, real-time platform where users can log expenses, categorize spending, and settle debts with a single tap.
Built with a Feature-First Architecture, Spendly ensures scalability and maintainability, leveraging the power of Firebase for backend services and Riverpod for robust state management.
- Real-Time Synchronization: Instant updates across all devices using Cloud Firestore.
- Group Dynamics: Create groups, invite friends, and split bills using various logic.
- Data-Driven Insights: Beautifully rendered charts to visualize spending habits.
- Premium UI/UX: Smooth animations and a modern design language powered by
flutter_animateandgoogle_fonts.
- Firebase Auth: Secure login via email/password.
- Social Integration: One-tap Google Sign-In support.
- Session Management: Persistent login states using
shared_preferences.
- Expense Tracking: Log individual expenses with categories and timestamps.
- Visual Analytics: Interactive pie and bar charts via
fl_chartto monitor monthly burn rates. - Activity Feed: A chronological history of all financial transactions.
- Shared Ledgers: Create groups for specific events or households.
- Smart Settlements: Algorithm-driven debt simplification with robust provider synchronization to ensure accurate "settle up" flows.
- Comments & Interaction: Discuss specific expenses within the app to clarify costs.
- Image Support: Attach receipts to expenses using
image_picker. - Theming: Dynamic theme support (Light/Dark mode) defined in the core configuration.
- Deep Linking: Advanced routing handled by
go_router. - Flexible Environments: Support for toggling between Demo Mode and Original Mode via app configuration.
| Category | Technology |
|---|---|
| Framework | Flutter (Dart) |
| State Management | Riverpod |
| Backend/DB | Firebase (Firestore, Auth) |
| Navigation | GoRouter |
| Charts | FL Chart |
| Animations | Flutter Animate |
| Local Storage | Shared Preferences |
Spendly follows a Feature-First / Layered Architecture, separating concerns to ensure the codebase remains clean as it grows.
lib/
βββ core/ # Global configurations, shared widgets, and services
β βββ config/ # App constants and environment setup
β βββ models/ # Shared data models
β βββ repositories/ # Abstract data access layers
β βββ router/ # GoRouter definitions
β βββ theme/ # UI styling and colors
β βββ widgets/ # Reusable UI components (Buttons, Inputs)
βββ features/ # Independent modules by business logic
β βββ auth/ # Login, Signup, Password recovery
β βββ dashboard/ # Main overview screen
β βββ expenses/ # Expense creation and listing
β βββ groups/ # Group management logic
β βββ analytics/ # Data visualization logic
βββ main.dart # Application entry point
- Flutter SDK:
>=3.3.0 - Dart SDK:
>=3.3.0 <4.0.0 - A Firebase Project (for backend services)
-
Clone the repository bash git clone https://github.com/Elarionitis/Spendly.git cd spendly
-
Install dependencies bash flutter pub get
-
Firebase Setup
- Create a project in the Firebase Console.
- Add Android/iOS apps to your Firebase project.
- Download
google-services.json(Android) andGoogleService-Info.plist(iOS). - Place them in
android/app/andios/Runner/respectively. - Alternatively, use the FlutterFire CLI to initialize the configuration: bash flutterfire configure
-
Run the application bash flutter run
Spendly uses Riverpod for reactive state. Here is how the expense and settlement states are typically accessed and synchronized:
dart // Accessing the expense provider final expenseList = ref.watch(expenseProvider);
// Monitoring settlement synchronization final settlementState = ref.watch(settlementProvider);
expenseList.when( data: (expenses) => ListView.builder( itemCount: expenses.length, itemBuilder: (context, index) => ExpenseTile(expenses[index]), ), loading: () => CircularProgressIndicator(), error: (err, stack) => Text('Error: $err'), );
Routing is centralized in lib/core/router/:
dart context.pushNamed(AppRoute.expenseDetails.name, pathParameters: {'id': '123'});
The application environment can be toggled in lib/core/config/app_config.dart. This allows developers to switch between a demo environment and the original production-ready mode.
Ensure code quality by running the test suite. Tests are maintained to align with the latest UI and logic changes: bash flutter test
This project adheres to flutter_lints. To check for linting issues:
bash
flutter analyze
When updating platform-specific settings, ensure that the build scripts (e.g., android/app/build.gradle.kts) are correctly configured for the target environment and dependencies.
- Update the version in
pubspec.yaml. - Run the build command:
flutter build apk --release
- Open
ios/Runner.xcworkspacein Xcode. - Ensure a valid Provisioning Profile is set.
- Run:
flutter build ios --release
- OCR Receipt Scanning: Automatically extract data from receipts using ML Kit.
- Multi-Currency Support: Real-time currency conversion for international trips.
- Export Reports: Generate PDF/CSV monthly financial statements.
- Budgeting Mode: Set monthly limits for specific categories.
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are what make the open-source community such an amazing place to learn, inspire, and create.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Project Maintainer: Elarionitis
Project Link: https://github.com/Elarionitis/Spendly