All notable changes to Garmin Connect Uploader will be documented in this file.
From v1.0.1 onwards, the app includes a "Smart Migration" feature to handle older versions automatically. To update correctly:
- Keep it in the family: Place the new
.exein the same folder as your previous version. This ensures your settings (uploader_config.json) and logs are preserved. - Run the new version: Once launched, the app will detect if the auto-start shortcut points to a previous file.
- One-Click Update: A prompt will appear asking if you'd like to update the shortcut. Simply click Yes to ensure the new version is the one that launches at boot.
Important
Your settings and logs are safe as long as the new EXE is in the same location as the old one. You can safely delete the old version's EXE file once the startup entry has been updated.
Upgrading from v1.0.2 or earlier: The old Startup-folder shortcut (GarminUploader.lnk) and XOR-encrypted password in uploader_config.json are automatically migrated on first launch of v1.0.3. No manual steps required.
- Two-Factor Authentication (MFA/2FA) support: The app now fully supports Garmin accounts with two-step verification enabled. When logging in for the first time (or when credentials change), you'll be prompted to enter your 6-digit verification code. Authentication tokens are securely saved and automatically reused for approximately one year, so you only need to enter the MFA code once.
- Test Connection button: Added a dedicated "Test Connection" button next to the password field in Garmin Settings. Use this to manually verify your Garmin credentials without saving settings.
- Smarter credential validation: The app now only prompts to test Garmin credentials when they've actually changed, preventing unnecessary MFA prompts every time you save settings. When credentials change, you'll be asked if you want to test the connection before saving.
- Better rate limit handling: Added specific error detection and user-friendly messaging for Garmin's rate limiting (HTTP 429 errors), with clear instructions to wait 15-30 minutes before retrying.
- TrainerDay activity titles: When uploading TrainerDay workouts, filenames like
2026-03-20 18-32-32 - Torque Blocks.tcxare now parsed so that the Garmin activity name is set to the part after the dash (for example, "Torque Blocks"). - More reliable TrainerDay title mapping: Added a short polling step after each TrainerDay upload to wait for Garmin to finish processing and then identify the newly created activity before renaming it, reducing the chance of renaming the wrong activity.
- TrainerDay support as a third app source alongside Wahoo and MyWhoosh. TrainerDay uses the same Dropbox-based folder structure as Wahoo and the same upload-and-move-to-
uploadedbehaviour, and supports both.FITand.TCXworkout files.
- Refined Folder Settings UI with collapsible sections and status-only app headers for Wahoo, MyWhoosh, and TrainerDay. Each header shows a status pill (for example: Not configured, Folder missing, Ready), and the sync logic automatically skips apps that are not in a ready state.
- Improved visuals and layout: Larger app logos for better readability and automatic window height adjustment based on the expanded/collapsed sections, reducing empty space when sections are collapsed.
- TrainerDay quality-of-life tweaks: Added an in-app TrainerDay help dialog explaining how to connect TrainerDay to Dropbox and where to find the exported folder on disk.
- Dual-build releases: Now shipping both a single-file
.exeand a folder build (.zip). The folder build is less likely to trigger Windows Defender ML heuristics. See README for details. - Added
CHECKSUMS.txtwith SHA-256 hashes for verifying release authenticity.
- Reverted auto-start from registry back to Startup-folder shortcuts, using a lightweight temporary VBScript executed by
cscript.exeto create the.lnkfile. The Python exe itself never calls COM or PowerShell directly. The registryHKCU\...\Runapproach introduced in v1.0.3 triggeredWacapew.A!mldetections in Windows Defender. - Any leftover registry
Runentry from v1.0.3 is automatically cleaned up on first launch.
- Fixed Windows Defender
Wacapew.A!mlfalse positive by removing allwinregregistry writes. The exe no longer modifiesHKCU\Software\Microsoft\Windows\CurrentVersion\Run. - Fixed settings/config not loading at Windows startup. The config file path was relative, so when Windows launched the app at boot (working directory
C:\Windows\System32) it couldn't finduploader_config.json. The path is now resolved to an absolute path based on the exe's directory. - Fixed "OAuth1 token is required" upload error caused by stale Garmin sessions not being detected. The app now verifies the session before each sync and re-authenticates if expired. Failed session logins also properly reset the client so credential-based login can take over.
- Improved early-boot password retrieval. Added a retry with short delay for Windows Credential Manager reads, plus a safe base64 config-file fallback so credentials are always available even if keyring isn't ready yet.
- Windows auto-start now uses the registry (
HKCU\Software\Microsoft\Windows\CurrentVersion\Run) instead of dropping a.lnkshortcut in the Startup folder. This is the standard, Defender-friendly approach and eliminates the need forWScript.ShellCOM objects and PowerShell. - Password storage moved to Windows Credential Manager via the
keyringlibrary, replacing the old XOR + Base64 obfuscation. A simple base64 fallback is kept inuploader_config.jsonfor early-boot resilience. - Removed dependency on
pywin32/win32com.client; replaced with the built-inwinregmodule and thekeyringpackage.
- Reduced Windows Defender false-positive triggers by removing all PowerShell invocations (including
-ExecutionPolicy Bypass), COM-based shortcut manipulation, and XOR + Base64 encoding patterns that match common malware heuristics.
- On first launch, any existing
GarminUploader.lnkin the Startup folder is automatically deleted and replaced with a registry entry. - Existing XOR-encrypted passwords in
uploader_config.jsonare automatically migrated to Windows Credential Manager and removed from the config file.
- Windows build now uses a standalone Nuitka onefile executable to reduce antivirus false positives (especially Windows Defender) while keeping everything self-contained.
- Dedicated uploads-only log file
garmin_uploads.logthat records just successful upload events, with clear daily separators. - New "View Uploads Log" button in the About dialog to inspect upload history directly from the app.
- More robust resource bundling for compiled builds so the main icon, app logo, developer logo, and GitHub logo all display correctly in the About window.
- Improved handling of Garmin session tokens so that stale sessions are detected and recovered more reliably instead of silently failing uploads.
- Fixed edge cases in Windows auto-start shortcut migration when upgrading between versions compiled with different toolchains.
- Resolved layout issues in the About dialog where the Close button could be partially hidden on some DPI / scaling combinations.
- Logging now consists of:
- The main rotating log
garmin_uploader.log(10MB, 3 backups), and - A separate non-rotating upload log
garmin_uploads.logfor a clean history of uploaded files.
- The main rotating log
- Logs are always written next to the running executable (for both script and compiled modes), making upgrades and troubleshooting simpler.
- Simplified text in the About dialog – log file paths are now accessed via the built-in log viewers instead of being shown directly.
- MyWhoosh sync behavior warning in main window with link to detailed documentation
- Log file auto-rotation (10MB limit with 3 backup files for ~3 months of history)
- Built-in log viewer that opens at the latest entries instead of external text editor
- Visual icons in logs for easier scanning (✅ success, ❌ error,
⚠️ warning) - Persistent last sync/upload status that survives app restarts
- Automatic detection and update of old version auto-start shortcuts on first launch
- Interactive close button behavior: prompts user to run in background or close app
- "Minimize to Tray" button in Actions section for explicit tray minimization
- Bug where app would try to upload files from the "uploaded" subfolder
- GitHub repository link now points to correct URL
- Log viewer now allows text search (Ctrl+F) and selection while preventing edits
- GUI window scaling issues on high-DPI displays (user report) - added DPI awareness
- Unclear minimize to tray behavior - users weren't aware of tray functionality (user report)
- Log viewer now auto-scrolls to show latest entries first
- Updated README with new log retention policy and viewer behavior
- Optimized startup timing for Windows auto-start (reduced from 3.5s to 1s)
- Improved folder settings layout with wider entry fields and compact help buttons
- Enhanced MyWhoosh warning with larger icon, improved layout, and clearer messaging
- Adjusted window size to 600x825 with enforced minimum dimensions
- Cleaner UI spacing and alignment throughout
- Automatic upload of Wahoo and MyWhoosh .FIT files to Garmin Connect
- Secure password encryption using hardware-linked keys
- Auto-sync with configurable check intervals
- System tray support with minimize functionality
- Windows auto-start on boot
- Custom GUI with logo and developer attribution
- Detailed activity logging
- Folder validation and credential testing