A chess engine with a board attached. Twenty opponents live in it, from someone's first game of chess up to a grandmaster — and level 20 is the whole engine at full strength, not trying to be kind.

Drag a piece with the mouse, a finger, or the arrow keys. Everything else is in the menu: who plays white, who plays black, the level, the clock, the colours, the language, the sound.

Twenty opponents, not one engine turned down

Levels 1 to 19 climb from around 580 to 2640 rating points, roughly a hundred and twenty a rung — first game of chess, beginner, casual player, club player, tournament regular, master, grandmaster. The menu shows each level's rating and who it plays like as you pick it.

Searching less far is not enough. A network judging positions one ply deep already plays around 1500, so no cut in depth on its own reaches a beginner — and an engine that plays the best move of a crude evaluation is dull, never careless. Below full strength five things give at once: the engine looks less far ahead, judges positions more crudely, misjudges them on purpose (usually a little, occasionally by a piece), picks among the root moves worth playing instead of always the same one, and simply fails to notice some moves at all. That last one is what makes the low levels leave a piece hanging; nothing else does.

Treat the ratings as estimates, but they were anchored outside the engine rather than left to self-play: the middle of the ladder was played against networks trained to imitate human play, which run as bots and so carry a rating earned against people over hundreds of thousands of games.

Nothing depends on the machine, either. A level is never a time or a node budget, and every choice is drawn from the position's own hash — so a level misjudges the same position the same way every time, and is the same opponent in a browser tab as on a desktop.

 Playing

  • Mouse or touch: drag a piece and drop it. Dropped on an illegal square it flies back.
  • Keyboard: arrows or WASD to move, X or Enter to pick a piece up and put it down.
  • Z or Esc opens the menu, F turns the board round, Tab changes the colour scheme, U takes a move back, R starts again.
  • Whichever you touched last is the one in charge, so the keyboard is never taken away from you by a mouse you did not move.
  • Six languages — English, French, Spanish, German, Italian, Portuguese — picked from your browser at start-up and changeable in the menu.

In the browser

The first load fetches the neural network — about 22 MB, cached by the browser afterwards — and the menu is usable while it arrives. Levels 1 to 19 are pure search depth rather than a time budget, so they play exactly the same here as on a desktop, however slow the tab; level 20 is as quick as your machine and browser allow.

Download it and it goes faster

The same game is downloadable for Windows, Linux and macOS, and one binary does two things.

Run it with nothing after it and the board opens, exactly as it does here — but native, with every core of your machine and no 22 MB to fetch. That is where level 20 is worth meeting: in a browser tab the engine is boxed in by what WebAssembly and a single worker allow, and on your own machine it is not.

Run it from a chess interface instead — Arena, Cute Chess, En Croissant, anything that speaks UCI — and it never opens a window at all: it answers as an engine, ready to be analysed with or entered in a tournament. `gaiachess --no-gui` skips the wait and speaks UCI straight away. Levels are there too, as the `Skill Level` option, so the same twenty opponents are available in whatever interface you already use.

Under the board

This board is a coat of paint on a UCI chess engine, written from scratch in Rust: NNUE evaluation, principal variation search with the usual apparatus of pruning, reductions and extensions, multi-threaded search, and endgame tablebases — including 3-to-4-piece tables built into the binary, so it knows exact mate distances with nothing to configure.

Free software

© 2003–2026 Jean-François Romang. Distributed under the GNU General Public Licence, version 3 or later; it comes with no warranty. The source is on GitHub — read it, change it, pass it on under the same terms.

Credits

The story

The first Gaia was born in June 2003, in a student flat in Strasbourg: C code written between classes, debugged with printf, tested against Crafty on a single-core Pentium. Six versions in three years, a few French computer chess championships, and then life happened — silence from 2006 to now. Gaia 4 is a complete rewrite in Rust; not one line of the original survives. Coming back after twenty years felt like waking up in the future.

Links

Download

Download NowName your own price

Click download now to get access to the following files:

gaiachess-html5.zip Play in browser
Version 4.2.6
gaiachess-windows.zip 41 MB
Version 4.2.6
gaiachess-linux.zip 42 MB
Version 4.2.6
gaiachess-osx-arm64.zip 42 MB
Version 4.2.6

Comments

Log in with itch.io to leave a comment.

love the UI! very snappy and responsive

Thank you! Glad the snappiness comes through ; everything is drawn into a CPU framebuffer pixel by pixel, old-school style, so there's not much between your click and the screen. Have fun playing!

Very strong engine.  Well done.

My Ninny Chess Club follows a similar pattern -- UCI engine with personalities built on a PeSTO foundation, then converted to run as WASM.  Have a look.

Thank you! GaiaChess actually keeps a PeSTO eval under the hood too: the lower skill levels blend from pure material through PeSTO up to the full NNUE as you climb the ladder. I'll definitely check out Ninny Chess Club, personalities are a great angle. Cheers!

NNUE is an fascinating and throughly modern approach, just like your Rust choice. Ninny Chess Club doesn't need NNUE to crush human opponents, although I considered it.  Instead, I went with standard classical chess engine techniques I remember from Shredder and Crafty days.  PeSTO keeps it very fast, of course.  Hope you give it a go on "Deadly" level vs. Prodigy.  Good luck with GaiaChess.