OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻訳待ち
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.