Repository navigation
OpenVitals 2.14.0
Released 2026-10-12.
This release opens the CSV importer to nutrition: a spreadsheet with a row per meal becomes food entries in Health Connect, and the health report can now chart every nutrient Health Connect stores, from fibre to selenium. Skin temperature is read as what it is, a variation from your device's baseline, with the day's samples on a chart. Garmin watches that struggled to connect get a sturdier link, and a sync brings Pulse Ox, HRV values, thresholds and scores. The OpenVitals Wear OS app, still installed by hand, now syncs heart rate and an estimated night of sleep, and FFMI has a screen of its own.
- Nutrition from a CSV file. The CSV importer under Settings > Import & export takes nutrition as well as body measurements. A spreadsheet with a row per meal or per day becomes one food entry per row in Health Connect, at the row's own date and time. A column can be any nutrient Health Connect stores: energy and the macros, fibre and sugar, the fats and cholesterol, vitamins, minerals and caffeine, plus an optional Food name column. Each nutrient is read in the unit a nutrition label prints it in, kcal, g, mg or µg, or in another one you pick; a header such as "Sodium (mg)" or "Energy (kJ)" picks the unit for you. The confirm step shows each nutrient's range, so a column read in the wrong unit stands out. Importing a corrected file again replaces its entries rather than duplicating them. Imported foods can be deleted on the nutrition screen and never show as drinks.
- Every nutrient in the health report. The report builder lists every other nutrient Health Connect stores, under the nutrition screen's headings: Carbohydrates (fibre, sugar), Fats (energy from fat, the fatty acids, cholesterol), Vitamins and Minerals. Each is a metric of its own, with a chart, statistics and a table, printed in the unit a nutrition label uses. Ticking a heading ticks its whole group. Select all leaves them out, so a full report gains only the nutrients you ask for.
- An FFMI screen. Tapping the FFMI tile opens an FFMI screen instead of the BMI one: adjusted FFMI from your latest weight, body fat and height, and a history with one reading per body-fat measurement, paired with the weigh-in nearest it.
- More from a Garmin watch. A sync also reads the Pulse Ox readings and five-minute HRV values a watch records, and writes them to Health Connect. Functional threshold power, lactate threshold, hill score, endurance score and the night's restless moments have no place in Health Connect, so they show on the watch's Watch data screen. A watch that does not record them sends none.
- Wear OS watch sync, for testers. The OpenVitals app for Wear OS records heart rate on its own, with the screen off, plus what a sleep estimate needs, and keeps a week of it. On the phone, the watch's screen has a Watch Sync card: Sync watch copies the new heart rate into Health Connect and writes one estimated sleep session per night, with stages, unless that night already has a sleep session from another app or entered by hand. Turn on bedtime mode at night: while it is on, the watch app keeps the watch awake enough to record every minute. The first time a phone connects, the watch asks you to allow it. The watch app is not on any store yet and is installed over adb from a computer, as the install guide on the docs site describes. A sync runs only when you tap it.
- Skin temperature as a variation. Health Connect stores skin temperature as a change from a baseline the device set, not as a temperature, and the screen now reads it that way. Values sit under Variation from baseline, in signed degrees, on charts centred on zero with a dashed zero line, and the day view draws the record's samples through the day instead of one dot at its end. Comparisons are in degrees rather than a percent of a tiny number (no more "-652 % vs previous day"), the personal baseline keeps the days below zero, and the device's baseline has its own tile, or says Not provided by source. The deviation tile is now called Vs usual average. The health report exports skin temperature as a variation too.
- Garmin link. For watches that had trouble connecting or syncing, first reported on a Fenix 6, the link now does what Gadgetbridge does: it writes the way the watch asks to be written to, redials up to twice after an Android Bluetooth error, lets a long first sync run for up to 30 minutes instead of 3, and completes the handshake with watches that never send their configuration. A new Large Bluetooth packets switch on the watch's screen, on by default, can be turned off for a watch that keeps dropping the link or never gets a sync going.
- Cardio load for women. The dashboard's cardio load weights each minute with Banister's constants for women when your body profile says female; before, everyone got the men's. Without a sex in the profile nothing changes. Contributed by Ludwig Ettner.
- Wear OS app status. The status card says what is wrong: Bluetooth is off, the watch is no longer paired, the watch is waiting for you to allow this phone, this phone is blocked on the watch, or one of the two apps needs an update.
- Translations. Italian updated from Codeberg Translate. Everything new in this release is translated into every language in the picker.
- Mindfulness sessions no longer pause when the screen times out: the screen stays on while the timer runs, as it does while recording an activity.
- Drinks on the hydration screen. Meals imported from Apple Health or synced from another phone no longer show among the day's drinks, and an imported "Coffee" no longer counts towards your frequent drinks.
- Line charts. The smooth curve no longer overshoots past a peak or a trough, and a series narrower than one unit, such as a tenth of a degree or a glucose reading in mmol/L, fills its chart instead of being squashed under its own axis.
- Skin temperature tile. The dashboard tile shows the newest record that has a variation instead of going blank on one that carries only a baseline, and never shows "-0.0".
The app keeps the same package name and signing certificate, so this installs as a normal update.
Distribution flow:
- GitHub release with signed APK, signed debug APK, and signed Android App Bundle assets.
- Google Play update to follow, once 2.13.0 has cleared Play review.
Generated from docs/releases/2.14.0.md. Edit it there; changes made here are overwritten.
This wiki mirrors the Markdown in Hale-MTU/OpenVitals on every push to main.
Features
- Features
- Achievements
- Activity And Training Plans
- Activity Metrics
- Apple Health Import
- Beverage Logging And Caffeine
- Bluetooth LE Sensors
- Body Energy
- Body Metrics
- CoMaps Navigation Context
- CSV Import
- Cycle Tracking
- Daily Readiness
- Elevation Correction
- Feature Map
- FIT Files Import
- Food Logging
- GPX/KML/KMZ/TCX Route Import
- Health Connect Metrics Dashboard
- Health Report Export
- Heart And Vitals
- Heart Rate Recovery
- Home Screen Widgets
- Hydration
- Manual Entry Of Metrics
- Medical Records
- Metric Detail Customization
- Mindfulness
- Non Health Connect Metrics Dashboard
- Nutrition
- Offline Maps Support
- Onboarding And Permissions
- Preloaded Beverage Nutrition Reference
- Privacy, Support, And Diagnostics
- Recording Of Activity
- Reminders
- Settings And Preferences
- Sleep Score And Recovery
- Sleep Tracking
- Statistics
- Sync With Another Phone
How-to
App
- App Guide
- FAQ
- Getting Started
- Health Connect
- Install
- Local And Connected Editions
- Permissions
- Privacy
- Screenshots
- Support
Reference
- Design Reference
- Reference
- Design Guidelines for Offline & Sync
- OpenVitals UI Notes
- Reference: Data Capture
- Reference: Data Display
- Reference: Health Connect Matchmaking
- Reference: Health Connect Onboarding
- Reference: Health Connect Permissions
- Reference: Health Connect UX
- Reference: Promoting Health Connect
Engineering
- Code Analysis
- Engineering
- Flutter ↔ Kotlin test-parity matrix
- apple-health-import
- Architecture
- body-cycle-recovery
- Design system conformance
- Development
- Feature Playbook
- Flutter -> Kotlin test parity: domain/data/core/contract/state/navigation/di/bootstrap/l10n/widget_test
- Flutter → Kotlin test-parity matrix: features section
- Flutter → Kotlin test-parity matrix: ui / goldens / integration / fixtures
- Flutter-to-Kotlin test-parity matrix — dashboard + devicesync
- manual-entry
- Translations
Proposals
- Proposals
- Activity Start Flow Analysis
- Activity Start Flow Simplification Proposals
- Caffeine Detail And Future Sleep Insights
- Cycle Tracking: Design and Status
- Medical Records Through Health Connect
- Medical Records: What Is Left
Releases
- OpenVitals 2.16.0
- OpenVitals 2.15.2
- OpenVitals 2.15.1
- OpenVitals 2.15.0
- OpenVitals 2.14.5
- OpenVitals 2.14.4
- OpenVitals 2.14.3
- OpenVitals 2.14.2
- OpenVitals 2.14.1
- OpenVitals 2.14.0
- OpenVitals 2.13.0
- OpenVitals 2.12.0
- OpenVitals 2.11.2
- OpenVitals 2.11.1
- OpenVitals 2.11.0
- OpenVitals 2.10.1
- OpenVitals 2.10.0
- OpenVitals 2.9.1
- OpenVitals 2.9.0
- OpenVitals 2.8.0
- OpenVitals 2.7.3
- OpenVitals 2.7.2
- OpenVitals 2.7.1
- OpenVitals 2.7.0
- OpenVitals 2.6.6
- OpenVitals 2.6.5
- OpenVitals 2.6.4
- OpenVitals 2.6.3
- OpenVitals 2.6.2
- OpenVitals 2.6.1
- OpenVitals 2.6.0
- OpenVitals 2.5.0
- OpenVitals 2.4.1
- OpenVitals 2.4.0
- OpenVitals 2.3.2
- OpenVitals 2.3.1
- OpenVitals 2.3.0
- OpenVitals 2.2.8
- OpenVitals 2.2.7
- OpenVitals 2.2.6
- OpenVitals 2.2.5
- OpenVitals 2.2.4
- OpenVitals 2.2.3
- OpenVitals 2.2.2
- OpenVitals 2.2.1
- OpenVitals 2.2.0
- OpenVitals 2.1.0
- OpenVitals 2.0.4
- OpenVitals 2.0.3
- OpenVitals 2.0.2
- OpenVitals 2.0.1
- OpenVitals 1.9.0
- OpenVitals 1.8.0
- OpenVitals 1.7.7
- OpenVitals 1.7.6
- OpenVitals 1.7.5
- OpenVitals 1.7.4
- OpenVitals 1.7.3
- OpenVitals 1.7.2
- OpenVitals 1.7.1
- OpenVitals 1.7.0
- OpenVitals 1.6.3
- OpenVitals 1.6.2
- OpenVitals 1.6.1
- OpenVitals 1.6.0
- OpenVitals 1.5.1
- OpenVitals 1.5.0
Project