Skip to content

OpenVitals 2.0.4

github-actions[bot] edited this page Nov 9, 2026 · 1 revision

Released 2026-07-12.

The app's insides were rebuilt this release, and the rebuild is what found the bugs. Moving every calculation out of the screens that were doing it mid-draw put a lot of arithmetic side by side for the first time — and several numbers, it turned out, disagreed with each other.

Fixed

  • The sleep card called your watch's recordings "hand-typed", and never noticed the ones that really were. Health Connect labels how a record was made — actively recorded, automatically recorded, typed in by a person — and the data-confidence card was comparing that label against the wrong value. So it warned you about manual entries whenever your watch had recorded the night properly, and a night you genuinely did type in was never counted at all. The number the app was checking against is not one the app gets to choose; it is now written down once, in one place, rather than copied into three files where one of them was wrong.
  • The hydration goal bar filled up if you logged a single day. It measured the average of the days you logged against your goal — so a week in which you logged Monday, hit your target, and never opened the app again showed a completely full bar, with "1 of 1 days met" written above it. Log nothing and you cannot fall short of anything. The bar now counts the days you met your goal against the days that have actually happened, and stops at today: a goal you have not yet had the chance to miss does not count against you.
  • A day's heart rate could print an average outside its own low and high. The average came from Health Connect's own summary of the day, while the low and the high came from the individual readings — two different sets of numbers, printed side by side as though they were one. All three now come from the readings.
  • The skin-temperature card went blank while its own chart carried on drawing. A reading that arrives without a temperature difference emptied the card, while the chart directly underneath it went on plotting the readings that had one. The card and the chart now look at the same readings.
  • Respiratory rate showed you two different averages on one screen, and told you neither which was which: the figure under the chart was the average of your days, the figure on the card below it was the average of every individual reading. On an unevenly sampled week those are different numbers. There is one now.
  • An Apple Health import that failed on permissions said nothing useful, and offered no way to fix it. The one button that would have solved the problem — "grant permission" — could never appear, because a permission failure was never reported as one. It is now.
  • Screens could spin forever after a failed permission check. On the dashboard, in onboarding, and while saving an activity, a Health Connect permission probe that failed threw its error where nothing was listening. The loading spinner simply never stopped. Each of them now tells you what went wrong.

Changed

  • The app was rebuilt to Flutter's app-architecture guidelines. Every screen now works out what to show once, when its data loads, instead of recalculating charts, totals and statistics on every single redraw while you scroll. This is invisible if it went well, which is the point — but it is also why the fixes above exist, and it is the groundwork for iOS. The automated test suite grew from 1,605 checks to 1,890 in the process.

The app keeps the same package name and signing certificate, so this installs as a normal update.

Distribution flow:

  • Codeberg release with signed APK and signed Android App Bundle assets.
  • Direct Google Play production upload from the approved Woodpecker deployment.

Generated from docs/releases/2.0.4.md. Edit it there; changes made here are overwritten.

Home

Features

How-to

App

Reference

Engineering

Proposals

Releases

Project

Clone this wiki locally