Under the board

Stockfish, on your phone

The coach is not a heuristic, not a lookup table and not a language model with opinions about chess. It is the strongest chess program in the world, searching the position in front of you, on your device, with no network anywhere in the loop.

It runs on the device

The engine is compiled into the app and searches locally. That is not a privacy slogan — it is what makes the app work on a train, and what makes “analyse this” instant rather than a round trip to somebody’s GPU with a queue in front of it.

It also means the app has nothing to send anywhere, which is why the privacy policy is as short as it is.

It plays at a strength you set

Anywhere from about 1400 to full strength. A limited engine is not a strong engine playing badly on purpose in the obvious way: strength is limited by restricting how deep and how widely it searches, so it plays like somebody who did not see far enough — which is what a human opponent actually feels like.

It defends properly in the endgames

In the endgame drills the engine takes the other side and puts up the best defence there is. Knowing that king and pawn against king is winning is not the same as converting it against a defence that never errs, and the difference between those two states is exactly the thing the mode is for.

The one design decision worth arguing about

Move grading uses win probability, not centipawns.

Losing a hundred centipawns when you are already up a queen barely matters. Losing them in a level position is decisive. Centipawns cannot tell those apart — they are a linear scale laid over a game whose outcomes are not linear at all.

So every evaluation is converted to a win probability first, and the grade is the drop in your chances of winning. A trainer that says blunder when nothing happened stops being worth listening to, and once you stop listening the whole thing is decoration.

And then it says something

“−1.4” is not feedback. This is.

Once the engine has an answer, a coaching layer turns it into a sentence about the position — built from the features that actually changed, not from a template with the move pasted in.

  • “takes the open d-file”
  • “plants the knight on the e5 outpost, where no pawn can dislodge it”
  • “pries open lines toward the enemy king”
  • “leaves the opponent with an isolated pawn”
  • “lands the rook on the seventh rank”
  • “breaks up the enemy bishop pair”

All of it translated into 31 languages — including the chess vocabulary, which is the part a player notices being wrong. A fork is a horquilla in Spanish, a fourchette in French, 捉双 — “catching two” — in Chinese and 両取り in Japanese.

The licence

Using Stockfish has a price, and it is not money.

Stockfish is free software under the GNU General Public License v3. It is linked into this app, and the GPL is copyleft: a work that includes it and is distributed must carry the same terms.

So Chess Trainer is GPLv3, and its complete corresponding source is published. That is not generosity. It is the condition of using the best engine there is, and it is a fair one.

Not taking our word for it

The rules engine is proved, not tested.

The iOS app reimplements the rules in Swift rather than shipping a library, and a move generator with a bug in it is a trainer that teaches illegal chess. So it is checked with a perft suite: every legal move sequence to a given depth is counted from a set of positions with known answers, and the count either matches exactly or the build fails. There is no “mostly correct” state for a move generator to be in.

Read the source →

Chess Trainer

Tactics, positional judgement, endgame technique and coached play, with Stockfish running on the device. Nothing leaves the phone.

Free software under the GNU General Public License v3. Read the source.

© 2026 Mincho Milev. Chess Trainer is free software.

Stockfish © the Stockfish developers, GPLv3. Puzzles and games from the Lichess database, CC0. Not affiliated with Apple, Lichess or the Stockfish project.