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.
Stockfish 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.
Reckless has no such limiter, so choosing it takes the opponent ladder down to one rung: full strength. Settings says so before you choose rather than after.
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.
Both of them, one at a time
You pick which one plays.
Stockfish and Reckless are both compiled into the app. One of them is chosen in Settings, and from then on it plays, it grades your moves, and it labels the endgame drills. They do not run at once, and they never play each other — a second engine here is a second opinion you can switch to, not a spectacle to watch.
Stockfish 18
The strongest engine there is, and the only one here that can play down to a rating.
GPLv3 · source
Reckless 0.10
A different opponent with its own taste in positions. It has no strength limiter, so it plays at full strength or not at all.
AGPLv3 · source
Why bother with the second one? Because two engines that are both near the top of the rating lists still disagree, and the positions where they disagree are the interesting ones. An engine is not an oracle; it is a very strong player with a taste in positions, and having two of them makes that visible instead of hiding it behind a single number.
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.
Same −100 cp, two positions
+9.0 → +8.0−1% to win
+0.2 → −0.8−24% to win
Illustrative. The app computes this from the actual evaluation each time.
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.