FIT File Parser & Viewer

Drop a GPS activity file from your watch or cycling computer and explore your workout. Route map, elevation, heart rate, and power over time - plus a full spreadsheet export. Your data stays on your device.

GPS route map Elevation chart Heart rate Power data CSV export FIT format ?

Drop your .fit file here

or

Garmin, Wahoo, Polar - any .fit activity file

Learn more: reading FIT file data

FIT is a binary format

FitFileLab's comparison of GPX, TCX and FIT describes FIT as Garmin's native binary format, adopted by Wahoo, Coros, Suunto, Bryton and most modern devices. GPX and TCX are XML text files, so you can open them in a text editor, but a FIT file cannot be read that way.

A FIT file starts with a header containing the text ".FIT". After it comes a stream of definition messages, which describe the byte layout of what follows, and data messages, which carry the values. Each value is identified by a field number, not a name.

Field numbers and the values behind them

For the record message, which holds the second-by-second readings, the numbers include 0 for latitude, 1 for longitude, 2 for altitude, 3 for heart rate, 4 for cadence, 5 for distance, 6 for speed and 7 for power, as listed on the Tcl wiki's page on reading FIT files. The parser reads these, plus the newer enhanced speed and enhanced altitude fields, and skips any field it has no entry for.

Values are stored as integers with a scale and an offset. A Garmin developer forum post gives the rule: decoded value = encoded value / scale - offset. For altitude, with scale 5 and offset 500, a raw value of 3029 decodes to 3029 / 5 - 500 = 105.8 meters. Speed has a scale of 1000, so a raw 5500 is 5.5 meters per second.

Positions are stored in semicircles. The parser multiplies each by 180 / 2^31 to get degrees, and it counts timestamps in seconds from the FIT epoch, 31 December 1989, so it adds the offset to reach Unix time.

Missing data and compressed timestamps

FIT reserves an invalid value for each data type, such as 0xFF for an unsigned 8-bit field, to mean "no data". The parser treats these as absent. Some messages also carry only the last 5 bits of a timestamp, and the parser rebuilds the full time from the previous one, including when those 5 bits wrap around.

FAQ

Why are records, laps and sessions handled separately?

They are different message types in the FIT format. Records are individual readings, laps summarize a split segment, and the session summarizes the whole activity. Each has its own table of field numbers.

Why might a value be missing from the output?

The device may not have recorded it, it may have been written with the invalid value for its type, or the parser may not have an entry for that field number. Vendor-specific fields are skipped.

Does my file leave my device?

No. The file is parsed in your browser and nothing is uploaded.

Last reviewed: October 1, 2026