Readable by athletes
Any valid file can be put on the wall of the box as is. No braces, no YAML: whiteboard syntax.
An open language · version 1.1
WODCraft is a small language for prescribing functional-fitness workouts — and the compiler that checks them. Strict where it matters (units, movements, score coherence, plausibility), forgiving where coaches need it.
# Fran 21-15-9 for time, cap 10:00 Thruster 95/65 lb Pull-up Scaled: Thruster 65/45 lb Pull-up -> Jumping pull-up
FRAN 21-15-9 for time · cap 10:00 Thruster .......................... 95/65 lb Pull-up Score: time (capped: reps) Estimate: 3:22–6:14 Levels: scaled
Any valid file can be put on the wall of the box as is. No braces, no YAML: whiteboard syntax.
A box jump takes a height, not a load. 1 m Run asks whether you meant 1 mi. An EMOM nobody can finish is flagged.
The compiled JSON follows a versioned schema: it is what timers, apps and AI agents exchange.
Loads carry kilos and pounds, with the equivalences boxes actually use: 95 lb ↔ 43 kg, 24 in ↔ 60 cm.
Text goes in, a structured document comes out. Click a stage to see what it really produces for Fran.
Every diagnostic carries a code from the specification, an exact line and column — and a suggestion when there is one. Real output of wodc check.
# Tuesday EMOM 10 25 Thruster 43/30 kg 10 Box jump 24 kg 1 m Run 15 Pul-up
For time, AMRAP, EMOM, intervals, Tabata, Death by, strength sets, teams, there and back… On the left what the coach writes, on the right what the board shows.
# Fran 21-15-9 for time, cap 10:00 Thruster 95/65 lb Pull-up Scaled: Thruster 65/45 lb Pull-up -> Jumping pull-up
FRAN 21-15-9 for time · cap 10:00 Thruster .......................... 95/65 lb Pull-up Score: time (capped: reps) Estimate: 3:22–6:14 Levels: scaled
The coach writes Thruster 95/65 lb once. The compiler resolves it for each athlete: category, level, units, language.
Output of wodc show fran.wod
FRAN 21-15-9 for time · cap 10:00 Thruster ............................. 43 kg Pull-up Score: time (capped: reps) Estimate: 3:22–6:14 [men · rx · kg]
The real session of 29 September: warm-up, AMRAP, team chipper, core work. wodc timer turns it into the timer's run sheet.
No server: WODCraft's Python package runs right here thanks to Pyodide. Edit the WOD, break it, compile.
Press “Compile”: the compiler (≈ 10 MB with Python) loads the first time.
One specification, one schema, one conformance suite — and two implementations that check each other.
Check, display, format like gofmt, export to your calendar.
$ wodc check mardi.wod $ wodc show girls/fran --me $ wodc fmt --write mardi.wod $ wodc export ics semaine.wod
Language server and VS Code extension: live diagnostics, movement completion, hover, quick fixes.
python -m wodcraft.lsp
An MCP server exposes the compiler itself. The agent drafts a WOD, the compiler answers, the agent fixes it.
check_wod · compile_wod · show_wod format_wod · timeline_wod search_movements · library_get
WODCraftKit: the language ported to Swift, offline, validated by the same conformance suite.
import WODCraftKit
For clients that cannot embed the compiler. Docker image ready for Cloud Run.
POST /compile /check /format /show GET /catalog /library
Specification (CC BY-SA), versioned JSON Schema and conformance cases: WODCraft is meant to be reimplemented.
spec/SPEC.md spec/workout.schema.json spec/conformance/
$ pip install git+https://github.com/Nicolas78240/WODCraft $ wodc show girls/fran --lang fr
A collaboration: Nicolas Caussin set the course and had the idea, orchestrated, corrected and approved, and we iterated until this version. Most of the writing — specification, compiler, Swift port, tests, documentation and this site — was done by Claude (Anthropic) with Claude Code.