Skip to content
github-actions[bot] edited this page Nov 9, 2026 · 2 revisions

OpenVitals logo

Liberapay receiving Liberapay patrons

Privacy-first Health Connect dashboard, activity tracker, and manual entry app for Android.

OpenVitals reads from Health Connect and gives you one place to review the data already there, add your own records, record activities, import existing data, and work with recovery and readiness metrics locally.

The dashboard is read-only by default. Writes to Health Connect happen only through actions you start or enable, such as saving, recording, importing or syncing data.

No OpenVitals account is required, and the app has no INTERNET permission. OpenVitals is open source under AGPL-3.0-or-later.

Install

Channel Link
Google Play Install or join testing
F-Droid Install from F-Droid
GitHub releases Download signed release and debug APKs
Source Build it yourself

What you can do with OpenVitals

  • Review most metrics by day, week, month or year, with charts, history, source information and period statistics. Charts also expose summaries and navigation to screen readers.
  • Log by hand: drinks and hydration, food and nutrition, activities of every Health Connect exercise type, mindfulness, cycle records, a body analysis scale's whole weigh-in (weight, body fat, lean mass, body water, bone mass and BMR) in one form, height, blood pressure with the pulse the monitor shows, SpO2, respiratory rate, body temperature, HRV, blood glucose, VO2 max, and every kind of medical record Health Connect holds. Records with a matching Health Connect type are written there; some cycle-journal data stays local because Health Connect has no record type for it.
  • Record activities with GPS, offline maps and Bluetooth sensors. Routes and workouts can also be imported, and guided workout plans can be run from the phone.
  • Read recovery views derived on the phone: Daily Readiness, Body Energy and Training Readiness, together with HRV status, physiological stress, adaptive goals and explanation screens based on the data available.
  • Bring in Apple Health exports, CSV files of measurements, blood pressure readings, meals or the app's own workout exports, a cycle history exported by drip, route and workout files, and medical records as FHIR files, alone or in a zip, the older DSTU2 format included.
  • Generate PDF health reports fully on-device, with charts, statistics and sections for supported health data.
  • Track your cycle with a local day journal, estimates that count from a recorded LH test, temperature rise or mucus peak, reminders, pill tracking, a declared hormonal method, backup and a home-screen widget alongside the records kept in Health Connect. The night skin temperature and the overnight pulse, HRV and breathing a watch or ring records are drawn by cycle day, with the studies behind them, as information only.
  • Put widgets on the home screen for readiness, Body Energy, vitals, selected metrics and quick beverage logging.
  • Choose metric or imperial units, and pick the app language from fourteen translations or follow the system.

For the detailed feature inventory, see the feature guide.

Screenshots

OpenVitals dashboard OpenVitals onboarding OpenVitals settings Daily Readiness detail Body Energy detail Activity detail Activity recording Beverage entry

Devices and integrations

Watch and scale support (Garmin and Wear OS watches, the Xiaomi S400 scale) lives in the separate OpenWatch app, which writes what those devices record to Health Connect for OpenVitals to read.

Bluetooth sensors

Activity recording can use Bluetooth LE sensors for heart rate, cycling power, speed and cadence. Wheel-sensor distance can be used on rides without GPS.

A connected heart-rate sensor can also be used during strength training and for the heart-rate recovery test.

CoMaps

While CoMaps is navigating, OpenVitals can show its turn guidance on the offline activity map during a recording, and optionally save the guidance with the activity on-device.

Sync with another phone

OpenVitals can copy selected Health Connect records between two nearby phones over Bluetooth. If the cycle category is selected, its local journal, excluded cycles and declared cycle context are carried with it too.

Both phones show the same six-digit code before anything is transferred. The records are then encrypted for that sync session.

You choose the time range and data categories to copy. Medical records are an exception: when selected, they sync in full regardless of the chosen range.

Re-running a sync does not create duplicate records. An Overwrite existing records option writes the other phone's records again under OpenVitals, for records Health Connect lists but leaves out of its totals, as after a backup restore or a phone transfer.

Current coverage

OpenVitals currently has screens or data handling for:

  • Activity and workouts
  • Sleep and recovery
  • Heart and vitals
  • Body measurements
  • Nutrition, hydration and caffeine
  • Mindfulness
  • Cycle tracking
  • Goals
  • Achievements
  • Medical records
What is covered in each area
  • Activity and workouts: steps, distance, active and total calories, floors, elevation, wheelchair pushes, exercise sessions, routes, cardio load, speed, power and cadence where available.
  • Sleep and recovery: sleep sessions and stages, sleep score, sleep efficiency, OpenVitals-derived Daily Readiness, Body Energy and Training Readiness, HRV status, intensity minutes and physiological stress.
  • Heart and vitals: heart rate, resting heart rate, HRV, blood pressure, SpO2, respiratory rate, body temperature, skin temperature as a variation from the device's baseline, blood glucose and VO2 max. Some of these are view-only in the manual-entry UI.
  • Body: weight, height, BMI, body fat, lean body mass, BMR, bone mass, body water and Fat-Free Mass Index (FFMI) where the required measurements are available.
  • Nutrition, hydration and caffeine: drinks, hydration, meals, calories, macros, caffeine and the additional Health Connect nutrients present in the data.
  • Mindfulness: session history, totals, goals and timer/manual logging where the installed Health Connect provider supports mindfulness records.
  • Cycle tracking: periods and flow, ovulation tests, cervical mucus, basal body temperature, intermenstrual bleeding and sexual activity. The local journal also keeps data that Health Connect has no record type for, such as pain, mood, energy, desire, the cervix, symptoms and notes.
  • Goals: configurable daily goals for supported activity metrics, workout minutes, hydration, sleep, nutrition and mindfulness.
  • Achievements: badges and progress for daily steps, lifetime distance, floors and other supported achievement categories.
  • Medical records (beta): the Health Connect medical-record categories available on Android 14 and newer with a recent Health Connect module. Records can be imported, typed in by hand and exported. They are shown as stored; OpenVitals does not interpret their clinical meaning. The area is still in development, so review what you import.

A fuller breakdown of what can be viewed, entered, edited, imported or exported is in the feature guide.

Privacy

  • No account and no OpenVitals server receiving health data.
  • No ads or analytics SDKs.
  • The shipping app has no Android INTERNET permission.
  • No Google Play Services dependency is required for app functionality.
  • OpenVitals opts out of Android cloud backup.
  • Health Connect remains the source of truth wherever it has a record type.
  • The dashboard is read-only by default; writes happen only through actions you explicitly start or enable.
  • Bluetooth is used for sensors and phone-to-phone sync. Data sent over Bluetooth goes only to devices or phones you pair or use with those features.
  • Files are exported or shared only when you choose to do so.

Health Connect access is split into categories rather than requested as one block:

  • Activity & sleep: used by the dashboard.
  • Heart & recovery, Body, Activity extras, Nutrition & hydration, Mindfulness, and Vitals: optional categories.
  • Cycle tracking: separate sensitive access that can be granted or skipped explicitly.
  • Medical records: kept separate from the other Health Connect permissions and requested only when you enter the Medical records area.
  • Manual-entry write access: available during one-tap setup or requested when an entry flow needs it.

Permissions can be changed later in Settings.

OpenVitals does keep some app-only data locally where Health Connect cannot represent it, as well as caches and files used by features you enable.

Local data

This includes things such as:

  • derived summary caches and Body Energy history;
  • food and drink catalogues;
  • the parts of the cycle journal that Health Connect cannot store, along with cycle exclusions and pill intakes;
  • metadata used by device sync;
  • recordings not yet saved, staged Apple Health imports, imported offline maps and elevation tiles;
  • medical documents you explicitly choose to keep;
  • the last phone-to-phone sync report, the last Apple Health import report and the last crash report, each holding counts, types and reasons rather than your values.

These are stored in app-private storage on the device. Some local data can leave that storage only through an action you explicitly start; for example, cycle-journal data can be copied to another phone when the cycle category is selected in phone-to-phone sync.

See the privacy policy for the full text.

Platform requirements

  • Android only
  • minSdk 26
  • compileSdk 37
  • targetSdk 36
  • JDK 17 / Java 17 toolchain
  • Health Connect required

Health Connect platform notes:

  • On Android 14 and newer, Health Connect is part of the system
  • On Android 13 and older, the Health Connect app must be installed separately
  • Health Connect is not supported in work profiles
  • Mindfulness sessions require a Health Connect provider version that supports FEATURE_MINDFULNESS_SESSION
  • The app uses androidx.health.connect:connect-client 1.2.0-alpha06 so AndroidX maps newer activity, mindfulness, and aggregation APIs to the current platform permissions

Documentation

The user documentation lives at docs.hale.ngo:

Engineering docs stay in this repository:

Help Improve It

OpenVitals is still early. Useful feedback is specific: device model, Android version, Health Connect provider version, which permissions were granted, and what screen or workflow failed.

  • Try the latest beta from Google Play or GitHub releases
  • Report bugs and feature requests on GitHub issues
  • Translate OpenVitals in your language on Codeberg Translate
  • Ask questions and discuss support on OpenVitals Zulip
  • Star or follow the project on GitHub
  • Share screenshots or notes from real Health Connect setups, especially route recording and manual entry flows
  • Support ongoing development on Liberapay

Build from source

  1. Install a recent Android Studio with Android SDK 37.0 and JDK 17 support.
  2. Clone this repository.
  3. Open the project in Android Studio, or build from the command line.

In a complete checkout:

./gradlew :app:assembleDebug

To run the same basic checks used by CI:

./gradlew verifyCi
git diff --check

To install on a connected device or emulator:

./gradlew :app:installDebug
Windows: cleaning fails with a locked lint cache

On Windows, Gradle or Android Studio can occasionally keep lint cache jars open under app/build. If cleaning fails with a locked lint-cache jar, stop Gradle daemons first:

.\gradlew.bat --stop
Get-CimInstance Win32_Process |
  Where-Object { $_.CommandLine -like '*org.gradle.launcher.daemon.bootstrap.GradleDaemon*' } |
  ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
Remove-Item -LiteralPath app/build -Recurse -Force

More local development notes are in docs/engineering/development.md.

After launching the app:

  1. Complete onboarding
  2. Use one-tap setup to grant all requestable Health Connect permissions, or grant Activity & sleep first and then choose individual categories
  3. Grant Cycle tracking only if you want period, ovulation, cervical mucus, and basal temperature data shown
  4. Use Dashboard for read-only summaries and Add entry for explicit Health Connect logging

Architecture at a glance

The repository has two Gradle modules: :app is the phone app and :domain holds its pure Kotlin models and calculations.

The phone app uses:

  • Jetpack Compose, Material 3 and Navigation Compose for the UI;
  • ViewModel, coroutines and StateFlow for screen state;
  • Hilt for dependency injection;
  • the AndroidX Health Connect client behind HealthConnectManager and feature-specific repositories;
  • Room for derived caches and data Health Connect cannot represent. Health Connect remains the source of truth for record types it supports;
  • WorkManager for Apple Health imports and offline-map imports.

Watch and scale support is not in this repository: it lives in OpenWatch, a separate app that writes to Health Connect.

Live Bluetooth LE sensor streaming during activity recording is separate under sensors/ble/.

Phone-to-phone Health Connect sync lives under features/devicesync/ and uses Bluetooth Classic RFCOMM. The CoMaps provider lives under comaps/ and reads guidance through Android's ContentResolver.

See the architecture documentation for the current structure and development direction.

Project layout

License

OpenVitals is licensed under the GNU Affero General Public License v3.0 or later. Project thanks are listed in THANKS.md, and third-party asset notices are listed in THIRD_PARTY_NOTICES.md.


Generated from README.md. Edit it there; changes made here are overwritten.

Home

Features

How-to

App

Reference

Engineering

Proposals

Releases

Project

Clone this wiki locally