Tool · Louisiana Chess Association
Chess Scoresheet Scanner
Outcome: Players photograph a handwritten scoresheet and get a playable game, with unsure moves flagged for a one-tap fix and a Lichess analysis link.
The live decoder demo needs JavaScript.
Demo: a scoresheet photo becomes a playable game.
HOW IT'S BUILT
- 01Photo, shrunk in browser
- 02Verbatim transcription
- 03Legal-move search
- 04Review & fix
- 05PGN + Lichess link
The problem
Tournament games live on handwritten scoresheets. Typing one into analysis software is slow and error-prone, so most club games are never looked at again.
The data
Sixty games, three classics and fifty-seven generated to cover castling, promotion, en passant and ambiguous moves, turned into simulated transcriptions at three noise levels: clean, typical, and time-pressure scrawl. The errors model what a reader gets wrong: look-alike characters (b/6, N/H), missing capture and check marks, 0-0 vs O-O, blanks, crossed-out moves, and rows shifted by half a move.
Approach
Two stages with a hard line between them. A vision model copies the handwriting exactly, mistakes included, and is told twice never to fix a move; a beam search then decides what was actually played, scoring every legal move in each position against what was written, with look-alike characters costing less. It can treat a cell as noise, or insert a move a player forgot to write, but only if the next moves line up again. Keeping the stages apart is what makes the result measurable: raw reading accuracy and corrected accuracy are separate numbers. Fixing a move re-runs the search with that move locked in, so one correction usually repairs the moves after it. Profiling against the real chess engine cut decode time 8–16x (about 0.7s a game on a desktop) with output checked identical on 60 sheets, and it runs in a Web Worker so the page never freezes.
Validation
On the simulated sheets: every clean game decoded exactly; 87% of moves right under typical noise and 52% under time-pressure noise, with the first wrong move flagged for review 95% of the time under typical noise. The honest gap: simulated errors are guesses about handwriting, spread evenly, where real ones cluster late in the game.
Result
Live on louisianachess.org since September 2026 for anyone with an LCA account. Members photograph one sheet or several (front, back, continuation), fix any flagged move in a tap, then open the game in Lichess or chess.com, or save, share and email the PGN. Photos are read once and never stored, and a daily limit keeps the per-scan cost in check.
Next time
Measure on real scoresheets and rebuild the look-alike character table from real misreads instead of guesses. Teach the search to recover when a player skips a whole move pair, which it currently flags but cannot realign. Cut the review list: too many correct moves are flagged, so real data should tighten that. Then try a smaller, cheaper vision model and keep it only if the numbers hold.