JohanHellstedt963.6 km this year

Segment · Next.js · Vercel KV · Strava API

Training log

A calendar of every training day, weekly distance, the year to date and my latest activities per sport, read from Strava and updated when I upload a new activity.

All sports this week: 0 kcal

Active days
189
of 299 so far
Training
256 h
6.0 h a week
Sessions
278
6 sports
Streak
12 wk
3+ sessions a week · best 12
Training per day, 2026
Jan24h 11m
Feb15h 31m
Mar15h 3m
Apr35h 36m
May32h 18m
Jun14h 2m
Jul30h 47m
Aug34h 8m
Sep32h 50m
Oct21h 6m
Nov
Dec
Sat, Oct 241h 14m · 2 sessions
SportActivityDist.Time
RunningAfternoon Run8.044m
CyclingZwift - Mishmash12.630m
All sports, 2026
SportSessionsDist.TimeShare
Running10796487h 53m34%
Cycling772,06178h 7m31%
Strength55–47h 15m18%
Skiing20–24h 13m9%
Other17–17h 23m7%
Swimming2342m0%
Sessions by weekday, 2026
  1. 44Mon
  2. 50Tue
  3. 40Wed
  4. 25Thu
  5. 35Fri
  6. 43Sat
  7. 41Sun

Synced from Strava Oct 24, 2026

About Training log

  • Why I built it

    I wanted the site to show something I do every week, from live data instead of a screenshot.

  • Key decision

    Push, not polling. A Strava webhook updates a stored snapshot of my activities, so a page never waits on Strava or spends its rate limit. Strava doesn't sign webhook events, so the app only takes the activity id from them and fetches the activity itself. A missed event can leave the snapshot stale, which a protected resync route repairs.

  • Stack

    Next.js App Router with a server-only data layer, Vercel KV for tokens and the activity snapshot, deployed on Vercel.