UltraTrain / Product + data case study / 2026–2027

What a 50-mile race
can teach a 100-mile build.

I turned a Strava account export into a private training dashboard: one that reconstructs my first ultramarathon build, shows race-day pacing, and makes a 28-week plan measurable as new runs arrive.

My role: Product design, data pipeline and analysis Tools: Python, HTML/CSS, Strava export

The 2025 baseline

Pre-race training runs
35
Training volume
295 mi
Race elapsed time
8h 43m
Annotated UltraTrain dashboard excerpt showing 35 pre-race runs, 295 training miles, weekly volume including zero-mile weeks, and approximate ten-mile race splits. Notes explain that race day is excluded from training volume and elapsed pace includes stops.
Selected dashboard panels reconstructed from aggregate 2025 results for this public case study. Routes, activity IDs, and personal notes are omitted.

01 / The question

A result is not an explanation.

The 50-mile finish gave me a result, but it did not explain how my training varied or which patterns deserved attention. I built a local tool to separate training from race day, summarize weekly volume, approximate elapsed pacing, and compare future planned workouts with recorded activity.

Descriptive analytics today. No validated 100-mile finish prediction.

02 / The evidence

The build was uneven. That matters.

The account export shows 295 training miles across 35 runs before race day. Weekly mileage rose into September, then dipped sharply and fluctuated through November. The pattern is a baseline for asking better questions, not a recipe for the next race.

Weekly training miles

Peak 31.1 mi
Training runs only. The 50-mile event is excluded; zero-mile weeks remain visible. This describes recorded activity, not fitness or injury risk.
See the weekly mileage data
Running miles by week before the 2025 race
Week ofMiles
Jul 146.0
Jul 210.0
Jul 283.2
Aug 419.5
Aug 1115.5
Aug 1818.0
Aug 2527.6
Sep 123.9
Sep 825.6
Sep 1527.6
Sep 2231.1
Sep 290.0
Oct 69.1
Oct 1323.7
Oct 2018.0
Oct 2715.0
Nov 316.4
Nov 1014.9
Nov 170.0

03 / Race-day pacing

A finish time needs context.

Approximate elapsed pace by 10-mile section from the race track. The middle section was fastest; later sections slowed. Elapsed pace includes stops, and without heart rate, fueling, or effort notes I cannot identify the cause.

  1. 0–10 mi11:02per mile
  2. 10–20 mi10:19per mile
  3. 20–30 mi8:34per mile
  4. 30–40 mi10:14per mile
  5. 40–50 mi10:48per mile

The final 1.4 GPS miles are excluded from these equal-distance comparisons. Segment boundaries are approximate.

04 / The product

From export to a useful review.

UltraTrain reads my requested account export locally, checks and summarizes activities, and generates a static dashboard. It does not send the underlying workout data to a server.

  1. 01

    Strava export

    Activity summaries and a detailed race track.

  2. 02

    Python pipeline

    Filter runs, separate race day, calculate weekly volume and splits.

  3. 03

    Private dashboard

    Review the baseline and compare a plan with recorded training.

05 / Design decisions

The honest boundaries are part of the product.

Keep zero-mile weeks
Missing weeks stay visible so a chart cannot suggest uninterrupted growth.
Flag ambiguity
A checked-off workout recorded after midnight is flagged for review instead of silently matched.
Do not invent physiology
The export lacks heart-rate samples and consistent effort notes. Pace cannot establish fatigue or readiness.

06 / What comes next

The next 100 miles are new evidence.

As the 28-week Umstead build unfolds, I can add short effort, recovery, and fueling notes, refresh the account export, and compare planned versus recorded training. After the race, the project can assess which expectations held up. A predictive model would require a separate, larger dataset and a genuine evaluation.

Jack Noble Product + data UltraTrain is an active project