Repository navigation
Released 2026-11-06.
This release reads the cycle from the records a watch or ring leaves behind, and says plainly what they can and cannot tell. Once the current cycle holds a positive LH test, a confirmed temperature rise or a mucus peak, the next-period estimate counts from that day and the card names it. The thermal chart draws the night skin temperature a watch or ring writes to Health Connect beside the morning readings, and finds a rise in it afterwards, from the whole cycle, never in advance. A new card lines up each night's resting pulse, HRV and breathing rate by cycle day, with the studies behind it, and the cycle settings let you declare a hormonal method, which the skin temperature card takes into account. None of it marks a fertile or a safe day. On the wrist, the Wear OS watch app gains tiles for heart rate, steps and floors with the day's curve, and a weigh-in on the Xiaomi S400 Pro scale no longer saves as 204.7 kg.
Added
- The next-period estimate counts from a recorded ovulation sign. Once the current cycle holds a positive LH test, the first high day of a confirmed temperature shift or a mucus peak, the estimate counts from that day instead of from the last period start, since the days from such a sign to the next period vary less than whole cycles do. Each sign has its own interval, learned from your earlier cycles that hold the same sign and shrunk toward a published figure until there are enough of them. An LH test up to five days, or a mucus peak up to three days, before the first high day confirms the shift, and the card says a second sign agrees; signs that disagree fall back to the calendar estimate, and the card says so. The card names what the range counts from. It is still an estimate of the next period: it never marks fertile or infertile days.
- Night skin temperature in the thermal chart, with a shift found afterwards. Beside the morning readings, the chart shows the night skin temperature a watch or ring writes to Health Connect, as a change from the device's own baseline. Two chips, Morning (BBT) and Night (skin), switch each series on and off; each has its own colour and its own axis, and the two are never mixed. From 15 nights on, OpenVitals looks for a rise after the fact: the first night where it and the next two each lie at least 0.2 °C above at least five of the six nights before. The line under the chart says what was found and which rule found it, or that the nights are too few, too gappy or the signal too weak to judge, as happens when a device smooths what it passes on. The wording is "no shift detected", never a statement about ovulation, and the shift feeds no estimate. Skin temperature is read when the vitals permissions already allow it; otherwise the chip says so and points to the Health Connect permissions in Settings.
- What skin temperature can and cannot say. Under the thermal chart, a card explains that watches and rings measure skin temperature at night, that after ovulation it tends to be a little higher, and that OpenVitals reads a rise only afterwards and does not use skin temperature for its estimates. A toggle shows the numbers and the studies behind them, each with a link. When a hormonal method is set, or was stopped within the last two months, the card says in plain words why the pattern may be missing; a declared PCOS context adds a note that no study of temperature-based ovulation detection in PCOS was found. It is information, not a method of birth control, fertility prediction or medical advice.
- Night pulse, HRV and breathing across your cycle. A card on the cycle screen draws the current cycle's overnight resting pulse, HRV (RMSSD) and breathing rate by cycle day. Each night's value is the median of the readings inside its sleep session, placed on the day you woke up; a resting pulse the device only wrote as a daily value is drawn hollow and labelled as such. Each signal has its own colour, axis and chip, takes one device for the whole cycle, and is named as missing when the watch does not record it or the permission is not granted; one button asks for the sleep, resting heart rate, HRV and respiratory rate permissions, which are not part of the cycle permissions. "Why this is shown" opens the studies, how the night value is made, and the caveats: sleep, alcohol and hormonal contraception move these lines too. The card is information only: it says nothing about ovulation, fertility or contraception, and changes no estimate.
- A declared hormonal method. Settings, Cycle, has a Hormonal contraception card: pill, hormonal IUD, implant, ring or patch, injection or another hormonal method, with an optional day it was stopped. Copper IUDs, condoms and diaphragms use no hormones and are not listed. An enabled pill scheme counts as the pill. The method travels with the cycle journal export and with the cycle category of a phone-to-phone sync, and a phone that has declared none takes the other's. Today it changes only the skin temperature card.
- Watch tiles for heart rate, steps and floors. The Wear OS watch app offers three tiles, added from the watch's tile list. Each shows today's value in the colour the phone app uses for that metric, and the day's curve from midnight to midnight, drawn up to now: the heart rate as quarter-hour means, broken where the watch stored none, the steps and floors as a running total. The heart rate tile shows the newest sample with its age, a dash once it is older than an hour, and the day's lowest and highest under the curve; the floors tile shows the metres that counted. The steps are the ones the watch counted itself, so they can fall short of the phone app's total, which adds the phone's own steps and other apps'. A value whose permission is off, or whose sensor the watch lacks, shows as a dash with the reason. A tile starts no sensor and reads only what the watch app recorded; a tap opens the watch app. Verified on a TicWatch Pro 5 with Wear OS 4.
Fixed
- Xiaomi S400 Pro weigh-ins saved as 204.7 kg. The S400 Pro marks the frame it sends without a weight by setting every weight bit, where the S400 clears them. Read literally that is 204.7 kg, so the last frame of a weigh-in replaced the measured weight, and its impedance was taken for the other frequency, which made the body composition wrong too. Both markers now mean no weight, and the frame adds its impedance to the weigh-in instead of replacing it. Reported, with the fix, in #323.
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.