garmin-hevy-sync

Garmin heart rate and Hevy sets in one workout.

garmin-hevy-sync copies workouts, routines and weigh-ins between a Garmin watch and Hevy, in both directions. It runs in the background on your own computer every 30 minutes, on Linux, macOS, Windows or Docker.

curl -LsSf https://danieltyukov.github.io/garmin-hevy-sync/install.sh | sh

Installs uv if it is missing (uv brings its own Python 3.12), installs the tool, then starts the setup wizard. You can read install.sh first.

powershell -ExecutionPolicy ByPass -c "irm https://danieltyukov.github.io/garmin-hevy-sync/install.ps1 | iex"

Run it in PowerShell. Installs uv if it is missing, installs the tool, then starts the setup wizard. You can read install.ps1 first.

git clone https://github.com/danieltyukov/garmin-hevy-sync && cd garmin-hevy-sync && docker compose run --rm garmin-hevy-sync setup && docker compose up -d

Runs setup once in a temporary container, then starts a container that keeps syncing.

uv tool install git+https://github.com/danieltyukov/garmin-hevy-sync && garmin-hevy-sync setup

For machines that already have uv.

Needs Hevy Pro and a Garmin watch that records Strength activities. Version 0.2.0, MIT license.

Half a workout in each app

You start a Strength activity on the watch to get real heart rate and training load. Then you log the actual sets in Hevy on your phone, because typing reps on a watch is slow. Garmin and Hevy have no official integration, so each app ends up holding half of the session.

Recorded by the watch

  • Heart rate
  • Training load and training effect
  • Calories and set timing
  • Weigh-ins

Logged in Hevy

  • Exercise names
  • Reps and weights
  • Routines
  • Body measurements

After a sync, the Garmin activity holds the Hevy sets next to the heart rate the watch recorded. Sessions you only recorded on the watch show up in Hevy, and so do your Garmin weigh-ins.

Five flows, every 30 minutes

Each run goes through five flows in a fixed order. A and C use hevy2garmin, a community project. B, D and E are part of this project.

The five flows between Hevy and Garmin Connect Flow A sends Hevy workouts to Garmin strength activities, merged into the watch recording. Flow B sends watch-only strength activities back to Hevy workouts. Flow C sends Hevy routines to Garmin planned workouts. Flow D sends Garmin weigh-ins to Hevy body measurements. Flow E repairs exercise names on Garmin strength activities. Hevy Garmin Connect Workouts Strength activities Routines Planned workouts Body measurements Weigh-ins Sets merged into the watch recording Watch-only sessions Exercise names repaired Routines to follow on the watch Weight entries from the past year A B C D E The five flows between Hevy and Garmin Connect Flow A sends Hevy workouts to Garmin strength activities, merged into the watch recording. Flow B sends watch-only strength activities back to Hevy workouts. Flow C sends Hevy routines to Garmin planned workouts. Flow D sends Garmin weigh-ins to Hevy body measurements. Flow E repairs exercise names on Garmin strength activities. Hevy Garmin Connect Workouts Strength activities Routines Planned workouts Body measurements Weigh-ins A B C D E
Green arrows write to Garmin. Amber arrows write to Hevy.
  1. A
    Hevy workouts to Garmin activities. When the watch recorded the same session, the sets, reps and weights are merged into that recording. Garmin keeps the real heart rate and calories and does not gain a second, empty activity.
  2. C
    Hevy routines to Garmin planned workouts, so you can follow them on the watch.
  3. B
    Watch-only sessions to Hevy workouts. For strength sessions with no Hevy log to merge into. Garmin exercise names are matched to Hevy exercises, and anything without a confident match is named in the workout description instead of being dropped.
  4. D
    Garmin weigh-ins to Hevy body measurements. It looks back a year, because weigh-ins are irregular.
  5. E
    Exercise name repair. Fixes sets that show as “Choose an Exercise” in Garmin Connect. How that works.

Why the order matters

A runs before B. By the time B looks at Garmin, a session that started in Hevy already has its Hevy counterpart, so B skips it and nothing is imported twice. E runs last because it reads back what A wrote.

Loop prevention

A two-way sync without guards would copy the same workout back and forth. Four checks stop that:

Pairing ledger
B skips any Garmin activity that hevy2garmin has already paired with a Hevy workout, including sessions logged in Hevy hours later on the same day.
Overlap window
B skips any Garmin activity that starts within 45 minutes of an existing Hevy workout, or overlaps one in time. It also waits three hours after a session ends before importing it. This covers the gap before A records its pairing.
Cross-marking
When B creates a Hevy workout, it writes the pairing into hevy2garmin's ledger, so A never pushes it back to Garmin.
Local ledger
Every activity B has imported or skipped is recorded. Only failures are retried.

Exercise names that show up in Garmin

Merging Hevy sets into a watch recording used to leave every set reading “Choose an Exercise”, with a blank muscle map. The names were stored correctly. Garmin Connect ignored them because each set said it had been identified with zero confidence.

Garmin Connect set table for a merged strength activity. All eight sets show the placeholder Choose an Exercise. The same eight sets after flow E: five sets of Pistol Squat and three sets of Lunge.
The same eight sets in Garmin Connect, before and after the repair.

Garmin's rep counting stores how sure it was about each movement. Sets pushed in from outside carried a value of 0.0, which Garmin Connect reads as “nothing identified”, even when the name next to it is correct:

{
  "category": "SQUAT",
  "name": "PISTOL_SQUAT",
  "probability": 0.0
}

Flow E restates the same sets at full confidence and changes nothing else. It only touches active sets that have a real category at zero confidence, so sets the watch detected itself are left alone. hevy2garmin 0.12 now does this for new merges. Flow E repairs activities merged before that.

Garmin Connect muscle map, front and back views, with quadriceps, glutes and calves marked as primary muscles and hamstrings as secondary.
Once the names resolve, the muscle map fills in too.

Runs in the background

The installer ends by starting garmin-hevy-sync setup, which asks for what it needs and then turns on the schedule:

  1. Hevy API key. Copy it from hevy.com/settings?developer. The API needs Hevy Pro.
  2. Garmin sign-in. Your email, password and the code Garmin emails you, once. The password is not stored, only tokens that refresh themselves.
  3. Body stats. Optional. They make the calorie estimates more accurate.
  4. Schedule. Setup turns on the background run, every 30 minutes from then on.
How the schedule runs on each system
SystemHow it runs
LinuxA systemd user timer, or cron where systemd is not available
macOSA launchd agent
WindowsA Task Scheduler task that runs without opening a window
DockerThe container repeats the sync on its own

Runs missed while the computer was asleep or off are caught up. To change the schedule yourself, use garmin-hevy-sync schedule install, remove or status.

Commands

gh-sync is a shorter alias for garmin-hevy-sync.

setup
Run the setup wizard again.
login
Sign in to Garmin again, for example after the sign-in expired.
sync
Run the flows now. --dry-run reports what would change without writing anything, --flows a b runs only those flows, and --every 30m keeps repeating.
status
Show what has been synced and the last run's summary.
doctor
Check both accounts and list your devices and recent activities.
logs
Show the log. Add -f to follow it.
unmapped
List Garmin exercises that have no confident Hevy match.
push-to-watch
Send planned workouts to the watch now.
schedule
install, remove or status for the background schedule.
--version
Print the installed version.

Privacy and safety

  • It runs on your computer. Nothing leaves it except requests to Hevy and Garmin.
  • Your Garmin password is used once, to sign in, and is not saved. The sign-in leaves refreshable tokens in ~/.garminconnect.
  • The Hevy API key and settings live in one folder for your user account. Set GH_SYNC_HOME to use a different one.
    Linux
    ~/.config/garmin-hevy-sync
    macOS
    ~/Library/Application Support/garmin-hevy-sync
    Windows
    %APPDATA%\garmin-hevy-sync
  • Flow A merges into the watch recording instead of replacing it, so the heart rate, training effect and body battery Garmin recorded stay as they were.
  • sync --dry-run shows what a run would change without writing anything.
  • When a run fails, for example because the Garmin sign-in expired, you get a desktop notification. To get a push on your phone instead, set GH_NOTIFY_URL to an ntfy-style URL.
  • Keep two-factor authentication on. The emailed code is needed once, at sign-in.

Questions

What do I need?

Hevy Pro, because Hevy's API is only available to subscribers. A Garmin Connect account and a watch that records Strength activities; it was developed on a Venu 4. A computer that is on some of the time, or a server that runs Docker. The installer brings everything else.

Does Garmin keep my heart rate?

Yes. Flow A merges the Hevy sets into the activity your watch recorded, so heart rate, training load and calories stay. The other direction cannot carry heart rate: Hevy's API has no field for it, so watch-only sessions reach Hevy without it.

How soon does a workout show up in the other app?

Within one sync interval, 30 minutes by default, as long as the computer is awake. It is not instant. Run garmin-hevy-sync sync to sync straight away.

What happens if I delete a workout?

Deletions are not copied. A workout you delete in one app stays in the other until you delete it there too.

Can it stop working?

Yes. Garmin has no public API for this, so the Garmin side uses a community library that signs in the way the Garmin Connect app does. A change to Garmin's sign-in can break it until that library is updated. If a run fails you get a notification, and garmin-hevy-sync doctor shows which side is failing.

hevy2garmin says its PyPI command line is deprecated. Is that a problem?

No. The hevy2garmin command line on PyPI is deprecated after 31 October 2026. This project pins a version that keeps working.

How do I uninstall it?

Run garmin-hevy-sync schedule remove, then uv tool uninstall garmin-hevy-sync. Delete the settings folder listed under Privacy and safety, and ~/.garminconnect and ~/.hevy2garmin if no other tool uses them. With Docker, run docker compose down -v in the cloned folder; -v also deletes the data volume.

Is this made by Garmin or Hevy?

No. It is an independent open source project and is not affiliated with, endorsed by or supported by Garmin or Hevy.