A Chess Training App for Imitation Learning
LLMs learn faster if we first pretrain them to imitate dense teacher-forced examples. I speculated that this would work on humans too, so I built a chess app where you try to imitate Stockfish. My theory is that this will help humans quickly become OK at chess, but they will reach a wall where practice on full games is more efficient than continued pretraining[1]. I also think the app is fun.
This is probably not an efficient way to learn the basic rules of chess, and you’ll need to train openings separately. The idea of chess puzzle apps is hardly unique, but I don’t think anything else works in exactly the same way[2].

How does the game work?
We show you a board state from a real game, and two moves (generally the real move vs. what Stockfish would play). You pick which move you think is better, and then we tell you what Stockfish thinks, and show you how Stockfish would play out the next few moves.
There are also options to see the other move, to copy the info (to ask an AI to explain it), to share a link to the same problem with a friend, and an Elo-style[3] number so you can watch the number go up[4].
How do we pick moves?
We collect a bunch of games from Lichess (filtered to exclude certain fast game types), pick positions where the move mattered and the game wasn’t already over, and then run the moves through Stockfish.
If the real player and Stockfish disagree, we save the real move, Stockfish’s move, Stockfish’s win percentage for each move, and what Stockfish would play after each move. In the rare case where players agree with Stockfish, we save Stockfish’s second best move as an alternative.
When someone opens the app, we try to show a move that they can discriminate with 80% accuracy[5]. This still needs more calibration, but the calculation is based on the win probability gap given a shallow search.
There’s a lot more detail about how the app works in the spec.
More details
The code is open source and MIT licensed. You can find it on GitHub: brendanlong/chess-pretraining-for-humans
In terms of privacy, I collect the obvious data (your answers, plus account info if you sign up), and general usage data (how often do people open each page). I may run my own analyses (do people actually improve quickly?) and/or share anonymized data with other researchers.
Try it
If this sounds interesting to you, the app is live and you can try it instantly with no signup.
- ^
If this app gets any traction, I’ll measure how quickly people improve and compare it to Lichess ratings.
- ^
Chessort is similar to my app, but has you rank 4 moves. This is actually a better match for dense pretraining over a teacher model’s logit distribution than my app, but it’s so difficult that I’m not convinced it’s helpful.
- ^
The Elo number is calibrated from the Elo of players making the moves you’re judging, but it’s very unlikely to match your real chess Elo.
- ^
Or watch the number go down, if you’re bad at chess like me.
- ^
Learning seems to be fastest around 85% accuracy. 80% makes it slightly easier for us to calibrate our ratings.
This strikes me as a distribution shift relative to playing actual games. Often the issue is that you don’t consider the correct candidate move, and by the time you’ve narrowed the position down to two candidate moves you’ve already made a bunch of progress. Also, the two moves you’re shown in the app are often not the top two moves you’d consider as a human[1].
ChessTempo has a version of this where you play through master games and guess the move (without any prompting), and you gain points based on your score relative to the engine/master move. I think it still has some issues but seems better than this app to me.
Edit:
Also, it seems your screenshot might have a bug? Neither Bxh7 nor Ne5 are good moves in this position.
E.g. in your screenshot, I would consider Ne2 before looking at Bxh7+ or Ne5.
Thanks! I meant for this to be a random move but Claude decided to generate the board by hand and I didn’t catch it.
I updated the preview image to this position (chosen since it’s pretty easy to follow why it’s bad, but the move was played by an Elo 2300 player in a real game): https://chess-pretraining.brendanlong.com/?item=31395
I agree with this. I’m tempted to add a mode where you just have to pick Stockfish’s top move and then your score is how much worse your move is than Stockfish’s (Stockfish’s move = perfect score). I focused the initial version on the easiest problems though, since my theory is that the newest players are the ones who will benefit the most from this kind of training anyway.
Would it be possible to use something like Maia, instead of Stockfish? Then you could more plausibly get ‘higher human-strength moves’, where you are not left trying to followup impossibly sharp tactical play you can’t pull off without a chess engine, or other issues with doing direct naive behavior cloning from superhuman chess engines.
I looked into this, and I think it wouldn’t work for what I’m trying to do.
On my item bank (filtered for bad moves that humans thought were plausible), Maia basically agrees with Stockfish around half of the time, but also makes a move as bad or worse than the human around a quarter of the time. There are a small number of cases where Maia picks a good move and thinks Stockfish’s move is completely implausible (1.5%), but either the moves are so close that we’d basically never serve it, or the bad move is obvious even if Stockfish’s move is weird.
For examples of the last category, Maia plays queen to g7 here, and rook to e8 here.
Since I want to guarantee that the moves we show people are actually good, I approach this from the other direction and use how hard it is to see Stockfish’s move as a difficulty filter. At low ratings, we show you moves where there’s a large win swing that’s visible with a shallow search, and as you get better we slowly show moves with a smaller win swing or that require a deeper search to see.
Here’s the ratings bands and gaps:
rating band
median win rate gap
0–400
0.441
1200–1600
0.315
2000–2400
0.185
2400–2800
0.065
2800–3200
0.081
So, it’s possible for us to show moves that are very hard to distinguish, but only if you’re insanely good at this task. This item from before would require you to be in our 2400+ band.