Deploying a Demo
There are two ways to run a public demo of Athlete Vault:
| GitHub Pages (static) | Render + Neon | |
|---|---|---|
| Setup time | 0 min — automatic CI | ~10 min |
| Cold start | None — instant load | ~30s (free tier) |
| Real data | No — pre-baked demo dataset | Yes — your own activities |
| Backend required | No | Yes |
| Cost | Free | Free (with limits) |
Option A — Static GitHub Pages Demo (instant, no backend)
If you fork the repo, the included Deploy Demo GitHub Actions workflow automatically builds a read-only static demo and deploys it to https://<your-username>.github.io/athlete-vault/demo on every push to main.
The demo uses Mock Service Worker to intercept API requests in the browser and serve a pre-generated dataset of 30 SF Bay Area activities. No server, no database, no cold start.
To enable it:
- Fork the repository on GitHub
- Go to your fork → Settings → Pages → set source to GitHub Actions
- Push any change to
main— theDeploy Demoworkflow fires automatically - Your demo will be live at
https://<username>.github.io/athlete-vault/demo
Option B — Live Demo with your own data (Render + Neon)
This guide sets up a free public demo using Render (free web service) and Neon (free serverless Postgres). The setup takes about 10 minutes.
The deployment uses public mode (APP_PUBLIC_MODE=true): anyone can view your activities, heatmap, fitness charts, and records without logging in. Only you — the owner — can add data, sync sources, or change settings, by logging in with your password.
Free tier behaviour
Render's free web service sleeps after 15 minutes of inactivity. Visitors see a ~30-second cold start on the first request. This is fine for a demo — paid plans remove the sleep.
No persistent file storage
Render's free tier has no persistent disk. Uploaded FIT/GPX files are stored in /tmp and lost on each redeploy. All activity metadata lives in Neon Postgres and persists across restarts. For a demo, load data once via Strava sync or file upload and avoid redeploying unless necessary.
B1. Create a Neon database
- Sign up at neon.tech — free, no credit card
- Create a new project (any name, e.g.
athlete-vault-demo) - On the dashboard, copy the Connection string — it looks like:
- Keep this string — you'll paste it into Render in step 2
B2. Deploy to Render
- Sign up at render.com — free, no credit card for web services
- Click New → Blueprint and connect your GitHub account
- Select the
athlete-vaultrepository — Render will detectrender.yamlautomatically - In the Environment Variables panel, fill in
DATABASE_URLwith the Neon connection string from step 1 - Click Apply — Render builds the Docker image and runs migrations on first boot
Your demo will be live at https://athlete-vault-XXXX.onrender.com within a few minutes.
B3. Set BASE_URL (for Strava OAuth)
If you want Strava OAuth to work in the demo, add one more environment variable in the Render dashboard:
| Key | Value |
|---|---|
BASE_URL |
https://your-app-name.onrender.com |
Then update the Authorization Callback Domain in your Strava API app settings to match.
B4. Set your owner password
Public mode requires a password so visitors can't accidentally (or intentionally) modify your data.
- Open your Render URL once the service is up
- Click Owner login at the bottom of the sidebar
- No password is set yet — go to Settings → Password protection, enable it, and set a password
- From now on, the Owner login button in the sidebar lets you authenticate to manage data
B5. Load some data
Once the demo is up, load sample activities so visitors see a populated app:
- File upload: drag
.fitor.gpxfiles onto the Upload page - Strava sync: Settings → Strava credentials → Sources → Connect Strava → Sync now
- Watched folder: not available on Render (no local filesystem access from the browser)
Updating the demo
Render automatically redeploys when you push to main. Migrations run on every boot so schema changes are applied automatically.
To redeploy manually: Render dashboard → your service → Manual Deploy → Deploy latest commit.