finds.dev← search

// the find

yihong0618/running_page

★ 4,479 · Python · MIT · updated Jun 2026

Make your own running home page

A self-hosted personal running stats page that pulls workout data from Garmin, Strava, Nike, and a dozen other sources, then renders it as a static map-based website deployed to Vercel or GitHub Pages. For developers who run and want a shareable training history page without handing their data to a third party. The GitHub Actions workflow handles the recurring sync automatically.

Supports an impressive number of data sources (Garmin global and CN, Strava, Nike, Keep, COROS, GPX/TCX/FIT files, and more) with cross-sync scripts for moving data between platforms. The default switch from Mapbox to MapCN (free, no token) was a smart call — the old setup caused maintainer token abuse in issues #643 and #1055. The Textual-based TUI for browsing activities locally is a nice addition that doesn't require spinning up the full web app. Privacy controls are practical: polyline trimming at start/end, ignore-range filtering, and a full privacy mode that strips the map entirely.

The README notes scattered across the top ('Note 1', 'Note 2'...) are a maintenance graveyard — migration instructions for 2023 schema changes and token abuse warnings mixed in with setup docs signal that the project has accumulated significant historical debt. Authentication for Garmin and Nike involves scraping session tokens or intercepting localStorage, which will silently break whenever those apps change their auth flow. The React frontend and Python sync layer have no shared configuration model — you're editing TypeScript constants in one place and GitHub Actions secrets in another, which makes setup error-prone and hard to automate. No tests for the sync scripts themselves; `test_real.py` exists but it's unclear what it covers without reading it.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →