Chudlock
CoachHighlights NewScoutHeroesBuildsItemsMasteryLeaderboardsProsPatches
Supporter

Your games

  • Coach
  • Highlights
  • Scout
  • Draft room
  • Mastery
  • Quests

The meta

  • Tier list
  • Hero matchups
  • Street Brawl
  • Builds
  • Items
  • Item shop
  • Ranks
  • Patch notes
  • Meta report

Players

  • Leaderboards
  • Pros
  • Pro settings
  • Compare players
  • Live
  • Cups

Bots

  • Discord bot
  • Twitch bot

More

  • City Never Sleeps
  • About
  • Supporter
Midtown Exchange
New: make a highlight of your best playsLive high-rank matchesLatest patch notesStreet Brawl tier list
New: make a highlight of your best playsLive high-rank matchesLatest patch notesStreet Brawl tier list

About · Rating

How the Chudlock rating works

The rating says how well a player plays for the rank they play at. It is an average of how their games went, newest first, with how sure we are shown beside it. Here is every step, with a real match worked through.

What it is

Every standard ranked or unranked game gets a game score from −1 to +1 (the same score Mastery uses for its S to D grades). It compares six numbers from the game with the usual for that hero at the rank the game was played at. The rating is the average of those scores over a player's last 100 standard games, with three things done to it so it can be trusted: recent games count more, a short run can't look extreme, and the range it most likely sits in is shown.

0 is a typical game for the hero and rank. Plus is better than typical and minus is worse. Because every game is judged against its own rank, climbing doesn't flatter the rating and it can't be used to compare players at different ranks. A good Phantom and a good Initiate can both rate +0.10.

Chud % plays no part. It is a joke stat and is never a skill rating.

The formula

game score  s  = 0.30×souls + 0.15×kills + 0.20×deaths + 0.10×assists + 0.15×last hits + 0.10×denies
               each = log2(yours ÷ the usual), held between −1 and +1
               (deaths turned over: usual ÷ yours, so fewer is better)
weight      w  = 0.5 ^ (games ago ÷ 30),   for the newest 100 games
rating         = Σ w·s  ÷  (Σ w + 8)
likely range   = ± 1.96 × spread ÷ √(Σ w + 8),   spread ≈ 0.285
hero rating    = (Σ w·s on the hero + 12 × overall rating) ÷ (Σ w on the hero + 12)
  • The usual is the median for that hero at that rank, per minute, taken from a frozen snapshot of 30 days of games (to 2026-10-23), so scores don't drift as the meta moves. A game is judged against the rank on its own badge, or the nearest ranked game's if it has none.
  • Recent games count more. A game 30 games ago counts half as much as the latest. Games older than 100 are left out.
  • Shrinkage. The “+ 8” adds 8 games' worth of a typical player. With few games it holds the rating near 0. By 100 games it takes about 17% off, and it matters less with every game.
  • The range is where the rating most likely sits (95%). It uses the game-to-game spread of the score (0.285), mixed with the player's own once there are enough games, and narrows as games arrive. If the whole range is above 0 we say better than typical; if it is all below, worse; otherwise about typical.
  • A hero's rating uses the same games on that hero. It is pulled towards the player's overall rating rather than 0, because the player matters more than the hero. A hero needs 5 games to get one.
  • Which games. Standard matchmade games, ranked or unranked, over 5 minutes. Not Street Brawl, bot games, private lobbies, games left early, or games Valve didn't score. A rating needs 10 games, and under 30 it is called an early read.

A worked example

Match 125875926, a ranked game of 21:53. One player, on Haze at Mystic 6, won it with 11 kills, 2 deaths and 10 assists. The names are left out.

Step 1: the game score. Each number is set against the usual for Haze at Mystic 6, for a game this long.

NumberWeightThis gameThe usualScoreWeight × score
Souls0.3034.3k26.8k+0.36+0.107
Kills0.15114.9+1.00+0.150
Deaths (fewer is better)0.2023.7+0.90+0.179
Assists0.10106.3+0.68+0.068
Last hits0.15124123.4+0.01+0.001
Denies0.1001.9−1.00−0.100
Game score+0.40

A score of +0.40 is a grade of A (strong).

Step 2: the rating going into the game. Their 100 games before this one, newest first, with the weight each gets:

Games agoWeightGame scoreWeight × score
The game before1.00+0.23+0.233
2 games before0.98−0.09−0.087
3 games before0.95−0.14−0.133
10 games before0.81+0.14+0.115
30 games before0.51−0.16−0.084
60 games before0.26+0.48+0.124
100 games before0.10+0.26+0.026
…and the rest of the 100

The weights add up to 39.4 and the weighted scores to +3.10. So the rating is +3.10 ÷ (39.4 + 8) = +0.07. Their own spread is 0.276, so the range is 1.96 × 0.276 ÷ √(39.4 + 8) = ±0.08. That gives +0.07 ±0.08 over 100 games, which includes 0, so it reads as about typical for the rank.

Step 3: this game against the rating. A game score of +0.40 against a rating of +0.07. It scored better than 89% of their 100 earlier games, so the match page calls it “a strong game for them”. Their next rating counts this game at full weight.

Why those numbers

The settings come from the match histories of 12 regular players (1,200 games, 296 to 1,781 each), the players of one ranked match, checked on 2026-10-27. It is a small sample from one part of the ladder, so treat it as a sensible start, not a proof.

  • Game-to-game spread: 0.285. A player's single game moves about that much around their own average.
  • Spread between players: 0.087. The twelve ratings ran from −0.17 to +0.15, centred on −0.014. So real differences are small next to the noise in one game, which is why shrinkage and ranges matter and why most players will read “about typical”.
  • Shrinkage: the spread squared over the spread between players squared is 10.7 games. We use 8, a little less, because a wider field than twelve regulars will differ more.
  • Backtest: at every 20th game from the 60th, predict the next 20 games' average from the games before. Predicting 0 for everyone is out by 0.0180 (squared, on average). The rating as set here is out by 0.0085, within 1% of the best of 100 settings tried (window, half-life and shrinkage). Part of that error is the next 20 games' own luck, which no rating can predict.

The checks are in scripts/rating-calibration.ts, which needs a folder of match histories and makes no requests itself.

What the rating can't tell you

  • It isn't a rank and it doesn't compare ranks. It is relative to the rank each game was played at. Use the rank for who is higher on the ladder.
  • It sees six numbers. Souls, kills, deaths, assists, last hits and denies. Not positioning, healing, objectives, damage, drafting, calls or who won. A player who sets up their team can rate lower than the one who takes the kills.
  • It is a guide with a range, not a rank order. With 100 games the range is about ±0.08, and the whole field spans about ±0.17. Two players within a range of each other can't be told apart.
  • Heroes differ. Each is judged against its own usual, but some roles (supports, say) score lower on these numbers whatever they do. The hero ratings show this.
  • Few games, big shrink. Under 30 games it is an early read. Under 10 there is none.
  • Old games fade. After a break or a patch the oldest games may no longer describe how someone plays.
  • Hidden or missing ranks mean a game is judged against all ranks or the nearest ranked game's rank, and the rating says so.

Rank luck

Matchmaking balances the two teams' average rank, not who is on them. Rank luck is the average rank of a player's teammates (without them) against the other team, over the games their profile has read, from the ranks each match recorded. A step is one rank number: Emissary 3 to Emissary 4. Six steps make a rank.

It needs 8 games where at least three teammates and four opponents showed a rank, so unranked games, which record none, don't count. The gap is “even” unless it is bigger than its 95% range, and a game is “ahead” or “behind” when the gap is 1 step or more. Rank is known before the game starts, so the result can't leak in.

Beside it we show how the same people played in those games, as game scores. We don't call that luck: winners score higher, so it mostly says who won.

The playstyle read

Rem's habits (the ones behind the “habits file” and practice goals) are each counted in every match we read, and the read compares them across the last 10 to 60 games (20 or more is a firm read) with what other players do. Then it names the 3 biggest gaps in plain words, with the games and deaths that show each, and one practice goal. It looks at 17 of Rem's 18 habits.

  • Counted from the match (dying alone, being first to die in a fight, staying in at low health, dying within 40 seconds of respawning, dying with souls to spend, missing Mid Boss, missing teamfights): set against the other players in the same games, whom matchmaking put at about the player's rank, measured by the same rules. It compares game by game, so a long game or a hard lobby counts on both sides. Those players use other heroes, which is why the read says “the other players in your games” and doesn't claim a hero.
  • Measured against the hero and rank already (farm, deaths, damage, golden statues, headshots, self-healing, objective damage): the same hero at the same rank over the last 30 days, as a percentile. 50 is the middle. The read names the hero and rank when 60% of the games share them.
  • Against lane opponents (souls and last hits at 9:00, soul orbs): the even result, 0.
  • Left out: “Hit your item timings”. There is no yardstick for the other players in a game.

A habit is a gap only if it is worse than the comparison by a margin that matters (for a count, at least 1.3 times the others') and reliably: at least 1.5 standard errors across the games, with 10 or more games measured. The gaps named are the ones with the most reliable difference. Nothing is named if nothing clears that bar.

Not yet done: a same-hero yardstick for the counted habits (“you die alone twice as often as other Oracles on Haze”). The numbers needed come from the full files of thousands of matches, which can't be fetched from a browser. Until that exists, those habits are set against the other players in the same games.

For a rating leaderboard

Rated on a player's last 100 standard games, newest counting most, each judged against the usual for that hero at the rank it was played at. Players need 30 games (25 on a hero).

The rules and a row for every player and hero are in lib/stats/rating.ts (RATING_BOARD, ratingBoardRows, compareBoardRows), for whoever builds the board.

Chudlock

Free Deadlock stats and coaching. Chudlock is an independent fan project and is not affiliated with or endorsed by Valve. Match data comes from the community deadlock-api; peer comparisons use the last 30 days of matches and are approximate.

Your games

  • Coach
  • Highlights
  • Scout
  • Draft room
  • Mastery
  • Quests

The meta

  • Deadlock tier list
  • Hero matchups
  • Street Brawl tier list
  • Hero builds
  • Item tier list
  • Item shop
  • Ranks
  • Patch notes
  • Meta report

Players

  • Leaderboards
  • Pros
  • Pro settings
  • Compare players
  • Live matches
  • Cups and leagues

Bots

  • Discord bot
  • Twitch bot

More

  • City Never Sleeps
  • About
  • Supporter

The fine print

  • Privacy
  • Terms

Deadlock and its art belong to Valve Corporation.As an Amazon Associate Chudlock earns from qualifying purchases.