OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Weekly NFL confidence pool picks, results, and standings.
Translation pending
Sports & fitnessTypeScript · JavaScriptGitHub @sgrossman18OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.