OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Get personalized weekly training and nutrition plans that adapt to your progress
AI summary · website content
Sports & fitnessHTML · JavaScriptGitHub @Geronimo91-codeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Weekly training plans built from your profile, logged in the app, rebuilt every week. Single-file PWA on Vercel, Firebase Auth + Firestore, OpenRouter for plan generation.
index.html — the whole app (auth, onboarding, views)sw.js, manifest.json, icon.svg — PWAapi/_lib.js — Firebase Admin, token check, OpenRouter callapi/generate-plan.js — POST, builds a weekly plan from the profileapi/weekly-review.js — POST, closes a week: review + next week's plan from the logsapi/weekly-close.js — Monday cron, auto-closes last week for users who logged sessionsapi/estimate-meal.js — POST, macro estimate from a meal descriptionapi/calendar.js — GET, per-user iCal feed (token in the URL)api/delete-account.js — POST, erases the user's data and auth accountapi/daily-notify.js — daily cron, sends today's session by Web Pushfirestore.rules — each user can only read/write users/{uid}/**vercel.json — crons: daily notify 06:00 UTC, weekly close Monday 04:00 UTC (Hobby fires within the hour)firestore.rules in the Rules tab and publish.FIREBASE_CONFIG in index.html.npx web-push generate-vapid-keys. Put the public key in VAPID_PUBLIC_KEY in index.html and both keys in Vercel env..env.example. CRON_SECRET is sent automatically by Vercel cron as a Bearer token when set.users/{uid} profile, email, createdAt
users/{uid}/plans/{weekId} generated weekly plan
users/{uid}/logs/{id} session logs (step 3)
users/{uid}/reviews/{wk} weekly feedback (step 4)
users/{uid}/nutrition/{d} targets + meals (step 5)
users/{uid}/weights/{id} weight history
users/{uid}/push/main Web Push subscription + timezone
usage/{uid} server-only daily API counters (not readable by clients)
clubs/{clubId} name, sport, inviteCode, createdBy
clubs/{clubId}/members/{uid} role (coach|member), name, hidden
clubs/{clubId}/activity/{id} finished sessions for feed + leaderboard
clubs/{clubId}/notes/{uid} coach note fed into the member's next review
.github/workflows/smoke.yml runs a headless Chromium against the live site after every push. Add these repository secrets (GitHub → Settings → Secrets and variables → Actions):
CADENCE_URL — e.g. https://cadence-xi-one.vercel.appCADENCE_TEST_EMAIL / CADENCE_TEST_PASSWORD — an email/password account created in Firebase → Authentication → Users → Add user
Tests: API routes and auth, sign-in and tab navigation, Today fits one screen, the session view, nutrition/log/club screens and the language switch, and the per-day preference editor. Two heavier tests run only on manual dispatch with the generate input: full plan generation and layout measurement. Results are published to the test-results branch as JSON.