Template gallery / training-plan
Training plan template
Landscape training plan set like a race bib. Page one is the reference sheet: the race, the target time set large, the plan's shape, the pace or load key the day cells refer to, the rules and the blocks across the sheet. Then one seven-day grid per week that never splits across a page, each with its number, dates, block and total in a left rail. Rest days are tinted grey and the session of the week carries a red bar.
chromium default PDF 15 top-level fields Billed per page
Fields
The full JSON Schema is below. Required fields are marked; anything missing comes back as a 422 naming the path, the expected type and a value that would be accepted.
| Field | Type | Required | Description |
|---|---|---|---|
| accent | string | optional | The one hot accent: the session-of-the-week bar, the block week numbers and the target time. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| key_tint | string | optional | Background of a day marked `kind: key`. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| issued_on | string (date) | optional | |
| version | string | optional | Plans get revised. Print which one the athlete is holding. |
| plan | object { name, goal, goal_date, goal_note, … } | required | The header cards. Each one prints only if its field is there, so a strength block with no paces does not show an empty card. |
| athlete | object { name, category } | required | |
| coach | object { name, business, email, phone, … } | optional | |
| zone_label | string | optional | First column heading on the reference table. Say "Lift" or "RPE" for strength work. |
| pace_label | string | optional | Second column heading. Say "Load" or "% 1RM" for strength work. |
| effort_label | string | optional | |
| zones | array of object { name, pace, effort, purpose } | optional | The key the day cells refer to: paces for a runner, loads for a lifter, watts for a cyclist. |
| principles | array of string | optional | The rules the athlete is meant to reread in week 6. |
| phases | array of object { name, weeks, focus } | optional | The blocks, across the page above the weeks. |
| weeks | array of object { number, dates, phase, focus, … } | required | One block per week, each a seven-column grid that never splits across a page. |
| footer | string | optional | Replaces the default guidance-not-medical-advice line. |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| landscape | true |
| margin | "0.45in" |
| print_background | true |
Example payload
This exact object renders the preview above. It is also what the API echoes back in a validation error, so an agent can repair a payload without a round trip to the docs.
{
"issued_on": "2026-09-16",
"version": "2",
"plan": {
"name": "12-week half marathon build",
"goal": "Cape Fear Half",
"goal_date": "2026-12-13",
"goal_note": "Wilmington NC, flat and usually cold",
"target": "1:52:00",
"target_note": "8:33 per mile, 20 min faster than March",
"length": "12 weeks",
"start_date": "2026-09-21",
"volume": "42 mi peak",
"volume_note": "374.1 mi across the plan",
"sessions_per_week": "5 to 6",
"sessions_note": "One long, one hard, the rest genuinely easy"
},
"athlete": {
"name": "Nadia Ferreira-Blake",
"category": "F40, third half marathon"
},
"coach": {
"name": "Owen Castellanos",
"business": "Northbank Endurance",
"email": "owen@northbankendurance.test",
"phone": "(910) 555-0163"
},
"zone_label": "Zone",
"pace_label": "Pace / mi",
"effort_label": "Effort",
"zones": [
{
"name": "Easy",
"pace": "10:15 – 10:45",
"effort": "Zone 2",
"purpose": "Most of the plan. You can hold a full conversation. If you cannot, you are running it wrong."
},
{
"name": "Steady",
"pace": "9:30",
"effort": "Zone 3",
"purpose": "Comfortably hard. Short sentences only. Used to finish long runs."
},
{
"name": "Half pace",
"pace": "8:35",
"effort": "Zone 3-4",
"purpose": "Race pace. It should feel almost too easy in week 7 and honest in week 12."
},
{
"name": "Threshold",
"pace": "8:10",
"effort": "Zone 4",
"purpose": "The pace you could hold for an hour flat out. The engine of this plan."
},
{
"name": "10k pace",
"pace": "7:50",
"effort": "Zone 4-5",
"purpose": "Short reps only, to make threshold feel comfortable."
},
{
"name": "Strides",
"pace": "7:20",
"effort": "Relaxed and fast",
"purpose": "20 seconds, full recovery. Form work, not a session."
}
],
"principles": [
"Easy days easy. Nearly every plan that fails, fails here.",
"Move a session rather than skip it, and tell me when you do.",
"Paces are for flat ground in cool weather. Add 15 to 20 seconds a mile above 70°F or into a headwind, and run hills on effort.",
"If a niggle is still there after two easy days, message me before the next hard session.",
"Long runs are done in the kit and shoes you will race in, from week 9 on.",
"Two down weeks are scheduled. They are part of the plan, not a reward."
],
"phases": [
{
"name": "Base",
"weeks": "Weeks 1 – 4",
"focus": "Five days a week, one short quality session, long run to 10 mi."
},
{
"name": "Build",
"weeks": "Weeks 5 – 8",
"focus": "Threshold volume climbs, six days, long run to 13 mi with race pace in it."
},
{
"name": "Peak",
"weeks": "Weeks 9 – 10",
"focus": "Biggest two weeks, a 10k tune-up, and the long run on tired legs."
},
{
"name": "Taper",
"weeks": "Weeks 11 – 12",
"focus": "Volume down by a third, intensity kept, race on the Sunday."
}
],
"weeks": [
{
"number": 1,
"dates": "Sep 21 – 27",
"phase": "Base",
"focus": "Get the legs used to five days. Nothing hard.",
"volume": "24 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"detail": "Mobility 15 min if you feel like it",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "5 mi",
"detail": "Easy pace, then 4 x 20s strides on the flat"
},
{
"day": "Wed",
"session": "Steady",
"load": "4 mi",
"detail": "Comfortably hard breathing, conversation in short sentences"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi",
"detail": "All of it easy. Slower than you think"
},
{
"day": "Fri",
"session": "Rest / strength",
"detail": "30 min: squat, hinge, single-leg, core",
"kind": "rest"
},
{
"day": "Sat",
"session": "Long run",
"load": "8 mi",
"detail": "Flat route, easy pace throughout",
"kind": "key"
},
{
"day": "Sun",
"session": "Recovery",
"load": "2 mi",
"detail": "Optional. Walk it if the legs are heavy"
}
]
},
{
"number": 2,
"dates": "Sep 28 – Oct 4",
"phase": "Base",
"focus": "First speed of the block, short and controlled.",
"volume": "27 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "5 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Intervals",
"load": "6 mi",
"detail": "2 mi w/u, 6 x 400 m at 10k pace w/ 90s jog, 1.5 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Rest / strength",
"kind": "rest"
},
{
"day": "Sat",
"session": "Long run",
"load": "9 mi",
"detail": "Easy. Practise drinking on the move",
"kind": "key"
},
{
"day": "Sun",
"session": "Recovery",
"load": "2 mi"
}
]
},
{
"number": 3,
"dates": "Oct 5 – 11",
"phase": "Base",
"focus": "First threshold work. Effort, not pace, if it is warm.",
"volume": "30 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "5 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Threshold",
"load": "7 mi",
"detail": "2 mi w/u, 3 x 1 mi at 8:10 w/ 90s jog, 2 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Rest / strength",
"kind": "rest"
},
{
"day": "Sat",
"session": "Long run",
"load": "10 mi",
"detail": "Last 2 mi steady",
"kind": "key"
},
{
"day": "Sun",
"session": "Recovery",
"load": "3 mi"
}
]
},
{
"number": 4,
"dates": "Oct 12 – 18",
"phase": "Down",
"focus": "Cut back. This is where the last three weeks land.",
"volume": "23 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Wed",
"session": "Steady",
"load": "4 mi",
"detail": "No intervals this week"
},
{
"day": "Thu",
"session": "Easy",
"load": "4 mi"
},
{
"day": "Fri",
"session": "Rest",
"kind": "rest"
},
{
"day": "Sat",
"session": "Long run",
"load": "7 mi",
"detail": "Shorter on purpose",
"kind": "key"
},
{
"day": "Sun",
"session": "Recovery",
"load": "3 mi"
}
]
},
{
"number": 5,
"dates": "Oct 19 – 25",
"phase": "Build",
"focus": "Six days. Friday is short and genuinely easy.",
"volume": "31 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "5 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Threshold",
"load": "8 mi",
"detail": "2 mi w/u, 4 x 1 mi at 8:10 w/ 90s jog, 2 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Easy",
"load": "3 mi",
"detail": "Shake-out only"
},
{
"day": "Sat",
"session": "Long run",
"load": "10 mi",
"detail": "Last 3 mi steady",
"kind": "key"
},
{
"day": "Sun",
"session": "Rest",
"kind": "rest"
}
]
},
{
"number": 6,
"dates": "Oct 26 – Nov 1",
"phase": "Build",
"focus": "Longer reps at 10k pace, then the first 12.",
"volume": "34 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "6 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Intervals",
"load": "8 mi",
"detail": "2 mi w/u, 5 x 800 m at 7:50 w/ 2 min jog, 2 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Easy",
"load": "3 mi"
},
{
"day": "Sat",
"session": "Long run",
"load": "12 mi",
"detail": "Easy throughout. Take gels at 45 and 75 min",
"kind": "key"
},
{
"day": "Sun",
"session": "Rest",
"kind": "rest"
}
]
},
{
"number": 7,
"dates": "Nov 2 – 8",
"phase": "Build",
"focus": "Biggest week before the down week. Long run has race pace in it.",
"volume": "37 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "6 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Threshold",
"load": "9 mi",
"detail": "2 mi w/u, 2 x 2 mi at 8:10 w/ 3 min jog, 3 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "6 mi"
},
{
"day": "Fri",
"session": "Easy",
"load": "3 mi"
},
{
"day": "Sat",
"session": "Long run",
"load": "13 mi",
"detail": "Last 4 mi at 8:35. This is the session of the block",
"kind": "key"
},
{
"day": "Sun",
"session": "Rest",
"kind": "rest"
}
]
},
{
"number": 8,
"dates": "Nov 9 – 15",
"phase": "Down",
"focus": "Absorb it. Resist the urge to add a session.",
"volume": "28 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Wed",
"session": "Steady",
"load": "5 mi",
"detail": "No reps"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Rest / strength",
"kind": "rest"
},
{
"day": "Sat",
"session": "Long run",
"load": "10 mi",
"detail": "All easy"
},
{
"day": "Sun",
"session": "Recovery",
"load": "3 mi"
}
]
},
{
"number": 9,
"dates": "Nov 16 – 22",
"phase": "Peak",
"focus": "The hardest threshold session and the longest run so far.",
"volume": "39 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "6 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Threshold",
"load": "10 mi",
"detail": "2 mi w/u, 5 x 1 mi at 8:10 w/ 75s jog, 2.5 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "6 mi"
},
{
"day": "Fri",
"session": "Easy",
"load": "3 mi"
},
{
"day": "Sat",
"session": "Long run",
"load": "14 mi",
"detail": "Last 5 mi at 8:35, in race kit and race shoes",
"kind": "key"
},
{
"day": "Sun",
"session": "Rest",
"kind": "rest"
}
]
},
{
"number": 10,
"dates": "Nov 23 – 29",
"phase": "Peak",
"focus": "Tune-up 10k on Saturday, long run the next morning on tired legs.",
"volume": "42 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "6 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Steady",
"load": "7 mi",
"detail": "Middle 4 mi at 9:30"
},
{
"day": "Thu",
"session": "Easy",
"load": "6 mi"
},
{
"day": "Fri",
"session": "Rest",
"detail": "Travel and race kit laid out",
"kind": "rest"
},
{
"day": "Sat",
"session": "10k tune-up race",
"load": "9 mi",
"detail": "2 mi w/u, 6.2 mi race, 0.8 mi c/d. Run it, do not race it to the last drop",
"kind": "key"
},
{
"day": "Sun",
"session": "Long run",
"load": "14 mi",
"detail": "Very easy. Legs will be heavy and that is the point",
"kind": "key"
}
]
},
{
"number": 11,
"dates": "Nov 30 – Dec 6",
"phase": "Taper",
"focus": "Volume comes down, intensity stays. You should start feeling springy.",
"volume": "33 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "5 mi",
"detail": "6 x 20s strides"
},
{
"day": "Wed",
"session": "Threshold",
"load": "8 mi",
"detail": "1.5 mi w/u, 3 x 1.5 mi at 8:10 w/ 2 min jog, 2 mi c/d",
"kind": "key"
},
{
"day": "Thu",
"session": "Easy",
"load": "5 mi"
},
{
"day": "Fri",
"session": "Easy",
"load": "3 mi"
},
{
"day": "Sat",
"session": "Long run",
"load": "12 mi",
"detail": "Last 3 mi at 8:35",
"kind": "key"
},
{
"day": "Sun",
"session": "Rest",
"kind": "rest"
}
]
},
{
"number": 12,
"dates": "Dec 7 – 13",
"phase": "Race",
"focus": "Do less than you want to. Sleep is the session this week.",
"volume": "26.1 mi",
"days": [
{
"day": "Mon",
"session": "Rest",
"kind": "rest"
},
{
"day": "Tue",
"session": "Easy + strides",
"load": "4 mi",
"detail": "4 x 20s strides"
},
{
"day": "Wed",
"session": "Race pace tune",
"load": "4 mi",
"detail": "1 mi w/u, 2 mi at 8:35, 1 mi c/d"
},
{
"day": "Thu",
"session": "Easy",
"load": "3 mi"
},
{
"day": "Fri",
"session": "Rest",
"detail": "Bib collection. Feet up",
"kind": "rest"
},
{
"day": "Sat",
"session": "Shake-out",
"load": "2 mi",
"detail": "Plus 4 x 20s strides. Nothing more"
},
{
"day": "Sun",
"session": "Cape Fear Half Marathon",
"load": "13.1 mi",
"detail": "8:35/mi to 10 mi, then whatever is left. Goal 1:52",
"kind": "key"
}
]
}
],
"footer": "Paces are guidance for flat ground in cool conditions. Move a session rather than skip it and tell your coach when you d… [263 characters, shortened for display]"
}
Values longer than 240 characters — data URIs, inline SVG — are shortened here so the
shape of the payload stays readable, and the replacement says how much was left out.
get_template and GET /v1/templates/:ref return them in full.
Render it
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "training-plan@1",
"format": "pdf",
"data": "… the example payload above …"
}' # No API key. The first call mints a trial of 10 PDF pages or 10 images.
curl -sS https://mcp.galleyrender.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "render",
"arguments": {
"template": "training-plan",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — training-plan@1 — in anything you ship. Publishing a new
version never changes an old one. Render endpoint reference →
Renders the example payload on the production service. No account, no key.
JSON Schema
schema.json (15 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Training plan",
"type": "object",
"required": [
"plan",
"athlete",
"weeks"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The one hot accent: the session-of-the-week bar, the block week numbers and the target time. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#d62828"
],
"default": "#d62828",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"key_tint": {
"type": "string",
"description": "Background of a day marked `kind: key`. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#fbeceb"
],
"default": "#fbeceb",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"issued_on": {
"type": "string",
"format": "date",
"examples": [
"2026-09-16"
]
},
"version": {
"type": "string",
"description": "Plans get revised. Print which one the athlete is holding.",
"examples": [
"2"
]
},
"plan": {
"type": "object",
"required": [
"name"
],
"description": "The header cards. Each one prints only if its field is there, so a strength block with no paces does not show an empty card.",
"properties": {
"name": {
"type": "string",
"examples": [
"12-week half marathon build"
]
},
"goal": {
"type": "string",
"examples": [
"Cape Fear Half"
]
},
"goal_date": {
"type": "string",
"format": "date",
"examples": [
"2026-12-13"
]
},
"goal_note": {
"type": "string",
"examples": [
"Wilmington NC, flat and usually cold"
]
},
"target": {
"type": "string",
"examples": [
"1:52:00"
]
},
"target_note": {
"type": "string",
"examples": [
"8:33 per mile, 20 min faster than March"
]
},
"length": {
"type": "string",
"examples": [
"12 weeks"
]
},
"start_date": {
"type": "string",
"format": "date",
"examples": [
"2026-09-21"
]
},
"volume": {
"type": "string",
"examples": [
"42 mi peak"
]
},
"volume_note": {
"type": "string",
"examples": [
"374 mi across the plan"
]
},
"sessions_per_week": {
"type": "string",
"examples": [
"5 to 6"
]
},
"sessions_note": {
"type": "string",
"examples": [
"One long, one hard, the rest genuinely easy"
]
}
}
},
"athlete": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Nadia Ferreira-Blake"
]
},
"category": {
"type": "string",
"examples": [
"F40, third half marathon"
]
}
}
},
"coach": {
"type": "object",
"properties": {
"name": {
"type": "string",
"examples": [
"Owen Castellanos"
]
},
"business": {
"type": "string",
"examples": [
"Northbank Endurance"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"owen@northbankendurance.test"
]
},
"phone": {
"type": "string",
"examples": [
"(910) 555-0163"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/northbank.png"
]
}
}
},
"zone_label": {
"type": "string",
"default": "Zone",
"description": "First column heading on the reference table. Say \"Lift\" or \"RPE\" for strength work.",
"examples": [
"Zone"
]
},
"pace_label": {
"type": "string",
"default": "Pace",
"description": "Second column heading. Say \"Load\" or \"% 1RM\" for strength work.",
"examples": [
"Pace / mi"
]
},
"effort_label": {
"type": "string",
"default": "Effort",
"examples": [
"Effort"
]
},
"zones": {
"type": "array",
"description": "The key the day cells refer to: paces for a runner, loads for a lifter, watts for a cyclist.",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Threshold"
]
},
"pace": {
"type": "string",
"examples": [
"8:10"
]
},
"effort": {
"type": "string",
"examples": [
"Zone 4"
]
},
"purpose": {
"type": "string",
"examples": [
"The pace you could hold for an hour flat out. The engine of this plan."
]
}
}
}
},
"principles": {
"type": "array",
"description": "The rules the athlete is meant to reread in week 6.",
"items": {
"type": "string",
"examples": [
"Easy days easy. Nearly every plan that fails, fails here."
]
},
"examples": [
[
"Easy days easy."
]
]
},
"phases": {
"type": "array",
"description": "The blocks, across the page above the weeks.",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Build"
]
},
"weeks": {
"type": "string",
"examples": [
"Weeks 5 – 8"
]
},
"focus": {
"type": "string",
"examples": [
"Threshold volume climbs, six days, long run to 13 mi with race pace in it."
]
}
}
}
},
"weeks": {
"type": "array",
"minItems": 1,
"description": "One block per week, each a seven-column grid that never splits across a page.",
"items": {
"type": "object",
"required": [
"number",
"days"
],
"properties": {
"number": {
"type": "integer",
"minimum": 1,
"examples": [
7
]
},
"dates": {
"type": "string",
"examples": [
"Nov 2 – 8"
]
},
"phase": {
"type": "string",
"description": "Printed as a pill in the week header.",
"examples": [
"Build"
]
},
"focus": {
"type": "string",
"description": "One line on what this week is for.",
"examples": [
"Biggest week before the down week. Long run has race pace in it."
]
},
"volume": {
"type": "string",
"description": "The week's total, right-aligned in the header. The template does not add this up for you: it is a string so it can be miles, hours, tonnage or TSS.",
"examples": [
"37 mi"
]
},
"days": {
"type": "array",
"minItems": 1,
"maxItems": 7,
"description": "Give all seven, including rest days, or the grid runs short.",
"items": {
"type": "object",
"required": [
"day",
"session"
],
"properties": {
"day": {
"type": "string",
"examples": [
"Wed"
]
},
"session": {
"type": "string",
"examples": [
"Threshold"
]
},
"load": {
"type": "string",
"description": "The number that matters: distance, time, tonnage.",
"examples": [
"9 mi"
]
},
"detail": {
"type": "string",
"examples": [
"2 mi w/u, 2 x 2 mi at 8:10 w/ 3 min jog, 3 mi c/d"
]
},
"kind": {
"type": "string",
"description": "`rest` greys the cell, `key` tints it as the session of the week.",
"enum": [
"",
"rest",
"key"
],
"examples": [
"key"
]
}
}
}
},
"note": {
"type": "string",
"description": "A line under the week's grid.",
"examples": [
"If Saturday is above 70°F, move the race-pace miles to Sunday morning."
]
}
}
}
},
"footer": {
"type": "string",
"description": "Replaces the default guidance-not-medical-advice line.",
"examples": [
"Paces are guidance for flat ground in cool conditions."
]
}
}
}