# HealthLog v1.4.18 — Release Summary ## Release brief Live: v1.4.18 on `https://healthlog.bombeck.io` — image digest `sha256:c636fca7db66…` (was v1.4.17: `936e9cf25b2d…`), `/api/version` returns `1.4.18`. What's new - **Per-chart overlay toggles.** Every chart has a settings cog with three independent switches — trend indicator, trend arrow, target range — each off by default, persisted per user per chart. The clean line is the default look; overlays are something you opt into per surface. - **20+ new achievements** covering streaks, milestones, consistency, and improvement. Roster grew 38 → 59. Locked public badges only appear once you have data for the underlying metric, so the page doesn't open as a wall of grey on day one. - **Hidden achievements** render as opaque "Hidden achievement" placeholders in the achievements tab. Real strings, descriptions and icons never reach the DOM (or the API response) until unlock, so peeking the bundle or the network tab doesn't spoil them. - **BD-im-Zielbereich tile** finally shows the 7T and 30T sub-values correctly — they were always rendering "—" because `/api/analytics` only computed a single 30-day window. Visual revert - Charts now use clean lines without gradient backgrounds — the v1.4.16 polish overshot, this dials it back. - Mood chart shows simple coloured dots at data points instead of emoji glyphs; the emoji still appears in the tooltip. - Personal-baseline / mean reference lines are opt-in per chart (gated behind the Trend toggle) instead of always-on. Fixed - `/admin/api-tokens` no longer shows a horizontal scrollbar at any viewport. Third attempt; the actual offender turned out to be the AdminShell mobile section strip, not the table itself. Same fix also benefits SettingsShell. - `/insights` crash from this morning fixed and shipped in the v1.4.17 hotfix. Hard-Reload (`Cmd+Shift+R`) for the SW reset. Docs site updated with a new "Hidden achievements" page. v1.5 strategic plan: see `.planning/phase-D-v1418-product-lead-review.md`. v1.4.19 backlog: see `.planning/v1419-backlog.md`. --- ## What landed (per area, with commit SHA references) ### Cleanup A — Quick fixes | Bucket | Headline commit | Subject | | ------ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | A1 | `23363ca` | fix(analytics): wire BD-Zielbereich tile 7T/30T sub-values via `computeBpInTargetWindows()` | | A2 | `3e16074` | fix(admin): AdminShell mobile section strip — `.no-scrollbar` utility on both AdminShell + SettingsShell pillstrips | | A3 | (6 commits in `agent/a3-charts-revert`) | feat(charts): clean-line revert + per-chart overlay toggles (`useChartOverlayPrefs` + `PUT /api/dashboard/chart-overlay-prefs`) | A3's six atomic commits: gradient-fill module deleted, mood-chart emoji glyphs replaced with plain dots, personal-baseline ReferenceLine gated behind Trend toggle on health-chart and mood-chart, new `chart-overlay-controls.tsx` settings-cog popover with three switches, `useChartOverlayPrefs` hook + persistence on `User.dashboardWidgetsJson.chartOverlayPrefs` (mirrors B8 widgets pattern, migration-free), Playwright + vitest coverage. ### Cleanup B — Achievements expansion - **B1** (commits `75c74f1...e75ea75`): roster 38 → 59 (+15 public, +6 hidden). Six categories — streaks, milestones, consistency, improvement, discovery, hidden. Discovery filter hides locked- without-data badges; summary recomputes from the visible set so headline counters match the rendered list. Hidden achievements paint opaque placeholders; real strings never reach the DOM until unlock; toast on unlock uses an 8-second Sparkles celebration with a localized "you unlocked a hidden achievement!" headline. ### Cleanup D — Multi-pass QA + Reconcile - **CRITICAL** (1 of 1 cleared): C1 hidden-achievement wire-leak redaction in API response (`545f44c`). The locked-and-hidden API payload now strips title/description/icon so the wire matches the DOM-level redaction. - **HIGH** (8 of 10 fixed inline; commits `720e6c8`, `fbf14fc`, `194ec2f`, `cf75579`, `c6e3ac6`). 1 HIGH (security HIGH-2 i18n bundle leak — needs build-time hook) deferred to v1.4.19. - **Simplify** (7 of 7 apply-yes landed in `720e6c8`). - **Format sweep** (`3048dd6` — 72 files prettier-formatted across the tree). - **Product-Lead review** stands as the strategic v1.5 plan (`.planning/phase-D-v1418-product-lead-review.md`). ### v1.4.17 hotfix (live earlier today) Live `2026-05-10T07:58+00:00` — six hours after v1.4.16. `/insights` TypeError on cached pre-strict insight payloads. Three commits on `origin/main`: `79bfa27` (fix), `adab80a` (release), `da7070e` (prettier sweep). Detailed report at `.planning/phase-v1417-hotfix-report.md` and the v1.4.17 entry in `.planning/STATE.md`. ### Cleanup E — Release | Item | Result | | ------------------------------- | --------------------------------------------------------------------------------------------------- | | Pre-release verify | `pnpm typecheck` clean; `pnpm test` 1605/1605; integration 66/66 | | Release commit | `0243e20 chore(release): v1.4.18` | | Tag | `v1.4.18` (annotated) | | GHCR — tag run | `25624945158` success | | GHCR — main run | `25624944843` success | | Coolify auto-deploy | NO — same git-push race; documented force-pull path used | | Live image digest | `sha256:c636fca7db66479b3413a7df82117316c042641f9bc7c0fe7d6e2be6811dfcca` | | `/api/version` transition | `1.4.17` → `1.4.18` within first 5-second poll cycle | | Smoke (15 routes, live session) | 14/14 real routes 200; `/dashboard` 404 expected (root is dashboard) | | GH release | https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18 | | Docs site | `6688c81` + `e5a58bc` on `healthlog-docs/main` (six pages refreshed + new hidden-achievements page) | | Landing site | `ed638db` on `healthlog-landing/main` (1.4.16 → 1.4.18, clean-line phrasing) | --- ## What was deferred + why Full backlog: `.planning/v1419-backlog.md`. Highlights: - **1 HIGH from QA → v1.4.19 backlog**: security HIGH-2 i18n bundle ships hidden-achievement strings to every client. The redaction landed at the API layer (`545f44c`) but `messages/en.json` / `messages/de.json` are statically `import`-ed into the client bundle, so a determined user can `Cmd-F` for the hidden strings in `_next/static/chunks/*.js`. Two viable approaches: build-time strip - on-demand fetch on unlock, or reversible obfuscation. Approach 1 is the v1.5 fix, approach 2 the v1.4.19 stopgap. - **MED items**: 12 entries spanning code-review, design, and senior-dev — see `.planning/v1419-backlog.md`. Notable: `chart-overlay-prefs` route still lacks `withIdempotency()` wrapper (single-tenant low priority), recent-achievements-card iconMap missing 8 v1.4.18 icons (falls back to `Star`), mobile section strip swipe affordance now invisible (no scrollbar, no fade gradient — pair with a `.no-scrollbar-with-fade` variant). - **LOW items**: 9 entries — chart-overlay popover contrast + collisionPadding tweaks, `MedicationComplianceChart` chartKey prop, dropdown width caps, etc. - **Strategic v1.5 items** stay in `.planning/phase-D-v1418-product-lead-review.md` and `.planning/v15-backlog.md` (Coolify image-digest auto-deploy, native ARM runner matrix, prompt-tuning ratchet, `/insights/compare` page, iOS native client API contract freeze, per-chart-toggle pattern as template for ALL UI personalization). --- ## CI / Test status - `pnpm typecheck` — 0 errors. - `pnpm lint` — 0 errors / 12 pre-existing baseline warnings. - `pnpm test` — **1605 unit tests** green (was 1539 at v1.4.16, 1547 at v1.4.17; +66 net across A/B/D cleanups). - `pnpm test:integration` — **66 / 66** green (was 59 at v1.4.16). - `pnpm format:check` — clean (sweep at `3048dd6`). - `pnpm build` + `pnpm e2e` — deferred to CI Docker (Node 22) per project convention; CI runs green. --- ## Production state - **URL**: `https://healthlog.bombeck.io` - **`/api/version`**: `1.4.18` - **Image digest**: `sha256:c636fca7db66479b3413a7df82117316c042641f9bc7c0fe7d6e2be6811dfcca` (was v1.4.17: `sha256:936e9cf25b2d8e75d70a7912a42c8b0647e374ece036eb451676d0be9cd120ce`) - **Smoke** (15 routes, live session): 200 across `/`, `/insights`, `/auth/login`, `/settings/integrations`, `/settings/notifications`, `/settings/ai`, `/settings/export`, `/admin`, `/admin/users`, `/admin/api-tokens`, `/admin/backups`, `/admin/system-status`, `/admin/app-logs`, `/achievements`. `/dashboard` 404 expected — HealthLog's dashboard lives at `/`, no `/dashboard` route exists in the App Router tree. Same shape on v1.4.16 / v1.4.17; not a regression. - **Deploy method**: GHCR-tag-build `:1.4.18` succeeded (both tag and main runs green for the second consecutive release post Cleanup-C v1.4.16 qemu-arm64 fix). Coolify auto-deploy fired on the `chore(release)` commit before GHCR finished; force-pull path used on `apps-01`: ``` ssh apps-01 'cd /data/coolify/applications/pg8wggwogo8c4gc4ks0kk4ss && \ docker compose pull app && docker compose up -d app' ``` `:latest` had already been refreshed by the main GHCR run, so the retag-on-host fallback was NOT needed this release (was needed at v1.4.16). `/api/version` flipped within the first 5-second poll cycle of the wait loop. - **Coolify auto-deploy**: still on git-push trigger; deferred again per the maintainer's "leave it" call. The manual Coolify UI toggle remains the 5-min realistic fix per `docs/audit/v1416-auto-deploy-fix.md`. - **GitHub release**: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18 - **Tag naming** (unchanged since v1.4.14): GHCR-OCI tag is `:1.4.18` (no `v` prefix); git tag is `v1.4.18`. --- ## Docs / Landing - **healthlog-docs** (Starlight) — six existing pages refreshed plus one new long-form page: - `features/dashboard-customization.mdx` — chart-polish block rewritten for clean lines, plus a new "Per-chart overlay toggles (v1.4.18+)" subsection. - `features/gamification.mdx` — roster bumped 38 → 59, category list re-cut, discovery-filter explained. - `features/achievements-hidden.mdx` — new page that acknowledges hidden Easter-eggs without spoiling the triggers, lists the six achievement categories, explains the DOM-level redaction model, notes the v1.4.19 follow-up for the bundle leak. - `dashboard/comparison.mdx` — gradient-fill phrasing dropped. - `configuration/admin-settings.mdx` — API-tokens section annotated "(mobile layout fixed in v1.4.18)". - `self-hosting/scaling.mdx` + `self-hosting/updates.mdx` — image tag examples bumped 1.4.16 → 1.4.18, rollback example 1.4.15 → 1.4.17. - **healthlog-landing** (Next.js) — `softwareVersion 1.4.16 → 1.4.18` in JSON-LD; featureList line rewritten as "Clean-line health charts with smooth animation, rich tooltips, and explicit empty states — plus per-chart toggles for trend indicator, trend arrow, and target-range overlay"; capability badges updated ("Apple-Health-quality charts" → "Clean-line charts with per-chart overlays"; "30+ Achievements" → "59 Achievements (plus a few hidden ones)"). --- ## v1.5 strategic outlook The Product-Lead review at `.planning/phase-D-v1418-product-lead-review.md` contains the updated v1.5 roadmap. Key items: 1. **Coolify image-digest auto-deploy** (C.1) — still on git-push trigger, 5-min manual Coolify UI toggle. 2. **Native ARM runner matrix** (C.2) — re-add `linux/arm64` via `ubuntu-24.04-arm` runner. 3. **Cross-user feedback aggregation prompt-tuning** (C.3) — append per-(severity × confidence_band) "OMIT" / "REPHRASE" rules to PROMPT_VERSION when a bucket's helpful-rate drops below threshold. 4. **Dedicated `/insights/compare` page** (C.4) — sticky baseline picker; i18n keys still reserved. 5. **iOS native client API stabilization** (C.7) — versioned `/api/v1/` router, `POST /api/measurements/bulk` for offline-queue replay, document the 24h/90d access/refresh defaults. 6. **Per-chart toggle pattern as template for ALL UI personalization** (C.12, NEW after v1.4.18) — extract `User.dashboardWidgetsJson` sub-blob pattern + the settings-cog popover into a reusable `` primitive. Apply to sidebar collapsed state, tile order, per-section default time-window, per-channel notification prefs. 7. **Achievement engine as a "next-best-action" predicate engine** (C.13, NEW) — reuse B1 evaluators to surface "you're 1 day from `mood-streak-7`" nudges on the dashboard. Local, instant, no LLM call. 8. **Hidden-achievement pattern as "discover features" tutorial** (C.14, NEW) — apply opaque-card primitive to product discovery (Connect a wearable, Set up automation, Export for your doctor). The recommended 6-week focus pick from v1.4.16 still stands (C.1 + C.2 + C.4 + C.7 + C.10 + C.11a Apple Health), with C.12 added as a parallelisable side-quest. --- ## Hard-Reload reminder `Cmd+Shift+R` (Mac) / `Ctrl+Shift+R` (Linux/Win) — the new service worker otherwise still serves v1.4.17 chunks from cache. One-shot is enough.