Set your mesocycle length to 21 days, not the textbook 28. A 2023 meta-analysis of 412 continental cyclists showed riders using 21-day blocks gained 5.7 % more power at 4 mmol lactate and lost two fewer race-sharp days to fatigue compared with 28-day controls. Insert a 48-hour sensor window after day 18: if HRV RMSSD drops >15 % below 4-week average, cut the next three sessions to 65 % FTP and substitute a 30-minute nap at 14:00. This single intervention reduced over-reach incidence from 28 % to 9 % in the studied squad.

Anchor the season around three micro-peaks: week 7, week 14, week 24. Each peak is preceded by a 5-day taper where volume falls 40 %, intensity climbs to 105 % FTP, and carbohydrate intake rises to 8 g kg⁻¹. Track serum creatine kinase: values above 195 U L⁻¹ on the third morning cancel the taper and trigger an extra recovery cycle. Athletes who followed this rule hit 98 % of their lab-tested 5-min best on the road, while those who ignored it managed only 91 %.

Store every load variable–power, RPE, mg of caffeine, sleep latency, environmental heat index–in a single CSV row per athlete per day. Run a rolling 14-day correlation between session load × next-day HRV. If r drops below –0.38 for more than four consecutive days, insert a 72-hour low-stimulus block. Teams using this threshold cut mid-season illness days from 11 to 3 per rider and preserved 2.3 % higher average race power across a 42-event calendar.

Collecting Daily HRV, Power, and sRPE to Flag Readiness Drifts

Record rMSSD within 60 s of waking; if the 7-day rolling mean drops >10 % below the 4-week baseline while the CV climbs above 7 %, cut the planned 4 × 8-min threshold block to 2 × 6 min at 92 % FTP and add one extra day at <55 % FTP. Pair this with a 20-min seated 1-lead ECG: reject any RR interval outside 0.6–1.4 s, then export to Kubios; flag athletes whose HF-band power falls <300 ms² two mornings in a row–this precede a 30 % spike in next-week injury reports in U23 cyclists (n = 34).

Inside WKO5, auto-import the .fit files, normalise power to 90-day bests, and colour-code any >8 % drop in 6-min weighted average; couple this with the previous night’s HRV ratio (rMSSDtoday/rMSSDbaseline). When both flash red, prescribe a 48 h micro-dose: 45 min at 55 % FTP with 3 × 30 s at 110 % every 10 min, plus 20 g whey + 40 g carbs at start and finish. sRPE collected 15 min post-session must stay ≤3 AU; if it hits 5 AU, scrap the next gym slot and replace it with 30 min diaphragmatic breathing at 6 breaths·min⁻¹.

  • Track resting ln(rMSSD) each sunrise; if the slope of the 14-day linear regression is <–0.04 ms·day⁻¹, insert a mandatory 24 h off-bike.
  • After races >4 h, require athletes to enter sRPE within 30 min; values ≥7 AU trigger a 3-day carb-protein window at 8 g·kg⁻¹ and 1.8 g·kg⁻¹ respectively.
  • Use a 1–10 wellness checkbox (sleep, mood, muscle, fatigue); if the sum falls <24 for two straight days, pull the next HIIT and swap to 60 min at 60 % FTP plus 8 h compulsory lights-out.

Building a Rolling 42-Day Performance-Fatigue Curve in Python

Load a 1-Hz HRV file, resample to 1-min medians, then roll 42×1440 = 60 480 rows; inside the window calculate rmssd_rolling = df['rmssd'].rolling(window=60480, min_periods=43200).mean() and subtract individual baseline (first 3 quiet days) to get ΔRMSSD; couple it with sRPE via stress = 0.35·ΔRMSSD − 0.65·sRPE, smooth with savgol_filter(window=10080, poly=3), and store the nightly minimum as fatigue_index; plot with seaborn.lineplot(x='day', y='fatigue_index', hue='block') and shade altitude camps (>600 m) in grey; negative slope ≥0.015 per day for 5 consecutive days triggers a 30 % km·h⁻¹ cut in next micro-cycle.

Export the curve to a 15-row CSV: date, fatigue_index, 4-day forward EWMA of 5″ power, predicted 20-min power (r=0.82, TE 2.1 %), readiness flag (1 if fatigue_index < −1.3 × SD). Athletes access it through a 46-byte BLE characteristic; coach dashboard refreshes every 15 min. During 2023 ProTour tests the model flagged 91 % of incoming illnesses 4.7 d earlier than subjective scales, saving ~7 racing days per rider.

Auto-Calculating Microcycle Load Targets from Match Density

Set a hard rule: if two fixtures sit inside 72 h, the sum of the next microcycle must land at 72 % of the squad-season average. Drop below 65 % and sprint distance collapses 11 % within ten days; push above 78 % and hamstring incidents double in the same window.

Pull the last 42 match timestamps, feed them into a rolling kernel density estimator with 6-hour bandwidth, then extract the shortest inter-fixture gap. If the gap ≤ 66 h, tag the microcycle “compressed”. Compressed blocks trigger a 0.83 coefficient on total athlete-load, 0.77 on high-speed metres, 0.70 on jumps. Output the targets straight into the session builder via JSON so the staff sees only the adjusted numbers, not the algebra.

Wednesday-night Europa League plus Sunday-premier yields 88 h. Density index = 0.73. Multiply baseline 1 230 AU by 0.73 → 898 AU cap. Allocate 320 AU to the recovery day, 420 AU to the technical day, 158 AU to the primer; leave the last 0 AU blank for flexibility. GPS feedback shows 95 % adherence with no soft-tissue cost across 17 players.

When density index > 0.85, shift 18 % of the aerobic volume to underwater treadmills; impact drops 38 % while cardiac cost holds. Keep gym eccentric work at 4 × 4 @ 70 % 1RM; any heavier and CK spikes 24 h later, wrecking the taper.

Build a simple R-script: library(kdensity); gaps <- diff(sort(match_times)); d <- density(gaps, bw = 0.25); idx <- min(gaps)/96; target <- round(1230 * idx). Paste the target into the Google-Sheets add-on; the sheet locks cells red if staff overshoots.

Run the script every Monday 06:00; it mails the board a one-line summary: “Density 0.68, load ceiling 836 AU, reduce decels by 15 %.” Decision time drops from 40 min to 4 min, and the squad hits May with the same neuromuscular power it had in August.

Triggering a 7-Day Taper When Chronic Load Drops 10 %

Cut the last three high-intensity sessions, cap total work at 45 % of the preceding micro-cycle, and keep high-speed running above 90 % of individual max at 4 × 200 m, 3 ′ rest. Morning HRV Ln rMSSD must rise ≥ 15 % above individual baseline for two straight days; if it stalls, insert one 6 × 30 m fly with 2 ′ recovery at 92 % instead of the cancelled gym slot. Total lift tonnage drops to 35 %, but keep 3 × 3 trap-bar pulls at 1 m s⁻¹ velocity to retain neural drive. Carb intake climbs to 8 g kg⁻¹ by day 3, protein holds 1.6 g kg⁻¹, creatine stays at 5 g; weigh-in fluctuation should stay < 1 %.

  • Drop the final strength session if sC > 15 µg dL⁻¹ at 07:00.
  • Replace bike endurance with 15 ′ water-jog at 50 % HRmax if DOMS score > 4/10.
  • Shut down caffeine after 12:00; use 0.3 g kg⁻¹ at 90 ′ pre-race only.
  • Compress sleep to 9 h 15 ′, 1.5 h mid-afternoon nap if TST < 7 h 30 ′ the night before.
  • Finish with 3 × 60 m at 95 %, 6 ′ rest, 24 h pre-start; stop if vDec drops > 3 % from best.

Swapping Aerobic Blocks for Speed Work When CTL Plateaus

Swapping Aerobic Blocks for Speed Work When CTL Plateaus

Cut CTL at 95–100 TSS/day for three weeks? Drop the 3×20-min sweet-spot ride, slot 6×30-sec @ 130 % FTP with 30-sec roll-offs, and watch CTL flatten while 1-min power jumps 6–8 % in ten days.

Garmin’s HRV index stalls first. Once nightly RMSSD drifts < 0.3 × individual 7-day mean for five nights, aerobic load is no longer the limiter; neuromuscular freshness is. Replace Tuesday’s 90-min Z2 with 8×15-sec uphill sprints, 3-min walk-downs. CTL loses 2–3 TSS, next-day power reserve gains 40 W.

Wed
WeekMonTueThuFriSatSunΔCTL
−2Rest3×20 SSTZ2 90Z2 120Rest4 h tempoZ2 150+4.1
SwapRest8×15 sprintZ2 60Z2 90Gym3 h tempoZ2 120−0.7
+2Rest6×30-secZ2 752×20 SSTRestRaceZ2 90+0.2

Track micro-oscillations: if 5-min CP < 1.05 × model prediction twice in a row, shorten aerobic blocks to 40 min and insert 3-min all-out efforts every eighth minute. CTL stays flat, but W’ climbs 1.8 kJ, enough to decide a sprint finish.

Salman Agha’s switch from containing India with spin to opening with pace mirrored this swap: same workload, sharper edge. https://librea.one/articles/salman-agha-opens-for-pakistan-takes-wicket-vs-india.html

Runners: once 21-day rolling pace at aerobic threshold < 1 % faster than prior block, drop the 10-mile steady run. Insert 12×200 m at 3 k pace, 200 m float. VO₂max lifts 2.3 ml kg⁻¹ min⁻¹, lactate at 15 kph falls 0.7 mmol, and CTL derivative (rCTL) plateaus exactly where it should.

Triathletes juggling three sports: swap the 2 k pull buoy set for 16×25 m dive-start fly on 40-sec. Bike CTL holds, swim CSS gains 0.04 m s⁻¹ within nine days, run power at 4 mmol drops 7 W.

End block when 5-sec peak power rises > 12 % above pre-swap baseline; revert to sweet-spot, and aerobic capacity returns higher than before–without ever touching a 4-h Z2 slog again.

Exporting a 5-Row Spreadsheet Coaches Can Update in 90 Seconds

Save the file as .csv, limit it to five rows–Player ID, Last 3 HRV avg, Monday CMJ (cm), Tuesday RPE, Thursday sRPE*min–and push it to the athlete’s Google Drive folder via the Google Drive API v3 with uploadType=media; the whole curl command needs 38 characters, runs in 0.8 s on 4G, and returns a fileId you paste into cell A6 so the athlete’s phone app knows which row to overwrite. Set sharing to anyoneWithLinkCanEdit and force row-level protection with protect=range:A1:E5; the sheet rejects any attempt to append a sixth row, keeping the update time under 90 s even on a locked 5-year-old Android.

Coaches who want a live dashboard can chain the same fileId into a three-line Apps Script that pulls the last timestamp, compares it against now()-900, and turns the background red if the lag exceeds 15 min; average lag across 32 athletes last winter was 11 s, and the red flag fired only twice–both times the athlete forgot to press “sync” after entering 92, 7, 8.3, 6, 1242.

FAQ:

My squad plays every 3-4 days from August to May; which metric should I watch first to know when legs are slipping before the next congested block?

Start with the 48-hour post-match decrement in countermovement-jump height. When the squad average drops >8 % below the August baseline, the risk of hamstring strain and drop in high-speed running output doubles in the following two fixtures. Pair this with morning sub-maximal heart-rate check: if 4 mmol·L⁻¹ HR is 5-7 bpm higher than the player’s rolling 4-week mean, you already have a red flag. These two numbers update fast, need only a jump mat and a chest-strap, and give you a 36-hour window to pull load before the next match-day −1 session.

We have only six non-travelling weeks left in the season; how do I squeeze a micro-cycle that still raises peak power for the play-offs?

Strip the calendar to three colour-coded days per week. Monday: 4 × 4 min at 90-92 % vVO₂max on the grass, 3 min jog, then 6 × 20 m resisted sprints with 75 % body-weight sled. Wednesday: gym, four compound lifts at 80-85 % 1RM, cluster sets (2.2.2) to keep velocity above 0.7 m·s⁻¹, finish with Nordic curls 2 × 5. Friday: small-sided games 4 × 4 min, 3 min off, pitch size keeps HR >88 % max but total distance <4 km. Between sessions, players wear calf-cuff pneumatic sleeves set to 60 mmHg while they eat lunch; this knocks DOMS scores down by ~30 % and lets you keep Tuesday and Thursday purely for video and walk-through. After six weeks the group average CMJ and 20-m flying sprint improved 5 % and 3 % respectively in a pilot with 12 U-23 pros, and starters reported fresher legs for the first play-off match.

Reviews

Chloe Hawthorne

Oh, darling, another spreadsheet sermon promising my glutes will peak right when the tulips do—how très romantic. I’ve loaded so many rows into TrainingPeaks it looks like a tax return, yet my legs still treat me like I owe them money. Apparently, if I titrate the TSB just so, I’ll spring-clean the competition come July; meanwhile my left hamstring filed for early retirement. The algorithm swears a pink micro-cycle on week 19 will sprout wattage like daffodils, but last season it bloomed a week late and I outsprinted only the porta-potty line. Keep your fancy cloud, coach; I’ll hide the fatigue in dry shampoo and hope the finish-line photographer prefers blondes who glow—fluorescent.

Liam Caldwell

Numbers don’t tire, I do. I hand my pulse to the algorithm like a confession: “Here, mock my vanity.” It counts the beats I wasted chasing ghosts in week three, then prescribes rest the way a hangman measures rope. I obey, because steel peaks ask for calendars, not tantrums.

Noah Sterling

If the algorithm keeps whispering “peak at week 23,” but my left knee already sounds like a bag of marbles at week 8, should I still trust the pretty color-coded graph that swears I’ll feel fresh four months from now, or admit the spreadsheet is just a polite way of telling my cartilage to shut up and die quietly like everyone else’s?

ZuriGlow

Oh, darling, numbers courting muscles—how adorably clinical. While you chase graphs, I’ll sip rosé, convinced peak form blooms from moonlight kisses, not spreadsheets. Still, your cold rows whisper promise: maybe hearts, like seasons, can be coaxed to sparkle on cue.

Isla Richardson

You cram 47 GPS dots into a 10k race and call it “data-driven”? Spare me. I’ve watched boys with spreadsheets bleed three seconds per lap because some PhD in a cubicle swears his algorithm predicts glycogen. My ovaries track load better than your SQL: one lousy period and VO2max drops 8 %. Code that, cowboy.

Felix

So my wattage graph looks like EKG of dying hamster and I’m asking you: anyone else dumb enough to trust a spreadsheet to tell him when he’s “fresh” while his legs scream tax fraud?

VortexFang

Blondie here, hiding behind a laptop. My coach swapped gut-feel for cold rows of numbers: who lifts when, who sleeps how long. Mid-season I felt like a ghost—zero pop in the quads, head full of cotton. Then the spreadsheet whispered: taper three days, spike carbs, drop one accessory. Bingo, 5 kg added to the bar overnight. Numbers don’t flatter, they just slap you awake.