From 4c35c16d644f8743a307cda240868f446352b9bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 31 Jul 2026 01:27:29 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.34.3=20=E2=80=94=20say=20t?= =?UTF-8?q?he=20thing=20the=20surface=20already=20knew?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thirty-four changes, most of them one shape: something the server or the screen already knew and did not say. A closed schema that omitted three fields it sends. A fence around sensitive data that the contract never described, so the native client dropped an affordance rather than risk crossing it. An ingest whose only durable trace fired on success, leaving "did the phone even post" unanswerable. A profile save that discarded valid fields to punish an invalid neighbour. A card titled "that day" that received the day and threw it away. --- CHANGELOG.md | 68 +++++++++++++++++++++++++++++++++++++++++++ docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e99571f23..90ca2058e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,74 @@ ## [Unreleased] +## [1.34.3] — 2026-07-31 + +A release about surfaces that knew something and did not say it. + +### Added + +- The workout page now shows the day around a session instead of linking away + from it: the day's pulse curve, the night before, and that day's mood, on the + page. It also offers the previous session of the same sport in one tap, says + how many workouts the list holds, and lets a sport narrow it. +- When a nutrient sync arrives and nothing can be stored, the nutrients page now + says so and why, in plain sentences, instead of showing the same empty page + someone would see who never synced at all. + +### Changed + +- The health score appears once. It is a single card below the greeting with the + breakdown behind one expander, rather than a compact copy in the greeting plus + nine full-width blocks underneath. Scores with too little input leave the grid + but keep their name and the reason they are not scored. +- The Coach input is one row tall until you type. It used to reserve a second row + for its buttons before anything had been written. +- Card headings sit closer to their content. A card with a title and no + description reserved space for a description that was never there, which + affected 45 of the 48 cards in the app. + +### Fixed + +- A profile save no longer discards everything because one field is invalid. + Valid fields are saved, rejected ones are named, and if nothing can be saved + the message says which field blocked it. Validator wording no longer reaches + the screen. +- A failed read on the nutrients page is no longer shown as "no data yet". + +### Contract + +- Share-link selection now publishes which leaves belong to which group and which + group is the sensitive one. The server always knew; a client that could not see + it had to withhold "select all" rather than risk sending psychometric scores in + a single tap. +- The dashboard snapshot schema declares three fields the route has been sending + all along. Because that schema is closed, a strictly generated client rejected + the real response. +- Rhythm events carry their own six-value classification, separate from the + three-value one on ECG rows. +- Six routes that clients consume were added to the published specification, + including sixteen skip reasons enumerated from the source rather than + transcribed. Three schemas were named in the specification's own prose while + never being emitted; all three are now published. + +### Operations + +- The optional worker in the bundled compose file inherited 14 of the app's 62 + environment variables, missing every mail, push and notification value. It is + the process that sends notifications, so a split deployment ran a worker that + silently sent nothing. Both services now share one definition. +- Bounded log rotation on both containers, dropped capabilities and a memory + limit on the app, with the reasoning recorded, including why the database gets + neither. +- Every nutrient ingest call is now recorded, not only the ones that stored a + row. The single durable trace used to be conditional on success, so a batch + that was entirely rejected looked exactly like a batch that never arrived. +- The build carries its own memory ceiling, so a local run, CI and the published + image all invoke it the same way. +- The self-hosting notes warn that a pinned image reference stays pinned, and name + the two checks that catch a deploy which reports success while serving the + previous release. + ## [1.34.2] — 2026-07-30 Point release. One workout that arrived more than once, and several surfaces diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index b3441a552..25fb37174 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.34.2 + version: 1.34.3 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 aaf6f6dc2..c993e4965 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.34.2", + "version": "1.34.3", "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 c247424d4..3f1789a63 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.34.2"; + /* @sw-version-fallback */ "v1.34.3"; 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/*`