OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻訳待ち
FairPlayr counts the minutes during the match, shows who has played least and suggests substitutions. The coach decides. Works offline.
翻訳待ち
スポーツ・フィットネスTypeScript · CSSGitHub @Schpauxオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
FairPlayr is a mobile-first matchday app for grassroots football coaches to manage lineups, substitutions, and fair playtime.
翻訳待ち
Loading the full README.
Read the full README ↗FairPlayr is a mobile-first matchday assistant for grassroots football. It is built for volunteer coaches, parent coaches, and team managers who need fast decisions on the sideline without digging through heavy admin tools.
The product focuses on practical matchday flow: squad selection, starting lineup, bench/field overview, substitutions, and fair playtime distribution. It is designed for quick use on a phone, with a modern UI, low friction navigation, and a clear in-match workflow.
Today, FairPlayr combines local matchday state (for speed and reliability during a game) with cloud-backed team and integration data (for persistence and collaboration). Norwegian and English are both first-class locales, and the app is web-first with a future app packaging direction.
FairPlayr is intentionally a sideline tool, not a full club ERP or elite analytics platform.
In youth and grassroots football, matchday decisions are often made under time pressure by volunteers. That leads to inconsistent substitutions, uneven playtime, and unnecessary cognitive load.
FairPlayr exists to make fair rotation and match organization easier in real time. The goal is simple: fewer spreadsheets, fewer ad hoc decisions, and more predictable fairness for players.
.
├─ src/
│ ├─ app/
│ │ ├─ [locale]/
│ │ │ ├─ page.tsx # Home
│ │ │ ├─ team/ # Team manager + Spond beta card
│ │ │ ├─ match/ # Match planner, setup, live, details
│ │ │ ├─ lineup/ # Dedicated lineup builder
│ │ │ ├─ settings/ # Theme/language/auth status
│ │ │ └─ auth/ # Sign-in, sign-up, callback
│ │ ├─ manifest.ts # PWA manifest (/manifest.webmanifest)
│ │ ├─ serwist/[path]/route.ts # Builds and serves the service worker (/serwist/sw.js)
│ │ └─ api/
│ │ ├─ matches/ # Match CRUD/read endpoints
│ │ └─ integrations/spond/ # Spond connect/sync/import endpoints
│ ├─ components/
│ │ ├─ match/
│ │ ├─ team/
│ │ ├─ lineup/
│ │ ├─ auth/
│ │ ├─ providers/
│ │ └─ ui/
│ ├─ sw/ # Service worker: routing rules, caches, update gate
│ ├─ domain/ # Match/live/team domain logic
│ ├─ i18n/ # next-intl routing and request config
│ └─ lib/
│ ├─ server/ # Server modules (matches, integrations)
│ ├─ supabase/ # Browser/server/middleware clients
│ ├─ teamData/ # Local vs cloud repository abstraction
│ └─ storage/ # Local storage state for match/runtime
├─ supabase/
│ ├─ config.toml
│ └─ migrations/
└─ messages/ # en.json / no.json translations
Implemented auth methods:
Key behavior:
This is the beginning of the README. Read the rest at the original. Read the full README ↗