No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Personal sports results tracker. Each competition has its own Google Sheet, which holds the data. A web app is used for entry, ladders and stats.
| Path | What it is |
|---|---|
apps/hub/index.html | Home page listing every competition (on now, coming up, finished). New competitions are added to its COMPS list. |
apps/team-match/index.html | App source for team-v-team competitions (pilot: A-League Men 2026/27). Published as a private claude.ai artifact. |
apps/tournament/index.html | App source for pool-and-knockout tournaments (Rugby League World Cup 2026, men's and women's). Published as a private claude.ai artifact. |
index.html, a-league/, world-cup/ | GitHub Pages copies, built by python3 tools/build_pages.py. Don't edit them directly. Outside claude.ai the apps sign in to Google with your OAuth Client ID. |
docs/START-HERE.md, docs/handoff-*.md | The map for new sessions, and what each competition's last session knew. |
manifest.webmanifest, */manifest.webmanifest, icons/ | Let a phone save the hub, or any single app, to its home screen. |
main is the live site (GitHub Pages publishes from it). Work happens on a separate branch and reaches main through a pull request, so the site on your phone only changes when a pull request is merged.
Planned shapes: team-match (football, rugby league, AFL, NFL…), race (F1 and other motorsport), cricket (limited overs and WTC). A new competition in an existing shape needs a sheet with the tabs below and its own App Settings, not new code.
Matches: one row per game. id | season | round | stage | date | kickoff | home | away | homeGoals | awayGoals | homeReds | awayReds | venue | attendance | extraTime | homePens | awayPens | notes | updatedAt | playedRound | status | homeHT | awayHT | homeScorers | awayScorers. stage is Regular, EF, SF1, SF2 or GF. id (M0001…) is permanent and matches the official match number; never renumber it. round is the matchday a game belongs to; playedRound is filled in only when a game is moved, with the round it is played alongside (the app shows it under both). homeHT/awayHT are half-time goals. homeScorers/awayScorers hold the goal scorers as one line of text, e.g. B. Borrello 43'; L. Gillion 45+2'; N. Milanović 50' (pen): paste them one per line into the Details box on a match card (names with or without minutes; (pen) and (OG) are understood; an own goal is listed under the team it counted for). Players are matched by name (accents ignored, full names and initials treated alike), so there is no player list.status = Postponed holds a game on its matchday with no valid date (the old date stays in date, and notes records it). The app lists these in a "Waiting for a new date" tray; setting the new date clears the status and suggests playedRound from the dates of the other rounds' games.Teams: code | name | short | colour1 | colour2 | homeVenue | active.Venues: venue | city.App Settings: key | value — points per result, tiebreak order, rounds, finals teams and format, season.2018/19…2026/27) are the original hand-built ladders; the app only reads them (History tab).updatedAt.'. Nothing is ever deleted or rewritten in bulk.node tests/run.js loads the app with a stubbed window.claude and an in-memory sheet, pastes a round of fixtures, saves results, and checks the writes, ladder, tabs and phone layout. Needs Playwright (Chromium at /opt/pw-browsers/chromium). Screenshots and the generated page land in tests/ and are git-ignored.
apps/race/index.html is the app source; formula-e/index.html is the GitHub Pages copy. The sheet id is not in the code: the app asks for the sheet link on first use and keeps it in the browser (race_settings). Everything competition-specific (points, bonuses, team and manufacturer rules) comes from the sheet, so F1 can reuse the app with its own sheet.
Sheet: the Formula E tracker. The original season tabs (14/15 … 27) and Records are left as they are; the app does not touch them.
This is the beginning of the README. Read the rest at the original. Read the full README ↗