Repository navigation
OpenVitals 2.3.1
github-actions[bot] edited this page Nov 9, 2026
·
1 revision
Released 2026-07-24.
A polish release about honesty at the edges: the day boundary, the year view, and the hours your tracker spends off your wrist. Widgets stop freezing overnight, mornings show last night's vitals instead of "No data", Body Energy keeps living while the watch charges, and a Garmin Edge can now be a live sensor and a sync device at once.
- A Garmin Edge can be two things at once. A bike computer now broadcasts as a live sensor during a recording - heart rate, speed, cadence, power, the way a strap does - while still syncing its recorded rides afterwards. Edge devices are classified as bike computers with their own setup flow.
- WearOS smartwatches are recognised as their own device type. They are labelled on the sensor list, get a watch screen without the Garmin-only controls, and a new Health Connect sources card in diagnostics shows which apps are feeding your data.
- Widgets ask for what they need, when you add them. Placing a widget now offers the "Alarms & reminders" permission that keeps background refreshes on schedule - silently skipped if already granted, and declining keeps the widget. Widgets also refresh the moment a watch sync or an Apple Health import lands new data, instead of waiting for the next timer.
- Home-screen widgets no longer freeze overnight. The refresh alarm is armed exactly when the permission allows, so Android's battery saving can no longer defer it for hours and leave a widget showing yesterday's pre-dawn state all morning.
- Body Energy keeps living while the tracker is off. Once the day has shown any data, baseline metabolism keeps draining through the gaps, and a walk recorded by the phone's own step counter drains too - even with no heart rate and no calorie series. Untracked days still hold steady rather than sliding to zero.
- Mornings show last night. HRV, resting heart rate, respiratory rate, SpO2 and skin temperature now read from your night window, so the dashboard has your overnight values at breakfast instead of "No data" until the first daytime sample.
- Caffeine got its clock fixed. The bedtime projection now describes the night ahead (it could claim "0 mg at bedtime" four minutes before midnight with 61 mg active), the dashboard tile shows the caffeine active in your body right now with today's intake beneath it, and safe-night statistics only count nights that have actually happened.
- Midnight no longer breaks streaks. Nutrition, activity and hydration goal streaks survive into the new day until it genuinely fails, and a drink logged just before midnight still counts toward the hydration reminder schedule after it.
- The Calories year view tells the truth. Two artefact days per year (one doubled, one missing, around the clock changes) are gone, years without data no longer show hundreds of thousands of phantom kilocalories, paging quickly through years no longer piles up reads until the screen hangs on "Syncing", and switching between calendar and rolling ranges applies immediately.
- Garmin sleep stages sit where they happened. Stage timestamps were read as starts instead of ends, shifting every span onto the wrong stage - a 92-minute REM block could be drawn as Light sleep.
- Intensity minutes count the whole week toward the weekly goal, not just today.
- The largest text size fits everywhere. Every top-level screen now survives a 2.0 font scale.
The Codeberg and Play builds keep the same package name and signing certificate, so this installs as a normal update.
Distribution flow:
- Codeberg release with per-ABI signed APKs (arm64-v8a and armeabi-v7a) and signed Android App Bundle assets.
- Direct Google Play production upload from the approved Woodpecker deployment.
Generated from docs/releases/2.3.1.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