Releases: sturimcode/eufy-sync
Release list
v1.13.2 - Clear sync notifications and summaries
Sync notifications now explain what happened at each service. Sending one weigh-in to Strava and Zwift no longer appears as two measurements, and a Garmin skip includes the date of the reading already there.
- Terminal summaries count completed syncs separately for Garmin, Strava, and Zwift.
- Partial failures produce one failure notification that also names the services that completed a sync.
- Dry-run sync failures stay in the terminal without sending notifications or changing the network-failure count.
- First-run and multiple-profile summaries retain partial results. Garmin logs use the correct local date and distinguish weight-only uploads from full body composition.
Verified with 517 tests covering service combinations, existing readings, retries, partial failures, dry runs, multiple profiles, backfills, repairs, and time-zone boundaries.
Full changes: v1.13.1...v1.13.2
v1.13.1 - Choose all sync targets during setup
First-run setup now offers Garmin Connect, Strava, and Zwift together. Choose any combination, including Zwift alone, before entering service credentials. After a successful first sync, macOS and Windows users can enable the existing four-hour schedule.
Zwift remains experimental and opt-in. Setup verifies the Zwift login before saving the configuration. If that check fails during first-run setup, the recovery message sends you back to the same wizard. The separate --setup-zwift command still works for existing installations.
The README now focuses on installation and first sync, with linked guides for commands, Linux scheduling, and troubleshooting. It also clarifies Garmin history repair, raw Eufy weights arriving before full body composition, and Strava's API-app subscription requirement. GitHub has a CI badge and a bug-report form, and the shared test and release workflows use the updated checkout and Python setup actions.
To update an existing installation, run eufy-sync --update.
v1.13.0 - Experimental Zwift weight sync
Zwift weight sync is back as an optional experimental target. Run eufy-sync --setup-zwift to connect it, then eufy-sync to sync.
The tool sends only the latest valid weight for your selected Eufy profile. It reads Zwift's saved weight after an update and records success only when that value matches. Matching weights skip the write, and Zwift failures let Garmin and Strava continue.
Setup saves your login in the existing credential store, and later runs reuse and renew the session. Use --target zwift to run only Zwift, --doctor to check the connection, and --disconnect-zwift to remove it.
A real weight change, restoration, and token refresh have been verified on one account. This uses an unofficial route; longer-term reliability across accounts and connected services is still unproven.
This release also prevents a saved Garmin recovery reading from reaching current-weight targets when Eufy returns a fresh reading with the same ID.
v1.12.0 - Recover interrupted Garmin upgrades and keep Strava current
Eufy Sync now saves a Garmin replacement before deleting the weight-only reading it replaces. If the upload fails or the process stops, a later run can finish the replacement from the saved measurement.
- Garmin revisits older weight-only readings so body composition can arrive after the initial WiFi sync. Readings with different IDs must match within 120 seconds and 0.1 kg, with only one possible match.
- Profile selection checks raw and processed history together. Raw readings with missing or unknown profile IDs cannot slip through the selected profile's filter.
- Strava receives only the newest valid weight from each run. Backfill cannot overwrite a newer recorded weight with an older one.
--doctorchecks live Garmin and Strava access and shares the sync lock when refreshing tokens.- Scheduled runs retry once after 60 seconds when a temporary network failure is the only error.
The existing sync database is updated automatically. Configuration and the four-hour schedule stay the same.
All 447 tests passed on Linux, macOS, and Windows with Python 3.12, 3.13, and 3.14. Ruff and live Garmin and Strava connection checks also passed.
v1.11.0 - Optional browser extra, fallback only on real login failures, lint in CI
What's Changed
- Optional browser extra, fallback only on real login failures, lint in CI; 1.11.0 by @sturimcode in #64
Full Changelog: v1.10.2...v1.11.0
v1.10.2 - Time out the prompts on the toast-driven recovery path
What's Changed
- Time out the prompts on the toast-driven recovery path; 1.10.2 by @sturimcode in #63
Full Changelog: v1.10.1...v1.10.2
v1.10.1 - Heal a dead Garmin session in the read paths too
What's Changed
- Heal a dead Garmin session in the read paths too; 1.10.1 by @sturimcode in #62
Full Changelog: v1.10.0...v1.10.1
v1.10.0 - Reliability sweep: self-healing Garmin sessions, honest task results, safer deletes
What's Changed
- Fix sweep: 13 findings from the 2026-08-28 Windows review by @sturimcode in #61
Full Changelog: v1.9.1...v1.10.0
v1.9.1 - Raise dependency floors, test on Python 3.14, README upkeep
What's Changed
- Raise dependency floors, test on Python 3.14, README upkeep; 1.9.1 by @sturimcode in #60
Full Changelog: v1.9.0...v1.9.1
v1.9.0 - Backfill dates from create_time and add --repair-days
What's Changed
- Backfill dates from create_time and add --repair-days; 1.9.0 by @sturimcode in #59
Full Changelog: v1.8.1...v1.9.0