Skip to content

OpenVitals v2.15.2

Latest

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:56

Released 2026-11-01.

This release keeps the dashboard filling when Health Connect runs out of patience. On Android 13, where Health Connect is a separate app with a stricter limit, a fresh install could show "no data" on every tile and a toast asking to wait a minute, forever; the app now spaces its calls, needs far fewer of them, counts down in a banner and asks again for the missing tiles by itself. Sync with another phone gains an Overwrite existing records option for records Health Connect holds but does not count, the CSV importer reads blood pressure logs and the app's own workout exports, and a Wear OS watch now sends the floors it climbed and a resting heart rate for each night, and rests its heart rate sensor while off the wrist. Every report, crash draft and log the app can hand out holds counts, types and reasons, never your values.

Added

  • Overwrite existing records in a phone-to-phone sync. Health Connect can hold a record and still leave it out of its totals: a record restored from a backup or a phone transfer keeps the app that first wrote it as its source, and when that app is not on the new phone the dashboard reads zero steps while the sync counts the record as already there. A new checkbox on the "What to accept" step, off by default, makes this phone write every record the other phone sends under OpenVitals, which Health Connect does count. The choice is local to the phone that ticks it, a record arriving twice in one session is still written once, and the report says when it was on.
  • Workouts from a CSV file. The CSV importer recognises the workout export the activity detail screen writes and imports each row as a workout of its own: editable, deletable, and replaced rather than duplicated on a re-import. A file made by hand with the same headers imports the same way, with the date and time settings for local times, so a history rebuilt from other apps' exports comes in one workout a row. Distance, elevation, steps, calories, floors and wheelchair pushes are written beside the session, an average heart rate becomes a flat series, and a type the app cannot name is stored as an other workout and counted.
  • Blood pressure from a CSV file. A systolic and a diastolic column, in mmHg, make one reading per row, with optional body position and cuff location columns read as the words the app itself shows, in its language or in English. A position or cuff the file leaves out, or names in an unknown word, takes a default chosen on the mapping step and remembered for the next import. A reading outside what Health Connect accepts, or whose systolic is not above the diastolic, is rejected on its own; the weight in the same row still imports. Contributed by Anthon Pang.
  • Floors and elevation from a Wear OS watch. The watch app measures the height climbed from its barometer, one value per minute: a rise counts once it reaches 3 m, so the barometer's wobble does not add up. A sync turns the metres into floors, 3 m each with partial floors kept, and writes the same metres as elevation gained. Height counts only when the watch counted at least 10 steps per floor in that minute and the one before, so elevators and weather fronts drop out. A watch without a barometer records none.
  • A resting heart rate from each night on a Wear OS watch. Each finished night with sleep gives the lowest half-hour average of the heart rate during the night, written to Health Connect at the end of the night. A day that already holds a resting heart rate from elsewhere, such as the vendor's app, keeps that one. This needs the grants to read and write resting heart rate; the watch card asks for them.
  • Live heart rate on the watch's screen in the app. While the watch's device screen is open and the watch is worn, its status card shows the heart rate as it happens. The watch measures it for the phone only while the screen is open, and nothing live is stored.

Changed

  • Health Connect rate limits. When Health Connect refuses a read, the dashboard shows a banner that counts down and then reloads the tiles it could not fill, on its own; the tiles that have data keep it and their place, and the toast is gone. A refusal that repeats waits longer each time: 1, 2, 5, then 15 minutes. On Android 13, where Health Connect is a separate app with a stricter quota, calls are spaced out, a fortnight of heart rate for the cardio load is read in a dozen calls instead of thirty, the Body Energy warm-up computes three days a pass and resumes where it stopped, and the granted permissions are asked once per half minute instead of once per tile. A refused permission check no longer reads as "nothing granted" for the rest of the session, which left a fresh install with every tile empty. The Report an issue draft carries a count of Health Connect calls by kind, so a refusal can be traced from a report. Reported on Android 13.
  • Reports, crash drafts and logs hold structure, not data. Every text the app hands out for troubleshooting was reviewed: the Apple Health, CSV, drip and medical import reports, the sync report, the crash report and the Report an issue draft. They hold counts, record types, units, reasons and masked error text, never a value, a record's time, a name, a file name or a location. The medical report groups what was refused by type and reason instead of printing the records. The crash report is kept seven days at most and deleted once it has gone into an email, a copy or a file; the Report an issue draft carries the app's log, masked, in debug and nightly builds. Copied reports are marked sensitive so Android keeps them out of the copy preview, and a transfer to a new phone leaves the reports behind. The privacy policy is dated October 23, 2026, and asks for your consent once more.
  • Apple Health workouts without their route are listed on the import card, by activity and date, instead of in the report, so each route can be brought in with the route importer.
  • A Wear OS watch off the wrist stops measuring heart rate after a minute, which is what costs the most battery, and starts again as soon as it is back on; turning the screen on or taking it off the charger restarts it too. A watch without an off-body sensor measures all the time.
  • A phone whose key changed is asked about again on the watch. A phone that reinstalled the app, or cleared its data, presents a new key, and the watch refused it until the phone was forgotten on the watch and allowed again. The watch now asks whether to allow the phone again, with the reason, and Allow replaces the old key. Pairing the watch again on the phone keeps the key, so the watch asks nothing.

Fixed

  • Two trackers, one workout. Two watches worn on one walk, or a watch and its vendor app, each file their own session, and a second app may call the outing something else, a walk on one wrist and a hike on the other. Such sessions from different sources are now folded into one whatever their type, so the activity statistics no longer add the distance and time twice. Within one app, two overlapping sessions of different types stay two records.
  • Dashboard edit mode. On a phone whose Health Connect lacks some metrics, a drag across the fixed section could swap two tiles where the grid showed an insert. Both now count the same tiles.

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.
  • Direct Google Play production upload from the approved production run of the release workflow.