Home

Olympus · Flutter app · personal project

A fitness app that cites its numbers

Olympus is the Android app I use for training, food and health. It plans my lifting and running, logs workouts and meals, and reads my watch through Health Connect. A small coach runs on the phone. Health data stays encrypted on the device, and each figure on screen names the formula or dataset behind it.

  • Flutter
  • Dart
  • Riverpod
  • go_router
  • Drift + SQLite3MultipleCiphers
  • ML Kit pose detection
  • On-device LLM (llama.cpp)
  • Health Connect
  • English and Spanish
Statusv0.11Personal app, Android only, not on a store
Code434Dart files in 26 feature modules
Database66Drift tables on encrypted SQLite
Coach2BQwen3.5 on the phone, 18 app tools

Web demo. The app's screens, recreated for the browser with sample data. The app itself runs on Android.

Interactive demo

Guided tourPress Next to start, or use the app freely

How it's built

Architecture

Flutter, Material 3, Riverpod 3
State lives in Riverpod providers. The theme is seeded from deep Aegean blue (#2A5BA8), light and dark, and takes the wallpaper colours on Android 12 and later.
go_router
Five tabs (Today, Train, Eat, Coach, Profile) in a shell route, with deep links into sessions, races and foods from widgets and notifications.
Drift on encrypted SQLite
66 tables on SQLite3MultipleCiphers with FTS5 search. The app refuses to open the database if the cipher is missing, and backups are re-keyed with a passphrase.
Pure-Dart domain engines
Lifting plans, progressive overload, recovery, VDOT paces, race prediction, nutrition targets, caffeine and readiness are plain Dart with no Flutter imports, so they are unit tested on their own. This page runs JavaScript ports of them.
Local coach with a number guard
Qwen3.5 2B (Q4_K_M) through llama.cpp, downloaded once and checked by SHA-256. It reads data through 18 app tools, and the guard flags any number in a reply that no tool returned.
Platform channels
Kotlin behind method channels: Health Connect for sleep, heart rate, HRV and steps; a foreground service that keeps GPS runs going with the screen off; and safety texts by SMS on outdoor outings.

Principles

  • Offline first. The core features work in airplane mode. The network is used for sync, weather and dataset updates.
  • Numbers come with a source. Calories and macros come from bundled food datasets. The rest come from published formulas, cited on the screen that shows them. Where the app uses a rule of mine, it says so.
  • Health data stays encrypted on the device. It leaves the phone only when I switch that on.
  • Code makes the plans. Plans and adjustments come from deterministic code. The language model explains them and turns free text into data.

In the app only

Camera rep counter
ML Kit pose detection follows the joints on the camera feed and counts reps of a set.
Hands-free logging
Say "80 kilos, 8 reps" or "ochenta kilos, ocho repeticiones" after a set; a deterministic parser logs it, with no model involved.
GPS runs
Guided runs with spoken cues, interval paces adjusted for the heat, and the route recorded by a foreground service.
Barcode and label scanning
Scan a product's barcode, or read a nutrition label with on-device text recognition when the product is not in the catalogue.

About this page

The ported engines are tested against the values the Dart code gives (VDOT 49.8 from a 20-minute 5K, as in Daniels' tables). The exercise names, foods and nutrition values here are a short list written for this page, since the app's datasets are licensed. The coach is a scripted replay, and the number check on its replies is the app's own logic, ported.