How to Create Your Own CR4NKUP Workouts .c4w

Create fully custom training sessions using simple text files. A .c4w file is just JSON that CR4NKUP reads and turns into a workout.

1) Create a New Workout File

  1. Open any text editor (Notepad, VSCode, Notepad++, etc.).
  2. Save the file with the extension .c4w.

Example: my_first_workout.c4w

2) Basic Structure of a .c4w File

Every workout contains these fields:

{
  "workoutName": "My Custom Workout",
  "description": "What this workout is about.",
  "author": "Your Name",
  "duration": 1800,
  "steps": [ ... ],
  "notices": [ ... ],
  "metadata": { ... }
}
FieldMeaning
workoutNameTitle shown inside CR4NKUP.
descriptionLonger explanation (supports rich text tags).
authorYour name or nickname.
durationTotal workout length in seconds.
stepsThe workout blocks (warmup, intervals, ramps, freeride…).
noticesPop-up messages shown during the workout (optional).
metadataDifficulty, tags, last updated timestamp.

3) Workout Steps

Each step has a type, a duration (seconds), and an intensity target relative to your FTP.

{
  "stepType": "Interval",
  "duration": 300,
  "startIntensity": 0.85,
  "targetIntensity": 0.85,
  "targetCadence": 90
}
Important
  • Intensities are relative to FTP. Example: 0.85 = 85% FTP, 1.05 = 105% FTP.
  • targetCadence is optional and should mainly be used for cadence-specific training (spinups, cadence drills, etc.).

4) Freeride Segments (No ERG Mode)

If you want a section where you ride freely without target power (ERG off), set both intensities to 0:

{
  "stepType": "Freeride",
  "duration": 600,
  "startIntensity": 0.0,
  "targetIntensity": 0.0
}

CR4NKUP recognizes startIntensity = 0 and targetIntensity = 0 as a freeride segment.

5) Creating Ramps (Progressive Power Changes)

A Ramp step smoothly changes the target power from startIntensity to targetIntensity over the step duration.

Example: ramp from 60% FTP to 85% FTP over 3 minutes:

{
  "stepType": "Ramp",
  "duration": 180,
  "startIntensity": 0.60,
  "targetIntensity": 0.85
}

Ramps are great for warmups, cooldowns, progressive intervals, and smooth transitions between efforts.

6) Notices (On-Screen Messages)

Notices show messages at specific times during the workout.

{
  "time": 900,
  "message": "Get ready for Interval 2!"
}

Rich Text Support

You can use Unity rich text tags in description and message, for example:

Use formatting sparingly so important cues stand out.

7) Metadata (Recommended)

{
  "difficulty": "intermediate",
  "tags": ["ftp", "sweetspot", "30min"],
  "lastUpdated": "2025-01-10T12:00:00+01:00"
}

Tags help CR4NKUP filter and search workouts. Keep tags simple, consistent, and lowercase.

8) Where to Save Your Workout Files

As a user, place custom workout files in your CR4NKUP workouts folder:

Windows

C:\Users\YOURUSERNAME\AppData\LocalLow\Crankup GmbH\Cr4nkup\Workouts\
Note
CR4NKUP loads every .c4w file found in the user workouts folder when the game starts. Next time you open the Workouts menu in the game a thumbnail for the new Workout will be created automatically.

9) Full Example You Can Copy

{
  "workoutName": "Custom Example",
  "description": "A simple example workout to help you get started.<br><br><b>Tip:</b> You can use rich text to highlight sections.",
  "author": "Your Name",
  "duration": 1800,
  "steps": [
    { "stepType": "Warmup",  "duration": 300, "startIntensity": 0.60, "targetIntensity": 0.75 },
    { "stepType": "Ramp",    "duration": 180, "startIntensity": 0.75, "targetIntensity": 0.90 },
    { "stepType": "Interval","duration": 480, "startIntensity": 0.90, "targetIntensity": 0.90 },
    { "stepType": "Recovery","duration": 180, "startIntensity": 0.50, "targetIntensity": 0.50 },
    { "stepType": "Interval","duration": 480, "startIntensity": 0.95, "targetIntensity": 0.95 },
    { "stepType": "Cooldown","duration": 180, "startIntensity": 0.50, "targetIntensity": 0.50 }
  ],
  "notices": [
    { "time": 0,   "message": "Warm up and prepare for the ramp." },
    { "time": 300, "message": "Ramping up — increase power smoothly." },
    { "time": 600, "message": "<b>First interval!</b> Hold steady." }
  ],
  "metadata": {
    "difficulty": "intermediate",
    "tags": ["example", "ftp", "30min"],
    "lastUpdated": "2025-01-10T12:00:00+01:00"
  }
}