Put it on your phone
Do this before you sign in — it's what stops iPhone Safari quietly signing you back out.
- Open the site link in Safari. It has to be Safari — Chrome on iOS cannot install it. And if you tapped the link in WhatsApp, you are in its built-in browser: tap the share or ⋮ menu and choose Open in Safari first.
- Tap the Share button — the square with an arrow coming out of the top.
- Scroll down the list and tap Add to Home Screen.
- Tap Add. The icon appears with your other apps.
- Open it from that icon from now on, and sign in from inside it — the installed app keeps hold of your sign-in far better than a browser tab does.
- Open the site link in Chrome. If you tapped it in WhatsApp, tap the ⋮ menu and choose Open in Chrome first — the built-in browser cannot install apps.
- Either tap the Add to home screen button in the site's own toolbar, or use Chrome's ⋮ menu → Add to Home screen / Install app.
- Confirm. The icon appears in your app drawer.
- Open the link in Chrome or Edge.
- Click the install icon in the address bar — a small screen with a downward arrow, at the right-hand end. Or use the ⋮ menu → Cast, save and share → Install page as app.
- It opens in its own window and pins to your taskbar or dock.
On Safari for Mac: File → Add to Dock. A plain bookmark works fine on a computer too — the week-long expiry is an iPhone problem.
Signed in already and not installed? There's a banner offering to walk you through this any time — tap How on it.
Who does what
Everything else on this page makes more sense once these three are straight.
- League owner. Creates the league, creates each season (box count, format, points), rosters or delegates boxes, invites box admins and players, controls settings, and is the only one who can restore a cleared score or archive a season. There's always at least one; there can be more than one.
- Box admin. Runs one or more specific boxes: edits that box's player list, shares its player link, and can enter or approve scores in it at any time — they don't need the season to still be "open" the way a player does.
- Player. Claims their own name in a box (see Signing in) and from then on can submit their own match scores and confirm or reject scores an opponent has entered for them. Nothing else.
None of this needs a password, ever. Owners and box admins sign in with an emailed link; players sign in by tapping their name from a link posted in their box's WhatsApp group.
Signing in
Different for each role — none of it needs a password.
Owners and box admins
Tap sign in and enter your email. If that address has been made an owner or box admin, a one-time link arrives within seconds, valid for 15 minutes. No account exists until someone invites you this way — there's no self-serve sign-up for these roles.
Been invited but never got the email? Check spam, and check it's the exact address you were invited with — the league owner can see and resend from the People screen.
Players
Your box admin posts one link per box in the WhatsApp group — the same link all season. Tap it, tap your own name from the list, and you're in on that device. If you get signed out later, tap the same link again; it still works.
Opened the link inside WhatsApp's own browser? You'll see a warning — sign-ins made there often don't stick. Use the ⋮ menu to open it in Safari or Chrome first, then claim your name there.
Moving to a second device
Signed in already and need the same account on another phone or a laptop? Use Use on another device in the tools row — it copies a one-hour, one-time link. Open it on the new device within the hour and it signs that device in as you, no re-claiming needed.
Sessions otherwise last about six months before you'd need to sign in again the normal way.
Running the league (owners)
Everything here lives behind the League console button, owner-only.
Seasons
New season — name, start/end dates, how many boxes, a match format, and the points for a win / a loss with a set / a loss with none / an unplayed match (see Points & format). It starts as a draft — roster the boxes (yourself, or hand boxes to admins), then hit Go live. An archived season stays viewable forever; Reopen brings it back if you archived too early.
Roll over builds next season from this one's final standings, using the "promoted/relegated per box" numbers in Settings: the top few go up, the bottom few go down, everyone else stays. Box 1 only sends players down and the bottom box only sends them up.
It arrives as a plan, not a decision. Drag players between boxes or tap a name to move it, add anyone who has joined, and sit out anyone who is away. Before you commit it tells you what it noticed: matches still unplayed, someone going down who never played a match, and if two players finished level on points at the promotion cut, which tie-break separated them. Once you have moved somebody it stops re-proposing over your work, so changing the up/down numbers is an explicit Re-propose. The new season is created as a draft for you to check, then take live.
People
Invite owners, box admins (assigned to specific box numbers), or generate a player link for a box. Owner and box-admin invites can go by email (their address becomes their permanent sign-in from then on) or as a plain link if you'd rather hand it over yourself — a link-only admin invite has no self-recovery if they lose it, since there's no email attached.
From here you can also see who's claimed which player slot, sign out someone's devices without removing them, revoke anyone outright, and rotate a box's player link if it's leaked or the season's moved on (existing signed-in players are unaffected — only the link itself changes).
Members, History & Snapshot
Members is your master player list across every season — rename someone, or merge two entries if the same person was added twice under slightly different spellings (their whole history moves with the merge).
History shows every score ever entered in a box, including corrections and anything cleared — cleared scores are never really gone, and only the owner can Restore one.
Snapshot, in the tools row, downloads the entire league — every season, box, player and result — as one JSON file. Worth doing now and then as your own backup.
Enter a score
The bit that happens most often.
- Tap the cell where the two players cross on the sheet, or a row in Results to correct one already entered.
- Type the set scores, from the left-hand player's side — the initials above each column say which is which. How many sets you're asked for depends on this season's format (see Points & format).
- Extra boxes appear when needed. Enter a set as 7-6 and an optional tiebreak-loser's-points box appears. Split one set each in a two-set format and a championship tiebreak becomes required, because otherwise nobody's won.
- Check the panel at the bottom — it spells out who won and what each player gets before you save.
- Save score.
If it queries your score
An unusual score — 8-6, say — tints amber with a note. It does not stop you; save it anyway if that's genuinely what happened. The only things that actually block saving are a set tied at the same score, or a two-set format left at one set all with no championship tiebreak entered — in both cases there's truly no winner yet.
If a player enters it
A box admin's entry is final immediately. A player's own entry goes in as pending until their opponent confirms it — or it confirms itself automatically after a few days if nobody objects (the league owner sets how many, default 3). Either player can also correct an already-confirmed score themselves; the old score stands until the opponent confirms the change.
Read the tables
Several views of the same box.
The Sheet
Every pairing in the box at a glance. Each row reads from that player's side, so their wins are green and their defeats are red or amber. Every match shows up twice — once in each player's row — but it's one fixture underneath. A diagonal-striped cell awaiting confirmation, and the blocked-out diagonal is where a player would meet themselves.
- Green — won the match
- Amber — lost, but won a set
- Red — lost without winning a set
On a phone the grid scrolls sideways and the names stay pinned to the left edge.
Standings
Bonus set counts matches lost after winning a set. Ties are settled by head to head first, then set difference, then game difference. Pending scores don't count until confirmed. Games and Sets columns are hidden on a phone; tap a player's name for the detail, or turn a laptop on it. Copy as image renders the table as a picture, ready to paste straight into WhatsApp.
Still to play
Sorted by who owes the most matches. Tap a player to see exactly who they still have to play — tap one of their opponents and it opens the score form for that match directly. Usually the fastest way in: someone posts a result in the group, tap their name, tap their opponent, type the score.
Results
Newest-first log of every confirmed and pending score. Pending rows carry a Confirm/Reject pair right there for whoever's entitled to act on them — the opponent, or a box admin.
Points & format
Both are set per season by the owner — what's below is the usual default.
| Result | Points |
|---|---|
| Won the match | 3 |
| Lost the match but won a set | 2 |
| Lost without winning a set | 1 |
| Did not play the match | 0 |
The exact numbers for the season you're viewing are always spelled out in the Standings footer, since an owner can change them when creating a season.
Match formats on offer
- Two sets + championship tiebreak (the usual default) — split 1-1 and a 10-point tiebreak, won by two, settles it instead of a third set.
- Best of 3 full sets — split 1-1 and you actually play a third set.
- Best of 3, match tiebreak decider — plays the same as the first option (2 sets + a 10-point breaker); it's offered under its own name for leagues that prefer that label.
- Single set or pro set to 8 — one set (or one set to 8 games) settles it outright.
A recorded tiebreak set shows in proper notation, e.g. 7-6(5).
Trying the live demo
If you landed here from the demo site, this is the section for you.
The demo is a public, shared sandbox league — real functionality, fake data, no setup. A banner across the top offers Try as owner, Try as box admin, and Try as player: tap any of them and you're signed in as that pre-made person, immediately, with no email and nothing to type. Switch role replaces those buttons once you're signed in, so you can hop between perspectives.
- It's genuinely writable — add players, enter scores, approve them, poke around every admin screen described on this page.
- It's shared: everyone trying the demo right now is looking at and editing the same league, like a whiteboard.
- It resets itself every day — nothing you do there is meant to last, so don't use it for anything real.
Convinced? Deploying your own real, private league takes about the same infrastructure as the demo, just pointed at your own database — see the project's README for that.
The solo tracker
A separate, much simpler mode — one box, no server, no logins.
Just track one box on this device, on the site's start screen, opens it. It's the original single-box tracker: type in your players, it builds every fixture for you, and you score matches the same way described above — but there's no owner, no invites, and nothing to sign in to.