github MBombeck/HealthLog v1.4.33
v1.4.33 — polish and reliability

latest releases: v1.4.34.5, v1.4.34.4, v1.4.34.3...
6 hours ago

Quality-leap release between two HealthKit milestones. The headline is a P0 hotfix for the /api/analytics 500 that broke the Insights mother page for any account with more than a few thousand measurements: the six per-metric status helpers were spreading the entire numeric history into Math.min / Math.max, which trips a stack overflow once a single argument list exceeds the V8 spread cap. Both the surfaced symptom and the latent risk in five sibling helpers were folded onto a reduce-based min/max path.

Around that hotfix landed a deep polish pass: the Insights mother page now defers three below-the-fold blocks behind next/dynamic to trim the cold mount cost, the analytics endpoint gained a ?slice=summaries slim slice that the per-metric sub-pages now ride, the Coach snapshot builder picked up a 60 s LRU keyed on (userId, scope), the Settings shell consolidated three duplicate copies of the about / notifications / about-dropdown surfaces, the navigation strip dropped a redundant "Home" group label and a colliding "Notifications" sibling, every icon-only button on the medications and admin surfaces gained an accessible name, every Progress bar gained one too, three pages had their heading hierarchy repaired to a sequential h1 → h2 → h3, the mobile Coach FAB now hides while a chart tooltip is open so it cannot occlude the read-out, and the auth shell normalised every authenticated route to a single max-w-screen-xl container.

Also lands the Apple App Site Association handler at /.well-known/apple-app-site-association on every host that fronts the app, advertising the iOS bundle's App ID prefix (S8WDX4W5KX.dev.healthlog.app) under webcredentials.apps so the passkey ceremony shares cleanly between the web origin and the iOS app.

The release closes nineteen issues from a five-surface audit + a runtime bug-hunt pass, plus six follow-up tracks of polish across the affected surfaces.

Added

  • Slim /api/analytics?slice=summaries slice for per-metric sub-pages, dropping correlations / health-score / medications blocks for roughly half the cold-mount response on those routes.
  • useScrollResetOnRoute() hook as the single source of truth for route-change scroll-to-top behaviour.
  • <SettingsCardHeader> primitive extracted from three near-duplicate copies inside the Settings shell.
  • Apple App Site Association handler answering 200 with application/json on every host that fronts the app, so the passkey ceremony shares cleanly between web origin and iOS app.

Changed

  • Insights mother page defers daily briefing, correlation row, and trends row behind next/dynamic with matching skeleton fallbacks; above-the-fold hero stays an eager import.
  • "Notifications" settings section renamed to "Notification channels" so it no longer collides with the inbox at /notifications.
  • German "KI-Auswertungen" label became "Auswertungen" per the long-standing rule that user-facing surfaces drop the model-vendor prefix.
  • Insights tab strip regrouped by metric category (vitals / cardiovascular / activity / wellbeing).
  • About section folded into the user-card dropdown; route /settings/about still resolves for direct links.
  • Auth shell container width normalised to a single max-w-screen-xl across every authenticated route.
  • Card defaults normalised to p-4 md:p-6 so mobile + desktop spacing stay in lock step.

Fixed

  • /api/analytics 500 (P0). Stack overflow from Math.min(...values) / Math.max(...values) spreads on long histories; hotfixed on the surfaced helper and folded across six sibling status helpers.
  • Spotlight onboarding tour intercepting dashboard clicks via overlay z-index + pointer-events combo.
  • BP chart Y-axis unit read "Hg" instead of "mmHg".
  • Bottom-nav viewport overlap on shorter viewports.
  • /insights/puls subtitle read "Ruhepuls" instead of "Puls".
  • Weight chart duplicate Y-axis ticks on narrow domains.
  • Web-vitals beacon self-throttling at full sample rate; dropped to 10%.
  • Medication compliance classifier flushing every dose to very_late when the dose-window estimator can't resolve a window.
  • /api/insights/generate POST returning 500 instead of refusing cleanly on a disabled master flag.
  • Mood Log overflow on narrow viewports.
  • Header username contrast on the dark theme.
  • Mobile bottom-nav clipping its second row on the smallest viewport.
  • Threshold-toggle parity in Settings (now reflects server-side state on mount).
  • Notifications section redundancy collapsed onto one surface.
  • Coach-rail labels promoted to semantic <h3> headings.
  • Non-sequential heading order repaired on three surfaces.
  • Icon-only buttons on the medications page + admin feedback inbox + reminders surface gained accessible names.
  • Every <Progress> instance gained an accessible name.
  • Button loader CLS eliminated by reserving loader space.
  • Mobile Coach FAB auto-hides while any chart tooltip is open.
  • Settings mobile section strip scroll-snap so the active pill always lands on the leading edge.
  • Passkey card no longer clips its internal grid on the tablet breakpoint.
  • Sidebar "Home" group label dropped; the four nav entries live at the top level.

Performance

  • Coach snapshot builder LRU cache (60 s TTL, keyed on (userId, scope)).
  • Assistant flags memoised per request instead of re-running per surface mount.
  • Web-vitals sample rate dropped to 10% so the beacon doesn't self-throttle.

Refactor

  • Six per-metric status helpers moved from spread to reduce-based min/max, retiring the latent stack-overflow path.
  • Seven per-page scroll-reset useEffect duplicates retired behind useScrollResetOnRoute().
  • Three Settings card-header duplicates retired behind <SettingsCardHeader>.

Accessibility

  • Icon-only buttons named on medications + admin feedback inbox + admin reminders.
  • Progress bars named across the app.
  • Heading order repaired on three surfaces.
  • Coach rail labels promoted to semantic <h3> headings.

Don't miss a new HealthLog release

NewReleases is sending notifications on new releases.