Luna CE v2.5.0 released — now running 24/7, with a serious strength jump on Lichess

Discussion of chess software programming and technical issues.

Moderator: Ras

Spunc595
Posts: 24
Joined: Mon Jul 06, 2026 12:15 am
Full name: Daniele Marpino

Luna CE v2.5.0 released — now running 24/7, with a serious strength jump on Lichess

Post by Spunc595 »

Hi everyone,

I'd like to share the new release of Luna, my UCI chess engine written in Rust: Luna CE v2.5.0.

What Luna is

Luna combines classical bitboard move generation (magic bitboards for sliders) with a quantized NNUE evaluation (HalfKP 256×2-32-32-1, Stockfish-compatible network format), incrementally updated on make/unmake. Search is negamax/PVS with iterative deepening, aspiration windows, a transposition table, and the usual pruning family (reverse futility, futility, null move with a zugzwang guard, mate distance pruning, LMR, quiescence with SEE and delta pruning). It falls back cleanly to a classical PST evaluation if no NNUE file is present.

What's new since v2.1.0

Move ordering: added a counter-move heuristic and capture history (both new signals alongside the existing killer moves and SEE/MVV-LVA ordering). The plain history heuristic was rewritten to use a self-limiting "gravity" update instead of a hard cap, plus a malus for quiet moves that were tried but didn't cause a cutoff — instead of only ever rewarding successes.
A real bug fix from a lost game: the UCI go command parser mishandled value-less flags like ponder. When a GUI/wrapper sent go ponder wtime X btime Y ..., the misalignment made Luna silently fall back to a fixed 5-second budget instead of reading the actual clock — the likely cause of a time forfeit from a completely winning position. Fixed, and pondering is disabled anyway since Luna doesn't implement the pondering protocol.
ARM64 support: working cross-compilation to aarch64, plus a NEON SIMD path for NNUE inference (previously ARM builds fell back to scalar code). Runs natively on ARM Linux and Android.
Housekeeping: cleaned up a messy repo (a stale duplicate copy of the source tree had accumulated at the root), removed dead code, translated all source comments to English for a wider audience.
Infrastructure

Luna now runs 24/7 on an Oracle Cloud ARM instance instead of my personal laptop, so it should be reliably reachable for games/challenges going forward rather than only when my machine happens to be on.

Results

Since deploying the fixes above and moving to dedicated hardware, Luna's Lichess bot ratings have climbed noticeably over the past few weeks: bullet 2001→2268, blitz 1787→2267, rapid 1794→2241. (Lichess bot ratings, not directly comparable to CCRL or other formal lists, but a real trend worth sharing.)

Links

GitHub: https://github.com/Spunc595/Luna-Chess-Engine
Lichess (challenges welcome): https://lichess.org/@/LunaEngineChess
Feedback and games against Luna are always welcome — happy to hear what breaks it.
Spunc595
Posts: 24
Joined: Mon Jul 06, 2026 12:15 am
Full name: Daniele Marpino

Re: Luna CE v2.5.0 released — now running 24/7, with a serious strength jump on Lichess

Post by Spunc595 »

Update on Luna CE: since the v2.5.0 announcement, I've rewritten the NNUE from scratch (Akimbo-style architecture, embedded directly in the executable — no more external file to place correctly, which was likely the cause of a previous tournament result with zero wins). Live ratings on Lichess (LunaEngineChess) are now above the estimate I gave in the original post across every time control: bullet 2306, blitz 2322, rapid 2351, classical 2354. v3.0.0 with this rewrite is coming in the next few days.

Since then I've been testing several new search heuristics (persistent move-ordering history, continuation history, TT age-aware replacement, correction history) — all came back SPRT-neutral or negative, even against the new eval. I've since pivoted to systematically tuning the existing search constants (RFP/futility margins, LMR formula, null-move reduction) via self-play SPSA rather than adding more heuristics. Curious what others have found actually moves the needle once the "easy" heuristics are in place — always happy to hear what's worked for you at this stage.