From 8d5948ceb362ece58f3f02ade66e0902d768e807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 9 Aug 2026 01:55:42 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20v1.37.3=20=E2=80=94=20the=20i?= =?UTF-8?q?mmunization=20record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 +++++++++- docs/api/openapi.yaml | 2 +- package.json | 2 +- public/sw.js | 2 +- src/app/vaccinations/page.tsx | 2 +- src/components/layout/nav-model.ts | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eaf17ff3f..d43ea4b8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -## [Unreleased] +## [1.37.3] — 2026-08-09 + +### Added + +- An immunization record. A new Vaccinations module, switched on under Settings then Modules, keeps a lifetime Impfpass. Each dose sits under the disease it protects against, with its place in the series worked out on the server, so a combination shot appears under every component it covers. You add a dose by picking from a catalogue of around thirty entries, searched by disease or antigen name, or by typing it the way your pass reads; a date plus one of those two is all that is required, and the lot number, the injection site, the practice, a link to a visit and an encrypted note are each optional. Where the catalogue knows a schedule it shows it with its source, as information rather than advice. A dose that carries a booster interval offers a prefilled reminder you can edit or decline, and confirming it writes an ordinary preventive-care reminder that appears on the checkups page and moves itself forward when you log the next dose. A vaccination scan in the document vault can attach to its record, the record can link documents it already holds, and the doctor report gains an immunization section you can leave out. The module rides the record-sharing model, so a parent can keep a child's Impfpass under a managed profile. Six languages throughout, including the catalogue names, and never a brand name. ### Fixed @@ -24,6 +28,8 @@ one already made for you. - The write and manage descriptions on the invite form are one line each now, with the full detail behind the info icon instead of a wall of text. +- A preventive-care reminder set to the longest interval the engine allows no longer loses its next date when a dose is logged against it. The reminder now moves a full cycle forward instead of falling silent. +- The catalogue and practice pickers now carry a name for a screen reader; a control that only showed an icon was unnamed before. ## [1.37.2] — 2026-08-08 @@ -53,6 +59,8 @@ that day. It describes a connection between things you wrote down. It never claims a cause. + The rework this reading sits on grew from a concept Kai worked out in detail. Thanks, Kai. + Below fifteen days there is nothing at all. Between fifteen and thirty the page says how far along it is instead of guessing. Between thirty and sixty the comparison is there and is labelled as provisional. Where the days are diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index dabf15d07..eda74e0de 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.37.2 + version: 1.37.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 97cec2d6c..879ffa5c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.37.2", + "version": "1.37.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 d62c81e76..4a79ea477 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.37.1"; + /* @sw-version-fallback */ "v1.37.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/*` diff --git a/src/app/vaccinations/page.tsx b/src/app/vaccinations/page.tsx index dd7637c37..9fb2ae6a4 100644 --- a/src/app/vaccinations/page.tsx +++ b/src/app/vaccinations/page.tsx @@ -9,7 +9,7 @@ import { PageAuthGate } from "@/components/ui/page-auth-gate"; import { VaccinationsView } from "@/components/vaccinations/vaccinations-view"; /** - * v1.38.0 — the immunization log entry. + * v1.37.3: the immunization log entry. * * Gated on the resolved `modules.vaccinations` flag from `GET /api/auth/me`. * The module is default-on, so `=== false` is the only state that hides the diff --git a/src/components/layout/nav-model.ts b/src/components/layout/nav-model.ts index edf3d032e..cc3059dcb 100644 --- a/src/components/layout/nav-model.ts +++ b/src/components/layout/nav-model.ts @@ -194,7 +194,7 @@ export const NAV_DESTINATIONS: ReadonlyArray = [ tourId: "nav-illness", requiresModule: "illness", }, - // v1.38.0 — the immunization log sits in the clinical spine beside Illness. + // v1.37.3: the immunization log sits in the clinical spine beside Illness. // Born-gated: `requiresModule: "vaccinations"` reads the resolved module map, // so the entry is absent until the account keeps the module on (default-on — // it drops only when a user turns it off). SURFACE-gated: the `/api/vaccinations*`