Rowing Workout Notation (RWN)
This page follows the same flow used in Logbook Companion: learn the specification clearly, then move into playground-driven examples and validator usage.
RWN Reference
Version 0.1.0-draft • Request for Comment
Why RWN
Rowing already has strong informal workout shorthand, but teams and apps still use slightly different syntax. RWN keeps the notation coaches already understand while making it predictable enough for software to parse, validate, and execute.
Shared language across teams
Use one readable format for athletes, coaches, and planners instead of rewriting workouts per tool or spreadsheet.
Reliable tooling and automation
Structured syntax enables parser validation, canonical names, and template workflows in Logbook Companion.
Interoperability as a standard
A lightweight open standard makes it easier to share plans between apps, communities, and future integrations.
Quick before/after example
Informal: 4 by 500, 1 minute rest, 2k pace ish
4x500m/1:00r@2k
1. Basic Structure
Standard Intervals
[Repeats] x [Work] / [Rest]r
- 4x500m/1:00r
- 8x1:00/1:00r
- 500m/1:00r
Steady State
[Duration] or [Distance]
- 10000m
- 30:00
2. Components
| Component | Examples | Notes |
|---|---|---|
| Work Unit | 500m, 1:00, 500cal | Distance, time, or calories. |
| Rest Unit | 1:00r, 3:30r | Uses trailing rest suffix. |
| Guidance | @r20, @2:05..2:10, @UT2 | Execution intent metadata. |
3. Extended Guidance (@)
Block Tags (Semantic Structure)
3b. Advanced Guidance Features
@open Keyword
For intentionally unrestricted segments — sprints, athlete discretion, or "go as hard as you want."
0:30@open
500m@open
Distinct from omitted guidance — @open means intentional freedom, not a missing value.
Chained Guidance
Combine multiple guidance modifiers on a single work unit.
30:00@UT2@r20
Zone + rate applied together.
Sub-interval Guidance (+ segments)
Split a piece into segments with individual guidance using + inside repeats.
10x(2:30@r24..26 + 0:30@open)/30sr
First 2:30 controlled, last 30s open sprint.
3x(4:00@UT2 + 1:00@open)/2:00r
4 min steady + 1 min sprint per rep.
Input Tolerance / Shorthand
Flexible input forms that normalize to standard RWN notation.
| Input | Normalized | Rule |
|---|---|---|
| 3' | 3:00 | Minute shorthand |
| 30" | 0:30 | Second shorthand |
| 3'30" | 3:30 | Combined |
| 30:00r20 | 30:00@r20 | Rate shorthand |
| 4 x 500m | 4x500m | Whitespace tolerance |
| @18-22spm | @18..22spm | Dash tolerance |
4. Advanced Syntax
Segmented Workouts
Use + to chain blocks with clear flow.
[w]10:00 + 4x2000m/3:00r + [c]10:00
Grouped Repeats
Nest interval sets for ladders and compound blocks.
3x(750m/3:00r + 500m/3:00r)
PM5 Splits
10000m [2000m]
Undefined Rest
Use /...r for open or coach-defined rest periods.
4x2000m/...r
5. Machine Types & Mixed Modalities
Use modality prefixes for non-rowing activities and mixed circuits.
Bike: 15000m
Ski: 8x500m/3:30r
[w]Row: 5:00 + Row: 2000m + Bike: 5000m + Ski: 2000m + [c]Row: 5:00
6. Session Orchestration Draft
Experimental extensions for multi-athlete and non-erg session structures. These are under active design and may change.
Partner Workouts
Alternating athlete pairs with partner(on=[core], off=[task]).
partner(on=4x1000m/...r, off=wait)
Passive off-task — partner waits.
partner(on=4x1000m/...r, off=circuit(...))
Active off-task — partner does a circuit.
Relays
Team relay format with relay(leg=[distance], total=[distance]).
relay(leg=500m, total=6000m)
Basic relay — team size inferred from total ÷ leg.
relay(leg=500m, total=6000m, team_size=6)
Explicit team sizing.
Station Rotation
Circuit rotation with rotate(stations=[n], switch=[time], rounds=[n], plan=[...]).
rotate(stations=4, switch=5:00, rounds=3, plan=[Row: 5:00, Bike: 5:00, Ski: 5:00, circuit(...)])
Off-erg Circuit
Non-erg activities with circuit([exercise], [exercise], ...).
circuit(20 burpees, 20 pushups, 20 situps, 1:00 plank)