From 2b5fb617bae504b3c0f80b3f77fd6cdf136bfcb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 17 Jul 2026 14:35:06 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.29.2=20=E2=80=94=20WHOOP?= =?UTF-8?q?=20workout=20sport,=20intraday=20history,=20Today=20dismiss,=20?= =?UTF-8?q?vitals=20info-tip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WHOOP workouts map to canonical sports (bike rides show as cycling) with a history backfill and a richer cross-source merge; the intraday heart-rate view gains a day navigator with 90-day dense retention and an hourly fallback for older days; milestone/ECG/tension cards can be dismissed from Today; vitals context moves into an (i) popover and the VO2max heading no longer clips; Oura cycle phases feed the cycle tracker where available. --- CHANGELOG.md | 25 +++++++++++++++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 079773f79..8cdfad400 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ ## [Unreleased] +## [1.29.2] — 2026-07-17 + +- **WHOOP workouts carry their real sport.** WHOOP was the only source that + didn't translate its activity into the app's own sport names, so + WHOOP-tracked rides and runs landed unlabelled instead of as cycling or + running. New and existing WHOOP workouts are now mapped, so your bike rides + show up as cycling — history included. When the same session comes in from two + sources, the canonical row now keeps the richest reading (heart rate, energy, + distance) instead of dropping it. +- **Scroll back through the day's heart rate.** The intraday heart-rate view + gains a day navigator to step through previous days. The fine-grained history + now stays for 90 days (was 14); older days show the coarser hourly shape. +- **Clear a card from Today.** A milestone, a new ECG, or a tension note can be + dismissed from the Today rail once you've seen it; the section tightens when + the last one is gone. The cards that need an action stay until you act. +- **Vitals context moves into an info tap.** The vitals tiles carry an (i) with + the context — your reading against your personal range, and against your age + where that applies — instead of a permanent caption. The VO₂ max heading no + longer gets cut off. +- **Oura cycle phases feed the cycle tracker.** Where your Oura connection + provides cycle-phase data, it now fills the cycle tracker as a background + source; your own entries always win. + +Two migrations (0247, 0248). No breaking changes. + ## [1.29.1] — 2026-07-17 A round of fixes and small refinements from living with the daily view. diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index 0a6c2842d..f26730199 100644 --- a/docs/api/openapi.yaml +++ b/docs/api/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: HealthLog API - version: 1.29.1 + version: 1.29.2 description: >- Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest. diff --git a/package.json b/package.json index aecdc5b15..0006031b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.29.1", + "version": "1.29.2", "description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.", "license": "PolyForm-Noncommercial-1.0.0", "homepage": "https://healthlog.dev", diff --git a/public/sw.js b/public/sw.js index 50c7c0d12..4d02ccf2d 100644 --- a/public/sw.js +++ b/public/sw.js @@ -36,7 +36,7 @@ try { // v1.4.38.4 → v1.4.42. Do not hand-edit; bump `package.json` and rebuild. const CACHE_VERSION = (typeof self !== "undefined" && self.__APP_VERSION__) || - /* @sw-version-fallback */ "v1.29.1"; + /* @sw-version-fallback */ "v1.29.2"; const STATIC_CACHE = `healthlog-static-${CACHE_VERSION}`; const PAGE_CACHE = `healthlog-pages-${CACHE_VERSION}`; // v1.18.6 — read-only data cache for a curated allowlist of safe GET `/api/*`