chore(release): v1.35.3 — an ECG arrives on its own, and only once

Apple Watch ECG recordings reach the record straight from the app instead of
only through an export archive. One recording per request, gated by the same
switches that already govern reading them.

A recording is now identified by what it is rather than by what a source calls
it, so the same strip arriving through both doors converges on one row. The
migration that adds the constraint resolves the duplicates already stored: it
keeps the row holding the waveform over one holding only a verdict, and moves a
removed row's event link onto the row that is kept. The losing rows are deleted.
This commit is contained in:
Marc-André Bombeck committed 2026-08-01 19:54:08 +02:00
1 parent 3b37d73f31
commit ffe5545032
4 files changed
+33 -3

No files matched your search

+30
View File
@@ -2,6 +2,36 @@
## [Unreleased]
## [1.35.3] — 2026-08-01
### Added
- Apple Watch ECG recordings can now be sent directly by the iOS app, through a
new endpoint at `POST /api/insights/ecg`, instead of only arriving inside an
export archive. One recording travels per request, and the endpoint is gated
by the same module and status switches that already govern reading ECGs, so an
account with the surface switched off is unaffected.
### Changed
- A recording carries its own identity, so sending the same one again resolves
to the same record. A strip that arrives once inside an export archive and
again from the app ends up as a single entry rather than a duplicate or an
error.
### Migration
- This release removes duplicate ECG recordings. An existing database can hold
more than one row for the same recording, because the export archive and a
live client name the same strip differently. A uniqueness rule now prevents
that, and the migration resolves what is already stored before applying it.
Where two rows describe the same recording, it keeps the one holding the actual
waveform over one holding only a verdict, and it carries a removed row's link
to its rhythm event onto the row that is kept, so resolving a duplicate never
costs the recording its place in the timeline. Rows that lose are deleted, and
they cannot be recovered. Back up the database before deploying if that matters
for your instance.
## [1.35.2] — 2026-08-01
### Added
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: HealthLog API
version: 1.35.2
version: 1.35.3
description: >-
Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest.
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "healthlog",
"version": "1.35.2",
"version": "1.35.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",
+1 -1
View File
@@ -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.35.2";
/* @sw-version-fallback */ "v1.35.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/*`