← Leaderboard
A plain-English guide

How ratings work.

A guide to what those numbers actually mean — no math degree required.

§ 01 What the rating represents
⚡
Chess-style Elo · TrueSkill team math

Ratings run on TrueSkill, Microsoft Research's algorithm from Xbox Halo and DOTA-style ladders — it owns the team aggregation: how four players' ratings combine into "team strength" and how credit gets split after a doubles match. Every update is boosted by score margin; once the league runs its first era reset, movement shifts to a chess-style fixed K-factor per match, damped to keep long-term standings stable.

The league opens on pure TrueSkill — ratings find their level fast while everyone is new — with margin-of-victory weighting from day one. Era resets and the chess-club K-factor dynamics are the toolkit for later, when standings need a fresh season.

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.

The Tier Ladder
3000+
Dominating

League's apex. The ceiling is unclaimed so far.

2500
Top of the league

Consistent winner. Beats most opponents most of the time.

2000
Solid intermediate

Can hang with most of the league. Match outcomes go either way.

1500
Brand new

Default starting rating. 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 pickleball because doubles tends to produce higher numbers than chess.

§ 02 How wins and losses move your rating

After every match, every player's rating moves up or down. Two rules:

  1. You win → rating goes up. You lose → rating goes down. Obviously.
  2. 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."

§ 03 Why the score matters (the "margin")

An 11-10 nailbiter and an 11-0 bagel aren't the same thing — and the system reads them differently:

Close win
11 – 10

Suggests the teams are roughly even.
Small rating change.

Blowout
11 – 0

Suggests the winners are clearly better.
Bigger rating change.

The bigger the gap, the more the system updates. But the boost grows logarithmically and is capped — there's no super-bonus for the bagel specifically. An 11-10 win counts about 1.04×, an 11-0 about 1.35×, so a blowout and a total demolition count similarly.

§ 04 Resets & eras (someday)

This league hasn't needed one yet — but the system supports rating resets. If the board ever drifts far apart, whatever spread has accumulated 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 — for any past season, the leaderboard exactly as it stood the moment of the reset. For now there is one continuous era: everything since the first Friday.

Why would resets exist? Without them, a few players who got hot early pull away from the league and never come back — and the algorithm becomes more confident over time that the gap is real, so the ratings stabilize but stop telling a fresh story. An era reset re-tightens the field so a new season has competitive stakes: anyone can climb 500 points or fall 500 and it matters.

§ 05 What a single match actually moves

One match changes your rating by roughly:

  • ±15-30 for an expected outcome (top beats bottom)
  • ±40-90 for a balanced match
  • ±100-260 for a genuine upset (underdog beats favorite)

The biggest single-match swing possible (a bottom-of-league team bageling the top 11-0) tops out around 300 display points. Five losses in one night drops you somewhere around 200-400 — meaningful, recoverable in a couple of strong sessions. The engine's damping constants are the knob that controls this; they can be tuned tighter or looser if the league wants more or less volatility.

§ 06 Why TrueSkill's team math — but not its dynamics

Classic chess Elo is built for two individuals facing each other. Pickleball 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 via Bayesian factor graphs. That's the half of the system we kept.

What changes over time is the dynamics. Vanilla TrueSkill tracks confidence as a Bayesian uncertainty band: rating moves shrink as a player accumulates more games. For a small league that runs era resets, that pushes ratings toward early stability and late staleness — players get "locked in" and matches stop mattering in their final standings.

So after an era reset the league pins uncertainty flat (σ = 6), applies a fixed K-factor (K = 0.33) to scale every update, and re-tightens the whole field at each era. The result feels more like a chess club than a competitive ladder: predictable movement, every match contributes, the leaderboard tells you this month's story.

§ 07 Under the hood (for the curious)

The actual math, in the current era:

  • Every player is modeled as a normal distribution N(μ, σ²). Post-reset σ is pinned at 6.0 for everyone, so μ alone moves.
  • The displayed rating is (μ − 3σ) × 60 + 1500. With σ flat, this collapses to a linear function of μ, which is why we can do the proportional reset squish cleanly.
  • After every match we feed the four ratings into the TrueSkill team posterior (factor-graph message passing — that's the part we keep from TrueSkill). We then scale the μ update by margin_weight = 1 + 0.5 · ln(1 + (winner − loser) / winner), capped at 1.6×. An 11-10 nailbiter weighs ~1.04×; an 11-0 demolition ~1.35×. (If the league ever runs an era reset, updates after it would additionally be damped by a fixed K = 0.33 — see §02.)
  • Era boundaries would be explicit events in the timeline — none have happened yet. A reset on date D would take each player's rating, compute a target via new = 1500 + (old − pre_min) / (pre_max − pre_min) · 1000 (where pre_min/pre_max are the field's range), and write a new rating_history row pinned to that target. Matches after the reset evolve from these new values.
  • Win probability uses the standard TrueSkill formula Φ(Δμ / √(N·β² + Σσ²)), temperature-calibrated by dividing the z-score by 4.8 before the CDF — raw predictions were too confident on small-league data.

Roughly 2,500 lines of Python. TrueSkill via the trueskill library for the team math; the K-factor / flat-σ / reset / margin 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.

§ 08 Common questions
Q: Can I see all of my matches?

Yes. Click your name from the leaderboard. The "Match Log" section shows every game you've ever played, with the ELO change for each — plus a gold ◆ marker on every era boundary so you can tell which season each match belongs to.

Q: Would a rating reset erase my standing?

No — and none has happened yet. If the league ever runs one, whatever rank you hold going in is preserved (#1 stays #1, #15 stays #15); the absolute numbers just get rescaled closer together. The History tab would archive the final pre-reset leaderboard, so a big run stays on the record forever.

Q: Why does the leaderboard show "★ PR" next to so many players?

That chip means a player is currently at their lifetime peak rating. In a young league most careers are still short and still climbing, so a good night often IS a new personal best. As histories get longer the chip gets rarer — it appears and disappears as players climb past or fall below their previous best.

Q: My partner and I beat a team rated much higher. Why did we only gain a few points?

Margin: an 11-10 squeaker is worth less than an 11-4 statement, and the engine damps every update to keep the league stable. A genuine upset still earns 100-260 points, just not 400+. If you win three upsets in a session you'll feel it in your standing.

Q: Is this still TrueSkill?

Half. We use TrueSkill's team math — how four players' ratings combine into team strength and how credit splits after a match. We don't use its Bayesian confidence-tracking anymore (σ is pinned flat, K-factor scales every update uniformly). The honest description is "chess-style Elo with TrueSkill team aggregation."

Q: Why was the homepage hero about someone who didn't even play this session?

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.

Built by Jetson Ngo · this page itself was generated from the live source code, so it's always in sync with how the system actually works.