Help
On this page
Quick Start
Get up and running in a few minutes. You’ll need at least 4 players to start.
- Go to Players & Rankings and add some players.
- Head to Sessions and create a new session.
- Mark who’s playing and set the number of courts.
- Tap “Generate Round” to create balanced pairings.
- Record results by tapping “Record Result” on any pairing.
- Watch player ratings update after every match.
Dashboard
The home page shows stat cards for total players, sessions, matches, and the top-ranked player. Click any card to jump to that section. Below the stats you’ll find the top 3 players by rating and the 5 most recent matches across all sessions.
Players & Rankings
The Rankings page is where you manage your roster. Type a name into the text field and click “Add.” If you want to set custom initial skill values, expand the advanced section to set mu (default 25.0) and sigma (default 8.33).
The rankings table shows every player with their mu, sigma, 95% confidence interval, games played, wins, losses, win rate, and last played date. Click any column header to sort. Use the search bar to find a player by name, or expand the filters to narrow by games, mu, or sigma. Active filters appear as removable badges below the search bar.
Click a player’s name to view their profile. The profile page shows a rating card with their stats, a Gaussian curve comparing their skill distribution to the league average, and a full match history with W/L indicators for every game. You can rename the player using the pencil icon (ratings and history are preserved) or delete them entirely, which removes all their match records.
Sessions
Sessions group matches into a single play session. Create one from the Dashboard or the Sessions page using the “New Session” button. If the most recent session has no matches yet, you’ll be asked whether to replace it or keep it and create another. Sessions are numbered sequentially.
Attendance
On the session page, use the attendance grid to mark who’s playing. The “All” and “Clear” buttons select or deselect everyone. Choose the number of courts from the dropdown (1–3). You need at least 4 players per court to generate a round. Changing attendance or court count resets any unsaved generated rounds.
Generating Rounds
Tap “Generate Round” from the floating action button to create optimal pairings. Each generated round shows court assignments, team compositions, and a win probability bar for each match. From a pairing you can tap “Record Result” to enter the score directly. You can generate multiple rounds before recording any results.
Schedule Weights
Under “Advanced” in the attendance section, four sliders control what the scheduler prioritises: Balance, Fairness, Diversity, and Information. Changes apply immediately to future rounds. See the Schedule Generation section for details on each objective.
Managing Matches
The “Played” section lists all recorded matches in the session. Use the up and down arrows to reorder them. Click a match to view details, edit teams, or delete it.
Matches
Recording a Match
You can record a match from the floating action button on the Dashboard or Matches page, from the “Record Result” button on a generated pairing, or directly via the Record Match page.
How Recording Works
Tap a slot (Team A or B, player 1 or 2), then tap a player from the grid to assign them. All 4 slots must be filled and all 4 players must be unique. Set the score using the increment and decrement buttons. Draws are not supported — one team must have a higher score, up to a maximum of 15. Click “Record Match” to save and ratings update immediately.
Match History
The Matches page lists every recorded match across all sessions with the session number, game number, team compositions, and scores. The winning score is highlighted. Click any row to view the full match details.
Editing and Deleting Matches
From the match detail page you can edit the teams and score, or delete the match entirely. Deleting a match recalculates all affected ratings.
Rating System
Player ratings use the TrueSkill model via openskill. Each player is represented by two values:
Skill Rating ()
Estimated skill level. Starts at . Updated after each match:
Uncertainty ()
How uncertain we are about . Starts at . Decreases with each game:
95% Confidence Interval
True skill is 95% likely to be within . Players with overlapping intervals may be closer than raw suggests. The Gaussian curve on each player’s profile visualises this distribution.
Match Prediction
Before each match, the system predicts the outcome using the Bradley-Terry model. The probability that Team A beats Team B is:
where is the standard normal CDF, and is the team’s effective rating (average of both teammates). A probability near 50% means a well-balanced match.
Schedule Generation
The scheduler finds the best set of pairings and court assignments by maximising a weighted objective function with four components. Each component is normalised to 0–1 so the weights reflect true importance. You control the trade-offs using the sliders in the session’s Advanced section:
- Info ()
- — prefer players with high uncertainty (large ) for maximum information gain.
- Balance ()
- — favour matches where the win probability is close to 50%.
- Diversity ()
- where is the total skill-gap and partnership-repeat penalty — avoid lopsided teams and repeated pairings.
- Fairness ()
- where is the break-repeat penalty — discourage players from playing on the same court twice in a row. An additional cross-round penalty spreads play across the session — penalises rounds whose 4 players collectively have more games, rewarding sets of under-played attendees.
The solver uses branch-and-bound search with an optional timeout of 2 seconds. If no feasible schedule is found, try selecting more players or reducing the court count.
Settings
The Settings page gives you control over your data. You can export a complete JSON backup at any time, import data from a previous backup, undo the most recently recorded match (which recalculates ratings), or reset all data entirely — this is irreversible.
The Session Defaults section lets you choose what carries over to new sessions. You can toggle whether the last session’s attendance and court configuration are remembered. Changes save immediately.
If you’re in a league context, an additional option lets you import your existing localStorage data into the league. A confirmation dialog shows a summary before importing.
Multi-League
Sign in from the Login page to access multi-league features. Once authenticated you can create leagues, each with a name and a unique invite link to share with players. Your leagues are listed on the My Leagues page.
Anyone with an invite link can view the league in read-only mode. When viewing a league you don’t administer, all editing controls are hidden, the top bar shows a “view-only” badge, and an Exit button appears to return to your local data. League admins get full edit access after logging in.
Data & Privacy
In local mode, all data stays in your browser’s localStorage. Nothing is sent to any server. Use the Settings page to export a JSON backup at any time. In league mode, data is stored on the league server and managed by the league administrator.
Your theme preference (light, dark, or system) is saved in localStorage and persists across sessions.
Created by andrewboyley.co.za