Skip to content

Convert ZWO to FIT

Turn a Zwift ZWO workout into a Garmin FIT file so a session built in Zwift can run on your Garmin head unit or watch. Use the free, in-browser Kaiord Editor — no account, no upload — or the CLI and TypeScript SDK if you prefer to script it. Conversions go through Kaiord's canonical KRD format and stay within round-trip tolerances (time ±1 s, power ±1 W or ±1 % FTP).

Three ways to convert

1. Editor (drag & drop)

Open kaiord.com/editor, drop your .zwo file, choose FIT as the export format, and download workout.fit. It runs entirely in your browser.

2. CLI

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

3. SDK

ts
import { fromText, toBinary } from "@kaiord/core";
import { zwiftReader } from "@kaiord/zwo";
import { fitWriter } from "@kaiord/fit";
import { readFile, writeFile } from "node:fs/promises";

const zwo = await readFile("workout.zwo", "utf-8");
const krd = await fromText(zwo, zwiftReader);
const fit = await toBinary(krd, fitWriter);
await writeFile("workout.fit", fit);

What survives the conversion

DataZWO (Zwift)FITResult
Step order & namesblocksworkout stepsPreserved
Time durationsDuration secondssecondsPreserved (±1 s)
Power targets% FTP (Power fraction)power targetPreserved (±1 % FTP)
RampsWarmup / Cooldown / Rampranged power targetPreserved as a power range
Free-ride segmentsFreeRideopen stepPreserved as an untargeted step
Cadence targetslimitedrpmPreserved when present
Text eventsin-ride messagesNot part of the FIT workout definition

Gotchas

Will it load on my Garmin? FIT is Garmin's native workout format, so the output is directly loadable. To send it to your device, push it with the CLI — kaiord garmin push -i workout.fit --input-format fit — or use the Editor's Garmin integration. See the garmin command.

Sport type. ZWO uses bike or run; these map to the FIT cycling / running sports. Zwift workouts are overwhelmingly cycling, so most files land as indoor cycling on your device.

In-ride text messages don't transfer. ZWO text events are Zwift-specific overlays and are not part of the FIT workout target model, so they are not emitted into the FIT file.