Author: Inuway
Focalors Focalors: All-in-one Chess Engine, Training Platform, PGN reader to analyze imported games and custom GUI. Built from scratch in pure Rust. Features a hybrid HCE/NNUE engine, NNUE training pipeline, puzzles, analysis, and adaptive strength, all in a single binary..
What's in this release
Local play against the engine at configurable strength, with a responsive board and clock.
Game review — step through any finished game and see per-move engine evaluation and best-move suggestions.
PGN import — paste a game from any source to run a full review.
Puzzles — tactics training from a local puzzle set.
Statistics & history — persistent SQLite-backed history of your games and stats over time.
UCI mode for use as an engine in external chess GUIs (focalors uci).
Cross-platform binaries for Linux (x86_64), macOS (aarch64), and Windows (x86_64), attached below.
Known limits & roadmap
The engine is playable and improves with the bundled NNUE, but strength tuning is ongoing.
The GUI is intentionally compact — some features (deeper analysis views, opening explorer, etc.) aren't there yet.
Performance work (parallel analysis, SIMD NNUE inference) is on the roadmap.
Contributions, bug reports, and feedback are all welcome.
Focalors 0.3.0 what's new?
Double-click to launch. The released binary now starts in GUI mode when you run it with no arguments. Previously it defaulted to UCI protocol mode — fine if you knew to run ./focalors gui, confusing if you didn't. UCI mode is still there via ./focalors uci for plugging into external chess GUIs.
Stronger play. Promoted a new NNUE network (gen3) trained on additional self-play data — 10 epochs warm-started from the v0.2.0 net with 6,000 fresh depth-8 self-play games. Opening preference shifted from b1c3 to e2e4 from the starting position, no broken behavior in tactical or middlegame spot-checks.
~15% faster NNUE evaluation. L2 and L3 forward passes are now SIMD-vectorized (L1 already was as of v0.2.0). Forward-pass microbench: 661ns → 565ns. On top of that, search now prefetches the next position's TT entry after each move and uses stack-bounded arrays instead of per-node heap allocations in move ordering.
Mate scores are now correct across moves. Mate-in-N scores stored in the transposition table were being read back unmodified at later plies, which could report the wrong mate distance after the search persisted across moves. Now correctly ply-adjusted on store and probe. Existing search behavior on non-mate positions is bit-identical (same node counts and PVs at depth 14 across baseline positions).
Crash recovery in the GUI. If anything inside the analysis or search worker threads panics, the UI no longer gets stuck — the analysis spinner returns to Idle and the engine status returns to ready instead of "thinking forever". RAII guards fire on every exit path, including unwinds.
Dev / release builds stay aligned. Local builds and CI now use the same x86-64-v3 baseline as the released Linux/Windows binaries, eliminating a class of "works on my machine" bugs where dev builds quietly used AVX-512 that release binaries didn't have.

Comments
Post a Comment