OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Competition tracker for climbing gyms. Log every send on numbered routes in your gym's active set, climb the Chorkboard, and compete with your friends.
Sports & fitnessTypeScript · PLpgSQLGitHub @tmhnslyOnlineOwner 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.
Multi-gym bouldering competition tracker PWA. Climbers log attempts
on numbered routes within a gym's active competition set, earn points
on a public gym leaderboard ("Chorkboard"), and compete inside
private groups called crews.
Live at https://chork.vercel.app (once a domain lands, this'll update).
• Next.js 15 App Router (Turbopack)
• Supabase (Auth, Postgres, RLS, RPCs, pg_cron)
• SCSS modules + a design-token system
• TypeScript strict, Vitest for tests
Open http://localhost:3000.
If you're linked to a Supabase project:Read the full README ↗Multi-gym bouldering competition tracker PWA. Climbers log attempts on numbered routes within a gym's active competition set, earn points on a public gym leaderboard ("Chorkboard"), and compete inside private groups called crews.
Live at https://chork.app.
pg_cron)pnpm install
cp .env.example .env.local # fill in Supabase URL + keys
pnpm dev
Open http://localhost:3000.
If you're linked to a Supabase project:
pnpm exec supabase db push # apply pending migrations
pnpm exec supabase gen types typescript \
--project-id <id> > src/lib/database.types.ts # regenerate types
| Command | Purpose |
|---|---|
pnpm dev | Dev server |
pnpm build | Production build (CI equivalent) |
pnpm test --run | Vitest one-shot |
pnpm test | Vitest watch mode |
pnpm next lint | Next.js lint (CI-blocking) |
pnpm storybook | Storybook on :6006 |
All docs live in docs/:
CLAUDE.md — orientation for contributors (and
the Claude agent that works on this codebase). Start heredocs/architecture.md — auth flow,
data access layer, multi-tenancy, crew model, push pipelinedocs/schema.md — Supabase tables, RPC
catalogue, RLS summarydocs/migrations.md — one-line-per-file
migration history (001 → current)docs/testing.md — test patterns,
mocking strategy, what to test vs skipdocs/db-audit.md — DB hardening
findings from the last audit passdocs/roadmap.md — shipped / next / plannedsrc/
├── app/ # Next.js App Router
│ ├── (app)/ # Authenticated climber routes
│ ├── admin/ # Gym admin + organiser surface
│ ├── auth/ # Supabase callback
│ ├── competitions/ # Climber-facing comp pages
│ ├── crew/ # Crew tab
│ ├── leaderboard/ # Chorkboard
│ ├── login/
│ ├── onboarding/
│ ├── privacy/
│ ├── profile/
│ ├── u/[username]/
│ ├── layout.tsx
│ └── page.tsx # Wall / landing
├── components/ # React components (Storybook sits next door)
├── lib/
│ ├── auth.ts # requireAuth / requireSignedIn / requireGymAdmin
│ ├── auth-context.tsx
│ ├── data/ # Queries, mutations, pure logic
│ ├── offline/ # IndexedDB mutation queue
│ ├── push/ # web-push server + client helpers
│ └── supabase/ # Browser + server + middleware clients
├── middleware.ts
├── styles/ # Design tokens + mixins
└── test/ # Mock factories shared by tests + stories
supabase/migrations/ # 001_initial_schema.sql → current
Vercel. Push to main → auto-deploys. Preview deploys on PRs.
Before shipping migrations, always:
pnpm test --run greenpnpm next lint cleanpnpm build succeeds locallypnpm exec supabase db push applied (production DB is the source
of truth — we don't maintain multiple environments)