Environment
- fit-file-faker installed via
pip install fit-file-faker (current release as of August 2026)
- Python 3.12, running in Docker
- Profile
app_type: Custom
- Source device: Hammerhead Karoo 3
- Target device: Garmin Fenix 7 Pro Solar (product ID 4375), configured with my watch's real Unit ID as the serial number
Summary
After editing a Karoo-recorded FIT file, the file_id message correctly gets the configured Garmin manufacturer/product/serial_number, but the device_info message for the primary device (device_index=0) gets its manufacturer and product fields rewritten while its serial_number field is left untouched — still containing the Karoo's original (non-Garmin) serial number. This produces an internally inconsistent FIT file: file_id and device_info disagree about the device's serial number.
I believe this is why activities uploaded from Karoo files never get Training Effect / Training Status calculated on Garmin Connect, and why the activity's "Devices & Apps" section is empty in the Garmin Connect UI, even though the same profile/device selection works as expected for the file_id message.
Steps to reproduce
- Configure a profile with
app_type: custom, targeting a Garmin device (e.g. Fenix 7 Pro Solar, product 4375) with a real Unit ID as the serial number.
- Edit a Karoo-recorded
.fit file without uploading:
fit-file-faker /path/to/karoo_ride.fit
- Inspect the
file_id and device_info messages in the original vs. edited file (I used a small custom FIT parser to dump these fields; happy to share it if useful).
Observed data (device_index=0, the primary/head-unit record)
Field | Original file | Edited file
-- | -- | --
file_id.manufacturer | 289 (Hammerhead) | 1 (Garmin) — correctly patched
file_id.product | 3 | 4375 — correctly patched
file_id.serial_number | 240970090 | 3506959378 (my configured Unit ID) — correctly patched
device_info[0].manufacturer | 289 | 1 — correctly patched
device_info[0].product | 3 | 4375 — correctly patched
device_info[0].serial_number | 240970090 | 240970090 — unchanged, still the Karoo's original serial
Every device_info message for device_index=0 across the whole ride (~30 messages in my test file, presumably one per some periodic interval) shows the same pattern: manufacturer/product patched, serial_number not patched.
Expected behavior
device_info.serial_number for the primary device record should be rewritten to match the configured Unit ID, consistent with what's written to file_id.serial_number.
Additional observation
The peripheral sensor device_info records (e.g. device_index=3, originally a power meter reporting manufacturer=32) also get manufacturer/product rewritten to the Garmin values (1 / 4375), which seems unintended too — a connected sensor shouldn't be relabeled as the watch itself. Not sure if that's in scope for the same fix or a separate issue.
Why this matters
Per Garmin's anti-spoofing changes from December 2023 (referenced in a few other FIT-editing tools' docs/issue trackers), Garmin Connect appears to validate internal consistency of device identity before enabling Training Effect / Training Status calculation and device attribution in the UI. A file_id/device_info serial number mismatch looks like exactly the kind of inconsistency that would trip that validation.
Sample files:
test_modified.zip
Note: This issue was created mostly with use of AI - probably better than if I did it myself :)
Environment
pip install fit-file-faker(current release as of August 2026)app_type: CustomSummary
After editing a Karoo-recorded FIT file, the
file_idmessage correctly gets the configured Garmin manufacturer/product/serial_number, but thedevice_infomessage for the primary device (device_index=0) gets itsmanufacturerandproductfields rewritten while itsserial_numberfield is left untouched — still containing the Karoo's original (non-Garmin) serial number. This produces an internally inconsistent FIT file:file_idanddevice_infodisagree about the device's serial number.I believe this is why activities uploaded from Karoo files never get Training Effect / Training Status calculated on Garmin Connect, and why the activity's "Devices & Apps" section is empty in the Garmin Connect UI, even though the same profile/device selection works as expected for the file_id message.
Steps to reproduce
app_type: custom, targeting a Garmin device (e.g.Fenix 7 Pro Solar, product 4375) with a real Unit ID as the serial number..fitfile without uploading:file_idanddevice_infomessages in the original vs. edited file (I used a small custom FIT parser to dump these fields; happy to share it if useful).Observed data (device_index=0, the primary/head-unit record)
Every
device_infomessage fordevice_index=0across the whole ride (~30 messages in my test file, presumably one per some periodic interval) shows the same pattern: manufacturer/product patched, serial_number not patched.Expected behavior
device_info.serial_numberfor the primary device record should be rewritten to match the configured Unit ID, consistent with what's written tofile_id.serial_number.Additional observation
The peripheral sensor
device_inforecords (e.g.device_index=3, originally a power meter reportingmanufacturer=32) also getmanufacturer/productrewritten to the Garmin values (1 / 4375), which seems unintended too — a connected sensor shouldn't be relabeled as the watch itself. Not sure if that's in scope for the same fix or a separate issue.Why this matters
Per Garmin's anti-spoofing changes from December 2023 (referenced in a few other FIT-editing tools' docs/issue trackers), Garmin Connect appears to validate internal consistency of device identity before enabling Training Effect / Training Status calculation and device attribution in the UI. A
file_id/device_infoserial number mismatch looks like exactly the kind of inconsistency that would trip that validation.Sample files:
test_modified.zip
Note: This issue was created mostly with use of AI - probably better than if I did it myself :)