Repository navigation
OpenVitals 2.6.4
Released 2026-08-13.
This release is about numbers that were technically correct and told you nothing. Body Energy charged a broken night almost exactly what it charged a perfect one, because it counted the minutes you slept and never asked how they went. Weight over a month was a calendar of near-identical coloured dots, shaded by a quantity that barely moves. A month of nutrition was a total nobody eats by. And a Garmin day could report 889 steps while the watch had recorded 1,007, because records that overlapped by a single minute had that minute discarded by Health Connect. Each of those is a different bug with the same shape: the data was there and the reading was not.
- Body Energy reflects how well you slept, not only how long. Overnight charge now scales by sleep efficiency, time spent awake after falling asleep, and the deep and REM share of the night. Two eight-hour nights of very different quality used to land within a few points of each other and now sit about fifteen apart. Three properties keep it honest: an ordinary night charges exactly what it charged before, so the change spreads nights apart rather than moving everyone up; the effect is capped at twenty percent either way, so no single night of odd staging can undo hours actually slept; and a sleep source that records no stages is left exactly as it was, because a start and an end alone read as a flawless night and would earn a bonus for recording nothing.
- A flawless night reads above a merely good one. The sleep score stops distinguishing nights once they clear its clinical thresholds, which is right for a score answering whether a night was healthy and wrong for one asking how much it restored. The charge reads the same measurements on a continuous scale instead. Stage architecture is deliberately not stretched that way: more deep sleep than the healthy range is not more recovery.
- Body measurements draw a trend line over week, month and year. Weight, body fat, lean mass and the rest previously handed those ranges to the calendar heatmap, which colours a day by how big its number is. That reads well for steps and reads as nothing for a weight that spends its life inside a two-kilo band. The scale is fitted to the values rather than anchored at zero, because a kilogram of drift is invisible on an axis that starts at nothing. Day keeps its own intraday chart.
- Nutrition leads with a daily average over a period. Each nutrient tile shows the daily average with the period total kept underneath, across the vitamin and mineral grids as well as the four macros. A single day is left alone, where the total already is the day.
- A new Nutrition setting chooses what an average divides by. Averaging over logged days only, the default, is what someone who logs occasionally means by their daily calories. Turned off, the divisor is every elapsed day of the period. Either way a period still running divides only by the days that have happened, so this month's average on the thirteenth is over thirteen days and not thirty-one.
- Garmin step counts no longer come up short. Each sync's first intraday record began at the edge of its fifteen-minute slot, which was before the previous sync's last record ended. Health Connect discards the overlapping span when it aggregates, so records that summed to 1,007 steps reported 889. Distance and active calories were losing the same way.
- An entry list stays expanded after an entry is swiped away. How far the list had been expanded was remembered against the entries themselves, so deleting one reset it to the first page, which pulled everything below it up the screen and left the reader looking at a section they had never scrolled to.
- Maximum heart rate is no longer invented from a quiet fortnight. With no trustworthy observed maximum the app used the highest rate it had seen plus ten, so a fortnight peaking at 141 produced a stated maximum of 151 with nothing marking it as a guess. It now uses the same age-based figure as heart-rate recovery and Body Energy, honours a maximum stated in the body profile outright, and labels an estimate as an estimate.
- The cardio load target no longer reports impossible percentages. A week scored from heart rate was being compared against older weeks that could only ever be scored from movement, which produced figures such as 2640 percent of target. The baseline now only includes weeks scored by the same yardstick.
- Chart date labels arrive whole. A label was confined to its own slot and clipped there, so a month showed "1(" for the 16th, and a year on a line chart cut its month names down to slivers. Labels are now measured against the width they actually have and thinned to what fits.
The app keeps the same package name and signing certificate, so this installs as a normal update.
Distribution flow:
- Codeberg release with signed APK, signed debug APK, and signed Android App Bundle assets.
- Direct Google Play production upload from the approved Woodpecker deployment.
Generated from docs/releases/2.6.4.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.17.0
- 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