A personal dashboard to visualize steps and walking progress as a virtual journey across the United States via I-90 from Seattle to Boston (2,850 miles).
- Virtual Cross-Country Journey: Track your real-world steps as progress along I-90
- Interactive Map: Leaflet-powered map showing your current position and route waypoints
- Daily Steps Chart: Visualize step counts with goal tracking (15,000 steps/day) and date range filters
- Statistics Dashboard: Total distance, steps, days tracked, and crossing count
- Yearly Detail View: Browse daily step data in a sortable table
- Dark Mode: System-aware theme with manual toggle
- iOS Shortcut Integration: Push daily steps from Apple Health via iOS Shortcuts
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, Tailwind CSS |
| Backend | FastAPI (Python 3.11+) |
| Database | MySQL 8 |
| Mapping | Leaflet + React-Leaflet |
| Charts | Recharts |
| Deployment | Docker Compose |
Apple Health → iOS Shortcut → POST /api/steps → MySQL → Dashboard
Steps are converted to miles at a rate of 2,000 steps = 1 mile. Daily goal is 15,000 steps.
git clone https://github.com/mbuckingham74/walks-app.git
cd walks-app
cp .env.example .env
# Edit .env with your credentialscd docker
docker compose up -d --buildThe frontend runs on port 3080 by default. Configure your reverse proxy (nginx, Traefik, etc.) to route traffic.
Backend:
cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadFrontend:
cd frontend
npm install
npm run dev| Variable | Description |
|---|---|
MYSQL_HOST |
Database hostname |
MYSQL_PORT |
Database port (default: 3306) |
MYSQL_USER |
Database user |
MYSQL_PASSWORD |
Database password |
MYSQL_DATABASE |
Database name |
MYSQL_ROOT_PASSWORD |
Root password for initial setup |
CORS_ORIGINS |
Allowed origins for API |
See .env.example for a complete template.
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/steps |
Upsert daily steps (for iOS Shortcut) |
GET |
/api/stats |
Dashboard statistics for a year |
GET |
/api/steps |
Daily steps data with date range |
GET |
/api/route |
I-90 waypoints for map rendering |
GET |
/api/config |
Public configuration (steps_per_mile, daily_goal) |
GET |
/api/health |
Health check |
Create an iOS Shortcut that:
- Gets today's step count from Health
- Sends a POST request to your API:
POST https://your-domain.com/api/steps
Content-Type: application/json
X-API-Key: your_api_key_here
{
"date": "2025-12-13",
"steps": 8500
}
Run the shortcut daily (manually or via automation) to sync your steps.
The I-90 route includes 34 waypoints across 11 states:
Washington: Seattle → Ellensburg → Spokane Idaho: Coeur d'Alene Montana: Missoula → Butte → Bozeman → Billings Wyoming: Sheridan → Gillette South Dakota: Rapid City → Wall → Chamberlain → Mitchell → Sioux Falls Minnesota: Worthington → Albert Lea → Rochester Wisconsin: La Crosse → Madison Illinois: Rockford → Chicago Indiana: Gary → South Bend Ohio: Toledo → Cleveland Pennsylvania: Erie New York: Buffalo → Rochester → Syracuse → Utica → Albany Massachusetts: Springfield → Boston
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ walks-frontend │────▶│ walks-api │────▶│ walks-mysql │
│ (React/Nginx) │ │ (FastAPI) │ │ (MySQL 8) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
▼
npm_network (nginx proxy manager)
MIT