Repository navigation
OpenVitals 2.5.0
Released 2026-08-04.
OpenVitals is native Kotlin again. Every feature the 2.x line added has been rebuilt on the Android-native app, and this release adds what it was rebuilt for: a second phone across the table, a folder of CSV files, and a clearer story for the watch on your wrist — all of it without an account and without the internet. Your data and settings from the previous version are imported the first time you open it.
- Sync health data with another phone over Bluetooth. Two phones, a code you confirm on both, and a report of what moved. No account, and no internet is used at any point. Records keep their original source: an activity that Gadgetbridge wrote on one phone still says so on the other.
- Import health data from CSV files through a guided wizard that maps your own columns onto the records they belong to.
- Units that follow your device. The unit setting now defaults to your Android measurement-system preference, and every quantity can override it on its own — kilometres for distance, pounds for weight, and Celsius for temperature can all be true at once.
- Quick-add a drink from the reminder. One tap on the notification logs it — the app never opens — and the countdown to the next reminder is anchored to your last drink rather than to the clock. Reminders now survive a reboot and a change of timezone.
- Record a run or ride without GPS. The barometer still counts your climb and the phone still counts your steps, so an indoor or tunnelled session is a real activity rather than a gap.
- A guided heart-rate recovery test, recorded as part of the session it follows.
- TCX and indoor-workout file import, for treadmill runs, trainer rides and strength sessions — files with no route, which is not the same thing as a broken file.
- The Body Energy home-screen widget draws its day again, with the start and end values labelled on the curve.
- Settings additions: Body profile is now a section of its own, carrying your height and the measurements Health Connect resolves; high and low heart-rate alert thresholds; a stepper for the hydration goal; and a toggle for the mindfulness integration.
- Smartwatches sync through Health Connect. OpenVitals does not pair with watches: Gadgetbridge or your vendor's app syncs the watch into Health Connect, and OpenVitals reads everything there — steps, heart rate, HRV, sleep and workouts — with the original source shown on each record. Bluetooth sensors are unaffected: heart-rate straps and cadence and power sensors still stream live into a recording.
- Your previous version's data comes across on first launch. Goals, units, theme, caffeine and body profile, custom drinks, paired sensors, reminders, offline map packs and home-widget selections are imported automatically the first time 2.5.0 opens. Nothing from the old version is deleted.
- Elevation is more accurate. GPS noise no longer banks itself as climb: altitudes are smoothed and thresholded the way the barometer path always was, so a climb below the noise floor honestly reports zero.
- The dashboard only offers tiles your device can fill. A metric your phone cannot provide gets no tile instead of an empty one, and edit mode still lists it so adding it back is never a dead end.
- Chart settings live together. Rolling dates moved next to aggregate charts under Display.
- Sleep no longer double-counts overlapping stages. When a source records the same stretch as both light and deep sleep, the deeper stage wins and the total can never exceed your time in bed.
- Year views load again on large libraries. Yearly calories, steps and heart metrics are served from the app's daily-history cache and read in slices, instead of one oversized Health Connect request that could silently come back empty.
- The dashboard syncs once per open, with one status banner instead of two.
- The Body Energy widget no longer forgets its morning. A transient permission hiccup used to reset the day's start to 50; the widget now keeps the value carried over from yesterday.
- Elevation on backfilled activities now runs through the same smoothing as a live recording and an imported route.
- The skin-temperature card no longer blanks when the newest reading carries no change — it reads the newest reading that actually has one, the same data its chart draws.
- An unchanged battery reading no longer re-stamps its time, so a device that reports the same percent does not look freshly updated.
- A permission error now offers a way to grant access instead of a dead-end message: the real request inside Health Connect, or Health Connect's settings outside it.
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.5.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