A Flutter app for tracking daily water intake. Backed by Firebase, with real-time sync, push reminders, server-driven UI and a full Codemagic CI/CD pipeline for Android and iOS
app-demo.mp4
- Sign in with email/password, Google, Apple or Facebook (Facebook is dev-only)
- Real-time hydration log on Firestore, with hydration coefficients per drink type (water, tea, coffee, milk)
- Daily goal: either calculated from weight or set manually
- Push reminders via FCM with quiet hours and topic subscription
- Local scheduled reminders, timezone-aware
- Remote Config for switching the progress indicator style (circular / linear) and showing an emergency banner without shipping a new build
- Shareable "today" link that opens straight into the app (App Links via Firebase Hosting, dev-only)
- Profile + avatar upload to Firebase Storage
- Account deletion flow with reauthentication
- EN / UK localisation
- Light / dark theme
- Firebase Analytics screen tracking and Crashlytics non-fatal reporting
- Offline banner when the device loses connectivity
- Flutter (stable) and Dart 3.8
- State management:
flutter_bloc - DI:
RepositoryProviderfor the stateful stuff (repositories, services),get_itfor the stateless platform utilities - Routing:
go_routerwith an Analytics observer - Networking:
diowith a refresh-token interceptor - Firebase: Auth, Firestore, Storage, Messaging, Remote Config, Analytics, Crashlytics, App Check
- Notifications:
firebase_messaging,flutter_local_notifications,flutter_timezone - Localisation:
easy_localization - CI/CD: Codemagic
.
βββ android/ Android platform code, Gradle config
βββ ios/ iOS platform code, CocoaPods
βββ assets/ Fonts, images, SVGs, i18n JSON, runtime config
βββ docs/ Internal notes (flavors etc.)
βββ lib/
β βββ common/ App-wide widgets, services, utils, DI, router
β βββ data/repositories/ Firestore / Storage / Messaging repositories
β βββ features/ Feature-first modules (cubit + screens + widgets)
β β βββ account/
β β βββ auth/
β β βββ home/
β β βββ history/
β β βββ statistics/
β β βββ preferences/
β β βββ profile/
β β βββ notifications/
β β βββ locale/
β β βββ theme/
β β βββ ...
β βββ firebase/ Firebase services and models
β βββ network/ Dio client, interceptors, WebSocket
β βββ main.dart Entry point - DI, Firebase init, EasyLocalization
βββ scripts/ Codegen, l10n, Firebase Hosting helpers
βββ codemagic.yaml CI/CD pipelines (dev + prod)
βββ pubspec.yaml
- Flutter SDK 3.41.x (or compatible)
- Dart SDK ^3.8.0
- Android Studio / Xcode for native builds
- A Firebase project (Auth, Firestore, FCM, Storage, Remote Config, Crashlytics, App Check)
flutter pub getThese are gitignored, you bring your own:
android/app/src/dev/google-services.json
android/app/src/prod/google-services.json
ios/config/dev/GoogleService-Info.plist
ios/config/prod/GoogleService-Info.plist
Two files under assets/ (also gitignored):
assets/config_development.jsonassets/config_production.json
Example:
{
"appName": "Daily Water Tracker",
"apiBaseUrl": "https://your-api-url.com",
"googleServerClientId": "YOUR_CLIENT_ID.apps.googleusercontent.com"
}The project has dev and prod flavors
flutter run --flavor dev
flutter run --flavor prodFor web (single artifact, flavor goes through dart-define):
flutter run --dart-define FLAVOR=dev
flutter run --dart-define FLAVOR=prodsh ./scripts/generate.shsh ./scripts/generate_l10n.shflutter pub run flutter_launcher_icons -f flutter_launcher_icons-dev.yaml
flutter pub run flutter_launcher_icons -f flutter_launcher_icons-prod.yamlsh ./scripts/firebase_hosting_deploy.shPipelines live in codemagic.yaml and are split in two:
- Development workflow - runs on every push to
master. Builds Android and iOS indevflavor with--build-name=0.0.<BUILD_NUMBER>, then ships the artifacts to the Firebase App Distributioninternal-testersgroup - Production workflow - runs on a Git tag (
v*.*.*). Takes the version from the tag, builds release Android/iOS inprodflavor, ships to Firebase App Distribution and TestFlight
Both workflows read release notes from a single release_notes.json
Licensed under the BSD-3-Clause License - see LICENSE.txt for details
Created by Mykola Shchypailo
Extrawest.com, 2026