Eight pieces of in-the-wild feedback

Strava timezone, watch auto-launch, onboarding fullscreen cover, keep-screen-awake setting, duration-set persistence, post-session set correction, and two runner tightenings.

← All changes

What shipped

  • Strava timezone. The ISO8601 formatter now uses TimeZone.current for start_date_local — activities were appearing two hours off.
  • Watch auto-launch. startWatchApp now awaits HealthKit authorization first; previously it silently failed on the very first run, before auth had been granted.
  • Onboarding. Browse Library opens via .fullScreenCover instead of .sheet — the nested sheet was snapping closed when the parent recomputed. Quiz options and path tiles get .contentShape(Rectangle()) so taps on the padding count.
  • Keep screen awake. New setting (default on) gates isIdleTimerDisabled across the runner’s lifecycle, so the phone stops dimming mid-set on the tripod.
  • Duration sets. Actual elapsed seconds are now persisted on every user-driven stop (Stop button, watch stop, manual log). Reaching the planned duration without overtime auto-completes the set and starts rest.
  • Edit set values post-session. A new sheet on the summary lets you fix per-set reps, weight, or duration with the same pickers as the runner — for the inevitable “I logged 8 but did 9”.
  • No duplicate previous-set row. The runner’s spec strip lost its redundant ghost cell; the actionable “Repeat previous ↖” strip below already shows the same data.
  • Rest timer’s “Up next ↓” now crosses the exercise boundary — when the current exercise is done, the line previews the next exercise’s first set instead of going blank.