STREETS OVER SCREENS.
Every run recorded on my Garmin, summarised by mileage, pace and consistency
I logged 1133 runs between Dec 2017 and Oct 2026. A Forerunner recorded each one, with distance in miles and pace in min/mile
As of 24 Oct 2026 Fresh
Four Watches, 62 Firmware Updates
One of these watches logged every mile above. Each bar runs from the first activity on a watch to the day the next watch replaced it. Each tick marks a firmware update
Trends Over Time
Yearly volume and recent monthly consistency, totalled from every individual Garmin run
Yearly mileage
* 2026 is a partial year, still in progress
Recent monthly volume
Updated through 24 Oct 2026
Every Day, Every Year
Each square is one day, with Monday on the top row. The colour gets stronger as the miles go up. Tap or hover on a square to see the date and the distance
Miles per day
Tap a square to see its date and miles
Showing Up
Each ring shows the share of weeks in a year with at least one run. A week goes from Monday to Sunday. For this year, the ring counts only the weeks to date
Weeks with a run, by year
Tiles Claimed
Squares on the Capture the Tile board that my runs claimed each month, for the last 24 months. A square counts each time one of my runs takes it
Play the boardTiles claimed by month
Training Load Balance
My training load for the last 7 days, compared with my average week over 28 days. This is the acute:chronic ratio that sports scientists use to monitor injury risk. A ratio of about 0.8 to 1.3 is the safe range. Overuse injuries tend to cluster above 1.5
load is going down, with room to build
As of 24 Oct 2026
If I Raced Tomorrow
I take my fastest run of 3 miles or more from the last 8 weeks. The Riegel formula scales its time to each race distance, T2 = T1 × (D2 / D1)1.06. The formula assumes that I train for the distance, so the longer the race, the more optimistic the time
Reference run on 20 Sep 2026. 11.0 mi in 1:20:59, at 7:20 per mile
What Made The Fast Races
A race is a run at 5k, 10k or half marathon distance under 6:00, 6:20 or 7:29 per mile, with no similar effort at that distance in the six weeks either side. Training efforts repeat within weeks. Races do not. I checked the list by hand and corrected two. That gives 10 races. The Riegel formula puts each one on a 10k scale, so a 5k and a half marathon sit on one axis. Then I look at the training in the 12 months before each race, with the final 16 weeks as the build
Race pace over the years
Minutes per mile. Lower is faster
Miles per week, final 16 weeks
Rank correlation -0.22. Lower on the chart is faster
Share of miles under 7:00, final 16 weeks
Rank correlation -0.67. Lower on the chart is faster
Fastest 5 against slowest 5
| Training, median | Fastest 5 | Slowest 5 |
|---|---|---|
| Miles per week, final 16 weeks | 19 | 16 |
| Fast miles share, final 16 weeks | 24% | 0% |
| Runs of 10+ miles, final 16 weeks | 6 | 3 |
| Miles in the year before | 701 | 597 |
| Fast miles share, whole year | 44% | 10% |
| Feet climbed per mile, months 4 to 12 out | 43 | 44 |
| Miles per week, final 3 weeks | 18 | 15 |
The 10 races, fastest first
| Race | Time | Pace | 10k equiv | Year miles | Mi/wk final 16 | Fast miles final 16 | 10+ mi runs final 16 |
|---|---|---|---|---|---|---|---|
| 5k, 16 Mar 2019 | 18:02 | 5:36 | 36:15 | 701 | 15.4 | 16% | 3 |
| 10k, 1 Feb 2026 | 36:49 | 5:54 | 36:40 | 1080 | 23.2 | 24% | 14 |
| Half, 1 Mar 2026 | 1:21:22 | 6:11 | 36:47 | 1059 | 21.6 | 18% | 12 |
| 10k, 22 Apr 2018 | 36:37 | 5:59 | 37:10 | 94 | 5.4 | 48% | 1 |
| Half, 29 Jul 2018 | 1:22:46 | 6:19 | 37:29 | 377 | 18.6 | 61% | 6 |
| 5k, 12 Apr 2020 | 18:23 | 5:50 | 37:46 | 593 | 15.5 | 0% | 5 |
| 10k, 14 Apr 2019 | 38:33 | 6:19 | 39:17 | 726 | 18.4 | 14% | 3 |
| 10k, 6 Feb 2022 | 39:57 | 6:24 | 39:48 | 597 | 12.6 | 0% | 1 |
| Half, 28 Jul 2019 | 1:28:45 | 6:44 | 40:02 | 615 | 11.9 | 11% | 2 |
| Half, 19 Sep 2021 | 1:33:59 | 7:04 | 41:57 | 557 | 18.9 | 0% | 5 |
The fastest 5 ran 24% of their final 16 weeks under 7:00 per mile. The slowest 5 ran 0%. Weekly mileage in that build was 19 against 16. Fast miles are miles run under 7:00 per mile. Run days are counted rather than runs, because 2018 track sessions logged each rep as its own activity. The 10k Apr 2018 race has only 18 weeks of data before it. The Half Jul 2018 race has only 32 weeks of data before it. 10 races is a small sample, so read this as a pattern and not a proof
The Air I Run In
On 80% of runs, my Forerunner records 260.6°F (127°C), which is its "no sensor" value. So I filled in the real conditions (air, feels-like, humidity, wind and rain) from the Open-Meteo archive. I used the exact place and hour of each run. That gives the true weather for 1128 runs
Median pace by feels-like temperature
Bar length shows how many runs fell in each band. The figure is the median pace in min/mile. Most runs are in cool marine air. The fastest band may partly reflect spring fitness and daylight, not temperature alone
Every Hill Counts
Pace follows the climb more closely than it follows the weather. I group runs by feet of ascent per mile, from the flat seawall to steep trail. In total I have climbed 245.9k feet, about 8.5× the height of Everest from sea level
Median pace by climb per mile
The steepest run climbed 322 ft per mile. Bar length shows how many runs fell in each band
Feet climbed through the year
Each line starts at zero on 1 January and climbs with every run. The mountain on the right is Everest from sea level, drawn to the same scale. 2025 was the biggest year at 38.3k feet
When I Run
I convert every start time to its local clock. So a run in Bali and a run in San Francisco both show the hour that I actually started. My busiest slot is evening. 84% of runs start in daylight
Runs by time of day
Dawn is the quickest slot because every race starts between 5 and 9 AM. 178 runs started after dark. Bar length shows the run count. The figure is the median pace in min/mile
The Engine, Measured
VO₂max is the estimate from my watch of my aerobic capacity, that is, how much oxygen I can use at maximum effort. Since 2023 it has climbed from 56.3 to 59.9, up 3.6 points, with a peak of 61. Also, on flat runs my heart now covers the same miles with fewer beats. This is consistent with a real gain in fitness, not chance
Average VO₂max by year
Only the current watch logs VO₂max, so the trend starts at 2023. The bars do not start from zero, so that the gains from year to year are easy to see
How Hard I Train
Every run has a Training Effect score. It measures how much load the run put on my aerobic system. The 80/20 rule says that four runs in five should be easy. I do the opposite. 72% of my runs are at tempo or harder, and only 29% are truly easy. It is effective, but it leaves little time to recover
Runs by training-effect band
The median run scores 3.4 of 5. Bar length shows the share of runs in each band, over 691 scored runs
The Cadence Lever
When my step rate goes up, my pace gets faster. I sort every run into quarters by cadence. The median pace goes from 10:08/mi at my slowest cadence (148 spm) to 7:12/mi at my fastest (167 spm). The correlation is r = -0.77. If I pool all the years together, the pattern disappears, because stride length changes from season to season. But inside each single year, a faster cadence goes with a faster pace every time
Median pace by cadence quartile
This uses 1104 clean runs. I removed runs that include walking and runs with bad GPS paces. Bars scale with speed, so the fastest quartile has the longest bar
Shoe Rotation
Lifetime mileage per pair, matched to each run from my Strava gear log
Miles per pair
The Dead Ends
The data did not support every idea I had. These are the trends that I looked for and did not find. I keep them here because it is more honest to show what the data does not support
Sleep didn't make me faster
I expected rest to show up in my pace. It does not. Before I control for anything, the correlation between hours slept and how fast I run is about zero. Body battery, stress and resting HR also show no link to pace. Recovery matters, but it does not show in my pace
Weather has little effect
The marine air in San Francisco is very even. So temperature, humidity and rain change my pace very little. The strongest link was humidity, at only -0.15. Hills matter much more than the weather
Breathing rate has too little data
Respiration followed effort as expected, but only 22 runs recorded it. That is not enough data to trust, so I do not use it
How The Data Gets Here
One monthly command pulls the exports from the watch and the apps into Postgres. The pages and the API read from there