How ratings work.
A guide to what those numbers actually mean — no math degree required.
Ratings run on TrueSkill, Microsoft Research's algorithm from Xbox Halo and DOTA-style ladders. It handles the part chess Elo can't: how four players' ratings combine into "team strength", and how credit gets split after a doubles match. On top of that, every update is boosted by score margin — a 21-5 says more than a 22-20.
The league runs on pure TrueSkill, so ratings find their level fast while everyone is new, then settle as games pile up. The system also supports season resets and chess-club style damping for later, if the standings ever need a fresh start.
Every player on the leaderboard has one number next to their name — like 1500, 2400, or 3100. That number is the system's best guess at how strong the player is right now.
League's apex. Current ceiling around 3100.
Consistent winner. Beats most opponents most of the time.
Can hang with most of the league. Match outcomes go either way.
Where new players begin — 1500, or 1300 for players starting out in the game. The system has no data on you yet.
The scale is loosely modeled on chess Elo, where most rated club players live between 1200 and 2400. We extended it slightly for badminton because doubles tends to produce higher numbers than chess.
After every match, every player's rating moves up or down. Two rules:
- You win → rating goes up. You lose → rating goes down. Obviously.
- The amount depends on who you played. Beating a player rated way above you gives you a lot. Beating someone way below you barely moves the needle. Same in reverse: losing to someone weaker hurts more than losing to someone stronger.
This is what stops the system from being gamed. You can't pad your rating by playing only weaker opponents — those wins are worth almost nothing. You also don't get punished for taking on tougher opponents and losing.
"If you want to climb fast, beat someone you 'shouldn't' beat. That's where the points are."
A 21-19 nailbiter and a 21-5 blowout aren't the same thing — and the system reads them differently:
Suggests the teams are roughly even.
Small rating change.
Suggests the winners are clearly better.
Bigger rating change.
The bigger the gap, the more the system updates. But the boost grows slowly and is capped — there's no super-bonus for a shutout. A 21-19 win counts about 1.05×, a 21-10 about 1.2×, a 21-0 about 1.35×. Deuce games count as the close games they are.
This league hasn't needed one — but the system supports rating resets. If the board ever drifts far apart, whatever spread has built up can be proportionally squished into the 1500–2500 band. The top stays the top, the bottom stays the bottom, but everyone starts the new era closer together.
Each squished era would be a season, and the History tab would keep the archive — the leaderboard exactly as it stood the moment of each reset. For now there is one continuous era: everything since the first night.
The system keeps two numbers on every player: its best guess at your skill, and how sure it is about that guess. A new player is a mystery, so the first games move the guess a lot. Every game after that makes the system more confident, and the swings get smaller.
The number on the leaderboard is deliberately cautious: it's your skill guess minus a safety margin for the system's doubt. As the doubt shrinks, the safety margin shrinks with it — which is why, early on, almost everyone's rating climbs just from playing. A tough first night can still leave you above where you started; it just leaves you lower than the players who beat you. Compare yourself to the board, not to 1500.
Classic chess Elo is built for two individuals facing each other. Badminton doubles is two teams of two, and the system needs to know how to:
- Combine two partners' ratings into a "team strength"
- Split credit between teammates when they win or lose
- Account for the fact that a strong partner can carry a weaker one
TrueSkill — Microsoft Research, 2007, same algorithm that powers Xbox Halo matchmaking — solves this natively. It also gives a newcomer's rating room to move fast, so a strong first-timer isn't stuck near the bottom for months.
The actual math:
- Every player is modeled as a normal distribution N(μ, σ²). A new player starts at σ = 8.33; σ shrinks with every game played.
- The displayed rating is (μ − 3σ) × 60 + 1500 — a conservative estimate. A default newcomer (μ = 25, σ = 8.33) lands exactly on 1500.
- After every game we feed the four ratings into the TrueSkill team posterior (factor-graph message passing), then scale the μ update by margin_weight = 1 + 0.5 · ln(1 + (winner − loser) / winner), capped at 1.6×. A 21-19 nailbiter weighs ~1.05×; a 21-0 ~1.35×.
- Each game of a matchup is rated separately, in the order played.
- Win probability uses the standard TrueSkill formula Φ(Δμ / √(N·β² + Σσ²)), temperature-calibrated by dividing the z-score by 4.8 before the CDF — raw predictions are too confident on small-league data.
TrueSkill via the trueskill library for the team math; the margin and reset layers are this project's. Everything is deterministic: given the matches table and these constants, running recompute_all reproduces the same final ratings every time.
Because the system got more sure about you. The leaderboard number subtracts a safety margin for uncertainty, and that margin shrinks with every game you play — early on, often faster than losses pull you down. What matters is where you sit relative to everyone else, and losses still cost you ground there.
Yes. Click your name from the leaderboard. The "Match Log" section shows every game you've ever played, with the rating change for each.
That chip means a player is currently at their lifetime peak rating. In a young league most careers are short and still climbing, so a good night often IS a new personal best. As histories get longer the chip gets rarer.
Two reasons: a 21-19 squeaker counts for less than a 21-8 statement, and an established player's rating moves less than a newcomer's because the system is already fairly sure about them. Keep beating teams like that and the board will catch up.
It shouldn't be. If you spot one, that's a bug — the system filters for players who actually played in the latest session. Let Jetson Ngo know.