Skip to content

Convert FIT to Garmin

Turn a Garmin FIT workout into the Garmin Connect workout format (GCN JSON) so a session from a FIT file can live in your Garmin Connect account and sync to your watch or head unit. Use the free, in-browser Kaiord Editor (no account, no upload), or the CLI and TypeScript SDK. Conversions go through Kaiord's canonical KRD format and stay within round-trip tolerances (time ±1 s, power ±1 W, heart rate ±1 bpm, cadence ±1 rpm).

Three ways to convert

1. Editor (drag & drop)

Open kaiord.com/editor, drop your .fit file, choose Garmin (GCN) as the export format, and download the result. To send it straight to your account, use the Editor's Garmin sync (backed by the garmin-bridge extension).

2. CLI

bash
pnpm add -g @kaiord/cli
kaiord convert -i workout.fit -o workout.gcn

To push directly to Garmin Connect (after kaiord garmin login):

bash
kaiord garmin push -i workout.fit --input-format fit

3. SDK

ts
import { fromBinary, toText } from "@kaiord/core";
import { fitReader } from "@kaiord/fit";
import { garminWriter } from "@kaiord/garmin";
import { readFile, writeFile } from "node:fs/promises";

const buffer = await readFile("workout.fit");
const krd = await fromBinary(new Uint8Array(buffer), fitReader);
const gcn = await toText(krd, garminWriter);
await writeFile("workout.gcn", gcn);

What survives the conversion

DataFITGarmin Connect (GCN)Result
Step order & namesworkout stepsworkout stepsPreserved
Time durationssecondstime durationsPreserved (±1 s)
Distance durationsmetersdistance durationsPreserved
Power targetswatts / zonewatts / power zonePreserved (±1 W; zones map across)
Heart-rate targetsbpm / zonebpm / heart-rate zonePreserved (±1 bpm)
Cadence targetsrpmrpmPreserved (±1 rpm)
Speed / pace targetsm/sm/sPreserved
Repeats / intervalsrepeat stepsrepeat blocksPreserved
Developer fieldscustom fieldsPreserved under extensions.fit

FIT and Garmin Connect are both Garmin-native, watt-based formats, so this is one of the highest-fidelity conversions Kaiord does — no assumed FTP is needed.

Gotchas

FIT file vs. Garmin Connect JSON. A .fit file is Garmin's on-device binary format; a .gcn file is Garmin Connect's workout JSON. They are not the same thing, which is why the conversion matters — the GCN output is what the Garmin Connect API accepts.

How does it get on my watch? Push the .gcn to your account with kaiord garmin push (via @kaiord/garmin-connect) or use the Editor's Garmin sync; Garmin Connect then syncs it to your device.

Developer and unknown fields. FIT developer fields and unknown messages have no Garmin Connect equivalent, so they are kept under extensions.fit and survive a later garmin-to-fit round-trip rather than being emitted into the GCN workout.