Guides and tools

Open a file

  • Open a .fit file — in your browser, without installing anything Drop a .fit file and see what is inside it: device, date, record types and field counts. Parsed on your machine; nothing is uploaded.
  • Convert a .fit file to CSV Turn a .fit file into CSV in the browser. No upload, no account, no watermark — the conversion runs on your device.
  • What is actually inside a .fit file The FIT format explained from 68,068 real files: message types, definition messages, local type redefinition, and what each device actually writes.
  • Apple Health export.zip — what is in it and how to read it What Apple Health exports, why export.xml is so large, and how to read it without uploading it anywhere. Drop the zip and see.
  • HKQuantityTypeIdentifierHeartRateVariabilitySDNN — what SDNN is in your Apple Health export Apple stores HRV as SDNN in milliseconds. What SDNN measures, why it is not the RMSSD your Oura or Whoop app shows, and how to read yours here.
  • HKQuantityTypeIdentifierOxygenSaturation — reading blood oxygen (SpO₂) from Apple Health Apple exports SpO₂ as a fraction between 0 and 1, not a percentage. Why 0.97 means 97%, and how to read your blood-oxygen data without uploading it.
  • HKCategoryTypeIdentifierSleepAnalysis — reading Apple Health sleep stages correctly Apple’s sleep is a category type with stages plus an “In Bed” value that overlaps them. Counting In Bed as sleep doubles your total — how to read it right.
  • HKQuantityTypeIdentifierStepCount — why your Apple Health step total is too high iPhone and Apple Watch both record steps, and the export keeps both. Add them and you double-count. How Apple de-duplicates, and how to read your real total.
  • HKQuantityTypeIdentifierRestingHeartRate — reading resting heart rate from Apple Health Resting heart rate is a once-a-day derived value, not a raw beat. How Apple computes it, why it differs from your lowest heart rate, and how to read yours.
  • HKQuantityTypeIdentifierHeartRate — reading heart rate from an Apple Health export Heart rate is Apple’s highest-volume identifier — up to a sample every few seconds. What the sampling rate really is, and how to read years of it locally.
  • HKQuantityTypeIdentifierRespiratoryRate — reading respiratory rate from Apple Health Apple measures respiratory rate mostly during sleep, in breaths per minute. Why you have few daytime values, and how to read the series yours contains.
  • HKCorrelationTypeIdentifierBloodPressure — reading blood pressure from Apple Health Blood pressure is a correlation type — two linked values, systolic and diastolic — not a single number. Why it is easy to drop, and how to read yours.
  • HKQuantityTypeIdentifierBloodGlucose — reading blood glucose from Apple Health Blood glucose is stored in mg/dL or mmol/L depending on region, an 18× difference. Why the unit matters so much, and how to read yours safely.
  • HKQuantityTypeIdentifierBodyMass — reading body weight from Apple Health Body weight in Apple Health is manual or from a scale, in kg, lb or stone by region. How the unit is carried, and how to read your weight history locally.
  • HKQuantityTypeIdentifierAppleSleepingWristTemperature — reading Apple wrist temperature Apple’s sleeping wrist temperature is a deviation from your baseline, not an absolute body temperature. Why ±0.3°C is normal and how to read it.
  • HKQuantityTypeIdentifierRunningPower — reading running power from Apple Health Apple estimates running power in watts from the Watch, not from a foot pod. Why it is not comparable to Stryd, and how to read your running-power series.
  • HKQuantityTypeIdentifierVO2Max — reading VO₂ max from Apple Health Apple’s VO₂ max is a submaximal estimate from the Watch, in mL/kg·min, not a lab test. What the number is, its test type, and how to read yours.
  • HKQuantityTypeIdentifierDistanceSwimming — reading swim distance from Apple Health Swim distance is stored in metres and comes from stroke and lap detection, not GPS. Why pool and open-water differ, and how to read your swim data.
  • Apple Health data dictionary — every HealthKit identifier, mapped Every HKQuantityTypeIdentifier, HKCategoryTypeIdentifier and HKCorrelationTypeIdentifier the parser reads, with its canonical kind and unit. Generated from the source.
  • Open a running .fit file — cadence, pace and running dynamics What a running .fit file records, why cadence often reads half what you expect, and how to see your pace, ground contact and stride — in the browser.
  • Open a trail-running .fit file — elevation and GPS under tree cover Trail-run .fit files carry big elevation numbers and GPS that drops under canopy. What is real, what is barometric, and how to read yours in the browser.
  • Open a treadmill-run .fit file — distance without GPS A treadmill .fit file has no GPS. Its distance comes from your wrist or a foot pod and can be off. How the distance is derived, and how to read the file.
  • Open a cycling .fit file — power, cadence and left/right balance What a cycling .fit file records from a power meter and head unit: watts, cadence, torque effectiveness, left/right balance. Read yours in the browser.
  • Open an indoor-cycling .fit file — trainer power and virtual speed Indoor rides record power from a smart trainer and a virtual speed with no GPS. Why the speed is fictional and the power is the real number. Read yours here.
  • Open a mountain-biking .fit file — rough-terrain GPS and Grit MTB .fit files carry jumpy GPS on technical terrain and, on some Garmins, Grit and Flow scores. What is measured, what is estimated, and how to read yours.
  • Open a pool-swimming .fit file — lengths, strokes and SWOLF A pool-swim .fit file counts lengths from wrist motion, not GPS, and records stroke type and SWOLF. Why the pool-length setting decides everything. Read yours.
  • Open an open-water swimming .fit file — GPS between strokes Open-water swims track GPS only when your wrist breaks the surface, so the trace is sparse and overshoots. Why the distance runs long, and how to read yours.
  • Open a rowing .fit file — stroke rate, drag factor and no GPS Indoor rowing files from a Concept2 or watch record stroke rate and, sometimes, drag factor and split, but no distance sensor. How to read a rowing .fit file.
  • Open a hiking .fit file — long duration, elevation and battery gaps Hiking .fit files are long, lean on barometric elevation, and often use a low-power GPS mode that thins the track. What that means for reading yours.
  • Open a walking .fit file — steps, and why totals double-count A walking .fit file records steps and often overlaps your daily step count from another device. What the file holds and why a raw total can double.
  • Open a strength-training .fit file — sets, reps and no distance A strength .fit file has no GPS and no distance — it records sets, reps, rest and heart rate. What a gym session file actually contains, read in the browser.
  • FIT activity types — every sport a .fit file can declare, measured Every canonical sport the parser resolves from a .fit file, with how often each appears across 68,068 real files, and what is specific to reading each one.
  • Open a Garmin .fit file — the most complete FIT there is Garmin defined FIT and writes the fullest version of it: running dynamics, developer fields, every message type. What a Garmin file holds, read in the browser.
  • Open a Wahoo .fit file — the out-of-order definition quirk Wahoo devices write valid FIT with one habit that breaks strict parsers: definition messages can arrive out of order after a pause. Why, and how to read it.
  • Open a Zwift .fit file — a virtual ride with no GPS A Zwift .fit file records a virtual ride: real power and heart rate, but simulated speed and distance and no GPS position. What is measured and what is invented.
  • FIT manufacturers — every device maker in a .fit file, measured Every device manufacturer that appears across 68,068 real .fit files, with how many each wrote, and the reading quirk for the makers whose behaviour is known.
  • Cycling power and FTP — what the watts in your .fit file mean Cycling power is measured, not estimated — and FTP, normalized power and TSS are all derived from it. What each is, and how to read the power in your ride.
  • Elevation gain — why every app gives a different number Elevation gain comes from a barometric altimeter or from GPS or from a map, and the three disagree. Why your climbing total is never quite the same twice.
  • Cadence — steps and revolutions per minute in your .fit file Running cadence is stored as revolutions per minute (half your steps), cycling cadence as crank RPM. Why they are encoded differently and how to read each.

When something is wrong

  • Why won’t my .fit file open The four things that actually break a .fit file, measured across 68,068 real ones — and a parser on this page that tells you which of them yours has.
  • FIT file CRC mismatch — what it means and whether your data is lost A CRC mismatch usually does not mean your ride is gone. What the checksum covers, why it fails, and how much of the file is still readable.
  • A truncated .fit file — recovering a ride that ended early A watch that ran out of battery mid-activity writes a header claiming more data than the file holds. The part before the cut is still readable.
  • Unknown FIT message types — the numbers the SDK does not name Manufacturers write message types the FIT SDK has no name for. Which ones appear in real files, and what a parser should do with them.
  • My Apple Health export is empty (or nearly) An export.zip that parses to almost nothing is usually not a broken export. What Apple actually includes, what it leaves out, and how to check yours.
  • My .fit file only shows part of my ride — why, and how to recover it A .fit file that redefines its message layout mid-file breaks parsers that cache the first definition, dropping everything after. Why, and how to read all of it.
  • My .fit file shows 255 or 65535 — what those numbers mean A 255, 65535 or 4294967295 in a .fit file usually means “no value”, not a real reading. FIT’s invalid sentinels, and why 0 can also mean absent.
  • My .fit file is missing a second activity — chained FIT files One .fit file can hold several activities chained together — a multisport or a resumed session. Parsers that stop after the first lose the rest. How to read them all.
  • Unknown developer fields in a .fit file — Connect IQ data A .fit file can carry custom “developer data” from Connect IQ apps and third-party sensors, self-described inside the file. What they are and how to read them.
  • My .fit file has the wrong date — the FIT time epoch FIT timestamps count seconds from 31 December 1989, not 1970. Read with the Unix epoch, a .fit file’s dates land 20 years early. Why, and how to read them right.
  • My Apple Health export.xml is too large to open — how to read it A multi-year Apple Health export.xml can be hundreds of megabytes and crash editors and importers. Why it is so big, and how to read it without loading it whole.

Comparing devices

  • SDNN vs RMSSD — why your HRV numbers do not match SDNN and RMSSD are both HRV in milliseconds and they are different quantities. There is no conversion between them. What each measures, and what to compare instead.
  • Why your Apple Watch HRV does not match your Oura ring Apple reports SDNN from spot checks. Oura reports RMSSD averaged over a night. They are different statistics over different windows — not a calibration problem.
  • Which HRV metric each device reports Apple, Oura, WHOOP, Garmin, Polar and Fitbit each report a different HRV statistic over a different window. The table, and why it matters.
  • Sleep stages are not the same across devices Four sleep vocabularies, one of which overlaps the others. Why Apple’s InBed double-counts, what Fitbit’s "restless" means, and what a coarser device is actually saying.
  • Active vs total calories — three definitions, one unit kcal is not a quantity. Active, total-including-basal, and the dietary conventions are different numbers, and one vendor reports energy in kilojoules.
  • Recovery, readiness and strain scores cannot be compared A recovery score is an algorithm nobody outside the vendor has seen. Why rescaling does not help, and why WHOOP strain is 0–21 rather than a percentage.
  • Skin temperature: absolute or a deviation? WHOOP reports ~33 °C. Oura and Fitbit report ±0.3. One is a temperature and the other is a deviation from your own baseline — they cannot share an axis.
  • Running power: Stryd vs Garmin vs Apple — why the watts do not match Stryd, Garmin and Apple all report running power in watts, but each estimates it from a different place with a different model. Why they disagree, and what to compare.
  • Step counts across devices — why your phone, watch and Fitbit disagree An iPhone, an Apple Watch, a Fitbit and a Garmin all count steps differently, and wearing two double-counts. Why totals differ, and which number to trust.
  • VO₂ max estimates: Garmin vs Apple vs Coros — why they differ Garmin, Apple and Coros each estimate VO₂ max from heart rate and pace, not a lab test. Why the numbers differ by several points, and how to read the trend.
  • Blood oxygen (SpO₂) across devices — Apple, Garmin and Oura compared Apple stores SpO₂ as a fraction, others as a percent, and each samples it differently — spot checks versus overnight. Why the numbers and coverage differ.
  • Distance: GPS watch vs phone vs foot pod — which is right The same run measured by a GPS watch, a phone and a foot pod gives three distances. How each is derived, where each fails, and which to trust when.
  • Kilojoules vs kilocalories — why WHOOP’s energy looks 4× too high WHOOP reports energy in kilojoules; Apple, Garmin and Fitbit use kilocalories. The 4.184× difference makes an import look wildly wrong. How to read energy correctly.