From 115c3e3dcd98e85ea6a09735b06b5ce9f176941b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 24 Jul 2026 13:00:10 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.32.18=20=E2=80=94=20a=20de?= =?UTF-8?q?ad=20Fitbit=20token=20no=20longer=20stamps=20a=20successful=20s?= =?UTF-8?q?ync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hold the Fitbit sync verdict when the token is dead or a write fails, and verdict-gate the history backfill so a partial first-time import retries instead of marking itself complete. No schema or contract change; the OpenAPI version string tracks the bump. --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b83046cc..6b6c7e4c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,34 @@ ## [Unreleased] +## [1.32.18] — 2026-07-24 + +When a Fitbit token was revoked or expired, the hourly sync noticed the failure +but then stamped the same cycle as a success. The connection flipped back to +connected, the sync position moved forward, and after you reconnected the +catch-up window could no longer reach the days that were missed. So the data +was skipped for good, and in the meantime the failing token was retried every +hour. + +- **A revoked Fitbit token no longer reports a successful sync.** A failed token + refresh now fails the whole cycle. The connection stays parked until you + reconnect, the sync position holds instead of advancing past real data, and + the once-per-failure alert stops repeating every hour. +- **Data after a reconnect is no longer skipped.** Because the position is held + back on a failed cycle, the next successful sync still covers the days that + were missed rather than starting after them. +- **A write failure during a sync holds its place too.** If rows were fetched + but could not be saved, the cycle keeps its position so the next run fetches + them again instead of letting them fall outside the catch-up window. +- **An interrupted history backfill no longer marks itself complete.** A partial + first-time import is retried until a full pass finishes, so the one-year + history walk fills in rather than freezing halfway. + +If your Fitbit history already has a gap from before this release: reconnect +Fitbit if prompted, then open Settings, Integrations, Fitbit and run a full +sync. It re-walks the last year and fills the gap in place. Gaps older than a +year are outside the backfill window and cannot be recovered. + ## [1.32.17] — 2026-07-24 The mood correlations on the Insights page could line up a day off. Your mood diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index 8eae52a6f..6f97b1e17 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.32.17 + version: 1.32.18 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 081084681..cb098d507 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.32.17", + "version": "1.32.18", "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 845fd4148..0ba82d22d 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.32.17"; + /* @sw-version-fallback */ "v1.32.18"; 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/*`