github drkostas/hevy2garmin v0.11.0
0.11.0

2 hours ago

Deprecated

  • The Python dashboard is retired in 0.12.0. The Next.js dashboard in web/ is the deploy for every fork: set Root Directory to web on your Vercel project (Settings > General) before updating past 0.11.x. In 0.12.0 api/index.py, server.py, the templates and the root vercel.json routing are removed, so a project with an empty Root Directory stops deploying. The demo at hevy2garmin-demo.gkos.dev already runs the Next.js dashboard; the Python one stays at hevy2garmin-demo.vercel.app until 0.12.0.
  • The PyPI package is deprecated, with an end date of 2026-10-31. The CLI and the Python sync core keep working until then; after that date the package receives no releases and is marked deprecated on PyPI. The replacements are the Next.js dashboard for the app and the npm package hevy2garmin for the sync engine (same FIT generation, same exercise map, same dedup rules, Python-parity goldens in its tests). garmin-auth on PyPI follows the same date.

Changed

  • hevy2garmin 0.5.0 adds the exercise to muscle-group mapping and volume aggregation (getExerciseMuscles, aggregateMuscleVolumes, MUSCLE_LABELS, MUSCLE_HEX) that soma's web and app each kept a copy of (soma#841).
  • hevy2garmin 0.4.1 is 0.4.0 rebuilt from an empty dist/: 0.4.0 shipped stale compiled files that shadowed the sync engine's types. A prepack step now clears and rebuilds dist/ before every publish (#508).
  • hevy2garmin 0.4.0 adds matchHevyToGarmin and toUtcDate, the timestamp matcher soma used to keep as a local copy (soma#835).
  • The hevy2garmin-web Vercel project is now connected to this repository with Root Directory web, so every pull request builds a preview of the Next.js dashboard next to the Python one, and merges to main deploy it (#478). Until now the green Vercel check on a PR had only ever built the Python dashboard.
  • Coming next: hevy2garmin-demo.gkos.dev moves to the Next.js dashboard. The Python demo stays reachable for one more release at hevy2garmin-demo.vercel.app (#456).
  • The sync engine now lives in the hevy2garmin npm package (0.3.0): syncOneWorkout, listCandidates, reconcilePending, retryPending, the pure dedup helpers and generateDescription, behind a SyncStore interface and a GarminGateway. The web dashboard imports it and keeps only a Postgres SyncStore adapter and route glue, so soma and any other consumer run the same dedup and dry-run logic (#500).
  • The Next.js web dashboard in web/ is now the recommended Vercel deploy: set Root Directory to web when importing a fork, or change it in an existing project's settings and redeploy (#456). The Python dashboard keeps working for existing deployments (Root Directory empty) but no longer gets new features. Both read the same database and credential rows.

Added

  • Web dashboard: a fresh-fork CI check (install from the lockfile, build, answer with a bare environment), web/.env.example, and a README section (#462).
  • Web dashboard: the GitHub token can be saved in-app and the auto-sync GitHub Actions workflow is created from the dashboard, with the generated workflow tested against the Python generator's output (#463).
  • Web dashboard: H2G_SECRET and H2G_PASSWORD_HASH (argon2) work the same as in the Python dashboard (#464).
  • Web dashboard: pull the Garmin profile, sync all routines at once, /sync redirects to the dashboard, and a Playwright smoke test runs in CI (#465).
  • docs/CUTOVER.md, a runbook for moving a deployment to the web dashboard: the checks that gate the flip, the one Vercel setting that performs it, the one that reverses it, and the behaviour you inherit (#468, #469). It calls out that intervals.icu cleanup is Python-only, so INTERVALS_API_KEY goes inert and deleted watch duplicates stay on intervals.icu, and that sync_log is written only by the Python path, so its history panel shows a gap for any window the web path was live.

Fixed

  • Garmin credential rows written flat by the Python login are read by the web dashboard, and nested rows written by the web dashboard are read by the Python one; both self-heal on start (#463).
  • The web parity smoke covers all eight pages, not six, and checks each is reachable by clicking the nav rather than only by direct URL (#468).
  • The parity smoke runs on its own port instead of the one npm run dev uses, so it can no longer attach to a running dev server and test against that developer's .env.local and database (#468).
  • CI runs the mobile Playwright project as well as desktop. The two navs are separate markup, so a mobile-only regression previously merged green (#469).

Don't miss a new hevy2garmin release

NewReleases is sending notifications on new releases.