From ed260f1ed8b94b02eaf828953f749fa6dd0d1f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 24 Jul 2026 11:09:44 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.32.16=20=E2=80=94=20keep?= =?UTF-8?q?=20a=20saved=20dashboard=20layout=20from=20a=20concurrent=20rin?= =?UTF-8?q?g=20save?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #581 --- CHANGELOG.md | 22 ++++++++++++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8255a1cf2..3cfdc5807 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ ## [Unreleased] +## [1.32.16] — 2026-07-24 + +Changing which tiles and charts appear on your dashboard could get undone if +you also toggled a hero score ring at about the same moment. Both actions save +the whole layout, and the ring change was built from an older copy, so +whichever reached the server last won. Thanks to @lutzkind for the clear +report. + +- **A saved layout now stays saved.** Your dashboard save is treated as the + authoritative one. If another change arrives after it but was based on an + older version of the layout, the server declines that write rather than + letting it overwrite your work. The ring toggle also carries only its own + fields, so it can no longer pull stale tiles along with it. +- **The two saves take turns instead of racing.** While a layout save is in + flight the score ring controls are held, and while a ring change is saving + the Save button waits, so the two writes can no longer overlap on the server. +- **A change underneath you reloads instead of getting lost.** In the rare case + where another tab saved first, the layout refetches from the server and a + small note asks you to make your change again against the fresh copy. + +Refs #581. + ## [1.32.15] — 2026-07-24 Your Polar training sessions now sync into HealthLog, alongside the recovery, diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index f235548b0..0998fe392 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.15 + version: 1.32.16 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 71c76cbdb..4cba5ff7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.32.15", + "version": "1.32.16", "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 da0f72c09..d672582af 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.15"; + /* @sw-version-fallback */ "v1.32.16"; 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/*`