* Move debug logs button from Home to Settings page, remove refresh/logout from Home AppBar - Remove Debug Logs, Refresh, and Sign Out buttons from DashboardScreen AppBar - Add Debug Logs ListTile entry in SettingsScreen under app info section - Remove unused _handleLogout method from DashboardScreen - Remove unused log_viewer_screen.dart import from DashboardScreen https://claude.ai/code/session_017XQZdaEwUuRS75tJMcHzB9 * Fix home page double AppBar inconsistency with settings/more pages The DashboardScreen had its own AppBar with a sync success icon, while MainNavigationScreen already provides a shared AppBar (logo + settings) for all tabs. This caused the home page to render a double top bar, inconsistent with the settings and more screens which have no extra AppBar. Remove the dashboard's AppBar and move the sync indicator into the body as an inline banner. https://claude.ai/code/session_0155XXsvt5zKLBpasmdkhPiF * Fix sync success cloud icon not appearing after sync The cloud icon only showed when pending transaction count decreased (local→server uploads). For normal pull-to-refresh syncs that download from server, pendingCount stays at 0 so the icon never triggered. Fix by also detecting when TransactionsProvider.isLoading transitions from true to false (any sync completion), and by triggering the icon directly after successful manual sync instead of showing a redundant snackbar. https://claude.ai/code/session_0155XXsvt5zKLBpasmdkhPiF * Address PR review: fix Timer leak, sync error check, false triggers 1. Timer leak (CodeRabbit): Replace Future.delayed with a cancellable Timer field (_syncSuccessTimer). Cancel existing timer before starting a new one, and clean up in dispose(). 2. Sync error not checked (CodeRabbit): _performManualSync now checks transactionsProvider.error after syncTransactions() returns. Shows error SnackBar on failure instead of false success indicator. 3. False positive triggers (Codex): Remove isLoading transition detection from _onTransactionsChanged since isLoading also toggles for fetchTransactions (non-sync paths). Keep only pendingDecreased for background sync detection; manual sync uses direct call path. https://claude.ai/code/session_0155XXsvt5zKLBpasmdkhPiF * Update mobile/lib/screens/dashboard_screen.dart Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Lazy Bone <89256478+dwvwdv@users.noreply.github.com> --------- Signed-off-by: Lazy Bone <89256478+dwvwdv@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Sure Mobile
A Flutter mobile application for Sure personal finance management system. This is the mobile client that connects to the Sure backend server.
About
This app is a mobile companion to the Sure personal finance management system. It provides basic functionality to:
- Login - Authenticate with your Sure Finances server
- View Balance - See all your accounts and their balances
For more detailed technical documentation, see docs/TECHNICAL_GUIDE.md.
Features
- 🔐 Secure authentication with OAuth 2.0
- 📱 Cross-platform support (Android & iOS)
- 💰 View all linked accounts
- 🎨 Material Design 3 with light/dark theme support
- 🔄 Token refresh for persistent sessions
- 🔒 Two-factor authentication (MFA) support
Requirements
- Flutter SDK >= 3.0.0
- Dart SDK >= 3.0.0
- Android SDK (for Android builds)
- Xcode (for iOS builds)
Getting Started
1. Install Flutter
Follow the official Flutter installation guide: https://docs.flutter.dev/get-started/install
2. Install Dependencies
flutter pub get
# For iOS development, also install CocoaPods dependencies
cd ios
pod install
cd ..
3. Generate App Icons
flutter pub run flutter_launcher_icons
This step generates the app icons for all platforms based on the source icon in assets/icon/app_icon.png. This is required before building the app locally.
4. Configure API Endpoint
Edit lib/services/api_config.dart to point to your Sure Finances server:
// For local development with Android emulator
static String _baseUrl = 'http://10.0.2.2:3000';
// For local development with iOS simulator
static String _baseUrl = 'http://localhost:3000';
// For production
static String _baseUrl = 'https://your-sure-server.com';
5. Run the App
# For Android
flutter run -d android
# For iOS
flutter run -d <simulator-device-UDID>
# or
flutter run -d "iPhone 17 Pro"
# For web (development only)
flutter run -d chrome
Project Structure
.
├── lib/
│ ├── main.dart # App entry point
│ ├── models/ # Data models
│ │ ├── account.dart
│ │ ├── auth_tokens.dart
│ │ └── user.dart
│ ├── providers/ # State management
│ │ ├── auth_provider.dart
│ │ └── accounts_provider.dart
│ ├── screens/ # UI screens
│ │ ├── login_screen.dart
│ │ └── dashboard_screen.dart
│ ├── services/ # API services
│ │ ├── api_config.dart
│ │ ├── auth_service.dart
│ │ ├── accounts_service.dart
│ │ └── device_service.dart
│ └── widgets/ # Reusable widgets
│ └── account_card.dart
├── android/ # Android configuration
├── ios/ # iOS configuration
├── pubspec.yaml # Dependencies
└── README.md
API Integration
This app integrates with the Sure Finances Rails API:
Authentication
POST /api/v1/auth/login- User authenticationPOST /api/v1/auth/signup- User registrationPOST /api/v1/auth/refresh- Token refresh
Accounts
GET /api/v1/accounts- Fetch user accounts
Transactions
GET /api/v1/transactions- Get all transactions (optionally filter byaccount_idquery parameter)POST /api/v1/transactions- Create a new transactionPUT /api/v1/transactions/:id- Update an existing transactionDELETE /api/v1/transactions/:id- Delete a transaction
Transaction POST Request Format
{
"transaction": {
"account_id": "2980ffb0-f595-4572-be0e-7b9b9c53949b", // required
"name": "test", // required
"date": "2025-07-15", // required
"amount": 100, // optional, defaults to 0
"currency": "AUD", // optional, defaults to your profile currency
"nature": "expense" // optional, defaults to "expense", other option is "income"
}
}
CI/CD
The app includes automated CI/CD via GitHub Actions (.github/workflows/flutter-build.yml):
- Triggers: On push/PR to
mainbranch when Flutter files change - Android Build: Generates release APK and AAB artifacts
- iOS Build: Generates iOS release build (unsigned)
- Quality Checks: Code analysis and tests run before building
- TestFlight:
mobile-release(mobile tags) triggers.github/workflows/ios-testflight.ymlfor signed App Store Connect uploads as part of one release flow
See mobile/docs/iOS_TESTFLIGHT.md for required secrets and setup.
Downloading Build Artifacts
After a successful CI run, download artifacts from the GitHub Actions workflow:
app-release-apk- Android APK fileapp-release-aab- Android App Bundle (for Play Store)ios-build-unsigned- iOS app bundle (unsigned, see iOS build guide for signing)
Building for Release
Android
flutter build apk --release
# or for App Bundle
flutter build appbundle --release
iOS
# Ensure CocoaPods dependencies are installed first
cd ios && pod install && cd ..
# Build iOS release
flutter build ios --release
For detailed iOS build instructions, troubleshooting, and CI/CD setup, see docs/iOS_BUILD.md.
Future Expansion
This app provides a foundation for additional features:
- Transaction history
- Account sync
- Budget management
- Investment tracking
- AI chat assistant
- Push notifications
- Biometric authentication
License
This project is distributed under the AGPLv3 license.