| Dashboard | Trends | Journal |
|---|---|---|
![]() |
![]() |
![]() |
| Medications | Settings |
|---|---|
![]() |
![]() |
| Feature | Description |
|---|---|
| Weight Logging | Track weight with kg units, averages & trend charts |
| Blood Pressure | Split systolic/diastolic input, status badges (Normal/Elevated/High) |
| Heart Rate | BPM logging with min/max/avg analytics and status indicators |
| Mood Logging | Emoji-based mood picker with optional notes |
| Medication Management | Mark as taken, add new prescriptions, daily/weekly/custom frequency |
| Feature | Description |
|---|---|
| Streak Counter | Tracks consecutive logging days to encourage consistency |
| Trend Alerts | Dismissable warnings for elevated BP or high heart rate |
| Refill Countdown | Tracks remaining pills and days until refill needed |
| Doctor Visit Log | Schedule and track appointments with notes |
| Clinical Reports | Monthly health summary + PDF export with share intent |
- Week / Month / Year segmented filtering with real-time recalculation
- Date Picker — filter data from a specific date onward
- Weight trend chart — bar visualization via
fl_chartwith delta tracking - BP & HR analytics — average values with color-coded status badges
- Dynamic Health Insights — pattern detection (morning vs evening BP, weight direction, HR trends)
- Daily health timeline — chronological, color-coded entries
- Free-form health notes — via floating action button
- All log types displayed — weight, BP, HR, mood, medication, appointments
- Onboarding flow — first-launch setup for name, goals, and preferences
- Dark Mode — warm espresso/charcoal palette that complements the light theme
- Health Goals — target weight, BP, daily steps, water intake
- Notification Preferences — medication reminders, vitals logging, weekly summaries
- Cloud Backup/Restore — sync health logs to/from Supabase PostgreSQL
- Google Sheets Export — export logs directly to a personal spreadsheet
| Layer | Technology |
|---|---|
| Language | Dart 3.x |
| UI | Flutter (Material 3) |
| State | Provider |
| Local DB | Floor (SQLite) — v3 schema with isSynced flags |
| Cloud | Supabase (Auth, Postgrest, Storage) |
| Export | Google Sheets API via googleapis |
| Async | Dart Streams & async/await |
pdf + printing packages |
|
| Charts | fl_chart |
| Notifs | flutter_local_notifications + timezone |
The app is built with Clean Architecture, separating concerns across three distinct layers for testability and long-term maintainability:
- Presentation Layer: Flutter screens consuming
ChangeNotifierProviders for state. Widgets are split into reusable components underpresentation/widgets/. - Domain Layer: Business logic and processing services (PDF generation, health insight engine) fully decoupled from UI and data sources.
- Data Layer:
HealthRepositorymediates between the Local DB (Floor SQLite for offline-first) and Remote (Supabase for cloud sync & auth).
lib/
├── core/ # App-wide theme, constants, notification service
├── data/
│ ├── daos/ # Floor DAOs (HealthLogDao, MedicationDao, etc.)
│ ├── database/ # VitalDatabase + migration definitions
│ └── entities/ # Floor entities (HealthLogEntity, MedicationEntity)
├── domain/
│ ├── models/ # Pure Dart domain models
│ ├── repositories/ # HealthRepository (local + cloud sync)
│ └── services/ # PDF service, health insight engine
├── presentation/
│ ├── providers/ # HealthDataProvider, MedicationProvider, SettingsProvider
│ ├── screens/ # Dashboard, Trends, Journal, Medications, Settings, etc.
│ └── widgets/ # MetricCard, TrendsChart, MoodSelector, SectionHeader
└── main.dart # Entry point with routing
- Flutter SDK 3.x & Dart ^3.11.0
- Android Studio / VS Code with Flutter extension
- A Supabase project
- Create a Supabase project
- Enable Email Auth in Authentication settings
- Create a
health_logstable:CREATE TABLE health_logs ( id TEXT PRIMARY KEY, logType TEXT NOT NULL, value TEXT NOT NULL, unit TEXT NOT NULL, notes TEXT, timestamp BIGINT NOT NULL, isSynced BOOLEAN DEFAULT TRUE );
- Create an
avatarsstorage bucket (public)
- Open your Supabase config file in
lib/ - Replace
supabaseUrlandsupabaseKeywith your project credentials
Never commit production secrets to public repositories.
flutter pub get
flutter runOr click Run in Android Studio / VS Code.
To regenerate Floor database code after schema changes:
dart run build_runner build --delete-conflicting-outputs- Light Mode: Clean white/grey surfaces with teal accents and Material 3 components
- Dark Mode: Warm espresso charcoal with off-white text — no jarring blues
- Typography: Material 3 type scale with custom heading weights
- Charts: Smooth
fl_chartbar & line graphs with animated transitions
When repeatedly signing up during testing, you may hit Supabase's Email Rate Limit. To work around this:
- Go to Supabase Dashboard → Auth → Rate Limits and increase temporarily
- Or log in with pre-created accounts from the Supabase Dashboard
This project is licensed under the GNU General Public License v3.0 — see the LICENSE file for details.




