---
name: wodwatts
description: Score CrossFit-style and strength & conditioning workouts in watts, estimating the mechanical work (joules) and average power from the athlete's height, weight, the movements, reps, loads and time. Use when someone asks how hard a workout was, wants to compare different workouts or athletes, or wants a workout designed or scaled to a power or work target.
---

# WODWatts v0.1

WODWatts puts any mixed workout on one scale: **average watts**. Lifting, gymnastics, jumping, rowing and running all become joules of work, and joules divided by seconds gives watts. That lets you compare a 5-minute couplet with a 20-minute chipper or a 5 km run, and compare athletes using watts per kilogram.

## When to use

- "How many watts was my workout?" / "How hard was today's WOD?"
- "Compare these two workouts" or "Who worked harder, me or my friend?"
- Writing a workout: "Build me a 15-minute workout around 150 W," or show the expected watts for a workout you created.
- Scaling: "What load gives the same work as Rx for my size?"

## What you need

1. **Athlete height and body mass.** Ask once if they are missing. If the person doesn't want to give them, use 1.75 m and 75 kg and say so.
2. **Every movement with its reps, and the load** for weighted movements.
3. **Total time** for watts. Without time, report work (kJ) only.

Convert units: 1 in = 0.0254 m, 1 lb = 0.4536 kg, 1 ft = 0.3048 m.

## If you can run code, use the script

`scripts/wodwatts.py` implements this whole method exactly. Write the workout as JSON and run it:

```bash
python3 scripts/wodwatts.py workout.json        # readable report
python3 scripts/wodwatts.py workout.json --json # machine-readable
python3 scripts/wodwatts.py --list              # supported movements and aliases
```

```json
{
  "athlete": {"height_in": 69, "weight_lb": 150},
  "time": "12:30",
  "rounds": 3,
  "items": [
    {"movement": "row", "calories": 15, "time": "1:10"},
    {"movement": "kettlebell swing", "reps": 15, "load_lb": 53},
    {"movement": "box jump", "reps": 10, "box_in": 24},
    {"movement": "thruster", "reps": [21, 15, 9], "load_kg": 43}
  ]
}
```

`reps` may be a number or a list (21-15-9). `rounds` multiplies every item. Optional per-item parameters: `box_in`/`box_m`, `target_ft`/`target_m` (wall ball), `rope_ft`/`rope_m`. For row and ski items, `time` is the time of that piece only. If you can't run code, calculate by hand as below; the answers match.

## Calculating by hand

Each rep's work in joules, with H = height (m), M = body mass (kg) and L = load (kg):

```
J per rep = 9.81 × [ M × (a·H + b)  +  L × (c·H + d) ]
```

Look up a, b, c, d in the table. Multiply by total reps, add all movements, then divide by total seconds for watts.

### Movement coefficients

| Movement | a | b (m) | c | d (m) |
|---|---|---|---|---|
| Air squat, walking lunge (per step) | 0.217 | 0 | 0 | 0 |
| Back / front / overhead / goblet squat | 0.217 | 0 | 0.245 | 0 |
| Strict press, push press, push jerk, split jerk | 0 | 0 | 0.332 | 0 |
| Bench press | 0 | 0 | 0.250 | 0 |
| Thruster | 0.217 | 0 | 0.577 | 0 |
| Deadlift | 0.088 | 0 | 0.430 | −0.225 |
| Power clean, sumo deadlift high pull | 0.088 | 0 | 0.818 | −0.225 |
| Squat clean | 0.305 | 0 | 0.818 | −0.225 |
| Hang power clean | 0 | 0 | 0.418 | 0 |
| Hang squat clean | 0.217 | 0 | 0.418 | 0 |
| Power snatch | 0.088 | 0 | 1.150 | −0.225 |
| Squat snatch, clean and jerk | 0.305 | 0 | 1.150 | −0.225 |
| Hang power snatch | 0 | 0 | 0.750 | 0 |
| Hang squat snatch | 0.217 | 0 | 0.750 | 0 |
| Pull-up, jumping pull-up | 0.332 | 0 | 0 | 0 |
| Chest-to-bar pull-up | 0.380 | 0 | 0 | 0 |
| Muscle-up (bar or ring) | 0.672 | 0 | 0 | 0 |
| Ring/bar dip, handstand push-up | 0.332 | 0 | 0 | 0 |
| Push-up | 0.249 | 0 | 0 | 0 |
| Burpee | 0.699 | 0.10 | 0 | 0 |
| Sit-up (AbMat) | 0.149 | 0 | 0 | 0 |
| GHD sit-up | 0.203 | 0 | 0 | 0 |
| Knees-to-elbows | 0.080 | 0 | 0 | 0 |
| Toes-to-bar | 0.097 | 0 | 0 | 0 |
| Double-under | 0 | 0.12 | 0 | 0 |
| Single-under | 0 | 0.05 | 0 | 0 |
| Box jump / step-up (box height h m) | 0 | h | 0 | 0 |
| Rope climb (climb height h m, default 4.6) | 0 | h | 0 | 0 |
| Wall ball (target t m, default 3.05) | 0.217 | 0 | −0.573 | t |
| Ball slam | 0.217 | 0 | 1.150 | −0.150 |
| Med-ball clean | 0.217 | 0 | 0.818 | −0.150 |
| Kettlebell swing (Russian, to eye level) | 0.054 | 0 | 0.518 | 0 |
| Kettlebell swing (American, overhead) | 0.054 | 0 | 0.850 | 0 |
| Dumbbell snatch | 0.088 | 0 | 1.150 | −0.150 |

For dumbbell or kettlebell movements done with two implements, L is their combined weight. For single-arm movements, L is the one implement.

### Machines and running

| Movement | Work in joules |
|---|---|
| Rower or SkiErg, average watts shown | watts × seconds of that piece |
| Rower or SkiErg, distance d (m) in t s | watts = 2.80 ÷ (t/d)³, then × t |
| Rower or SkiErg, calories C in t s | watts = (C × 3600/t − 300) ÷ 3.44, then × t |
| Bike or other machine showing watts | watts × seconds |
| Bike or other machine showing calories only | C × 4184 × 0.25 (rough) |
| Run, distance d (m) | 0.25 × 4.0 × M × d, plus M × 9.81 × elevation gain (m) |

When a machine shows watts, always use that number rather than an estimate.

### A movement that isn't listed

Build it from the same parts and label the result an estimate. Work per rep = Σ (mass × 9.81 × vertical rise of that mass). Useful pieces:

- **Moving whole body:** M. **Body above the knees** (squats, lunges): 0.884 M. **Upper body** (head, trunk, arms): 0.678 M. **Both legs:** 0.322 M.
- **Arm length:** 0.332 H. **Squat depth (hip travel):** 0.245 H. **Shoulder height:** 0.818 H. **Overhead reach:** 1.150 H. **Hip to chin:** 0.340 H. **Bar on the floor:** 0.225 m.

## Reporting the result

Use this layout. Round joules to 3 significant figures and watts to whole numbers.

```
WODWatts — <workout name>  |  <H> m, <M> kg
| Movement | Reps | Load | kJ | % of work |
...
Total work: <kJ> kJ   Time: <mm:ss>
Average power: <W> W  (<W/kg> W/kg)
Same energy would run a 100 W bulb for <min> minutes.
```

- **Watts per kg** (W ÷ M) is the fair number for comparing athletes of different sizes.
- If asked for calories, give metabolic kcal = total J ÷ 0.25 ÷ 4184, labelled as a rough estimate.
- Say briefly that the score counts the upward work against gravity, so it is a comparison number, not a calorie count.

## Worked example: "Fran"

21-15-9 thrusters at 43 kg and pull-ups, 5:00, athlete 1.75 m and 68 kg.

- Thruster: 9.81 × [68 × (0.217 × 1.75) + 43 × (0.577 × 1.75)] = 9.81 × [25.8 + 43.4] = **679 J**, × 45 reps = 30.6 kJ
- Pull-up: 9.81 × 68 × 0.332 × 1.75 = **388 J**, × 45 reps = 17.4 kJ
- Total 48.0 kJ ÷ 300 s = **160 W** (2.35 W/kg)

For scale with the same athlete: a 2,000 m row in 8:00 is about 203 W, and a flat 5 km run in 25:00 is about 227 W.

## Designing workouts with watts

- **Hitting a target:** work needed = target W × planned seconds. Pick movements and reps so the total work matches, using realistic paces (for example, about 3–4 s per thruster or 2–3 s per pull-up at a sustainable effort).
- **Show your estimate:** when you write a workout, add its estimated work and the watts at a likely finishing time, so the athlete can compare it with past sessions.
- **Fair scaling:** to give a smaller or larger athlete the same relative work, scale loads so their W/kg target is the same, not their absolute load.

## Limits

- Only lifting against gravity counts. Lowering, holding positions, isometric effort, horizontal movement and rest are scored as zero. Heavy, slow and grinding work is under-credited compared with how hard it feels.
- The body proportions are population averages (Drillis & Contini; Clauser et al., 1969). Individuals vary by a few percent.
- Several distances are estimates (hang height, hinge rise, kettlebell low point, double-under height, sit-up and toes-to-bar rises). Treat scores as accurate to roughly ±10%. They are most useful for comparing workouts and tracking the same athlete over time.
