Skip to content

OpenVitals 2.2.0

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

Released 2026-07-13.

This release is about the charts. Every one of them was a picture you could look at and not ask anything of: you could see that the line went up somewhere in the afternoon, and there was no way to ask when, or how much. The numbers were in the data and never on the screen. They answer now.

Added

  • Drag a chart to read it. A crosshair follows your finger, a ring marks the sample, and a tooltip gives the value and the time it was taken. It snaps to a real sample rather than reading the curve under your finger — the curve between two readings is an interpolation the app invented, and a tooltip may only ever report a number that was actually measured. The six intraday cards, both session traces, the caffeine curve and body energy all gained it at once. Dragging up the page still scrolls the page: the chart claims horizontal movement only.
  • A caffeine curve with a scale on it. It drew the decay of caffeine in a body with no y axis, no gridlines and no time axis — a whole day of it, with no way to tell when any of it happened or how much was left. It now reads milligrams down the side and midnight to midnight along the bottom, with a dashed line at the level you are trying to be under by bedtime, and a tick under each drink, so every sawtooth sits directly above the drink that caused it.
  • Charts that draw themselves in. The line draws left to right, bars grow up out of the axis, the ring sweeps round to its value. It is not decoration: it is the chart telling you which way to read it. If you have asked your phone to reduce motion, they are simply there, fully drawn, on the first frame.
  • A loading state shaped like a chart. Seven chart screens now load into a chart-shaped skeleton instead of a spinner, so the page does not jump when the data lands and the eye has already found the place to look. A spinner says "something is happening"; these screens knew exactly what was coming.
  • An empty chart that looks like an empty chart — a muted icon above the sentence, instead of a stray line of grey text floating in a card.

Changed

  • The chart palette. Eight of the seventeen metric accents fell below the 3:1 contrast ratio WCAG asks of a graphical object — the floor for a thing you are meant to be able to see. The floors accent (gold) scored 1.59:1 against the light surface: a chart line a sighted user has to hunt for, and a low-vision user simply does not get. The brightest colours were the worst ones, which is the trap: a saturated yellow is nearly as light as the white behind it. Every accent now clears 3:1 against both surfaces while keeping the hue it has always had — steps are still green, water is still blue, the heart is still rose. Nobody has to relearn the app.
  • The fill under a line is a gradient now rather than a solid block of colour, and every bar in the app rounds its corners by the same rule instead of three painters each having a private answer.

Fixed

  • Body Energy could draw a score above 100. It is a score defined as 0 to 100, and it was drawn with a spline that overshoots. The clamp that was supposed to prevent it did not work, because a Bézier can still bulge past a clamped handle. A curve that climbs above 100, or dips below the lowest reading of the day, is not a smoothing artefact — it is a false statement about your body, drawn in the same ink as the true ones. The curve can no longer leave the range of the readings it was drawn from. It also gained the scale it never had: a 0–100 score with nothing beside it to read it against.
  • An axis could label two different heights with the same number.
  • A chart filled the area under a line that was not there.
  • German, Estonian and Italian said route import took GPX/KML/KMZ, while the app has read TCX since 2.1.0 — so the one file type an indoor athlete would go looking for was the one those three languages said it could not read.

Translations

German, Spanish, Estonian and Italian are at 100%. Galician is under way at 5% and is not offered in the app until it passes 70%.

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.2.0.md. Edit it there; changes made here are overwritten.

Home

Features

How-to

App

Reference

Engineering

Proposals

Releases

Project

Clone this wiki locally