Files
amethyst/docs
Claude 40ab7e6ed2 feat: build My Fitness from the whole training log, not just Health Connect
My Fitness was a Health Connect viewer: the dashboard was empty without the
permission, and it did not count workouts the user had logged in Amethyst's own
composer. The app asked you to record a workout and then ignored it.

The log is now built from both sources Amethyst can learn from — Health Connect
sessions, and the user's own published kind 1301 events (their manual entries,
and anything posted from another NIP-101e client). Neither source alone is the
truth: Health Connect cannot see a workout typed by hand or one posted
elsewhere, and cannot look past 30 days; the published events carry none of the
device detail.

The consequence that matters: My Fitness now works with no health permissions
at all. Health Connect became an enhancement rather than a gate — a banner over
a working dashboard instead of a wall in front of an empty one. That is also
the honest form of the Play declaration's argument, which the previous build
could not make: Health Connect enriches a tracking feature that exists on its
own rather than being that feature.

Where a workout appears in both — the usual case once someone shares one their
watch recorded — the Health Connect copy wins: it keeps the metrics the post
dropped and a recorded start time rather than a publish timestamp. Matching is
on activity type plus a 15-minute start window, wide because a published event
often carries only the minute the user typed. Matching on time alone would
swallow a genuine second session of a different activity, so the type must
agree.

A published workout with no start tag falls back to created_at. That is the
publish time, not the workout time, which is close enough for the day-level
buckets (streaks, active days, the week split) and is the only signal a manual
entry has.

17 new tests: the dedupe boundary in both directions, same-time-different-
activity, ordering, and the mapper's unit conversions (miles and feet land as
metres — otherwise every total is out by 1.6x) plus its zero-is-absent rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019egdJyBHnrATZHjs86up8f
2026-09-15 19:20:09 +00:00
..
2026-03-26 14:35:18 -04:00
2026-01-06 06:49:59 +02:00