Capture today's numbers in <30 seconds. Saves to your browser. Skip fields you don't have.
Tape measure once a week, same time of day. Take 3 readings and average them. Navy formula calculates BF% from waist+neck (and hip for women).
Set your max HR and FTP and the zones recompute automatically. Run a max HR test in week 2 — see help below.
Best practice: set zones from lactate threshold HR (LTHR), not max. LTHR ≈ avg HR over the last 20 min of an all-out 30-min effort. Approximation: LTHR ≈ ~92% maxHR for trained riders.
Update FTP after every test. Zones recompute. Sweet spot = 88–94% FTP. Threshold = 95–105% FTP.
Hill protocol (preferred): 15 min warm-up. Find a 5–7 min steady climb. Ride hard but build for first 3 min, then push to 90% effort, then last 60s flat-out sprint to the top. Repeat once after 5 min recovery. Note peak HR across both efforts.
Trainer protocol: 15 min warm-up. 4 × 4 min hard with 2 min recovery; final interval is all-out, ramping the last 60s to absolute max. Peak HR = max HR.
Don't use 220−age. Margin of error is ±15 bpm. Your real max may surprise you (likely higher than 173 for you).
Activities + sleep + RHR + HRV + body battery are pulled from Garmin Connect by a GitHub Actions cron (4× daily) and stored in a Cloudflare Worker. The dashboard reads from the Worker on every load. Strava is no longer used.
wrangler secret put API_KEY) and as a GitHub Actions secret.