Totals is a Flutter mobile application that automatically tracks your bank transactions by parsing SMS messages from Ethiopian banks. It provides real-time balance updates, transaction history, analytics, and comprehensive financial insights all stored securely on your device.
|
|
|
|
|
- Commercial Bank of Ethiopia (CBE)
- Awash Bank
- Bank of Abyssinia (BOA)
- Dashen Bank
- Telebirr
- more coming soon....
- Automatic SMS Parsing: Monitors incoming SMS messages from banks and automatically extracts transaction details
- Real-Time Balance Updates: Account balances are updated automatically when transactions are detected
- Transaction History: Complete history of all transactions with filtering and search capabilities
- Account Management: Add and manage multiple bank accounts
- Analytics Dashboard: Visual charts and insights including:
- Income vs Expense tracking
- Net worth over time
- Spending patterns by period (Day, Week, Month, Year)
- Transaction statistics by bank and account
- Biometric Security: Protect your financial data with fingerprint or face authentication
- Dark/Light Theme: Beautiful Material Design 3 interface with theme support
- Local Web Server: Built-in HTTP server to access your data from a web browser on the same network
- 100% Local Storage: All data is stored locally on your device using sqflite
- No Cloud Sync: Your financial data never leaves your device
- Biometric Authentication: Secure access with fingerprint or face recognition
- Offline-First: Works completely offline after initial setup
- Flutter SDK (>=3.2.6)
- Dart SDK
- Android Studio / Xcode (for mobile development)
- Android device/emulator or iOS device/simulator
-
Clone the repository
git clone <repository-url> cd totals/app
-
Install dependencies
flutter pub get
-
Run the app
flutter run
-
Grant SMS Permissions: The app will request permission to read SMS messages. This is required to monitor bank transaction notifications.
-
Add Your First Account:
- Tap the "Add Account" button on the home screen
- Enter your account details:
- Account number
- Bank selection
- Account holder name
- The app will start tracking transactions for this account automatically
-
Initial Internet Connection: On first launch, the app may need internet access to download SMS parsing patterns. After this, it works completely offline.
- Navigate to the home screen
- Tap "Add Account" (or the + button if accounts already exist)
- Fill in the account details form
- Submit to save the account
- Home Tab: View all accounts and their balances
- Bank Tabs: Filter transactions by specific bank
- Analytics Tab: View charts and statistics
- Transactions List: Scroll through all transactions with filtering options
The Analytics page provides:
- Time Period Selection: Day, Week, Month, Year views
- Chart Types: Profit & Loss calendar, line charts, and more
- Filtering: Filter by bank, account, or transaction type
- Income/Expense Breakdown: Visual representation of your spending patterns
- Navigate to the "Web" tab in the app
- Start the local server
- Access the web interface from any device on the same network using the displayed IP address
- The web interface provides a full-featured dashboard for viewing your financial data
- Lock App: Tap the lock icon in the app bar to lock the app
- Biometric Authentication: Enable biometric authentication in settings for automatic locking
- Auto-Lock: The app locks automatically when minimized
lib/
├── auth-service.dart # Authentication service
├── main.dart # App entry point
├── components/ # Reusable UI components
├── data/
│ └── consts.dart # Bank definitions and constants
├── database/
│ ├── database_helper.dart # sqflite database setup
│ └── migration_helper.dart # Database migrations
├── local_server/ # HTTP server for web access
│ ├── handlers/ # API route handlers
│ ├── server_service.dart # Main server implementation
│ └── network_utils.dart # Network utilities
├── models/ # Data models
│ ├── account.dart
│ ├── transaction.dart
│ ├── sms_pattern.dart
│ └── summary_models.dart
├── providers/ # State management (Provider)
│ ├── transaction_provider.dart
│ └── theme_provider.dart
├── repositories/ # Data access layer
│ ├── account_repository.dart
│ └── transaction_repository.dart
├── screens/ # Main app screens
│ ├── home_page.dart
│ ├── analytics_page.dart
│ ├── web_page.dart
│ └── settings_page.dart
├── services/ # Business logic services
│ ├── sms_service.dart # SMS monitoring and parsing
│ └── sms_config_service.dart
├── sms_handler/ # SMS processing logic
├── utils/ # Utility functions
└── widgets/ # UI widgets
- Monitors incoming SMS messages in foreground and background
- Identifies bank messages using sender address patterns
- Parses transaction details using regex patterns
- Updates account balances automatically
- Stores transactions in local database
- Built with Shelf framework
- Serves REST API endpoints for web frontend
- Provides endpoints for:
- Accounts (
/api/accounts) - Transactions (
/api/transactions) - Banks (
/api/banks) - Summary (
/api/summary) - Analytics (
/api/analytics/*)
- Accounts (
- sqfite database for local storage
- Tables: accounts, transactions, failed_parses
- Automatic migrations for schema updates
The app includes a local HTTP server that exposes REST API endpoints. See:
lib/local_server/ENDPOINT_GUIDE.md- Guide for creating new endpointsAPI_IMPLEMENTATION_PLAN.md- Complete API specification
GET /api/accounts- List all accountsGET /api/transactions- List transactions with filteringGET /api/summary- Get aggregated summaryGET /api/banks- List supported banks
flutter testAndroid:
flutter build apk --releaseiOS:
flutter build ios --releaseThe app includes debug tools accessible from the home screen:
- SMS Debug Dialog: View recent SMS messages
- Transactions Debug Dialog: View all stored transactions
- Failed Parse Dialog: View SMS messages that couldn't be parsed
Key dependencies include:
provider- State managementsqflite- Local sqfite databaseanother_telephony- SMS monitoringshelf- HTTP server frameworklocal_auth- Biometric authenticationfl_chart- Chart visualizationshared_preferences- Local settings storage
See pubspec.yaml for the complete list.
- Ensure SMS permissions are granted
- Check that the sender address matches bank codes in
lib/data/consts.dart - View failed parses in the debug dialog to see what's happening
- Verify the account number matches the one in SMS messages
- Check that SMS parsing patterns are correct for your bank
- Some banks may require different account matching logic
- Ensure your device and computer are on the same network
- Check firewall settings
- Verify the IP address displayed in the Web tab
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
For issues, questions, or feature requests, please open an issue on the repository.
Note: This app requires SMS reading permissions to function. All data is stored locally and never transmitted to external servers. The app is designed specifically for Ethiopian banks and their SMS notification formats.




