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 towebon your Vercel project (Settings > General) before updating past 0.11.x. In 0.12.0api/index.py,server.py, the templates and the rootvercel.jsonrouting are removed, so a project with an empty Root Directory stops deploying. The demo athevy2garmin-demo.gkos.devalready runs the Next.js dashboard; the Python one stays athevy2garmin-demo.vercel.appuntil 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
hevy2garminfor the sync engine (same FIT generation, same exercise map, same dedup rules, Python-parity goldens in its tests).garmin-authon PyPI follows the same date.
Changed
hevy2garmin0.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).hevy2garmin0.4.1 is 0.4.0 rebuilt from an emptydist/: 0.4.0 shipped stale compiled files that shadowed the sync engine's types. Aprepackstep now clears and rebuildsdist/before every publish (#508).hevy2garmin0.4.0 addsmatchHevyToGarminandtoUtcDate, the timestamp matcher soma used to keep as a local copy (soma#835).- The
hevy2garmin-webVercel project is now connected to this repository with Root Directoryweb, so every pull request builds a preview of the Next.js dashboard next to the Python one, and merges tomaindeploy it (#478). Until now the green Vercel check on a PR had only ever built the Python dashboard. - Coming next:
hevy2garmin-demo.gkos.devmoves to the Next.js dashboard. The Python demo stays reachable for one more release athevy2garmin-demo.vercel.app(#456). - The sync engine now lives in the
hevy2garminnpm package (0.3.0):syncOneWorkout,listCandidates,reconcilePending,retryPending, the pure dedup helpers andgenerateDescription, behind aSyncStoreinterface and aGarminGateway. The web dashboard imports it and keeps only a PostgresSyncStoreadapter 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 towebwhen 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_SECRETandH2G_PASSWORD_HASH(argon2) work the same as in the Python dashboard (#464). - Web dashboard: pull the Garmin profile, sync all routines at once,
/syncredirects 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, soINTERVALS_API_KEYgoes inert and deleted watch duplicates stay on intervals.icu, and thatsync_logis 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 devuses, so it can no longer attach to a running dev server and test against that developer's.env.localand 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).