Skip to content

Convert ZWO to FIT ​

Scope

Converts structured workouts (steps and targets), not recorded activities. See Workouts vs. activities.

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 (in the browser) ​

Open kaiord.com/app, choose your .zwo file (FIT is already selected 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 messages—Not 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.