OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A daily-discipline, mental-toughness, and Christian faith app for athletes ages 13 and up (calibrated for 13-25) — live for hockey, basketball, golf, football, baseball, lacrosse, and soccer. Parents buy for athletes under 18; adults 18+ can own their own account (self-serve, flag-gated — not yet enabled in production). Identity precedes performance: we operate from Christ's victory, not toward it (Hebrews 12:1-2).
See CLAUDE.md for full mission, scope, and non-negotiable constraints (minor data protection, journal safety, content voice).檢視完整 README ↗A daily-discipline, mental-toughness, and Christian faith app for athletes ages 13 and up (calibrated for 13-25) — live for hockey, basketball, golf, football, baseball, lacrosse, and soccer. Parents buy for athletes under 18; adults 18+ can own their own account (self-serve, flag-gated — not yet enabled in production). Identity precedes performance: we operate from Christ's victory, not toward it (Hebrews 12:1-2).
See CLAUDE.md for full mission, scope, and non-negotiable constraints (minor data protection, journal safety, content voice).
apps/native are an additive App Store / Play path around the same web app — scaffolding only; store listings are not live. See docs/native-capacitor.md.main)from-victory/
├── apps/web/ # Next.js app (Vercel)
├── apps/native/ # Capacitor Android + iOS shell (store distribution)
├── supabase/ # Migrations
└── .github/ # CI gates (build, typecheck, lint, audio-cache-bust, privacy-verdict)
.nvmrc)audio:* and scripts:* tooling,
which executes .ts files directly via node --experimental-strip-types
(added in Node 22.6). The deployed app and CI still run on Node 20+; this
requirement applies to local audio generation / script export only.git clone <repo-url> from-victory
cd from-victory
nvm use # optional, picks up .nvmrc
npm install
cp apps/web/.env.example apps/web/.env.local
# Edit .env.local and fill in Supabase + Stripe values (see comments in the file).
Start the local Supabase stack (Supabase CLI required):
supabase start # starts local Postgres, Auth, Studio
supabase db push # apply all migrations
supabase gen types typescript --local > apps/web/lib/supabase/database.types.ts
Production migrations are applied automatically: merging a PR that touches
supabase/migrations/** triggers the db-migrate workflow, which runs
supabase db push against the linked project (FV-259 — closes the
code-ahead-of-schema gap that caused the 2026-06-12 login outage). It needs the
SUPABASE_ACCESS_TOKEN and SUPABASE_DB_PASSWORD repo secrets; if they are
missing the job fails loudly and the push must be run manually. Regenerating
types (supabase gen types --linked) remains a manual follow-up.
A daily drift detector backstops both halves of the deploy (FV-188 —
infra-drift workflow, scheduled + workflow_dispatch). It is strictly
read-only — it never applies migrations or changes secrets — and emails KC
through the existing Resend alert channel (ALERT_EMAIL_TO) when it finds a gap:
(1) any local supabase/migrations/** file missing on the linked project, or
(2) any required env var from apps/web/.env.example absent in the GitHub
production environment. The env check reports by name only and never reads,
logs, or emails a value. Mark a var optional with a # fv-env-check: optional
comment above it in .env.example. Required secrets/config for the job are
documented at the top of .github/workflows/infra-drift.yml. The two checks run
locally too:
# from apps/web/
node --experimental-strip-types scripts/check-env-presence.ts --no-alert
supabase migration list --linked \
| node --experimental-strip-types scripts/check-migration-drift.ts \
--migrations-dir ../../supabase/migrations
For local Stripe webhook testing (Stripe CLI required):
stripe listen --forward-to localhost:3000/api/webhooks/stripe
# Copy the printed whsec_... value into STRIPE_WEBHOOK_SECRET in .env.local
For end-to-end tests:
cp apps/web/.env.test.example apps/web/.env.test
# Fill in the test credentials before running npm run test:e2e
Run from the repo root:
| Command | What it does |
|---|---|
npm run dev | Start the Next.js dev server on :3000 |
npm run build | Production build of the web app |
npm run typecheck | Run tsc --noEmit against apps/web |
npm run lint | Run next lint |
npm test | Run tests across workspaces (when present) |
The web app stays on Vercel. apps/native wraps the hosted production URL
in a Capacitor WebView for Play / App Store distribution. It does not replace
the PWA and must not add tracking SDKs.
cd apps/native
npx cap sync
npm run build:android:debug # needs Android SDK; see docs/native-capacitor.md
# iOS archive requires macOS + Xcode — see docs/ios-app-store-release.md
Application / bundle id is locked: com.fromvictoryapp.app (Play Console).
Play enrollment, signing, Internal testing, and Data safety:
docs/android-play-release.md. iOS / App Store
(TestFlight-first; enrollment not started):
docs/ios-app-store-release.md. Architecture +
privacy rules: docs/native-capacitor.md.
These are non-negotiable. See CLAUDE.md for the full version.
main directly. Branch off with feature/<name> or hotfix/<name>.feat:, fix:, chore:, test:, docs:.privacy-verdict status check.This product serves minors (13-17). Journal entries are athlete-only readable, enforced at the database level via Supabase RLS. The parent dashboard reads metadata only. No third-party analytics or ad SDKs on minor accounts, ever (California AADC / GDPR-K compliance floor). Every PR touching user data, auth, journal, migrations, or third-party SDKs is reviewed by the kids-privacy-officer subagent; the privacy-verdict required CI check enforces an explicit VERDICT: APPROVED before merge.
If you're contributing: read the relevant sections of CLAUDE.md before opening a PR.