Open-source chess engine
A chess engine that teaches itself.
ArhanPassant gets stronger by playing itself, and a new version only replaces the old one after beating it over thousands of games. Then it trains you the same way: one puzzle at a time, at the edge of what you can do.
v0.9.0 · about 3,426 on the CCRL Blitz scale, from 7,484 games against rated engines · how
How it gets stronger
- Step 1
It plays itself
Machines in the cloud play thousands of fast games against the current version. Every position is saved with how the game ended.
- Step 2
It learns from those games
A neural network is trained on the saved positions to judge who is better. Better judgement means better moves.
- Step 3
It has to prove it
The new version plays the old one in pairs of games with colours swapped. It replaces the old one only if a sequential test is 95% sure it is stronger.
- Step 4
It ships, and starts again
Each promotion is logged below with its games and measured gain. The new champion becomes the opponent for the next round.
Promotion ledger
gate: SPRT [0, 5] Elo · α = β = 0.05 · 8+0.08
| Version | Date | Change | Games | Gain vs previous |
|---|---|---|---|---|
| 0.9.0 | 2026-10-03 | NNUE network (8 king buckets, 8 output buckets), 512 hidden units, trained on 295.0M self-play positions | 2720 | +14.6 Elo (5.9 to 23.3) |
| 0.7.0 | 2026-10-02 | NNUE network, 512 hidden units, trained on 235.0M self-play positions | 1188 | +27.6 Elo (14.9 to 40.2) |
| 0.6.0 | 2026-10-02 | NNUE network, 512 hidden units, trained on 199.0M self-play positions | 836 | +43.9 Elo (27.8 to 60.1) |
| 0.5.0 | 2026-10-02 | NNUE network, 512 hidden units, trained on 120.6M self-play positions | 1980 | +19.9 Elo (9.3 to 30.4) |
| 0.4.0 | 2026-10-02 | NNUE network, 256 hidden units, trained on 86.5M self-play positions | 748 | +51.5 Elo (34.4 to 68.8) |
| 0.3.0 | 2026-10-01 | NNUE network, 256 hidden units, trained on 45.3M self-play positions | 414 | +232.6 Elo (204 to 264.1) |
| 0.2.0 | 2026-10-01 | First NNUE network (128 hidden units) trained on 3.5M self-play positions | 720 | +83.1 Elo (61.1 to 105.8) |
| 0.1.0 | 2026-10-01 | Baseline: alpha-beta search with a hand-written evaluation | — | starting point |
Training that adapts to you
The trainer keeps a running estimate of your rating and of your skill at each tactical pattern, and chooses the next puzzle from 47,000 rated positions to teach you the most.
At the edge of your level
Each puzzle is picked so you should solve about four in five. Too easy teaches nothing; too hard teaches frustration.
Weak spots first
Your skill is tracked separately for forks, pins, back-rank mates and 20 other patterns, and the trainer leans toward the ones you miss.
Misses come back
A puzzle you get wrong returns after 10 minutes, then a day, then three days, then a week, until you solve it every time.
Your own mistakes too
Enter your Lichess or Chess.com name and the engine reviews your games, turning the moves that cost you most into puzzles.
For developers
One Rust codebase: a UCI engine for any chess GUI, a chess library with legal move generation checked against published perft counts, and the WebAssembly build that runs on this page.
Engine detailsuse arhanpassant::Position;
let pos = Position::startpos();
for m in pos.legal_moves().iter() {
println!("{}", pos.san(m)); // a3, a4, Na3, ...
}