‹ Back to the app

How the guess works.

No account lookups, no results tables — the estimate comes entirely from the quality of the moves on the board.

Step 1

Split the PGN into games and moves

A grammar-based PGN parser splits your export into games and strips comments, clock times, variations and annotations, leaving only the moves that were actually played. Each game is then replayed move by move to make sure every move is legal.

[Event "Live Chess"] [White "you"] … 1. e4 {[%clk 0:02:58]} c5 2. Nf3 d6 3. d4 cxd4 …
Game 1 · 64 moves you vs Magnus (ok, unlikely)
Game 2 · 41 moves you vs mom
Step 2

Ask Stockfish about every move — twice

For each position, Stockfish searches twice: once freely, to find the best move and its evaluation, and once restricted to the move you played. The gap between the two is your move's centipawn loss (100 centipawns = one pawn). Because both searches look at the very same position, quirks of the engine's evaluation cancel out — and if you played the engine's first choice, the loss is exactly zero.

Search 1 · engine's best
3. Bb5 → +0.35
Search 2 · your move
3. Nc3 → +0.10
loss = 25 cp

After 1. e4 e5 2. Nf3 Nc6 — the engine prefers Bb5 (solid ring), you played Nc3 (dashed ring). Both fine moves; the difference is small.

Step 3

Keep only the moves that say something

Two kinds of moves are excluded before averaging. The first 4 moves of each side are usually memorized opening theory, and any move played in an already-decided position (more than ±8 pawns) is garbage time — finding the fastest mate, or shuffling pieces in a lost cause, says little about skill.

opening theory decided (+8 / −8) rated moves ✓ move 1 move 40 0.0

One game's evaluation over time — shaded moves don't count toward the average.

Step 4

Map average loss to a rating

Your average centipawn loss (ACPL) over all rated moves is looked up in a calibration curve fitted against real chess.com players of known rapid rating, measured with this exact pipeline. Give away ~15 cp per move and you play like a grandmaster; give away ~95 and you're around 900.

3300 1850 400 0 50 100 150 200 average centipawn loss GM blitz · ACPL 15 → ~2650 club player · 70 → ~1400 beginner · 110 → ~800

The actual lookup table used by the app (dots are anchor points; values in between are interpolated).

Step 5

Adjust for the clock

Everyone plays worse with less time — so the same move quality means a stronger player in bullet than in classical or daily games. The estimate is shifted by the time control found in the PGN.

Bullet
+150
< 3 min
Blitz
+75
3–10 min
Rapid
±0
10–25 min
Classical
−75
25+ min
Daily
−100
correspondence
Step 6

Say how sure we are

Each game also gets its own mini-estimate. How tightly those cluster — and how many games and rated moves went in — decides the ± range and the confidence label. One brilliant game proves little; twenty consistent ones prove a lot.

High
15+ games, 400+ rated moves, per-game estimates agree
Medium
a decent sample, but noticeable spread between games
Low
under 5 games or under 150 rated moves — take it lightly

All together

20
games
640
rated moves
62 cp
avg loss
1632
from curve
+75
blitz
1707 ± 140
Medium confidence

And the honest fine print: this is a well-informed guess, not a measurement. Style matters — solid positional players measure a bit high, wild attackers a bit low — and site ratings sit on different scales. Expect the truth within a couple hundred points.