diff --git a/CHANGELOG.md b/CHANGELOG.md
index c9f88dd99..ccb6a7da2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,19 @@
## [Unreleased]
-## [1.28.52] — 2026-07-16 — Dashboard tiles for more of what you already track
+## [1.28.53] — 2026-07-16 — A "Today" overview at the top of your dashboard
+
+The dashboard opens with a Today view: your health score, the day's lead read,
+and a short "worth a look" list — a dose window that's open, an integration to
+reconnect, a check-up coming due — each a single tap to the right place. The
+familiar tiles and charts sit just below, unchanged.
+
+It reads the insight that's already prepared overnight, so it loads instantly
+and never generates anything on open. When last night's sleep hasn't synced yet,
+it says so plainly and fills in the sleep-dependent parts once the data arrives,
+rather than showing a stale or empty score. This is the first piece of a single
+daily view that later surfaces — a morning refresh, an optional daily note —
+will all build on.
The dashboard gains tiles for readings that were synced and charted but never
had a place on the home strip: heart-rate variability, blood oxygen, breathing
diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml
index 84b94a40d..aec0e879c 100644
--- a/docs/api/openapi.yaml
+++ b/docs/api/openapi.yaml
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: HealthLog API
- version: 1.28.52
+ version: 1.28.53
description: >-
Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest.
diff --git a/package.json b/package.json
index e3340ba20..2763172e0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "healthlog",
- "version": "1.28.52",
+ "version": "1.28.53",
"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",
diff --git a/public/sw.js b/public/sw.js
index e55614a3e..5bcf17e98 100644
--- a/public/sw.js
+++ b/public/sw.js
@@ -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.28.52";
+ /* @sw-version-fallback */ "v1.28.53";
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/*`
diff --git a/src/app/page-client.tsx b/src/app/page-client.tsx
index d358a5a6c..e6300180e 100644
--- a/src/app/page-client.tsx
+++ b/src/app/page-client.tsx
@@ -799,7 +799,12 @@ export default function DashboardPageClient() {
) : null)}
+ {/* The digest-driven TodayHero owns the promoted hero slot whenever
+ Insights is on (Marc sign-off, decision 1). The legacy opt-in
+ DashboardHero only shows for an Insights-disabled account, so the two
+ heroes never stack. */}
{heroVisible &&
+ !insightsEnabled &&
(primaryLoading || !heroSnapshot ? (
) : (