Zugwunder
The Mac app
Solver, tactics trainer, playing partner and board editor in one native window. It proves mates and problem-chess stipulations exactly, generates puzzles, analyses your games and prints puzzle sheets.
All featuresZugwunder is a chess engine I wrote from scratch in Swift, and the Mac app built around it. It proves mates, helpmates and selfmates exactly, invents new puzzles from its own endgame tables, trains your tactics and plays at about 3000 Elo. All of the thinking happens on your Mac.
1. Kf7 Kh5 2. Kf6 Kh6 3. Qg6#After 1…Kh6, 2. Qg6#
Every figure below comes from Zugwunder’s own test runs. The logs ship with each release, and a build that fails a test is not released.
| Playing strength | 3065 ± 20 Elo network v6, one core | 500 reference games against Stockfish at its calibrated UCI_Elo 3100, 60 s + 0.6 s per move, 256 MB hash, Syzygy tables: 83 wins, 284 draws, 133 losses. Beyond that series, the cluster has played thousands of games against Stockfish and other engines. An estimate on Stockfish’s scale, not an official rating. |
|---|---|---|
| Training data | 236.6 million positions | From Zugwunder’s own self-play and from games against Stockfish, labelled with Zugwunder’s search results and the game outcomes. No foreign code, weights or evaluations went into the network. |
| Evaluation | NNUE, 6th generation 768 → 2 × 256 → 1 | A small neural network, quantised to 16-bit integers and updated incrementally with SIMD instructions. Trained with a 150-line PyTorch script, embedded in the binary, run in Swift. |
| Dependencies | None | Swift and Apple’s frameworks only. The single exception is Fathom (MIT licence), which reads Syzygy endgame tables. |
| Tests per release | 364 + 32 | 364 Swift tests across engine, app and Wolfgang, plus 32 protocol tests run against the real zugwunder-uci binary. New search ideas have to win an SPRT match against the previous version first. |
| Languages | 4 | German, English, French and Dutch, switchable inside the app. This site follows the same four. |
The engine is a library. The Mac app, the chess GUI and the stand-alone UCI binary are three ways to use it.
The Mac app
Solver, tactics trainer, playing partner and board editor in one native window. It proves mates and problem-chess stipulations exactly, generates puzzles, analyses your games and prints puzzle sheets.
All featuresA chess GUI for any UCI engine
Play against Zugwunder, Stockfish or any other UCI engine, let engines play each other, run small tournaments from opening suites, and keep everything as PGN. Named after the cousin who taught me chess.
Wolfgang in detailThe engine on its own
One file for macOS, Linux (x86_64 and ARM64) and WebAssembly. Load it into Cute Chess, En Croissant, Banksia, Wolfgang or any other UCI chess program, or let it play in your browser.
Get the engineThe sidebar switches between them; the position on the board stays with you. A puzzle from the trainer can be solved, played out against the engine or edited.
Type a FEN, open a PGN or photograph a diagram from a book. Zugwunder finds the best lines with several variations at once, or proves a stipulation exactly: mate, helpmate, selfmate or stalemate in n, with the full solution tree and a warning when a problem has a second solution.
Puzzles from Lichess by motif and difficulty, your own puzzle library, and puzzles Zugwunder generates itself. Progress per puzzle and motif, hints when you want them, and a repeat mode for the ones that beat you.
Three strengths named Beginner, Club and Erik, an opening book and a clock with increments. Or play a different engine, limit Stockfish to an Elo, or watch Zugwunder take it on. Afterwards, a full game analysis with an evaluation curve and an annotated PGN.
Place pieces by hand, set the side to move and the castling rights, and let the app check that the position is legal before you solve, train or play from it.
The app grew from a mate solver into a complete chess workshop since late September. Here is what changed most recently; the full history is in the app’s release notes.
Choose the side to move, mate in one to six, and a queen, rook or pawn as the extra piece. Zugwunder draws a random three-piece endgame from its exact tables, verifies that exactly one first move mates in time, and hands the position to the trainer. Every puzzle is new, and every one is solvable.
Drop an image, paste one with ⌘V or pick a file: a diagram from a book, a scan or a screenshot. Recognition uses Anthropic’s Claude through your own API key, and the result is an editable proposal that you confirm before anything is solved. Interface, help texts and the model’s remarks now follow the app’s language.
A camera button in all four modes saves the whole window, title bar included, as a PNG wherever you like. Handy for a chess column or a club newsletter.
With UCI_LimitStrength on, UCI_Elo picks a level from 1100 to 3000. The scale was calibrated in more than 5,000 games against Stockfish 17.1 and is marked provisional until a second opponent and macOS have been checked.
The sixth network went into every build after 500-game matches against Stockfish and Arasan. The UCI implementation was completed to the 2006 specification, including pondering, searchmoves, go mate and node limits, and is checked by 32 protocol tests in every release.
zugwunder-uci became a separate program with builds for macOS, Linux x86_64 and ARM64, and WebAssembly. Both apps bundle their own copy and talk to it over UCI like any other engine.
A chess engine is the kind of program where every shortcut shows up as a lost game. There is no engine library underneath Zugwunder: move generation, search, the neural evaluation and its training pipeline, the endgame tables, the problem solvers, the apps and the updater are all part of the project.
The engine answers like any other UCI engine. A quick test in a terminal:
printf 'uci\nisready\ngo movetime 1000\n' | ~/bin/zugwunder-uci
It replies with its options, uciok, readyok, a few info lines and finally bestmove ….
Signed and notarised for macOS. The browser version needs no installation at all.