Where to get a COMPLETE list of FIT profile and message definitions?

I've written a tool to convert FIT files to GPX some years ago which does not work with the newest generation of Garmin devices.

The FIT files seem to contain the message type 327 (0x147) which is not seen on the latest list (Profile.xlsx in the FitSDKRelease_21.84.00 archive). So I am unsure if the list is incomplete or I forgot to implement something in my code (still investigating if anything has changed in newer FIT file definitions)...

..

  • oh that is very interesting and was not aware

    apparently Stryd is also not aware because they do not add their metrics to the lap and session messages in their datafield

    but what I really meant is also appending into to the activity summary "all details" on the watch itself, you'd think Garmin would wake up to the idea of allowing developers to inject additional summary info there

    BTW as you might be one of the most feature aware developers around, can you think of ANY way to get vo2max with decimal anywhere on the watch

    I can do it in post-analysis of the FIT file in windows via my own code using the full metmax field calculation but other than looking at the race-predictor moving by a few seconds, there is no way to see if vo2max is ie. 55.1 55.2 55.25 or whatever on the watch itself

    Remember when Strava finally added decimals across their entire system years ago and made it so much more useful?

    Garmin still hasn't caught onto that concept.

    28 hours of recovery time could be 28.0 hours or 28.9 hours, there's no way to tell on the watch itself, only post-analysis

    Heck Gamin doesn't even round seconds consistently across their summary displays, it's like a dozen different coders wrote all the different parts and no-one bothered to consolidate any of the rounding methods after a decade

  • Hard to believe that Stryd is not aware, it is well published on the same page as the record FIT data. Probably a matter of prioritizing their own app.

    I'm not sure whether it is really that useful to allow developers to add additional summary data on the watch itself. It doubles the effort, and I don't know how many people really look into their activity stats on the watch, myself I mainly do that in the app or on the Connect website. And Garmin could use their software developers potential more wisely by fixing bugs that cause people to lose their activity data.

    On the watch, you can view vo2max for running and cycling, as it is in the UserProfile, but indeed, only as a number without decimals. The alternative would be to develop a web service and get the info via an Internet call.

  • I find the GPS signal info interesting but useless

    What I look for to indicate GPS errors is two things

    1. any record without lat/lon = GPS loss

    2. impossible speeds in meters per second for running (4 minute miles) or cycling >35mph

    which indicate the GPS speed calculation is playing "catch up"

    did you know GPS speed is done using doppler-effect like a siren going by, where the hardware listens to the shift in pitch and does not need a sat lock, I found that fascinating

    But what's really weird to be is days like today where there are no apparently GPS errors and yet the distance for my 6.5 mile run comes up to 7 miles which is quite the stretch

    I think what is happening is my HRM-PRO and my Stryd fight it out for distance source and while the Stryd usually wins sometimes the HRM-PRO feeds the watch the wrong distance data and it's not as accurate (DC Rainmaker proved it)

    But I cannot tell in the FIT file what source was used for distance, GPS vs Stryd vs HRM-PRO, there's no clear indicator to me unless I am missing something

    It's also impossible to see the calibration factor on the HRM-PRO when it acts like a footpod, unlike the Stryd which exposes the calibration number and allows manual change

    You'd think Garmin would improve this by now after a decade, HRM-TRI, HRM-PRO, HRM-PRO-PLUS and now HRM-600 all still broken with no manual adjustments and no "events" in the FIT file showing when calibration happens and to what number

  • So Is it impossible to know if a Stryd Pod is accurately calibrated, given that in the FIT file the source for 'Distance' changes between GPS, Stryd, and HRM-PRO, as the source messages seem to indicate? Does this switch occur even when the sensor settings for speed and distance are set to 'Always'? Thank you  for your insightful posts about CF.

  • But I cannot tell in the FIT file what source was used for distance, GPS vs Stryd vs HRM-PRO, there's no clear indicator to me unless I am missing something

    Isn't this what the 'Device Used' message is telling?

  • Sorry for the delay in followup on this, can you tell me the message/field id for what you are referring to?

    if multiple footpod + GPS are present, I cannot seem to figure out how to determine which device was used

    There's a field that indicates that specifically? Can't find it

    Apparently there's also a "device used" for SPEED vs DISTANCE and they can be different

    (whenever I use stryd for speed+distance and ignore GPS result in the watch, my LT pace will be slower than GPS, like there is lag from a footpod)

  • Hi RinseRepeat,

    I cannot seem to figure out how to determine which device was used

    The devices used in the activity are the ones present in  device_info messages  23

    Apparently there's also a "device used" for SPEED vs DISTANCE and they can be different

    Yes, source messages  22, can have different devices for SPEED vs DISTANCE. And interestingly, in an activity, if you make a rest stop running/walking, the Speed source switch from Stryd footpod to GPS, even if you set Speed Distance always from Stryd

  • oh wow wow wow, thanks for pointing that out

    I feel so stupid now that I didn't notice it before

    message 22 aka "SOURCE" aka "device_used"

    and I can see now that depending on what's going on during an activity it can happen multiple times

    when I used only GPS used for speed/distance during a run, message 22 would only happen once

    but when I have stryd or HRM-PRO as footpod set to auto-calibrate,

    I can see message 22 happening many times during a single continuous activity (with no stops)

    THOSE MUST BE CALIBRATION EVENTS  even though it doesn't record the new calibration setting

    since they are timestamped that means I can lookup at what point in a run it decided to auto-calibrate

    first message 22 is after all the message 23 that lists all the devices

    source (22, type: 7, length: 15 bytes):
      timestamp (253-1-UINT32): 2026-01-05T05:28:34 (1136543314)
      unknown0 (0-1-UINT8): device2 (2)
      unknown1 (1-1-UINT8): cadence (5)
      unknown2 (2-1-UINT8): device6 (6)
      unknown3 (3-1-UINT8): device1 (1)
      unknown4 (4-1-UINT8): heart_rate (3)
      unknown5 (5-1-ENUM): 3
      unknown6 (6-1-UINT8, INVALID): 255
      unknown8 (8-1-UINT8, INVALID): 255
      xxx14 (14-1-UINT8, INVALID): 255
      xxx15 (15-1-UINT8, INVALID): 255
    

    device_info (23, type: 6, length: 95 bytes):
      timestamp (253-1-UINT32): 2026-01-05T05:28:34 (1136543314)
      device_index (0-1-UINT8): cadence (5)
      antplus_device_type (1-1-UINT8, original name: device_type): stride_speed_distance (124)

    0	speed	    device_index
    1	distance	device_index
    2	cadence	    device_index
    3	elevation	device_index
    4	heart_rate	device_index
    5   ???
    6	power	    device_index
    8   ???
    14  ???
    15  ???

  • do we know what the undocumented message 325 is about

    the fact there are five types might seem to align with "sources" (aka "device_used") ?

    happens few dozen times during an hour run with the numbers going back and forth - might this be calibration data?

    or maybe since 326 is a "gps event"  that 325 is related and invented by Garmin/FirstBeat at same time

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543328
      xxx0 (0-1-UINT8): 187
      xxx1 (1-1-UINT8): 11
      xxx2 (2-1-UINT8): 1
      xxx3 (3-1-UINT8): 116
      xxx4 (4-1-UINT8): 5
      xxx5 (5-1-UINT8): 81
    

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543338
      xxx0 (0-1-UINT8): 157
      xxx1 (1-1-UINT8): 9
      xxx2 (2-1-UINT8): 1
      xxx3 (3-1-UINT8): 99
      xxx4 (4-1-UINT8): 3
      xxx5 (5-1-UINT8): 81
    

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543345
      xxx0 (0-1-UINT8): 187
      xxx1 (1-1-UINT8): 11
      xxx2 (2-1-UINT8): 1
      xxx3 (3-1-UINT8): 116
      xxx4 (4-1-UINT8): 5
      xxx5 (5-1-UINT8): 81
    

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543362
      xxx0 (0-1-UINT8): 157
      xxx1 (1-1-UINT8): 9
      xxx2 (2-1-UINT8): 1
      xxx3 (3-1-UINT8): 99
      xxx4 (4-1-UINT8): 3
      xxx5 (5-1-UINT8): 81
    

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543408
      xxx0 (0-1-UINT8): 172
      xxx1 (1-1-UINT8): 10
      xxx2 (2-1-UINT8): 1
      xxx3 (3-1-UINT8): 70
      xxx4 (4-1-UINT8): 4
      xxx5 (5-1-UINT8): 81

    unknown (325, type: 8, length: 11 bytes):
      xxx253 (253-1-UINT32): 1136543474
      xxx0 (0-1-UINT8): 141
      xxx1 (1-1-UINT8): 8
      xxx2 (2-1-UINT8): 2
      xxx3 (3-1-UINT8): 53
      xxx4 (4-1-UINT8): 2
      xxx5 (5-1-UINT8): 81

  • Hi,

    This is a bit of a hidden feature, but if you hover the mouse over a message title or a field name in FIT File Viewer, it will show the corresponding id