OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Pick'em competitions with your friends.
Sports & fitnessTypeScript · PLpgSQLGitHub @ilovekimberlyOnlineOwner 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
HFA for sports competititons
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.