Running Page Save

Make your own running home page

Project README

Create a personal running home page

Github Action Chat on telegram


English | 简体中文 | Wiki

Runner's Page Show

Runner page App
zhubao315 Strava
shaonianche Strava
yihong0618 Nike
superleeyom Nike
geekplux Nike
guanlan Strava
tuzimoe Nike
ben_29 Strava
kcllf Garmin-cn
mq Keep
zhaohongxuan Keep
yvetterowe Strava
love-exercise Keep
zstone12 Keep
Lax Keep
lusuzi Nike
wh1994 Garmin
liuyihui Keep
sunyunxian Strava
AhianZhang Nike
L1cardo Nike
luckylele666 Strava
MFYDev Garmin-cn
tianheg Keep
Eished Keep
Liuxin Nike
loucx Nike
winf42 Garmin-cn
sun0225SUN Nike
Zhan Nike
Dennis Garmin-cn
hanpei Garmin-cn
liugezhou Strava
Jason Tan Nike
Conge Strava

How it works



  1. GitHub Actions manages automatic synchronization of runs and generation of new pages.
  2. Gatsby-generated static pages, fast
  3. Support for Vercel (recommended) and GitHub Pages automated deployment
  4. React Hooks
  5. Mapbox for map display
  6. Supports most sports apps such as nike strava...

automatically backup gpx data for easy backup and uploading to other software.
Note: If you don't want to make the data public, you can choose strava's fuzzy processing, or private repositories.



Clone or fork the repo.

git clone --depth=1

Installation and testing (node >= 12 and <= 14 python >= 3.7)

pip3 install -r requirements.txt
yarn install
yarn develop

Open your browser and visit http://localhost:8000/


docker build -t running_page:latest . --build-arg app=NRC --build-arg nike_refresh_token=""
# Garmin
docker build -t running_page:latest . --build-arg app=Garmin --build-arg email=""  --build-arg password="" 
# Garmin-CN
docker build -t running_page:latest . --build-arg app=Garmin-CN --build-arg email=""  --build-arg password="" 
# Strava
docker build -t running_page:latest . --build-arg app=Strava --build-arg client_id=""  --build-arg client_secret=""  --build-arg refresch_token="" 
docker build -t running_page:latest . --build-arg app=Nike_to_Strava  --build-arg nike_refresh_token="" --build-arg client_id=""  --build-arg client_secret=""  --build-arg refresch_token="" 

docker run -itd -p 80:80   running_page:latest

Open your browser and visit localhost:80

Local sync data

Modifying Mapbox token in src/utils/const.js

If you use English please change IS_CHINESE = false in src/utils/const.js
Suggested changes to your own Mapbox token


Custom your page

  • Find gatsby-config.js in the repository directory, find the following content, and change it to what you want.
siteMetadata: {
  siteTitle: 'Running Page', #website title
  siteUrl: '', #website url
  logo: '', #logo img
  description: 'Personal site and blog',
  navLinks: [
      name: 'Blog', #navigation name
      url: '', #navigation url
      name: 'About',
      url: '',
  • Modifying styling in src/utils/const.js
// styling: set to `false` if you want to disable dash-line route
const USE_DASH_LINE = true;
// styling: route line opacity: [0, 1]
const LINE_OPACITY = 0.4;

Download your running data and do not forget to generate svg in total page


Make your GPX data

Copy all your gpx files to GPX_OUT or new gpx files

python3(python) scripts/


Make your TCX data

Copy all your tcx files to TCX_OUT or new tcx files

python3(python) scripts/


Get your Garmin data
If you only want to sync `type running` add args --only-run If you only want `tcx` files add args --tcx
python3(python) scripts/ ${your email} ${your password}


python3(python) scripts/ [email protected] example


python3(python) scripts/ [email protected] example --only-run


Get your Garmin-CN data
If you only want to sync `type running` add args --only-run If you only want `tcx` files add args --tcx
python3(python) scripts/ ${your email} ${your password} --is-cn


python3(python) scripts/ [email protected] example --is-cn

Nike Run Club

Get your Nike Run Club data

Please note: When you choose to deploy running_page on your own server, due to Nike has blocked some IDC's IP band, maybe your server cannot sync Nike Run Club's data correctly and display 403 error, then you have to change another way to host it.

Get Nike's refresh_token

  1. Login Nike website
  2. In Develop -> Application-> Storage -> look for refresh_token


  1. Execute in the root directory:
python3(python) scripts/ ${nike refresh_token}


python3(python) scripts/ eyJhbGciThiMTItNGIw******

example img


Get your Strava data
  1. Sign in/Sign up Strava account

  2. Open after successful Signin Strava Developers -> Create & Manage Your App

  3. Create My API Application: Enter the following information

My API Application

Created successfully:

  1. Use the link below to request all permissions: Replace ${your_id} in the link with My API Application Client ID${your_id}&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=read_all,profile:read_all,activity:read_all,profile:write,activity:write


  1. Get the code value in the link



code value:



  1. Use Client_idClient_secretCode get refresch_token: Execute in Terminal/iTerm
curl -X POST \
-F client_id=${Your Client ID} \
-F client_secret=${Your Client Secret} \
-F code=${Your Code} \
-F grant_type=authorization_code


curl -X POST \
-F client_id=12345 \
-F client_secret=b21******d0bfb377998ed1ac3b0 \
-F code=d09******b58abface48003 \
-F grant_type=authorization_code


  1. Sync Strava data
python3(python) scripts/ ${client_id} ${client_secret} ${refresch_token}



upload all tcx files to strava
  1. follow the strava steps
  2. Execute in the root directory:
python3(python) scripts/ ${client_id} ${client_secret}  ${strava_refresch_token}


python3(python) scripts/ xxx xxx xxx


Get your Nike Run Club data and upload to strava
  1. follow the nike and strava steps
  2. Execute in the root directory:
python3(python) scripts/ ${nike_refresh_token} ${client_id} ${client_secret} ${strava_refresch_token}


python3(python) scripts/ eyJhbGciThiMTItNGIw******  xxx xxx xxx


Get your Garmin data and upload to strava
  1. finish garmin and strava setps
  2. Execute in the root directory:
python3(python) scripts/  ${client_id} ${client_secret} ${strava_refresch_token} ${garmin_email} ${garmin_password} --is-cn


python3(python) scripts/  xxx xxx xxx xx xxx

Total Data Analysis

Running data display
python scripts/ --from-db --title "${{ env.TITLE }}" --type github --athlete "${{ env.ATHLETE }}" --special-distance 10 --special-distance2 20 --special-color yellow --special-color2 red --output assets/github.svg --use-localtime --min-distance 0.5
python scripts/ --from-db --title "${{ env.TITLE_GRID }}" --type grid --athlete "${{ env.ATHLETE }}"  --output assets/grid.svg --min-distance 10.0 --special-color yellow --special-color2 red --special-distance 20 --special-distance2 40 --use-localtime

Generate year circular svg show

python3(python) scripts/ --from-db --type circular --use-localtime

For more display effects, see:

server(recommendation vercel)

Use Vercel to deploy
  1. vercel connects to your GitHub repo.


  1. import repo


  1. Awaiting completion of deployment
  2. Visits
Use Cloudflare to deploy
  1. Click Create a project in Pages to connect to your Repo.

  2. After clicking Begin setup, modify Project's Build settings.

  3. Select Framework preset to Gatsby

  4. Scroll down, click Environment variables, then variable below:

    Variable name = PYTHON_VERSION, Value = 3.7

  5. Click Save and Deploy

Deploy to GitHub Pages
  1. If you are using a custom domain for GitHub Pages, open .github/workflows/gh-pages.yml, change fqdn value to the domain name of your site.

  2. (Skip this step if you're NOT using a custom domain) Modify gatsby-config.js, change pathPrefix value to the root path. If the repository name is running_page, the value will be /running_page.

  3. Go to repository's Actions -> Workflows -> All Workflows, choose Publish GitHub Pages from the left panel, click Run workflow. Make sure the workflow runs without errors, and gh-pages branch is created.

  4. Go to repository's Settings -> GitHub Pages -> Source, choose Branch: gh-pages, click Save.

GitHub Actions

Modifying information in GitHub Actions

Actions source code The following steps need to be taken

  1. change to your app type and info


  1. Add your secret in repo Settings > Secrets (add only the ones you need).


  1. My secret is as follows



  • Complete this document.
  • Support Garmin, Garmin China
  • support for nike+strava
  • Support English
  • Refine the code
  • add new features
  • tests
  • support the world map
  • support multiple types, like hiking, biking~


  • Any Issues PR welcome.
  • You can PR share your Running page in README I will merge it.

Before submitting PR:

  • Format Python code with black (black .)

Special thanks

Recommended Forks


Just enjoy it~

Open Source Agenda is not affiliated with "Running Page" Project. README Source: yihong0618/running_page

Open Source Agenda Badge

Open Source Agenda Rating