From c4f2e0bc510bbb381ab1d9ea4c631c4a6ccdc47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 17 May 2026 23:13:20 +0200 Subject: [PATCH] chore(release): v1.4.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iOS v0.5.4 push-notification coordination — APNs category for med-reminder action-buttons + optional MOOD_REMINDER daily event. Additive only, migration 0069 idempotent. See CHANGELOG.md. --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d66784c9..b6d228448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,53 @@ # Changelog +## [1.4.38.1] — 2026-05-17 — iOS v0.5.4 push-notification coordination + +Coordinates the server side of the iOS v0.5.4 release. Two strictly +additive patches that unblock the new push-notification surface +without changing existing behaviour. + +### Added + +- **APNs category on med-reminder pushes.** `sendViaApns` now sets + `aps.category = "MEDICATION_REMINDER"` on every medication-reminder + payload so iOS renders the three action-buttons (Genommen / Snooze + 15 min / Übersprungen) wired up in iOS v0.5.3. `aps.mutable-content + = 1` is set by default so a future Notification Service Extension + can hook the payload without a server-side change. The med-reminder + metadata gains `scheduledAt` (ISO 8601) so the iOS "snooze 15 min" + action pins to the schedule slot rather than wall-clock delivery + time. +- **Optional `MOOD_REMINDER` daily event.** New per-user opt-in flag + (`users.mood_reminder_enabled`, default off) and a 15-minutely + worker cron that fires a single `MOOD_REMINDER` push at the user's + local 22:00 when no mood has been logged for the local date. + Idempotency anchored by the unique `(userId, date)` constraint on + the new `mood_reminder_dispatches` ledger — safe under cron + re-ticks inside the same 22:00 window and under concurrent workers. + Default-off via `EVENT_DEFAULT_ENABLED`; users who never opt in + see no behavioural change. + +### Compatibility + +- Older iOS builds that don't register the `MEDICATION_REMINDER` + category render the push as a plain alert (iOS ignores unknown + category identifiers). Backward-safe. +- `0069_v054_mood_reminder` migration uses `IF NOT EXISTS` + + `DO $$ ... EXCEPTION WHEN duplicate_object` guards mirroring the + idempotent pattern from `0061_audit_log_carrier` and + `0068_v1436_insights_exclude_metrics`. + +### Tests + +- Unit suite 4524 → 4565 (+41 new in `mood-reminder.test.ts` + + `apns.test.ts`). + +### Operator notes + +- Migration applies cleanly on deploy. No schema downtime. +- No env-var change. The cron entry is registered at worker boot. +- Coolify auto-deploys main on tag push. + ## [1.4.38] — 2026-05-17 — Robustness sweep, perf hotspots, full localization Closes the web punch-list before the v1.5 iOS sprint. The release diff --git a/package.json b/package.json index fbeb8ffa5..baf8fbd2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.4.38", + "version": "1.4.38.1", "description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.", "license": "AGPL-3.0-only", "homepage": "https://healthlog.dev",