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 weekly NFL confidence pool: an admin picks ~5 games a week, everyone ranks
their confidence in each pick (1-5, each value used once), and points equal
the confidence value for every correct pick. Season standings drop each
player's 3 lowest weeks.
Replaces the old Google Form + manual spreadsheet workflow — picks, grading,
and standings all happen automatically.查看完整 README ↗A weekly NFL confidence pool: an admin picks ~5 games a week, everyone ranks their confidence in each pick (1-5, each value used once), and points equal the confidence value for every correct pick. Season standings drop each player's 3 lowest weeks.
Replaces the old Google Form + manual spreadsheet workflow — picks, grading, and standings all happen automatically.
See DEPLOY.md for how to put this online.
npm install
cp .env.example .env # already done if you're reading this in the repo
npx prisma migrate dev # creates prisma/dev.db
npm run dev
Open http://localhost:3000. Sign-in emails aren't actually sent in dev —
the magic link is printed to the terminal running npm run dev; copy it
into your browser.
The first person to sign in whose email is listed in ADMIN_EMAILS (in
.env) is automatically made an admin.
prisma/schema.prisma — data model (Users, Players, Seasons, Weeks,
Games, Picks, LockOverrides).src/lib/scoring.ts — all the grading/standings math, pure functions,
no I/O. This is the file to read to understand the rules precisely.src/lib/locking.ts — pick-lock and admin-exception logic.src/lib/espn.ts / src/lib/sync-scores.ts — pulls live scores and
writes them onto Game rows. Runs opportunistically whenever someone
loads Results/Standings, plus a Vercel Cron backstop
(vercel.json → /api/cron/sync-scores).src/lib/timezone.ts — Eastern-time conversion for kickoff entry/display.
Deliberately avoids the common "round-trip through toLocaleString" trick,
which breaks depending on the server process's own timezone.src/app/picks, src/app/results, src/app/standings — participant
pages.src/app/admin — admin dashboard, week/game editor, participant list.Deferred by design (regular season only for now). When you get there:
Game.status/scores already work the same way; you'd mainly need a
seasontype=3 variant of the ESPN fetch in sync-scores.ts and a decision
on how confidence values work for a shrinking bracket.