Commit Graph

  • 92cea4dc99 fix: route leaderboards rank by moving time not elapsed — top-10 route times and route completions list now use COALESCE(moving_time_s, duration_s) so mid-activity pauses don't inflate times (consistent with moving-time avg pace) main owain 2026-07-01 21:04:46 +01:00
  • acf553ff5c docs: correct CLAUDE.md drift — beat also schedules sync_all_strava; three nginx configs (dev nginx/, deploy root, in-image SPA) with prod stack using Traefik labels; persist_activity lives in workers/tasks.py; add missing Celery tasks and ui components owainandClaude Fable 5 2026-07-01 21:01:42 +01:00
  • 4d5938cf33 fix(deps): resolve npm audit vulns — form-data 4.0.6 (high CRLF), Vite 5→8 + plugin-react 6 (esbuild dev-server moderate); bump frontend build image to node:22-alpine; mirror to export snapshot owain 2026-06-25 12:31:17 +01:00
  • 64caaad4e7 fix: cleanup StravaConfig on user delete (FK violation); equalize login timing (user enum); scope upload task-status to owner; SQL-side data-point downsampling; drop unused clsx/react-leaflet deps owain 2026-06-25 12:21:25 +01:00
  • 84eb1c46bd fix: map settings no longer revert/lose in-flight edits when profile refetches (dirty-flag guards hydrate clobber) owain 2026-06-25 11:04:53 +01:00
  • 3c97595093 feat: persist map tile settings (provider/style/API keys) server-side on user record; unbake Thunderforest default key into backend config (THUNDERFOREST_DEFAULT_KEY) served via profile owain 2026-06-23 12:37:27 +01:00
  • ffe285b7ba feat: global map provider/tiles setting (Thunderforest, MapTiler, CARTO, OSM, Esri) selectable in Profile with style + API key + live preview; all maps use it via useMapSettings/resolveTile owain 2026-06-23 12:29:50 +01:00
  • deecf668d2 feat: route tiles use Thunderforest Outdoors map style (dense labels, paths, contours) owain 2026-06-23 12:17:13 +01:00
  • 0901ed0ef3 feat: route tiles use OpenStreetMap standard raster for denser place/street labels owain 2026-06-23 12:11:59 +01:00
  • 62cea59ef8 feat: taller route tiles (h-46), labels overlay above route line for more place names, renamed auto routes become custom (rename clears auto_detected + startup backfill) owain 2026-06-23 12:08:33 +01:00
  • 16dff88564 fix: route tiles fill with fractional zoom (zoomSnap 0) so the route isn't tiny with wide margins; taller tiles (h-36) owain 2026-06-23 12:02:49 +01:00
  • 73bc986219 feat: routes page — deep-link to specific route, sport-colour tiles over real map, sort filter (distance/completions/last-completed), group custom vs auto-detected, taller map tiles owain 2026-06-23 11:57:39 +01:00
  • 4272c5dc4c feat: rename segments + create routes from an activity (detail page & dashboard recent activities) owain 2026-06-23 11:45:19 +01:00
  • 156ce60aa0 fix: personal records only count watch-recorded FIT activities; exclude phone/Strava GPX/TCX imports (bad GPS teleporting in old activities) owain 2026-06-21 19:51:32 +01:00
  • e2870e86a8 feat: Activities filters (type/year/date-range/distance) + Summary page with all-time & per-year/per-sport totals and distance-per-year chart owain 2026-06-21 16:29:33 +01:00
  • 69ecdaa4b2 feat: Strava export dry-run preview (new vs duplicate counts + confirm import) and prefer existing Garmin data over Strava on dedup owain 2026-06-21 10:41:54 +01:00
  • 07139120df feat: Strava support — bulk-export .gz/.tcx import fix + .tcx parser; full Strava API OAuth live sync (activities via streams) with Profile connect UI; colour gym/no-GPS sports red owain 2026-06-21 10:18:09 +01:00
  • e8615dd12d frontend: week-filter totals (distance/time/count) on Activities; colour HIIT & gym/no-GPS workouts red owain 2026-06-21 09:40:50 +01:00
  • 7d52b28f9d frontend: share one BodyBatteryChart component across Health + Dashboard (Dashboard now shows mid-activity pause markers too) owain 2026-06-20 20:16:06 +01:00
  • e33946e270 feat: avg pace over moving time (fixes elapsed-based pace on paused activities); show mid-activity pauses on Body Battery band via active_spans owain 2026-06-20 20:04:53 +01:00
  • 0e1d35364f frontend: standardise metric colours + crisp activity icons platform-wide owainandClaude Opus 4.8 2026-06-18 22:31:23 +01:00
  • a0912fd09a frontend: dashboard recent-activities widget no longer scrolls owainandClaude Opus 4.8 2026-06-18 22:00:42 +01:00
  • c14f3d60fa frontend: health trend graphs — taller widgets, top-right keys, tighter x-axis spacing, HRV line-only (no fill) with baseline-based Y range, weight/VO2 Y axes scaled to displayed data owainandClaude Opus 4.8 2026-06-18 21:47:24 +01:00
  • 227dadaca0 feat: rename activities; keep original Garmin title as a tag owainandClaude Opus 4.8 2026-06-18 21:35:09 +01:00
  • cc43d0f726 frontend: fix health body-battery activity bands not rendering (inline ReferenceArea so recharts recognizes them) owain 2026-06-18 14:08:44 +01:00
  • 471e43466c frontend: body battery activity overlays on dashboard; redesign highlight as coloured band below the data owain 2026-06-18 13:56:16 +01:00
  • a50d13179c frontend: global km/mi distance-unit toggle across dashboard, activities, routes, records owain 2026-06-18 13:01:25 +01:00
  • e61c77842f api: send Cache-Control no-store on /api responses so browsers can't cache stale auth state (e.g. garmin connected) owain 2026-06-18 12:07:13 +01:00
  • 385443522b frontend nginx: no-cache on index.html so deploys aren't masked by stale SPA shell (Edge heuristic caching) owain 2026-06-18 12:00:58 +01:00
  • 66076f2585 garmin sync: fix same-day second activity skipped by date-only dedup owain 2026-06-18 11:38:10 +01:00
  • 3a07655e2e dashboard sleep widget: fill empty space with hypnogram graph from Health tab owainandClaude Opus 4.8 2026-06-16 18:54:49 +01:00
  • c172bbe393 lap awards: 🥇 PR rows highlighted, 🏆 route lap-best, no awards on partial laps owain 2026-06-16 12:38:29 +01:00
  • a168f594a7 fix lap-bests distance matching + show PRs on activity page owain 2026-06-16 11:38:12 +01:00
  • 16144d60b4 HRV: plot Garmin overnight avg (weeklyAvg) not last-night; dedupe chart tooltips owain 2026-06-16 01:01:33 +01:00
  • d01f66223b HRV baseline band from Garmin + dashboard HRV colours + route name on recent activities + sync-now race fix owain 2026-06-16 00:13:16 +01:00
  • e7123ee5db Mobile-responsive UI: bottom tab nav, stacked dashboard, page fixes for phones owainandClaude Fable 5 2026-06-12 20:52:10 +01:00
  • 7673452bdb Refresh CLAUDE.md: lockfile status, new Celery tasks, sleep GMT convention, newer hooks/utils owainandClaude Fable 5 2026-06-12 20:52:10 +01:00
  • f69d34508d Sleep hypnogram: hover tooltip with exact times + darker REM colour owainandClaude Opus 4.8 2026-06-12 12:33:28 +01:00
  • e3964bbcdc Populate sleep_stages hypnogram timeline from Garmin Connect sync owainandClaude Opus 4.8 2026-06-12 12:21:21 +01:00
  • 319b04e413 fix(sleep): store sleep timestamps from GMT not Local (displayed +1h in BST) owain 2026-06-12 12:03:16 +01:00
  • b5b838bddc Fix treadmill/indoor distance over-measure and clean up polluted PRs owainandClaude Opus 4.8 2026-06-11 23:55:21 +01:00
  • e9cb1ea4e4 Dashboard Running PRs: show fixed 1k, 1 mile, 5k, 10k distances owainandClaude Opus 4.8 2026-06-11 23:42:12 +01:00
  • c05d27c115 Dashboard grid: 1-col min width for stats, vertical compaction for make-room dragging owainandClaude Opus 4.8 2026-06-11 23:36:29 +01:00
  • bb09c37b3d Dashboard polish: bounded drag push, equal-height stats, dark featured map, sport-coloured weekly bars owainandClaude Opus 4.8 2026-06-11 23:31:04 +01:00
  • 491660fc6b Dashboard: per-widget add/delete, free placement, VO2/HRV stats, body battery graph, more widgets owainandClaude Opus 4.8 2026-06-11 23:20:25 +01:00
  • 8ed47d6042 HRV balanced dots, dashed gap lines, dashboard widgets + drag-to-edit layout owainandClaude Opus 4.8 2026-06-11 23:04:43 +01:00
  • af32a0bb7f Add medals, HRV status dots, smooth segment hover, side-by-side map/timeline, HR zone times owainandClaude Opus 4.8 2026-06-11 22:44:20 +01:00
  • ec87f68729 Add trend-range gating, vehicle filter, sync cancel, moving time, and UI fixes owainandClaude Opus 4.8 2026-06-11 19:41:56 +01:00
  • 057eb9391a Fix passkey-disabled message obscured by null hash check owainandClaude Opus 4.8 2026-06-09 21:38:12 +01:00
  • 01a8fe135c Disable password login once a passkey is linked owainandClaude Opus 4.8 2026-06-09 21:34:23 +01:00
  • d350e9caea Add per-route top-10 leaderboard to activity detail owainandClaude Opus 4.8 2026-06-09 20:37:37 +01:00
  • bdd5f80c7e Harden auth/upload, fix PR-delete cascade and sync backfill owainandClaude Opus 4.8 2026-06-09 20:24:24 +01:00
  • 04689a29bd Cut Garmin sync API volume; dashboard/health/records/UI improvements owainandClaude Opus 4.8 2026-06-09 11:52:52 +01:00
  • 6a1726e0c3 Fix sleep score parsing, dashboard body battery, segment direction owainandClaude Opus 4.8 2026-06-08 20:58:53 +01:00
  • 0aa27713ca Fix follow-ups: lap bests, segments, charts, dashboard health owainandClaude Opus 4.8 2026-06-08 20:39:26 +01:00
  • bc437cce92 Batch 1: dashboard, maps, segments rewrite, health, sync UX owainandClaude Opus 4.8 2026-06-08 19:59:06 +01:00
  • e5feeb1178 Add explicit "link passkey to my account" flow owainandClaude Opus 4.8 2026-06-08 17:11:30 +01:00
  • e0ddc4cbf4 Fix PocketID config lookup when multiple admins exist owainandClaude Opus 4.8 2026-06-08 13:37:19 +01:00
  • 0e18ef2291 Fix PocketID secret wiped on re-save; log token-exchange failures owainandClaude Opus 4.8 2026-06-08 13:26:35 +01:00
  • 0dd6eba589 docs: refresh CLAUDE.md (beat service, TanStack Query, env vars, no tests) owainandClaude Opus 4.8 2026-06-08 13:19:55 +01:00
  • 0e4bc7b444 Multi-user via PocketID: account linking, group gating, admin user management owainandClaude Opus 4.8 2026-06-08 13:19:55 +01:00
  • bc4d68da07 Fix avg_hr_day: remove dead averageHeartRate lookup; add max_hr_day from UDS export owainandClaude Sonnet 4.6 2026-06-08 12:25:11 +01:00
  • 2d94f99356 Fix activity dedup crash: MultipleResultsFound on same-day same-sport activities owainandClaude Sonnet 4.6 2026-06-08 12:11:55 +01:00
  • f5d91cf8ae Fix Garmin full export import: UDSFile health data and nested zip FIT files owainandClaude Sonnet 4.6 2026-06-08 10:17:51 +01:00
  • 2ea691085f Fix VO2 arrow: tip lands at exact value on arc centre-line, base points outward owainandClaude Sonnet 4.6 2026-06-08 01:20:53 +01:00
  • bb9e8c59f4 VO2 max gauge: Garmin/Cooper Institute thresholds, add Superior category owainandClaude Sonnet 4.6 2026-06-08 01:15:26 +01:00
  • b6f185d5e8 Fix VO2 gauge: large-arc-flag must always be 0 for a 180° gauge owainandClaude Sonnet 4.6 2026-06-08 00:56:46 +01:00
  • 5c5877c792 Rework VO2 max gauge: full-colour ACSM bands, white inward arrow, no fill arc owainandClaude Sonnet 4.6 2026-06-08 00:49:17 +01:00
  • 5256bd448c Fix VO2 gauge arc direction: sweep=1 for upper (top) semicircle owainandClaude Sonnet 4.6 2026-06-08 00:41:31 +01:00
  • 221b2cd333 Fix VO2 max gauge: correct semicircle geometry, fixed 30-70 range, arrow pointer owainandClaude Sonnet 4.6 2026-06-08 00:38:53 +01:00
  • 45ff01f740 Fix health metrics API limit to support 5yr trend and snapshot navigation owainandClaude Sonnet 4.6 2026-06-08 00:28:37 +01:00
  • 8d304545a3 Health page: VO2 max gauge, layout improvements, 3Y/5Y trends, biological sex profile owainandClaude Sonnet 4.6 2026-06-07 23:49:01 +01:00
  • 70c7e5c0a8 Fix VO2 max extraction: values nested under entry['generic'] not top-level owainandClaude Sonnet 4.6 2026-06-07 23:18:04 +01:00
  • 093aa67e58 Log maxmet first entry structure to identify vo2max field name owainandClaude Sonnet 4.6 2026-06-07 23:13:43 +01:00
  • 546fdd96b5 Fix VO2 max sync: robust fallback when maxmet range returns non-list or valueless entries owainandClaude Sonnet 4.6 2026-06-07 23:01:18 +01:00
  • 0bb1f9bc1e Fetch full VO2 max history via maxmet/daily range query owainandClaude Sonnet 4.6 2026-06-07 22:35:38 +01:00
  • 854d4ed7cb Fix VO2 max extraction from training_status.mostRecentVO2Max.generic owainandClaude Sonnet 4.6 2026-06-07 22:16:09 +01:00
  • 41a39ec3c7 Try training_status and stats_and_body for VO2 max (debug logging) owainandClaude Sonnet 4.6 2026-06-07 21:59:05 +01:00
  • 367ae4e8f7 Switch VO2 max source to get_max_metrics (maxmet/daily endpoint) owainandClaude Sonnet 4.6 2026-06-07 21:38:41 +01:00
  • e440fb35dd Add debug logging for fitnessage API response owainandClaude Sonnet 4.6 2026-06-07 21:29:19 +01:00
  • 8fd7f984d9 Fix VO2 max extraction — use fitnessage API not daily stats owainandClaude Sonnet 4.6 2026-06-07 20:53:55 +01:00
  • 13ed824f01 VO2 max carry-forward and sync lookback days fix owainandClaude Sonnet 4.6 2026-06-07 20:12:51 +01:00
  • 45ff4c26aa Implemented all 9 UI fixes across health charts and activity detail pages. Changes are ready to push to git for the Docker build to pick them up. owain 2026-06-07 19:57:25 +01:00
  • 67fd4b3c96 Health hypnogram, routes tiles, BB bar chart, segment delta owainandClaude Sonnet 4.6 2026-06-07 18:44:00 +01:00
  • 492418586a Fixed Garmin sync progress bar granularity, timeout issue, and lookback days input, plus redesigned the sleep timeline with taller bars and yellow Awake colour. owain 2026-06-07 18:15:07 +01:00
  • bf1920eb9d Segments and Av HR update owain 2026-06-07 17:12:27 +01:00
  • 4a4cbdcc92 Fix pace sentinel, route map thumbnails, tiled segments, health/dashboard layout owainandClaude Sonnet 4.6 2026-06-07 16:36:54 +01:00
  • 5f5551db27 Fix wellness sync crash on None body battery levels owainandClaude Sonnet 4.6 2026-06-07 16:04:38 +01:00
  • da9c1e04cb Body owain 2026-06-07 15:26:54 +01:00
  • 568dc31e97 Round 2: body battery redesign, profile cleanup, segment integration, route/segment records owainandClaude Sonnet 4.6 2026-06-07 13:14:00 +01:00
  • 02eccad578 Add segments, YTD stats, route matching fixes, body battery layout, pace fix owainandClaude Sonnet 4.6 2026-06-07 12:01:25 +01:00
  • f0bbe92b2c Fix sync window: respect lookback_days even after first sync owainandClaude Sonnet 4.6 2026-06-07 11:16:08 +01:00
  • 616099402b Add body battery: sync, storage, and health UI chart owainandClaude Sonnet 4.6 2026-06-07 11:13:38 +01:00
  • 37ffd4c9e0 Fix wellness sync crash: serialize intraday_hr as JSON string for psycopg2 owainandClaude Sonnet 4.6 2026-06-07 11:00:22 +01:00
  • d57054509c Fix HealthPage crash: move intradayData query below selectedDay declaration owainandClaude Sonnet 4.6 2026-06-07 10:51:14 +01:00
  • f927e32853 Fix missing avg_hr_day/weight data; add 24hr HR chart to daily snapshot owainandClaude Sonnet 4.6 2026-06-07 10:47:53 +01:00
  • a28ce0e009 Add sync progress bar; change auto-sync to every 30 minutes owainandClaude Sonnet 4.6 2026-06-07 10:36:15 +01:00
  • a9b3da858d Fix five code-review findings: token auth, sync rate-limiting, model drift, FK cascade owainandClaude Sonnet 4.6 2026-06-07 10:30:20 +01:00
  • 211f77a574 Fix sync_lookback_days actually controlling the sync window owainandClaude Sonnet 4.6 2026-06-07 01:34:18 +01:00
  • 22b41109f5 Fix Garmin stats sync, add route merge/map/links, fix PR constraint owainandClaude Sonnet 4.6 2026-06-07 01:25:01 +01:00