Releases: jorgenhanssen/grail
Release list
Grail v2.0.1
Highlights
- Another round of datagen and training of the NNUE.
- Various bug/correctness fixes and performance improvements.
Search Improvements
- Added continuation correction.
- Tuned correction history weights.
- Razoring now uses the TT/search eval instead of the static eval.
- Use the TT/search eval instead of the static eval on the search stack.
- Skip null-move pruning when the static eval is below beta.
- Reduce quiet moves when the TT move is a capture.
Bug Fixes / Correctness
- Fixed an issue where futility pruning could prune the PV move at low depth (occasionally produced a wrong mate score).
- QS was storing the corrected eval in the TT. Now stores the raw static eval to avoid double-correction.
- No longer demote the PV move to a Cut node in the LMR re-search.
- Null-move pruning now returns the null score instead of beta.
- No longer store partial results from an aborted search in the TT.
- Preserve the existing TT move when an overwrite carries no move of its own.
- Fixed an i16 overflow in the score-drop check.
Misc
- General cleanup and dependency updates.
Elo gain over 2.0.0 (1 thread without endgame tablebases)
STC (10+0.1): +30.86 ± 4.21 Elo (10k games)
LTC (60+0.6): +34.28 ± 6.97 Elo (3k games)
VLTC (180+1.8): +33.11 ± 11.56 Elo (1k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v2.0.0
Time for a new version with some improvements I have made to Grail! The NNUE is now a fully self-taught network, and I thought that warranted a major bump 🎉 So here is 2.0.0:
New Features
Self-taught Evaluation
The new network has been trained from scratch over 6 generations of iterative self-play, totalling 67 million games. Previous versions used the old HCE as a bootstrap, but 2.0.0 uses knowledge derived from game outcomes.
Syzygy Endgame Tablebases
Grail can now load Syzygy tablebases for a slight increase in strength. Configurable with the new SyzygyPath and SyzygyProbeDepth UCI options.
go nodes
Added support for the go nodes UCI command.
Search Improvements
- History-scaled late move reductions (with continuation history)
- Capture history reductions
- Anti-reduction for PV moves replacing the old no-reduction guard
- Quadratic margin on singular extensions to prevent over-extension in long check chains.
NNUE Improvements
- Dual-perspective accumulator replacing the single STM input bit.
- Dead-neuron pruning in the linear layers for an NPS uplift.
- Per-neuron quantization scales in the accumulator instead of a single global scale.
Misc
- HCE has been yeeted.
- The
NNUEUCI toggle is gone with it. - General cleanup and module restructuring.
Elo gain over 1.1.0 (1 thread without endgame tablebases)
STC (10+0.1): +97.84 ± 4.66 Elo (10k games)
LTC (60+0.6): +75.03 ± 7.15 Elo (3k games)
VLTC (180+1.8): +80.27 ± 11.71 Elo (1k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.1.0
The biggest update to Grail so far!
New features, a reworked search, and a new NNUE for a roughly +270 Elo gain over 1.0.4.
New Features
Lazy SMP Threading
Grail now supports multi-threaded search via the Threads UCI option. Helper threads search at varied depths and pre-populate their results in the transposition table and correction history, seeding the main thread with data on positions it hasn't reached yet.
Elo gain for 4 threads vs 1 thread at various time controls:
Multi-PV Search
New MultiPV UCI option for analyzing multiple principal variations. Useful for analysis and opening exploration where you want to see more than the top choice.
Board Display
A new d command prints the board to the terminal. Mainly useful for debugging or quick visual inspection when running the engine directly. After a search, PV from/to squares are highlighted and per-PV eval bars are shown below the board.
Search Improvements
- Singular extensions with multi-cut pruning for uniquely strong moves.
- Correction history tables for static eval adjustment.
- Score-based aspiration window scaling.
- Anti-reductions for tactical moves replace the old zero-reduction bypass.
- SEE pruning extended to quiet moves.
- Removed null move verification search.
- Triangular PV table.
- Unified transposition table.
- Fractional reductions.
Move Ordering Improvements
- Threat-based bonuses in move ordering.
- MVV-LVA with proper LVA tiebreaking.
- Quiet check bonus gated behind SEE to filter out junk checks.
- Capture history updated from quiescence search.
- New bad quiets move ordering bucket.
- Removed killer moves.
New NNUE
New February 2026 net trained on 500M self-play positions. The training pipeline now blends eval and game outcome targets in WDL space, and uses multi-PV sampling to produce more varied training data.
Bug Fixes
- Fixed aspiration window overflow bug for mate scores.
- Fixed that the timer could fire during a subsequent search, causing
0000output. - Pawn attack maps now include all controlled squares.
- Removed buggy piece repetition penalty.
More technical details in #179.
Elo Improvement over 1.0.4 (1 thread)
STC (10+0.1): +272.51 ± 6.69 Elo (10k games)
LTC (60+0.6): +271.99 ± 11.29 Elo (3k games)
VLTC (180+1.8): +257.02 ± 17.40 Elo (1k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.0.4
Highlights
- Stronger evaluation from a retrained NNUE.
- Improved reduction logic based on more search context.
- Uses the best move from a partially searched iteration when the hard time runs out.
Bugs
- Avoids invalid PV lines exceeding the 50-move rule (fixes Fastchess warnings).
Misc
- Default
Move Overheadlowered to 10ms. - General search efficiency improvements.
Elo gain over 1.0.3
STC (10+0.1): +95.03 ± 5.33 Elo (10k games)
LTC (60+0.6): +102.97 ± 9.16 Elo (3k games)
VLTC (180+1.8): +109.45 ± 15.12 Elo (1k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.0.3
Highlights
- Phase-based NNUE output buckets: 8 separate output heads selected by piece count for better phase-specific evaluation.
- Fixed PV line truncation bug by disabling TT cutoffs in PV nodes.
- Null-move pruning now restricted to expected Cut nodes only.
Misc
- Removed Internal Iterative Deepening (redundant with IIR).
- Faster NNUE encoding via bulk u64 bitboard assignment.
- General code cleanup and performance improvements
Elo gain over 1.0.2
STC (10+0.1): +38.5 ± 5.3 Elo (10k games)
LTC (60+0.6): +41.0 ± 9.0 Elo (3k games)
VLTC (180+1.8): +56.8 ± 15.5 Elo (1k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.0.2
Improvements
- Reduce search depth in nodes when the transposition table doesn't have a best move (IIR).
- Late move reductions now applied at the root level.
- Improved move ordering when escaping from check - prioritizes king moves and cheaper pieces as blockers.
- More aggressive pruning using transposition table upper bounds.
Elo gain over 1.0.1
STC (10+0.1): +28.9 ± 5.2 Elo (10k games)
LTC (60+1.0): +22.6 ± 10.4 Elo (2k games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.0.1
Improvements
- Better at recognizing positions with insufficient mating material and avoids playing them for a win.
- Puts more effort into evaluating positions with potential pawn promotions.
- Improved time allocation for move-based time controls (e.g. 40/10).
- The
Move OverheadUCI option is now exposed (default: 20ms) to compensate for network or GUI latency. - Various search parameters have been refined through automated tuning.
Elo gain over 1.0.0
STC (10+0.1): +27.9 ± 5.3 Elo (10k games)
LTC (60+1.0): +19.5 Elo (500 games)
Downloads
- x86-64-v4: Modern CPUs with AVX-512 (2017+)
- x86-64-v3: CPUs with AVX2 (2013+)
- arm64: Apple Silicon
Grail v1.0.0
After working on it for a while, I feel my hobby chess engine is finally ready for v1.0.0. Not cutting edge, but plays a solid game.
Grail uses modern search techniques and evaluates positions using a simple NNUE trained on 500 million positions from self-play.
Development continues in my spare time, and I plan to release updates with several missing features and improvements like threading, tablebase support, and pondering. But don't worry! Grail supports all standard UCI time controls and analysis modes, so it works seamlessly with your favorite GUI for matches and analysis.