A family running activity tracker web application that allows you to upload GPX/TCX files, track multiple runners, visualize routes on maps, generate heatmaps, and view dashboard statistics.
- Runner Management: Create and manage multiple runners
- Activity Upload: Upload GPX/TCX files with automatic parsing of distance, duration, pace, and elevation
- Activity Tracking: View all activities with detailed metrics
- Interactive Maps: Visualize running routes on OpenStreetMap
- Heatmap: See all running routes overlaid on a single map
- Dashboard: View statistics including:
- Activity counts (last week, month, year)
- Total distances
- Top runners by mileage
- Activity calendar with 4-week view
- Filtering: Filter activities and stats by specific runners
- Node.js + Express
- TypeScript
- SQLite (better-sqlite3)
- Multer (file uploads)
- GPX/TCX parsing
- React + TypeScript
- Vite
- React Router
- Leaflet.js (maps)
- Recharts (optional for future charts)
- Docker + Docker Compose
- Nginx (frontend)
- Docker and Docker Compose installed
- OR Node.js 22+ (for local development)
- Clone the repository:
cd RunTracker- Start the application:
docker-compose up -d- Access the application:
- Frontend: http://localhost:8080
- Backend API: http://localhost:3000
- Stop the application:
docker-compose down- Navigate to backend directory:
cd backend- Install dependencies:
npm install- Create a
.envfile (copy from.env.example):
cp .env.example .env- Start the development server:
npm run devThe backend will run on http://localhost:3000
- Navigate to frontend directory:
cd frontend- Install dependencies:
npm install- Start the development server:
npm run devThe frontend will run on http://localhost:5173
- Navigate to the "Runners" page
- Fill in the username and display name
- Click "Add Runner"
- Navigate to the "Upload Activity" page
- Enter an activity title
- Select a GPX or TCX file
- Select one or more runners who participated
- Click "Upload Activity"
- Navigate to the "Activities" page
- Click on any activity to view details
- Use the runner filter to show activities for specific runners
- Navigate to the "Heatmap" page
- See all routes overlaid on a single map
- Use the runner filter to show routes for specific runners
- Navigate to the "Dashboard" page (or home)
- View recent activities, statistics, and calendar
- Use the runner filter for personalized stats
The application supports uploading GPX/TCX files up to 20MB in size. This limit is configured in:
- Nginx:
client_max_body_size 20M - Backend: Multer file size limit of 20MB
- Express: Body parser limit of 20MB
If you need to upload larger files, adjust these settings:
frontend/nginx.conf- Increaseclient_max_body_sizebackend/src/middleware/upload.ts- IncreasefileSizelimitbackend/src/index.ts- Increaselimitin express.json() and express.urlencoded()- Rebuild Docker containers:
docker-compose up --build
To backup your data, simply copy the ./data directory:
cp -r data data-backup-$(date +%Y%m%d)To restore, replace the ./data directory with your backup.
Run TypeScript compiler in watch mode:
npm run devBuild for production:
npm run build
npm startStart development server with hot reload:
npm run devBuild for production:
npm run build
npm run previewThis is a personal/family project, but feel free to fork and customize for your needs!
MIT
For issues or questions, please open an issue on GitHub.