Install
openclaw skills install @voronindenis5/rec-league-schedulerUse when you run (or coach in) a recreational sports league, club ladder, or weekly game group of 4-32 players and the schedule has become the job — who plays whom, who sits out, who's subbing for whom, is it fair. Round-robin fixture generation (single or double, bye handling for odd counts), absentee-aware rotation (the absent don't consume court time), fair-play audit (games and byes per player within ±1), player availability registry with match-day call-ups, standings table with head-to-head tiebreakers, and a printable match-day sheet. Replaces the spreadsheet-and-group-chat chaos that kills volunteer-run leagues.
openclaw skills install @voronindenis5/rec-league-schedulerVolunteer-run rec leagues — badminton club, squash ladder, padel group, chess club, football 7s, curling, darts league — all die the same death: the schedule becomes a second job for one unpaid person, and the group chat becomes the database. Typical symptoms:
This skill is the volunteer's scheduling brain:
fixtures seeds groups), leagues needing external
governing-body rule compliance, or scheduling across many teams with
venues/referees (that's full league-management software territory).player add "Alex" — build the roster (skill level 1-5 optional, used
only for balanced court assignment notes).fixtures --courts 3 --double — circle-method round-robin: each round
lists courts and the bye; --double plays home-and-away.absent "Sam" --date 2026-10-03 — registry of who's out when.night --date 2026-10-03 --present 9 --courts 3 — tonight's actual
rotation: present players re-flowed into courts, byes to the players with
the fewest so far; prints the match-day sheet.result "Alex" 21 15 "Sam" — record scores; standings builds the
table (points, diff, head-to-head).audit — the fairness report: games and byes per player (±1 target),
pair coverage matrix summary.# Roster
python3 scripts/league.py player add "Alex" --level 4
python3 scripts/league.py player add "Sam" --level 3
python3 scripts/league.py player add "Kim" --level 4
python3 scripts/league.py player add "Jo" --level 2
python3 scripts/league.py player add "Mel" --level 3
# Full season fixture list (5 players → bye each round)
python3 scripts/league.py fixtures --courts 2
# Round 1: [Alex vs Mel] court1, [Sam vs Kim] court2, bye: Jo ...
# Match night with real attendance
python3 scripts/league.py absent "Sam" --date 2026-10-03
python3 scripts/league.py night --date 2026-10-03 --present 4 --courts 2
# Results & standings
python3 scripts/league.py result "Alex" 21 15 "Mel"
python3 scripts/league.py result "Sam" 21 19 "Kim"
python3 scripts/league.py standings
# Fairness check
python3 scripts/league.py audit
State: league.json in cwd (or --db). Local, exportable, no accounts.
fixtures implements)N players in a circle; fix player 1, rotate the rest; each rotation yields N/2 pairings (or (N-1)/2 + a bye when odd). After N-1 rotations every pair has met exactly once. It's the same construction used in professional league scheduling — minimal rounds, perfect coverage, zero repeats.
audit enforces)| Metric | Target | Why |
|---|---|---|
| Games per player | within ±1 of mean | court time is the product |
| Byes per player | within ±1 of mean | nobody is perpetually benched |
| Pair meetings | 0 or 1 in single round-robin | variety beats rivalry |
| Consecutive byes | never 2 in a row | the unforgivable sin |
night re-flows who actually came; byes go to the least-benched.fixtures circle method: N-1 rounds (N even), N rounds (N odd), each pair exactly once (--double twice)night excludes absent players, fills courts from present, assigns byes by fewest-byesstandings sorts by points → game difference → head-to-headaudit flags games/bye spread >1 and duplicate pair meetingsreferences/round-robin-math.md — circle method proof sketch, bye
distribution for odd N, rotation re-flow algorithm, standings tiebreaker order