-
clone or Fork before vercel 404 need to pull the latest code
-
python in README means python3 python
-
use v2.0 need change vercel setting from gatsby to vite
-
2023.09.26 garmin need secret_string(and in Actions) get
python run_page/get_garmin_secret.py ${email} ${password} # if cn python run_page/get_garmin_secret.py ${email} ${password} --is-cn
-
2024.09.29: Added
Elevation Gainfield, If you forked the project before this update, please run the following command:- To resolve errors:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: activities.elevation_gain - If you don't have a local environment, set
RUN_TYPEtodb_updaterin the.github/workflows/run_data_sync.ymlfile once then change back.
python run_page/db_updater.py
- For old data: To include
Elevation Gainfor past activities, perform a full reimport. - To show the 'Elevation Gain' column, modify
SHOW_ELEVATION_GAINinsrc/utils/const.ts - note:
Elevation Gainmay be inaccurate. You can use Strava's "Correct Elevation" or Garmin's "Elev Corrections" feature for more precise data.
- To resolve errors:
-
It cost me a lot money, so please do not use my mapbox token more check this issue
Running page runners
- GitHub Actions automatically synchronizes running data and generates page displays
- Support for Vercel (recommended) and GitHub Pages automated deployment
- React Hooks
- Mapbox for map display
- 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.
- Garmin
- Garmin-CN
- New Way To Sync Nike Run Club
- Nike Run Club
- Strava
- GPX
- TCX
- FIT
- Garmin-CN_to_Garmin(Sync Garmin-CN activities to Garmin Global)
- Nike_to_Strava(Using NRC Run, Strava backup data)
- Tcx_to_Strava(upload all tcx data to strava)
- Tcx_to_Garmin(upload all tcx data to Garmin)
- Gpx_to_Strava(upload all gpx data to strava)
- Garmin_to_Strava(Using Garmin Run, Strava backup data)
- Strava_to_Garmin(Using Strava Run, Garmin backup data)
- COROS
- iGPSPORT
- Joyrun
- Komoot
- Onelap
Clone or fork the repo.
git clone https://github.com/yihong0618/running_page.git --depth=1pip3 install -r requirements.txt
npm install -g corepack && corepack enable && pnpm install
pnpm developOpen your browser and visit http://localhost:5173/
# NRC
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 secret_string=""
# Garmin-CN
docker build -t running_page:latest . --build-arg app=Garmin-CN --build-arg secret_string=""
# Strava
docker build -t running_page:latest . --build-arg app=Strava --build-arg client_id="" --build-arg client_secret="" --build-arg refresh_token=""
# Nike_to_Strava
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 refresh_token=""
# Keep
docker build -t running_page:latest . --build-arg app=Keep --build-arg keep_phone_number="" --build-arg keep_password=""
# run
docker run -itd -p 80:80 running_page:latest
# visit
Open your browser and visit localhost:80
If you use English please change
IS_CHINESE = falseinsrc/utils/const.ts
Suggested changes to your own Mapbox token
const MAPBOX_TOKEN =
'pk.eyJ1IjoieWlob25nMDYxOCIsImEiOiJja2J3M28xbG4wYzl0MzJxZm0ya2Fua2p2In0.PNKfkeQwYuyGOTT_x9BJ4Q';In addition to using the default map tile style, you can customize the map display by modifying the following configurations in
src/utils/const.ts:
const MAP_TILE_VENDOR = 'maptiler';
const MAP_TILE_STYLE = 'winter-dark';
const MAP_TILE_ACCESS_TOKEN = 'your_access_token';Currently supported MAP_TILE_VENDOR options include:
- "mapbox" - Mapbox map services
- "maptiler" - MapTiler map services
- "stadiamaps" - Stadia Maps services
Each MAP_TILE_VENDOR provides multiple MAP_TILE_STYLE options. Ensure the style matches your selected vendor. For available MAP_TILE_STYLE names, refer to the definitions in src/utils/const.ts.
When using "maptiler" or "stadiamaps", you must configure an ACCESS_TOKEN. The default token may cause quota limit issues if not replaced.
- MapTiler: Register at https://cloud.maptiler.com/auth/widget (Free tier available)
- Stadia Maps: Sign up at https://client.stadiamaps.com/signup/ (Free tier available)
- Find
src/static/site-metadata.tsin the repository directory, find the following content, and change it to what you want.
siteMetadata: {
siteTitle: 'Running Page', #website title
siteUrl: 'https://yihong.run', #website url
logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQTtc69JxHNcmN1ETpMUX4dozAgAN6iPjWalQ&usqp=CAU', #logo img
description: 'Personal site and blog',
navLinks: [
{
name: 'Blog', #navigation name
url: 'https://yihong.run/running', #navigation url
},
{
name: 'About',
url: 'https://github.com/yihong0618/running_page/blob/master/README-CN.md',
},
],
},- Modifying styling in
src/utils/const.ts
// 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;
// styling: set to `true` if you want to display only the routes without showing the map
// Note: This config only affects the page display; please refer to "privacy protection" below for data protection
// update for now 2024/11/17 the privacy mode is true
const PRIVACY_MODE = true;
// update for now 2024/11/17 the lights on default is false
// styling: set to `false` if you want to make light off as default, only effect when `PRIVACY_MODE` = false
const LIGHTS_ON = false;
// set to `true` if you want to show the 'Elevation Gain' column
const SHOW_ELEVATION_GAIN = true;- To use Google Analytics, you need to modify the configuration in the
src/utils/const.tsfile.
const USE_GOOGLE_ANALYTICS = false;
const GOOGLE_ANALYTICS_TRACKING_ID = '';privacy protection,setting flowing env:
# ignore distance for each polyline start and end.
IGNORE_START_END_RANGE = 200
# ignore meters for each point in below polyline.
IGNORE_RANGE = 200
# a polyline include point you want to ignore.
IGNORE_POLYLINE = ktjrFoemeU~IorGq}DeB
# Do filter before saving to database, you will lose some data, but you can protect your privacy, when you using public repo. enable for set 1, disable via unset.
IGNORE_BEFORE_SAVING =You can using Google map Interactive Polyline Encoder Utility, to making your IGNORE_POLYLINE.
Download your running data and do not forget to generate svg in
totalpage
Make your GPX data
Copy all your gpx files to GPX_OUT or new gpx files
python run_page/gpx_sync.pyMake your TCX data
Copy all your tcx files to TCX_OUT or new tcx files
python run_page/tcx_sync.pyMake your FIT data
Copy all your tcx files to FIT_OUT or new fit files
python run_page/fit_sync.pyGet your Garmin data
- If you only want to sync
type runningadd args --only-run - If you only want
tcxfiles add args --tcx - If you only want
fitfiles add args --fit - If you are using Garmin as a data source, it is recommended that you pull the code to your local environment to run and obtain the Garmin secret. The Python version must be >=3.8
Enter the following command in the terminal
# to get secret_string
python run_page/get_garmin_secret.py ${your email} ${your password}Copy the Secret output in the terminal,If you are using GitHub, please configure GARMIN_SECRET_STRING in GitHub Action.
# use this secret_string
python run_page/garmin_sync.py ${secret_string}example:
python run_page/get_garmin_secret.py xxxxxxxxxxxonly-run:
python run_page/garmin_sync.py xxxxxxxxxxxxxx(secret_string) --only-runGet your Garmin-CN data
- If you only want to sync
type runningadd args --only-run - If you only want
tcxfiles add args --tcx - If you only want
fitfiles add args --fit - If you are using Garmin as a data source, it is recommended that you pull the code to your local environment to run and obtain the Garmin secret. The Python version must be >=3.10
Enter the following command in the terminal
# to get secret_string
python run_page/get_garmin_secret.py ${your email} ${your password} --is-cnCopy the Secret output in the terminal,If you are using GitHub, please configure GARMIN_SECRET_STRING_CN in GitHub Action.

example:
python run_page/garmin_sync.py xxxxxxxxx(secret_string) --is-cnonly-run:
python run_page/garmin_sync.py xxxxxxxxxxxxxx(secret_string) --is-cn --only-run Sync your Garmin-CN data to Garmin
- If you only want to sync
type runningadd args --only-run The Python version must be >=3.10
Enter the following command in the terminal
# to get secret_string
python run_page/get_garmin_secret.py ${your email} ${your password} --is-cnEnter the following command in the terminal
# to get secret_string
python run_page/get_garmin_secret.py ${your email} ${your password}Enter the following command in the terminal
# to sync garmin-cn to garmin-global
python run_page/garmin_sync_cn_global.py ${garmin_cn_secret_string} ${garmin_secret_string}Get your Nike Run Club data
Please note:Due to the discontinuation of Nike Run Club in mainland China, you can only log in through a VPN. Before starting, please ensure that you are using a global non-mainland China proxy, allowing you to access
nike.cominstead ofnike.com.cn, as shown in the following image.
-
Sign in/Sign up NikeRunClub account

-
after successful login,openF12->Application->localstorage-> copy the content of "access_token" from the value of key
https://www.nike.com. -
Execute in the root directory , you should be able to see the image below, and then you can log into your account on the mobile as usual:
python run_page/nike_sync.py ${access_token}if you want to automate the submission of NRC data, you can refer to issue692.
If you've previously synced activities and want to continue syncing new ones, with
--continue-syncargspython run_page/nike_sync.py ${access_token} --continue-sync
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
ALL need to do outside GFW.
-
Login from this website, open F12 -> XHR -> get the
refresh_tokenfrom login api. -
copy this
refresh_tokenand use it in GitHub Secrets or in command line -
Execute in the root directory:
python run_page/nike_sync.py ${nike refresh_token}example:
python run_page/nike_sync.py eyJhbGciThiMTItNGIw****** Get your Strava data
-
Sign in/Sign up Strava account
-
Open after successful Signin Strava Developers -> Create & Manage Your App
-
Create
My API Application: Enter the following information
Created successfully:
-
Use the link below to request all permissions: Replace
${your_id}in the link withMy API ApplicationClient IDhttps://www.strava.com/oauth/authorize?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:writeExample:
https://www.strava.com/oauth/authorize?client_id=115321&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 -
Get the
codevalue in the link
example:
http://localhost/exchange_token?state=&code=1dab37edd9970971fb502c9efdd087f4f3471e6e&scope=read,activity:write,activity:read_all,profile:write,profile:read_all,read_all
codevalue:1dab37edd9970971fb502c9efdd087f4f3471e6
-
Use
Client_id、Client_secret、Codegetrefresh_token: Execute inTerminal/iTermcurl -X POST https://www.strava.com/oauth/token \ -F client_id=${Your Client ID} \ -F client_secret=${Your Client Secret} \ -F code=${Your Code} \ -F grant_type=authorization_code
example:
curl -X POST https://www.strava.com/oauth/token \ -F client_id=12345 \ -F client_secret=b21******d0bfb377998ed1ac3b0 \ -F code=d09******b58abface48003 \ -F grant_type=authorization_code
-
Sync
StravadataThe first time you synchronize Strava data you need to change line 12 of the code False to True in strava_sync.py, and then change it to False after it finishes running. If you only want to sync
type runningadd args --only-runpython run_page/strava_sync.py ${client_id} ${client_secret} ${refresh_token}
References:
upload all tcx files to strava
-
follow the strava steps
-
copy all your tcx files to TCX_OUT
-
Execute in the root directory:
python run_page/tcx_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token}
example:
python run_page/tcx_to_strava_sync.py xxx xxx xxx or python run_page/tcx_to_strava_sync.py xxx xxx xxx --all
-
if you want to all files add args
--all
upload all tcx files to garmin
-
follow the garmin steps
-
copy all your tcx files to TCX_OUT
-
Execute in the root directory:
python3 run_page/tcx_to_garmin_sync.py ${{ secrets.GARMIN_SECRET_STRING_CN }} --is-cnexample:
python run_page/tcx_to_garmin_sync.py xxx --is-cn or Garmin Global python run_page/tcx_to_garmin_sync.py xxx
-
if you want to all files add args
--all
upload all gpx files to strava
-
follow the strava steps
-
copy all your gpx files to GPX_OUT
-
Execute in the root directory:
python run_page/gpx_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token}
example:
python run_page/gpx_to_strava_sync.py xxx xxx xxx or python run_page/tcx_to_strava_sync.py xxx xxx xxx --all
-
if you want to all files add args
--all
Get your Nike Run Club data and upload to strava
- follow the nike and strava steps
- Execute in the root directory:
python run_page/nike_to_strava_sync.py ${nike_refresh_token} ${client_id} ${client_secret} ${strava_refresh_token}example:
python run_page/nike_to_strava_sync.py eyJhbGciThiMTItNGIw****** xxx xxx xxxGet your Garmin data and upload to strava
-
finish garmin and strava setup
-
Execute in the root directory:
python run_page/garmin_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token} ${garmin_secret_string} --is-cn
e.g.
python run_page/garmin_to_strava_sync.py xxx xxx xxx xx
Get your Strava data and upload to Garmin
-
finish garmin and strava setup, at the same time, you need to add additional strava config in GitHub Actions secret:
secrets.STRAVA_EMAIL,secrets.STRAVA_PASSWORD,secrets.STRAVA_JWT, Note:STRAVA_JWTis superior toSTRAVA_EMAILandSTRAVA_PASSWORD,STRAVA_JWTis thestrava_remember_tokenfield of the Strava web login Cookie. -
Execute in the root directory:
python run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }}
if your garmin account region is China, you need to execute the command:
python run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING_CN }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }} ${{ secrets.STRAVA_JWT }} --is-cn
If you want to add Garmin Device during sync, you should add
--use_fake_garmin_deviceargument, this will add a Garmin Device (Garmin Forerunner 245 by default, and you can change device ingarmin_device_adaptor.py) in synced Garmin workout record, this is essential when you want to sync the workout record to other APP like Keep, JoyRun etc.
the final command will be:
python run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING_CN }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }} ${{ secrets.STRAVA_JWT }}--use_fake_garmin_device
ps: when initializing for the first time, if you have a large amount of strava data, some data may fail to upload, just retry several times.
Get your COROS data
- If you only want to sync
type runningadd args --only-run
python run_page/coros_sync.py 'your coros account' 'your coros password'Get your iGPSPORT data
python3 run_page/igpsport_sync.py 'your igpsport phone' 'password' --with-gpxYou can replace with-gpx with with-fit to acquire data in fit format.
Get your Joyrun data
python3 run_page/joyrun_sync.py 'your joyrun phone' 'verication code' --with-gpxYou can replace with-gpx with with-tcx to acquire data in tcx format.
Get your Komoot data
python3 run_page/komoot_sync.py 'your komoot email' 'password' --with-gpx| Parameter | Description |
|---|---|
mail |
Login using specified email address |
password |
Use provided password and skip interactive prompt |
-n, --anonymous |
Skip authentication, no interactive prompt (valid only with -d) |
--with-gpx |
Download all tours as GPX |
-r, --remove-deleted |
Remove GPX files (from --output dir) without corresponding tour in Komoot (deleted and previous versions) |
--start-date=YYYY-MM-DD |
Filter tours on or after specified date |
--end-date=YYYY-MM-DD |
Filter tours on or before specified date |
-e, --no-poi |
Do not include highlights as POIs |
Get your Onelap data
python3 run_page/onelap_sync.py 'your onelap phone' 'password' --with-fitRunning data display
- Generate SVG data display
- Display of results:Click to view、Click to view
python run_page/gen_svg.py -h
usage: gen_svg.py [-h] [--gpx-dir DIR] [--output FILE] [--language LANGUAGE] [--year YEAR] [--title TITLE] [--athlete NAME] [--special FILE] [--type TYPE]
[--background-color COLOR] [--track-color COLOR] [--track-color2 COLOR] [--text-color COLOR] [--special-color COLOR] [--special-color2 COLOR] [--units UNITS]
[--verbose] [--logfile FILE] [--special-distance DISTANCE] [--special-distance2 DISTANCE] [--min-distance DISTANCE] [--use-localtime] [--from-db]
[--github-style GITHUB_STYLE] [--circular-rings] [--circular-ring-color COLOR] [--empty-data-color COLOR] [--birth YYYY-MM]
options:
-h, --help show this help message and exit
--gpx-dir DIR Directory containing GPX files (default: current directory).
--output FILE Name of generated SVG image file (default: "poster.svg").
--language LANGUAGE Language (default: english).
--year YEAR Filter tracks by year; "NUM", "NUM-NUM", "all" (default: all years)
--title TITLE Title to display.
--athlete NAME Athlete name to display (default: "John Doe").
--special FILE Mark track file from the GPX directory as special; use multiple times to mark multiple tracks.
--type TYPE Type of poster to create (default: "grid", available: "grid", "circular", "github", "monthoflife").
--background-color COLOR
Background color of poster (default: "#222222").
--track-color COLOR Color of tracks (default: "#4DD2FF").
--track-color2 COLOR Secondary color of tracks (default: none).
--text-color COLOR Color of text (default: "#FFFFFF").
--special-color COLOR
Special track color (default: "#FFFF00").
--special-color2 COLOR
Secondary color of special tracks (default: none).
--units UNITS Distance units; "metric", "imperial" (default: "metric").
--verbose Verbose logging.
--logfile FILE
--special-distance DISTANCE
Special Distance1 by km and color with the special_color
--special-distance2 DISTANCE
Special Distance2 by km and corlor with the special_color2
--min-distance DISTANCE
min distance by km for track filter
--use-localtime Use utc time or local time
--from-db activities db file
--github-style GITHUB_STYLE
github svg style; "align-firstday", "align-monday" (default: "align-firstday").
--birth YYYY-MM Birth date in format YYYY-MM
Circular Type Options:
--circular-rings Draw distance rings.
--circular-ring-color COLOR
Color of distance rings.
Github Type Options:
--empty-data-color COLOR
Color for empty dates in github style poster (default: #444444)
Generate github style svg show
python run_page/gen_svg.py --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.5If you want to change the display color of empty data(only github style), please use --empty-data-color:
python run_page/gen_svg.py --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 ----empty-data-color greyGenerate grid style svg show
python run_page/gen_svg.py --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-localtimepython run_page/gen_svg.py --from-db --type circular --use-localtimeGenerate a "Runner Month of Life" visualization as if your entire life consisted of only 1000 months.
python3 run_page/gen_svg.py --from-db --type monthoflife --birth 1989-03 --special-distance 10 --special-distance2 20 --special-color '#f9d367' --special-color2 '#f0a1a8' --output assets/mol.svg --use-localtime --athlete yihong0618 --title 'Runner Month of Life'Generate your share png using GPT gpt-image-1(last one)
python run_page/auto_share_sync.py --api_key xxxxxxxxx --base_url xxxxxxxxIf you want to generate a share png for a date
python run_page/auto_share_sync.py --api_key xxxxxxxxx --base_url xxxxxxxx --date 2023-11-11If you want to auto gen in ci you can refer this link
For more display effects, see: https://github.com/flopp/GpxTrackPoster
Use Vercel to deploy
Use Cloudflare to deploy
-
Login to Cloudflare dashboard.
-
Click
Workers & Pageson the left side. -
Click
Create applicationand selectPagestab, connect your GitHub account and selectrunning_pageRepo, then clickBegin setup. -
Scroll down to
Build settings, chooseCreate React AppfromFramework preset, and setBuild output directorytodist. -
Scroll down, click
Environment variables (advanced), then add a variable like the below:Variable name =
PYTHON_VERSION, Value =3.11 -
Click
Save and Deploy
Deploy to GitHub Pages
-
Go to repository's
Settings -> GitHub Pages -> Source, chooseGitHub Actions -
Go to the repository's
Actions -> Workflows -> All Workflows, chooseRun Data Syncfrom the left panel, and clickRun workflow.- The
Run Data Syncwill update data and then trigger thePublish GitHub Pagesworkflow - Make sure the workflow runs without errors.
- The
-
Open your website to check on the results
- note if the website doesn't reflect the latest data, please refresh it by
F5. - Some browsers (e.g. Chrome) won't refresh if there is a cache, you then need to use
Ctrl+F5(Windows) orShift+Cmd+r(Mac) to force clearing the cache and reload the page.
- note if the website doesn't reflect the latest data, please refresh it by
-
make sure you have write permissions in Workflow permissions settings.
-
If you want to deploy your running_page to xxx.github.io instead of xxx.github.io/running_page or redirect your GitHub Pages to a custom domain, you need to do three things:
- Rename your forked running_page repository to
xxx.github.io, where xxx is your GitHub username - Modify the Build module in gh-pages.yml, remove
${{ github.event.repository.name }}and change torun: PATH_PREFIX=/ pnpm build - In
src/static/site-metadata.ts, set siteUrl: '' or your custom domain URL
- Rename your forked running_page repository to
Modifying information in GitHub Actions
Actions source code The following steps need to be taken
-
change to your app type and info
-
Add your secret in repo Settings > Secrets (add only the ones you need).
-
My secret is as follows
-
Go to repository's
Settings -> Code and automation -> Actions ->General, Scroll to the bottom, findWorkflow permissions, choose the first optionRead and write permissions, clickSave.
Automate with iOS Shortcuts
Take the keep app as an example. Close the app after running, and then automatically trigger Actions to update the data.
-
Get actions id (need to apply token)
curl https://api.github.com/repos/yihong0618/running_page/actions/workflows -H "Authorization: token d8xxxxxxxxxx" # change to your config
-
Binding shortcut instruction
-
Get it via icloud running-page-shortcuts-template
-
Modify the dictionary parameters in the following figure
-
-
Automation
Storing Data Files in GitHub Cache
When SAVE_DATA_IN_GITHUB_CACHE is set to true in the run_data_sync.yml file, the script can store fetched and intermediate data files in the GitHub Action Cache. This helps keep your GitHub commit history and directory clean.
If you are deploying using GitHub Pages, it is recommended to set this value to true, and set BUILD_GH_PAGES to true.
supported manufacturer:
- Garmin
- magene
- 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~
- support for Zeep life
- 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 .)
- @flopp great repo GpxTrackPoster
- @danpalmer UI design
- @shaonianche icon design and doc
- @geekplux Friendly help and encouragement, refactored the whole front-end code, learned a lot
- @MFYDev Wiki
- @gongzili456 for motorcycle version
- @ben-29 for different types support
- @geekplux for different types support
Just enjoy it~
-
Strava API limit
https://www.strava.com/settings/api https://developers.strava.com/docs/#rate-limiting
Strava API Rate Limit Exceeded. Retry after 100 seconds Strava API Rate Limit Timeout. Retry in 799.491622 seconds -
vercel git ignore gh-pages:
you can change settings -> build -> Ignored Build Step -> Custom command
if [ "$VERCEL_GIT_COMMIT_REF" != "gh-pages" ]; then exit 1; else exit 0;





















