First public surface wave for the HealthKit Tier 1 metrics that
the iOS contributor brief locked in for v1.5. The headline item
is a workouts flow that lands end-to-end on the web: a list page
at /insights/workouts, a detail page with route preview and
summary stats, and a dashboard tile that surfaces the three most
recent sessions. Alongside the workouts surface arrives a family
of five new metric sub-pages — HRV, resting heart rate, blood
oxygen, body temperature, and active energy — each carried by a
shared scaffold so adding the next HealthKit metric is a four-line
page module. The release also cleans up two latent issues uncovered
during the wave-A audit: the workouts list endpoint had a Prisma
field-name bug that would have produced a 500 the moment a real
client called it, and HRV plus resting heart rate were sitting
in the vitals insight bucket where they did not belong.
Added
- Workouts API.
GET /api/workoutsreturns a paginated list
shaped to the iOS contract (distanceM,activeEnergyKcal,
avgHr,maxHr) using the v1.4.30 canonical-row picker;
GET /api/workouts/{id}returns a single workout with the same
field shape. Both endpoints honourrequireAuth()and respect
the existing per-user isolation guarantees. /insights/workoutslist page. Browsable workout archive
with newest-first ordering, type-filter pills, and an
Apple-Health-onboarding hint when the list is empty./insights/workouts/[id]detail page. Per-workout view
with summary tiles (duration, distance, energy, average and
max heart rate), an inline-SVG route preview when GPS samples
are present, and a graceful-unavailable notice for per-second
HR samples.- Dashboard recent-workouts tile. New widget id
recentWorkoutsdefaults to visible and surfaces the three
most recent sessions on the home page. Self-gates on a
non-empty list and renders an Apple-Health-onboarding hint
otherwise. - Five HealthKit metric sub-pages. New pages at
/insights/hrv,/insights/ruhepuls,/insights/sauerstoffsaettigung,
/insights/koerpertemperatur, and/insights/aktive-energie,
each rendered through the shared<HealthKitMetricPage>
scaffold with its own chart-cog popover state slot. Body
temperature surfaces the existing manual-entry CTA; the other
four intentionally render their empty state without a primary
action because the Apple Health / Withings ingest is the only
path for those metrics. - Insights tab-strip pills. Six new pills (workouts plus the
five HealthKit metrics) join the strip and self-gate on data
presence, so brand-new accounts still see the seven pre-existing
pills only.
Changed
- HRV + resting HR realigned to the cardiovascular bucket.
Both metrics moved out ofvitalsintocardiovascularto
match the iOS handoff brief's category table. The insight
bucket map, the per-metric status card grouping, and the
comprehensive narration all read the new placement; no client
contract changes because the bucket only drives in-app
grouping.
Fixed
- Latent 500 on workouts list endpoint. The list query
referenced two non-existent Prisma columns (distanceMeters
andenergyKcal); tests mocked Prisma withas neverso the
bug never surfaced in CI. The endpoint now uses the v1.4.30
pickCanonicalWorkoutRows()helper and projects the iOS
contract field shape end-to-end.