November 2, 2025
Before starting Uni, I tried coding a chess-engine to ready my programming skills. Now, in my last semester, I want to revisit the challenge. There I can reflect upon skills gained in software engineering and algorithm design. This time, I'm programming the engine in CPP instead of java.
Here is an overview of the components of a chess-engine:
| Component | Purpose |
| Move-generation | Generate legal moves for a position. Rules like en-passant and castling are to be considered. Move-generation can be done very efficiently using Bitboards. |
| Search | Search the game-tree. Optimization and parralelisation are major challenges |
| Evaluation | Evaluating a position. Both material value and strategy and tactics are considered. Here, neural networks can be used effectively |
| Databases | Probing opening and endgame databases during the game |
| Interfaces | Interacting with other chess programs using standard protocols like UCI |
In my implementation, I used the surge as a library for move-generation and Fathom for probing of the Syzygy tablebases (endgame-databases). In the following post I want to cover interesting details of my chess-engine. The (wip) engine is published on GitHub under the name Wombat.
This is me in September 2026. A full discussion of the implementation seems pointless to me. Last year, I implemented a basic chess-engine, but ran into various issues, and stopped after achieving an erroneus but passable result, which I did not benchmark. This is the Architecture so far:
The main components are eval.cpp and search.cpp. Move-generation and the memory-representation of positions are delegated to surge. There are the following helper components:
| Component | Description |
| EndgameDB | A frontend to Fathom. It can read end-game tables if one downloads them. |
| OpeningDB | A custom opening database query tool. The database is also custom, generated from a data-set of grand-master games |
| SearchThreadPool | Helps a custom implementation of parallel pv-search. (more on that see below) This was erroneus in retrospect. |
| TranspositionTable | Stores previous evaluated positions, the score can be reused while searching |
Right now i gave the implementation to Claude Code with the new Opus 5.5 Model with the main purpose of fixing my search. The (single!) prompt was basically this:
001Fix and improve this engine with the goal of reaching elo 1800
The fixed engine was benchmarked against stockfish:
| Stockfish Elo | Result (W-L-D) |
| 1800 | 200-0-0 |
| 2400 | 110-7-3 |
| 3000 | 13-41-26 |
Next, I implemented / vibe-coded an NNUE (efficiently updatable neural network) with no improvement in elo, but a 25% speed-up (see below). The Rest of the Blog-Post will be a write-up on search algorithms and the NNUE-architecture. Feel free to try, although anyone except top chess players will probably have no chance: Link.
To be continued.