Skip to content

Commit df75591

Browse files
christianboerclaude
andcommitted
Add Trail Godefroy race plan with aid stations and nutrition strategy
53km/1960m D+ (corrected from 50km). Figure-eight course from Bouillon Castle. Estimated 5 aid stations every ~9km based on other distance patterns. Combi nutrition: Maurten 320 + bars + fruit (~2620 kcal). Dashboard timeline now renders aid stations and flexible nutrition data. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 76979c1 commit df75591

File tree

5 files changed

+133
-19
lines changed

5 files changed

+133
-19
lines changed

plan/swiss-iron-trail-t78.md

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,47 @@ Warm weather adjustment (>20°C valley): add 500ml plain water per loop alongsid
227227
| Wed | Shakeout | 6 ||
228228
| Thu | **Rest** — mobility only |||
229229
| Fri | Travel to Bouillon |||
230-
| Sat (Jun 6) | **Trail Godefroy 50 km** — dress rehearsal | 50 | 1,840m |
230+
| Sat (Jun 6) | **Trail Godefroy 53 km** — dress rehearsal | 53 | 1,960m |
231231
| Sun | Rest |||
232-
| **Total** | | **~74 km** | **~1,840m** |
232+
| **Total** | | **~77 km** | **~1,960m** |
233233

234234
**Godefroy strategy:** dress rehearsal, NOT a race effort. Run at projected T78 pace/effort. Practice exact nutrition plan, gear, pacing. Target a comfortable finish — save legs for 3 weeks later.
235235

236+
**Course:** 53.5 km, ~1,960m D+. Figure-eight from Kasteel Bouillon — east loop toward Herbeumont (rolling), through Bouillon, then west loop toward Vresse-sur-Semois (more technical). Finish is a steep climb up to the castle.
237+
238+
**Estimated aid stations** (confirm with roadbook ~2 weeks before race):
239+
240+
| # | Est. km | Location (est.) | What to do |
241+
|---|---|---|---|
242+
|| 0 | Start — Bouillon Castle | Start fuelling immediately |
243+
| R1 | ~9 | East loop | Top up flasks, eat half a bar |
244+
| R2 | ~18 | East loop turnaround | Full refuel: flask + bar + fruit |
245+
| R3 | ~27 | Bouillon (centre of 8) | Key stop: full refuel, Maurten sachet + bar + fruit |
246+
| R4 | ~36 | West loop | Top up flasks, eat half a bar |
247+
| R5 | ~45 | West loop turnaround | Full refuel: flask + bar + fruit |
248+
|| 53.5 | Finish — Bouillon Castle | Done! |
249+
250+
**Godefroy nutrition plan:**
251+
252+
Combi approach: Maurten Drink Mix 320 for isotonic energy + bars for solid fuel at aid stations.
253+
254+
| Segment | km | Nutrition | Kcal | Fluid |
255+
|---|---|---|---|---|
256+
| Start → R1 | 0–9 | 1× Maurten 320 flask (500ml) | 320 | 500ml |
257+
| R1 → R2 | 9–18 | 1× Maurten 320 flask + ½ bar | 420 | 500ml |
258+
| R2 → R3 | 18–27 | 1× Maurten 320 flask + ½ bar | 420 | 500ml |
259+
| R3 → R4 | 27–36 | 1× Maurten 320 flask + ½ bar | 420 | 500ml |
260+
| R4 → R5 | 36–45 | 1× Maurten 320 flask + ½ bar | 420 | 500ml |
261+
| R5 → Finish | 45–53 | 1× Maurten 320 flask | 320 | 500ml |
262+
| **Aid station food** | | Fruit + water at R2, R3, R5 | ~300 | ~750ml |
263+
| **Total** | | | **~2,620** | **~3.75L** |
264+
265+
Target: ~280 kcal/hour across ~9:00–9:30. Carry 6× Maurten 320 sachets + 3 bars (e.g. Maurten Solid, Clif, or similar ~200 kcal bars).
266+
267+
**Warm weather adjustment:** take water from aid stations alongside Maurten flasks. Add electrolyte tab if >25°C.
268+
269+
**Pacing target:** even effort, not even pace. Power-hike steep climbs, run flats and gentle descents at ~6:30–7:00/km. Don't race — stay comfortable, practice T78 effort.
270+
236271
### Week 12 — Recovery (Jun 8–14)
237272
| Day | Session | km | Elev |
238273
|---|---|---|---|

scripts/export_dashboard_data.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,22 @@
4242
"total_fluid_l": 4,
4343
"heat_note": ">20°C: add 500ml plain water per loop alongside Maurten"
4444
}},
45-
{"date": "2026-06-06", "name": "Trail Godefroy", "distance_km": 50, "elevation_m": 1840, "role": "Dress rehearsal"},
45+
{"date": "2026-06-06", "name": "Trail Godefroy", "distance_km": 53, "elevation_m": 1960, "role": "Dress rehearsal",
46+
"aid_stations": [
47+
{"name": "R1", "km": 9, "action": "Top up flasks, ½ bar"},
48+
{"name": "R2", "km": 18, "action": "Full refuel: flask + bar + fruit"},
49+
{"name": "R3 — Bouillon", "km": 27, "action": "Key stop: Maurten sachet + bar + fruit"},
50+
{"name": "R4", "km": 36, "action": "Top up flasks, ½ bar"},
51+
{"name": "R5", "km": 45, "action": "Full refuel: flask + bar + fruit"},
52+
],
53+
"nutrition": {
54+
"product": "Maurten 320 + bars",
55+
"strategy": "1× Maurten 320 per segment + ½ bar from R1, fruit at R2/R3/R5",
56+
"total_kcal": 2620,
57+
"total_fluid_l": 3.75,
58+
"carry": "6× Maurten 320 sachets + 3 bars (~200 kcal each)",
59+
"heat_note": ">25°C: extra water at aid stations + electrolyte tab"
60+
}},
4661
{"date": "2026-06-27", "name": "Swiss Iron Trail T78", "distance_km": 78, "elevation_m": 5000, "role": "A-race"},
4762
]
4863

site/css/style.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,20 @@ a:hover { color: var(--accent-light); }
745745
font-weight: 600;
746746
}
747747

748+
.event-route .route-km {
749+
font-family: var(--font-mono);
750+
font-size: 0.65rem;
751+
color: var(--text-muted);
752+
min-width: 36px;
753+
}
754+
755+
.event-route .route-num.aid {
756+
background: var(--phase-mountain);
757+
font-size: 0.6rem;
758+
width: 14px;
759+
height: 14px;
760+
}
761+
748762
.event-route a {
749763
color: var(--text-primary);
750764
text-decoration: none;

site/data/training.json

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"generated_at": "2026-03-23T20:52:59",
2+
"generated_at": "2026-03-23T21:16:18",
33
"race": {
44
"name": "Swiss Iron Trail T78",
55
"date": "2026-06-27",
@@ -59,9 +59,44 @@
5959
{
6060
"date": "2026-06-06",
6161
"name": "Trail Godefroy",
62-
"distance_km": 50,
63-
"elevation_m": 1840,
64-
"role": "Dress rehearsal"
62+
"distance_km": 53,
63+
"elevation_m": 1960,
64+
"role": "Dress rehearsal",
65+
"aid_stations": [
66+
{
67+
"name": "R1",
68+
"km": 9,
69+
"action": "Top up flasks, ½ bar"
70+
},
71+
{
72+
"name": "R2",
73+
"km": 18,
74+
"action": "Full refuel: flask + bar + fruit"
75+
},
76+
{
77+
"name": "R3 — Bouillon",
78+
"km": 27,
79+
"action": "Key stop: Maurten sachet + bar + fruit"
80+
},
81+
{
82+
"name": "R4",
83+
"km": 36,
84+
"action": "Top up flasks, ½ bar"
85+
},
86+
{
87+
"name": "R5",
88+
"km": 45,
89+
"action": "Full refuel: flask + bar + fruit"
90+
}
91+
],
92+
"nutrition": {
93+
"product": "Maurten 320 + bars",
94+
"strategy": "1× Maurten 320 per segment + ½ bar from R1, fruit at R2/R3/R5",
95+
"total_kcal": 2620,
96+
"total_fluid_l": 3.75,
97+
"carry": "6× Maurten 320 sachets + 3 bars (~200 kcal each)",
98+
"heat_note": ">25°C: extra water at aid stations + electrolyte tab"
99+
}
65100
},
66101
{
67102
"date": "2026-06-27",
@@ -708,8 +743,8 @@
708743
"phase": "Race Rehearsal & Taper",
709744
"start_date": "2026-06-01",
710745
"end_date": "2026-06-07",
711-
"target_km": 74.0,
712-
"target_elevation": 1840.0,
746+
"target_km": 77.0,
747+
"target_elevation": 1960.0,
713748
"days": [
714749
{
715750
"day": "Mon",
@@ -748,9 +783,9 @@
748783
},
749784
{
750785
"day": "Sat",
751-
"session": "Trail Godefroy 50 km — dress rehearsal",
752-
"target_km": 50.0,
753-
"target_elevation": 1840.0,
786+
"session": "Trail Godefroy 53 km — dress rehearsal",
787+
"target_km": 53.0,
788+
"target_elevation": 1960.0,
754789
"date": "2026-06-06"
755790
},
756791
{

site/js/app.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,29 @@ function renderTimeline(events) {
113113
).join('') + `</div>`;
114114
}
115115

116+
let aidHtml = '';
117+
if (ev.aid_stations && ev.aid_stations.length) {
118+
aidHtml = `<div class="event-routes">` +
119+
ev.aid_stations.map(s => `
120+
<div class="event-route">
121+
<span class="route-num aid">${s.name.replace(/^R/, '')}</span>
122+
<span class="route-km">km ${s.km}</span>
123+
<span class="route-stats">${s.action}</span>
124+
</div>`
125+
).join('') + `</div>`;
126+
}
127+
116128
let nutritionHtml = '';
117129
if (ev.nutrition && typeof ev.nutrition === 'object') {
118-
nutritionHtml = `
119-
<div class="event-nutrition">
120-
<div class="nutrition-row"><span class="nutrition-icon">⚡</span> ${ev.nutrition.product}: ${ev.nutrition.per_loop}</div>
121-
<div class="nutrition-row"><span class="nutrition-icon">🏨</span> ${ev.nutrition.hotel_stop}</div>
122-
<div class="nutrition-row"><span class="nutrition-icon">Σ</span> ${ev.nutrition.total_kcal} kcal · ${ev.nutrition.total_fluid_l}L fluid</div>
123-
<div class="nutrition-row heat">${ev.nutrition.heat_note}</div>
124-
</div>`;
130+
const rows = [];
131+
rows.push(`<div class="nutrition-row"><span class="nutrition-icon">⚡</span> ${ev.nutrition.product}</div>`);
132+
if (ev.nutrition.per_loop) rows.push(`<div class="nutrition-row"><span class="nutrition-icon">↻</span> ${ev.nutrition.per_loop}</div>`);
133+
if (ev.nutrition.strategy) rows.push(`<div class="nutrition-row"><span class="nutrition-icon">📋</span> ${ev.nutrition.strategy}</div>`);
134+
if (ev.nutrition.hotel_stop) rows.push(`<div class="nutrition-row"><span class="nutrition-icon">🏨</span> ${ev.nutrition.hotel_stop}</div>`);
135+
if (ev.nutrition.carry) rows.push(`<div class="nutrition-row"><span class="nutrition-icon">🎒</span> ${ev.nutrition.carry}</div>`);
136+
rows.push(`<div class="nutrition-row"><span class="nutrition-icon">Σ</span> ${ev.nutrition.total_kcal} kcal · ${ev.nutrition.total_fluid_l}L fluid</div>`);
137+
rows.push(`<div class="nutrition-row heat">${ev.nutrition.heat_note}</div>`);
138+
nutritionHtml = `<div class="event-nutrition">${rows.join('')}</div>`;
125139
} else if (ev.nutrition) {
126140
nutritionHtml = `<div class="event-nutrition">${ev.nutrition}</div>`;
127141
}
@@ -133,6 +147,7 @@ function renderTimeline(events) {
133147
<div class="event-name">${ev.name}</div>
134148
<div class="event-detail">${ev.distance_km}km · ${ev.elevation_m}m D+</div>
135149
${routesHtml}
150+
${aidHtml}
136151
${nutritionHtml}
137152
<div class="event-days">${daysText}</div>
138153
</div>

0 commit comments

Comments
 (0)