ChessGrader.Review a game

ChessGrader / Methodology

How ChessGrader grades your moves

Every formula, threshold, and node budget behind a ChessGrader report, written down. If you think a grade is wrong, this page is how you check the math.

The engine

ChessGrader runs Stockfish 17.1 with the lite NNUE network, compiled to WebAssembly, in your browser. There is no server-side analysis. Every position in your game is evaluated with a fixed budget of 100,000 nodes per move. The app verifies at startup that the NNUE network actually loaded and records that with each analysis — it never silently falls back to the weaker classical evaluation.

Why fixed nodes instead of depth or time

Most analysis tools search for a fixed time or to a fixed depth. Fixed time means a gaming PC and a five-year-old phone produce different evaluations — and therefore different grades — for the same game. Fixed depth is closer, but depth is an uneven unit: modern Stockfish prunes aggressively, so "depth 20" covers wildly different amounts of work in different positions. A fixed node count makes the search deterministic in effort: the same game gets the same grades on any device, any day. That reproducibility is worth more to a grading system than squeezing out extra strength on fast hardware.

The two-pass design

The first pass grades every move at 100,000 nodes. Then the moments that matter — potential blunders, potential brilliancies, big evaluation swings, mates appearing or disappearing — are re-searched at 600,000 nodes with MultiPV 2 (the engine's two best lines), up to 12 positions per game.

The point: big labels should rest on deep numbers. Brilliant and Great can only be awarded by this verification pass. A shallow search occasionally mistakes a losing sacrifice for a sound one; six times the nodes and a second principal variation catch most of those. The verification pass also works in your favor on close calls — if your move ties the engine's second line within a whisker, it's credited as Best, compared on one consistent search.

Win probability

Centipawn evaluations are converted to a win percentage with the community-standard logistic curve, the same family used by Lichess and approximating chess.com:

win% = 50 + 50 · (2 / (1 + e^(−0.00368208 · cp)) − 1)

Grading on win probability rather than raw centipawns matters at the extremes: dropping from +9 to +7 is nearly meaningless, while dropping from +2 to 0 is the whole game. Centipawn loss explained covers why.

Move grades

Grades come from how much win probability a move gave up:

GradeRule
Brilliant (!!)Engine's best move AND a genuine sacrifice (static exchange < 0), position not already totally winning, still sound after — verified at 600,000 nodes
Great (!)The only good move (second-best line ≥18% worse), or the precise punish that turned a lost or equal game — verified at depth
Best (★)Matches the engine's top choice, or ties its second line within 10cp
ExcellentSmall loss: ≤25cp
GoodBigger loss, but under a 10% win-probability drop
BookEarly theory-range move (first 8 moves, low loss)
Inaccuracy (?!)≥10% win probability lost
Miss (✗)Your opponent handed you the game and the move gave it straight back — including missed forced mates while still winning
Mistake (?)≥20% lost
Blunder (??)≥30% lost

Plain-English versions of each label live in move classifications explained, and the sacrifice test behind the !! label in what makes a move Brilliant.

Mate handling

Naive centipawn math falls apart around forced mates, so three special rules apply. A longer route to a forced mate is never punished — the floor is Excellent, because mate in seven still wins. Losing a forced mate while still winning is a Miss, not a 100-point blunder. And a defender already facing forced mate isn't charged extra for the inevitable.

Accuracy

ChessGrader follows Lichess's documented method exactly. Per-move accuracy comes from an exponential-decay curve over the win-probability drop:

accuracy = 103.1668 · e^(−0.04354 · drop) − 3.1669

Game accuracy is the mean of two aggregates: a volatility-weighted average (sharp phases of the game count more than dead-equal shuffling) and the harmonic mean (one catastrophe isn't averaged away). Benchmarks by rating tell you what the resulting number means.

Estimated game rating

A log fit from your average centipawn loss over community ACPL-to-rating observations, rounded to the nearest 25. Caveats, stated as bluntly as we can: one game is a tiny sample; time control changes everything; a one-sided game flatters ACPL. It's a vibe, not a measurement, and the report says so.

Why your numbers can differ from chess.com's

Chess.com's exact formulas, search depths, and Brilliant detection are proprietary. ChessGrader is an honest, documented approximation built only from engine output and board arithmetic. In practice the differences are typically within one grade step and a couple of accuracy points. When the two disagree, you can at least check ChessGrader's side of the argument — it's all on this page.

Frequently asked questions

Why do my grades differ from chess.com’s Game Review?

Because chess.com's exact formulas, depths, and Brilliant detection are proprietary, while ChessGrader uses its own published rules. Both run Stockfish and grade on win-probability loss, so differences are typically within one grade step and a couple of accuracy points — but borderline moves can land on different sides of a threshold.

Is browser analysis weaker than server analysis?

In raw search, yes: Lichess's servers search millions of nodes per move versus ChessGrader's 100,000-node first pass. ChessGrader trades peak depth for consistency — the same grades on any device — and re-verifies the moments that decide big labels at 600,000 nodes with the top two engine lines. For grading purposes the results agree with deeper searches on the large majority of moves.

Can I trust a Brilliant label from ChessGrader?

More than most. Brilliant is only awarded when the move is the engine’s best, is a genuine material sacrifice by static exchange evaluation, the position was not already totally winning, and the move survives a 600,000-node verification search with the top two lines. A shallow first-pass search can never award it on its own.

What does 100,000 nodes mean in depth terms?

Very roughly depth 18 to 22 with modern Stockfish in typical middlegame positions, though it varies a lot because the search prunes unevenly. That is well beyond human tactical vision, but shallower than Lichess server analysis. Node counts are used precisely because depth is an inconsistent unit.

Do all devices really produce the same grades?

Yes. The search budget is a fixed node count, not a time limit, so a phone and a workstation do the same amount of engine work per move — the phone just takes longer. The NNUE network is verified as loaded before any analysis runs.

How accurate is the estimated game rating?

It is deliberately rough: a log fit from average centipawn loss to rating using community data, rounded to 25. One game is a small sample, time control shifts ACPL substantially, and one-sided games inflate the estimate. Use it as a fun signal across many games, never as a measurement.

What is the Miss grade and why does it exist?

Miss covers the case where your opponent handed you the game and your move gave it straight back, including missed forced mates while you are still winning. Pure win-probability math would call some of these blunders and others nothing at all; the dedicated grade names what actually happened.