Highlights
Builds on the v1.4.35 rollup foundation. The aggregator hot paths now skip the legacy live COUNT/MIN/MAX/AVG query whenever every logged type has DAY-bucket coverage, daily chart fetches opt into reading from measurement_rollups, and the Insights feature extractor swaps raw measurements for the same bucket source — capping the prompt payload in the low hundreds of kB rather than double-digit MB for power users. The Insights page itself stops blocking the entire shell on /api/insights/comprehensive, so each section renders its own skeleton and fills in independently.
On top of the perf wave: chart slot heights pinned to kill Recharts' width=-1 height=-1 warning and the matching CLS, a tri-state trend annotation contract that ends the cold-mount "more data needed" flash, medication intake history restored on the detail page, About card folded into the Admin Console with an auto-checking update badge in place of the manual button, cumulative-metric tiles (Steps + four others) reading the day's running sum, and an IP-whois fallback that surfaces city + country when the carrier lookup misses.
Performance
- Heavy-aggregate skip on the rollup-fresh + fully-covered path in
comprehensive-aggregatorandsummaries-slicevia a per-type coverage probe. - Daily chart fetches opt into rollup buckets via
GET /api/measurements?aggregate=daily&source=rollup. /api/insights/targetscached in the analytics LRU (60 s TTL, per-user, evicted on mutation).- Insights page swaps the page-level
isLoadinggate for per-section early-skeleton paint.
AI
extractFeaturesreadsmeasurement_rollupsDAY buckets; hard 5 MBFEATURES_MAX_BYTESguard with two-step downgrade (drop raw → drop optional sections) before a 422 withinsights_payload_too_large.- Coach settings sheet gained medications + anthropometrics exclusion switches, mirrored onto a new
users.insights_exclude_metricscolumn so Coach and Insights share a single privacy contract. compactSectionsdrops empty data blocks from Coach and Insights prompts.
Charts + Insights UI
trends-row-chart-slotpinned toh-[140px]; Recharts width/height warning gone.ChartSkeletonmini variant matches the loaded chart's wrapper.TrendAnnotationtri-state contract (pending/needs_data/generated) ends the cold-mount and regenerate-in-flight empty-hint flash.
UX
<IntakeHistoryListV2>restored on the medication detail page; server-paginated, sortable, mounted for every medication kind.- Settings + Admin tab-strip scroll switched from
inline: "center"toinline: "start". - Steps, Active Energy, Walking/Running Distance, Flights Climbed and Time in Daylight tiles read the day's cumulative sum via
pickCumulativeDaySum. - Insights nav strict-gate flipped — types without measurements no longer appear in the strip.
- "Über HealthLog" moved into the Admin Console (
/admin/about); the public marketing/aboutpage is untouched. - Manual "Update prüfen" button retired in favour of a 44 px, focus-ringed,
aria-label-bearing auto-check badge. - IP-whois fallback surfaces city + country with "Carrier nicht verfügbar" / "Carrier unavailable" when the upstream ASN lookup misses.
Accessibility
- IntakeHistoryListV2 sort headers and pagination buttons clear the 44 px touch floor and carry
focus-visible:ring. - UpdateBadge ditto, with a real
aria-labelandsr-onlytag exposure.
Schema
- Additive
users.insights_exclude_metrics(String[] NOT NULL DEFAULT '{}'); migration0068_v1436_insights_exclude_metricsis idempotent under re-run.
Operator notes
- Coolify auto-deploys main on tag push (working since v1.4.34.2). The first webhook may pull a stale
:latest; trigger a redeploy after the docker-publish workflow completes if so. - Marc-account migration path is no-op: rollups are already populated, so the per-type coverage probe takes the rollup-fast path immediately.
- See
CHANGELOG.mdfor the full per-area breakdown including the carry-over backlog for v1.4.37.