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,即可验证所有权并自行管理介绍。
一分钟完成验证HFA for sports competititons
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A web app for running 1v1 NHL pick'em competitions with a friend. Each night
of the slate you take turns drafting which game's winner you're picking, with
a snake-style draft order that keeps things fair across the week or season.查看完整 README ↗A web app for running 1v1 NHL pick'em competitions with a friend. Each night of the slate you take turns drafting which game's winner you're picking, with a snake-style draft order that keeps things fair across the week or season.
This first version supports:
You'll need three free accounts:
If you already have the project folder ("Home Field Advantage"), open a terminal there:
cd "Home Field Advantage"
npm install
supabase/schema.sql from this project, paste its entire contents into the editor, and click Run.https://abcd1234.supabase.co)http://localhost:3000 for now. We'll change it to your Vercel URL after deploying.In the project folder, copy the example env file:
cp .env.example .env.local
Then open .env.local and fill in:
NEXT_PUBLIC_SUPABASE_URL=<your project URL from step 2.6>
NEXT_PUBLIC_SUPABASE_ANON_KEY=<your anon public key from step 2.6>
NEXT_PUBLIC_SITE_URL=http://localhost:3000
Then start the dev server:
npm run dev
Open http://localhost:3000 in your browser. Sign in with Google, create a competition, and copy the invite link to share with a friend.
.env.local. For NEXT_PUBLIC_SITE_URL, use your future Vercel URL — Vercel tells you what it'll be (something like https://home-field-advantage.vercel.app).https://your-app.vercel.app and https://your-app.vercel.app/auth/callback.)That's it. Send the URL to a friend, both of you sign in with Google, create a competition, and start picking.
For a competition longer than one day, on each night of the slate:
The logic lives in lib/picks.ts and is unit-tested in lib/picks.test.ts
(npm test runs them).
app/
page.tsx Landing + your competitions list
login/ Google sign-in page
auth/callback/ OAuth callback that swaps the code for a session
auth/signout/ Sign-out POST endpoint
competitions/new/ "Create a competition" form
competitions/[id]/ The competition room — pick UI
join/[token]/ Joining via shareable invite link
api/competitions/[id]/picks/ Server-validated pick submission
api/competitions/[id]/score/ Walks pending picks and scores them
lib/
picks.ts Snake-draft logic (the heart of the app)
picks.test.ts Unit tests for the draft logic
nhl.ts Public NHL API wrapper
supabase/client.ts Browser-side Supabase client
supabase/server.ts Server-side Supabase client
supabase/
schema.sql Database schema + RLS policies
middleware.ts Refreshes Supabase session cookies
npm test
This runs lib/picks.test.ts, which validates the draft order generator
against every edge case described in the spec.