| title: STRIDE — Local AI Running Coach | |
| emoji: 🏃 | |
| colorFrom: red | |
| colorTo: gray | |
| sdk: gradio | |
| sdk_version: 6.16.0 | |
| app_file: app.py | |
| python_version: "3.11" | |
| pinned: false | |
| short_description: AI running coach for your Strava data, with attitude. | |
| # 🏃 STRIDE — Local AI Running Coach | |
| Turn your running history into a personality-driven coaching report and chat. | |
| - **Deterministic engine** (Python) computes the metrics — weekly mileage, pace | |
| trends, ACWR training load, and signals — so the numbers are always correct. | |
| - **LLM coach** (served via Modal + vLLM) only *interprets* those numbers in a | |
| chosen persona; it never does the arithmetic or invents data. | |
| - **Gradio UI** with demo athletes, a stock-ticker mileage chart, and a chat to | |
| ask the coach follow-up questions. | |
| ## Configuration (Space secrets) | |
| Set these under **Settings → Variables and secrets**: | |
| | Secret | Purpose | | |
| |---|---| | |
| | `LLM_BASE_URL` | Modal vLLM endpoint, including `/v1` | | |
| | `LLM_MODEL` | model name the endpoint serves (must match exactly) | | |
| | `LLM_API_KEY` | shared key for the secured endpoint | | |
| | `STRAVA_CLIENT_ID` / `STRAVA_CLIENT_SECRET` / `STRAVA_REFRESH_TOKEN` | optional: default account for the "use my data" path | | |
| Demo data needs no secrets — only the four `LLM_*` values are required for the | |
| coach to respond. | |
| ## Run locally | |
| ```bash | |
| uv run python app.py | |
| ``` | |