Personal running data visualization platform with automatic Strava sync.
- Strava / Nike Run Club data import
- Map route visualization with animated playback
- Split pace analysis and charts
- Daily auto-sync via GitHub Actions
- Responsive design for desktop and mobile
Create a .env.local file:
# Required - Map style
NEXT_PUBLIC_MAP_STYLE=https://basemaps.cartocdn.com/gl/positron-gl-style/style.json
# Strava (recommended)
STRAVA_CLIENT_ID=your_client_id
STRAVA_CLIENT_SECRET=your_client_secret
STRAVA_REFRESH_TOKEN=your_refresh_token
# Nike Run Club (optional)
NIKE_ACCESS_TOKEN=your_access_token- Go to Strava API Settings and create an app
- Get your
Client IDandClient Secret - Obtain
Refresh Tokenvia OAuth flow (see strava-oauth guide)
# Install dependencies
bun install
# Initialize database
bun run db:push
# Start dev server
bun run dev
# Manual sync
bun run syncVisit http://localhost:3000
- Fork this repository
- Import project in Vercel
- Configure environment variables (same as
.env.local) - Deploy
Note: Vercel deployment requires GitHub Actions for data sync. Database is stored in the repository.
# Using docker-compose
docker compose up -d
# Or manual build
docker build -t runpaceflow .
docker run -d -p 3000:3000 \
-e NEXT_PUBLIC_MAP_STYLE=https://basemaps.cartocdn.com/gl/positron-gl-style/style.json \
-e STRAVA_CLIENT_ID=your_id \
-e STRAVA_CLIENT_SECRET=your_secret \
-e STRAVA_REFRESH_TOKEN=your_token \
-v runpaceflow_data:/app/data \
runpaceflowBuilt-in GitHub Actions workflow for daily activity sync.
Add in repository Settings → Secrets and variables → Actions:
| Secret | Description |
|---|---|
STRAVA_CLIENT_ID |
Strava Client ID |
STRAVA_CLIENT_SECRET |
Strava Client Secret |
STRAVA_REFRESH_TOKEN |
Strava Refresh Token |
PAT |
Personal Access Token for push access |
- Auto sync: Daily at UTC 0:00 (Beijing 8:00)
Customize by editing cron in
.github/workflows/sync.yml:on: schedule: - cron: '0 0 * * *' # UTC time, format: min hour day month weekday
- Manual trigger: Actions → Sync Activities → Run workflow
- Data storage: SQLite database auto-committed to
data/activities.db
Inspired by yihong0618/running_page
MIT