OpenAthlete
AGPLv3 기반 지구력 훈련 플랫폼—EU 호스팅, 투명한 로직, 자체 호스팅·전체 내보내기 지원
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.