I Beat Stockfish 8 In Bullet
I've gone back and forth on whether this game was even worth writing up, mostly because on its own it's a ten-second bullet moment and not much more than that. But the more I thought about it, the more I wanted to use it as an excuse to actually write about Stockfish itself, because I don't think most players who play against it on Lichess every day know very much about what they're actually playing against, myself included until I started digging into it for this post. So this is going to be part game, part small history of the engine, and part a look at two other players who beat the same opponent I did, in circumstances a good deal more impressive than mine.
What Stockfish Actually Is
Stockfish began in 2008, developed by Tord Romstad, Marco Costalba, and Joona Kiiski, building on an earlier engine of Romstad's called Glaurung, which he had released back in 2004. Glaurung itself is worth a mention, since most people who talk about Stockfish today have never heard of it. It was a competent engine for its era, nothing revolutionary, but it had clean bitboard-based move generation and a search structure that was easy for other programmers to read and extend. When Romstad decided to open the codebase up and rename the project, he wasn't starting from zero, he was handing over a foundation that already worked, which is part of why the early growth of Stockfish was so fast compared to engines that were built in isolation by a single author.
It's been open source under the GPL from the start, which is part of why it ended up everywhere. Anyone can download it, run it locally, and even submit changes to it, and for over a decade now a large volunteer community has been doing exactly that.
This is worth sitting with for a second, because it's genuinely unusual in the world of high-performance software. Most of the strongest tools in any competitive domain are proprietary, built by a company with a commercial reason to keep the internals hidden. Stockfish inverted that completely. There's no company behind it, no paywall, no closed beta. The strongest chess engine on the planet, full stop, has always been something you could download for free in under a minute, with the source code sitting right there for anyone who wanted to understand exactly how it worked or try to make it better.
The turning point for Stockfish as a project was the creation of Fishtest in 2013, a distributed testing framework that lets anyone donate spare CPU time to test proposed changes to the engine against its current version, tens of thousands of games at a time, with the results checked statistically before anything is merged in. Before Fishtest existed, testing a proposed change meant one developer running a batch of games on their own machine and eyeballing the result, a terrible way to evaluate anything with the kind of noise chess games produce. A single game, or even a hundred games, can go either way for reasons that have nothing to do with which version is actually stronger. Fishtest solved that by making scale free. Volunteers install a worker client, it pulls a test job from the queue, plays out games in the background using idle CPU cycles, and reports the results back. Multiply that across thousands of volunteers running in parallel and you get statistical confidence in days that would have taken a single developer years to gather alone.
In the twelve months after Fishtest launched, Stockfish gained around 120 Elo points, a genuinely enormous jump in engine terms — roughly the difference between a strong club player and a titled player. No individual programming insight caused that jump. It was the testing infrastructure itself that changed, meaning every small, honestly-marginal improvement that used to get rejected for lack of evidence, or accepted based on a lucky run of games, could now be measured properly and merged in with real confidence. And it's stayed on that framework ever since. As of a couple of months ago, Fishtest has burned through more than twenty thousand years of cumulative CPU time testing changes, across something like ten billion individual games. That number alone should give you a sense of why it's been sitting at or near the top of every serious computer chess rating list for so long.

The graph most people reference when they talk about this shows roughly what that translated to in rating terms over the years, and it's worth sitting with for a second, because the shape of that curve isn't smooth. There's a long, steady climb through the early 2010s as Fishtest ground out incremental gains version after version, the kind of progress that looks unremarkable on any given month but compounds into something huge over a decade, and then a sharp step upward around 2020. That step is NNUE.
NNUE stands for "efficiently updatable neural network," and it's the single biggest change in Stockfish's history. Before June 2020, every version of Stockfish evaluated positions the old-fashioned way: a large set of hand-written heuristics, weighing things like material, king safety, and pawn structure, layered on top of alpha-beta search and bitboard move generation. It was pure calculation with no learned component at all. If you wanted to understand why the classical engine liked a given position, you could, in principle, trace it back to a specific term in a specific evaluation function some programmer had written and tuned by hand. That's a strength in terms of interpretability, but it's a hard ceiling in terms of raw playing strength, because human intuition about what makes a position good is genuinely worse than what a large enough neural network can extract directly from millions of positions.
The alpha-beta search itself deserves a quick word too, since it's easy to talk about NNUE and skip past the part of the engine actually doing most of the heavy lifting move by move. Alpha-beta is a way of pruning the astronomically large tree of possible chess games down to something a computer can actually search in a reasonable amount of time, by cutting off branches the moment it can prove they can't possibly beat a branch already found. Combined with bitboards, which represent the position as sets of 64-bit integers so that operations like "generate every legal knight move" reduce to a handful of bitwise operations instead of loops over squares, this is what lets Stockfish evaluate tens of millions of positions per second on ordinary consumer hardware. NNUE didn't replace any of that — it replaced only the evaluation function sitting at the leaves of the search tree, the part that decides how good a position actually is once the search has reached it. Everything else about how the engine explores the tree stayed the same.
Then in June 2020 the Stockfish team merged in an NNUE-based evaluation function, a small neural network trained on positions rather than hand-tuned by programmers, originally adapted from an idea developed for Shogi engines before someone realized it transferred well to chess. Within about two months it was already outperforming the classical version by close to a hundred Elo at short time controls — an almost unbelievable jump for a project that had been grinding out single-digit Elo gains per version for years. Stockfish 13, released in February 2021, pushed that further with a larger network and better training data, adding at least another thirty-five Elo over Stockfish 12. By Stockfish 14 that summer, the classical evaluation had essentially been phased out entirely in favor of NNUE, and every version since has just been refining and enlarging the network further, alongside the usual search improvements Fishtest keeps validating.
It's worth putting this in context against the other big name in modern computer chess, since people bring it up constantly. Leela Chess Zero, and the DeepMind system that inspired it, AlphaZero, use a fundamentally different architecture: a large convolutional or transformer-based network doing most of the positional evaluation, combined with Monte Carlo tree search instead of alpha-beta. For a stretch of time that approach looked like it might genuinely leapfrog the classical engines, since AlphaZero's early demonstration games against Stockfish 8 in 2017 were strikingly one-sided. But NNUE closed that gap from the other direction, giving Stockfish's traditional search the benefit of a learned evaluation without giving up the raw search speed alpha-beta and bitboards provide. The two families of engines now trade the top spot on various rating lists depending on hardware and time control, and the debate over which approach is "really" stronger has mostly cooled into an acknowledgment that both are far, far beyond any human.
The version most of us actually play against on Lichess, though, is the level 8 preset, and it's worth being precise about what that is, because it's not the same thing as "playing Stockfish." Lichess's bot levels are a deliberately engineered ladder, not a straightforward dial on search depth. Level 8 is deliberately capped in depth and, depending on the build Lichess is running, has some evaluation noise built in specifically so that it can be beaten by strong human players under normal conditions. The lower levels go even further, sometimes deliberately choosing a move that isn't the engine's actual top choice so that a beginner has a fighting chance. Level 8 sits near the top of that ladder, strong enough to punish careless play badly, but engineered to still occasionally miss things a full-strength engine simply would not.
It's still a very strong opponent relative to almost every human on the platform. It is not remotely the same engine that's been winning the Top Chess Engine Championship and the Computer Chess Championship every year since 2020, sitting at an official CCRL rating in the mid 3600s on a single core, and pushing toward 4000 on the kind of multi-core hardware nobody has sitting in their house. To put that number next to something familiar, Magnus Carlsen's peak classical rating sits in the mid 2800s. Full-strength Stockfish isn't just stronger than the best human on earth, it's stronger by a margin roughly equivalent to the gap between an elite grandmaster and a strong club player. Level 8 will beat you badly if you play carelessly. Full-strength Stockfish would not lose to a human in this lifetime.
Understanding What Elo Actually Measures
It's easy to throw rating numbers around without stopping to say what they mean, so a short digression here feels worthwhile before getting back to the games themselves. Elo isn't a scale of "skill points" in any absolute sense — it's a purely relative measure derived from the outcomes of games between rated players, calibrated so that a 200-point gap translates to roughly a 75 percent expected win rate for the higher-rated side, and the gap compounds from there. A 400-point gap is closer to a 90 percent expected win rate, and by the time you're talking about an 800 or 1000 point gap, the lower-rated side is expected to win only a tiny fraction of games, occasionally, on a good day, against a mistake. That's the shape of the gap between an average online player and full-strength Stockfish. It isn't that the human is unlikely to win — it's that the human is expected to win close to never, and the rare wins that do happen tend to come from precisely the kind of situation the next section is about, where the engine itself hands over a mistake and the human still has to be alert enough to take it.
A Previous Game
I have played Stockfish 8 more times than I can count at this point, mostly in bullet, mostly the way everyone does, half out of curiosity about where my own instincts hold up and half just to have something to premove against between real games. Most of those games are forgettable in the way bullet games against a computer usually are, the kind of thing you play out of habit while waiting for a real opponent to show up in the lobby, and forget about within the hour. This one I found genuinely amazing, enough that I wanted to put the first few moves on display rather than just describe it in passing, because it's a much better illustration of how fast bullet chess actually punishes people than anything I could write about it in the abstract.
The opening itself isn't worth walking through move by move. Nothing about it was unusual, no early deviation, no provocation on either side, just the kind of position both sides reach without thinking too hard about it. What matters is the moment right before things went wrong, and I want to be precise about it rather than dress it up, because the honest version is more interesting than the version where I come out looking clever.
I had a premove queued on Be3, a completely ordinary developing move in the structure we'd reached, the kind of move that barely registers as a decision in bullet. You see the shape of the position, you know the bishop belongs there, you queue it, and your attention moves somewhere else entirely, usually to the clock, sometimes to nothing at all. That's the entire premove culture in one sentence: you're trading a small amount of certainty about the current position for a large amount of speed later, and almost every bullet player does this constantly without thinking of it as a trade at all.
Stockfish played Bg4. On its own, that's simply a blunder. There's no trick to it, no deeper point buried underneath, the bishop was just hanging, and the correct response was to take it with the queen and be up a full piece for nothing. The engine wasn't baiting anything, it has no visibility into what a human has queued up on their end of the board, and level 8 in particular is perfectly capable of dropping a piece outright if the position calls for a move that happens to look reasonable and isn't, since the noise built into its evaluation exists precisely to let this kind of thing happen. It's easy, after the fact, to want to tell a better story than that, one where the machine somehow knew what was coming. It didn't. It just made a mistake, the same way a human opponent occasionally does when they misjudge a position under time pressure.
The problem was entirely on my side of the board. My premove had already been queued before Stockfish's move ever registered on the screen, which meant Be3 fired the instant it was legal to play it, with no chance for me to look at the position first and see the piece sitting there for free. Instead of Qxg4 and an extra bishop, I got Be3, walking my own queen straight into the pin on the d1 square, and a move later the queen was simply gone. So this wasn't really Stockfish punishing a premove in any clever sense. It handed me a free piece, and through no fault of its own, I turned it down in about the most expensive way available. Two blunders happened on that board in the space of two moves, and mine was by a wide margin the more costly one.
There's a broader point buried in this that I think about more than the game itself. Bullet chess against an engine is one of the only settings where you get to watch, in real time, exactly how a small commitment made a second ago collides with new information. In a slower game you'd simply see the piece hanging and take it, no story to tell. It's the speed of the format that turns an ordinary tactical opportunity into a comedy of errors, and honestly that's a big part of why bullet against engines stays interesting even once you know intellectually that you cannot outcalculate the thing on the other side of the board.
A Real Win Against Level 8
I want to be clear that my result above says nothing about the strength of level 8 itself, so I want to show what an actual, earned win against it looks like. NM ZugAddict, a USCF National Master who's been a fixture on Lichess for years, carries a trophy on his profile called the Zug Miracle, and according to his own profile it comes from a genuine bullet win over Stockfish level 8, twenty-eight moves, checkmate, no from-position setup, played out in full under a real bullet clock. It's well known enough on Lichess that it comes up in the forums whenever people ask about the site's rarer, one-off trophies, and it's treated with a kind of quiet respect that a lot of other bot-beating trophies don't get, precisely because everyone who's tried it knows how unlikely a clean win actually is.
Twenty-eight moves at bullet speed is long enough that there's no single lucky tactic carrying the whole result. That's a full game won under time pressure against an opponent that doesn't get careless just because the clock is short, which is a completely different achievement from what happened in mine. A National Master's rating already sits well above the vast majority of players on the platform, and even at that level, a clean win over level 8 is rare enough to be worth a permanent trophy rather than something that happens routinely in the background of a normal session.
The Long Game
The opposite end of the spectrum from bullet is correspondence chess, where the clock effectively disappears and each move can take a day or more to play. I want to include a second game here from a Lichess player named DwcHwng, whose rating was still provisional at the time, playing level 8 in a casual correspondence game that ran seventy-five moves and ended in checkmate, DwcHwng playing white.
Seventy-five moves in correspondence chess is a genuinely long game, the kind of length that usually only happens in one of two situations: either both sides are grinding out a technical endgame that takes real patience to convert, or the position stayed sharp and close for a long stretch before finally resolving. Correspondence removes essentially every advantage that time pressure gives an engine over a human. There's no clock to punish hesitation, no need to move instinctively, no cost to sitting with a position for twenty minutes before committing to a plan. Whatever an engine's advantage is in correspondence chess against a human who takes the format seriously, it isn't speed, since that variable has been removed entirely from the equation. It comes down purely to depth of calculation and the quality of long-term planning — exactly the kind of contest a human can occasionally win against level 8 specifically, since level 8 is still a capped engine rather than the genuine full-strength version.
I don't want to reconstruct the middlegame plans or the specific tactical sequence from memory here and risk getting the details wrong, since a seventy-five move game deserves an accurate move-by-move treatment rather than a rough paraphrase. What I can say with confidence is the shape of it: a long game, run entirely without time pressure, that ended in checkmate for the human side, which by itself tells you something about how differently this bot behaves once you take speed out of the equation entirely. If there's appetite for it, a full move-by-move breakdown of this one is exactly the kind of follow-up post I'd want to do next.
The Game I Won
I'll end with the full game from the top of this post — no further analysis needed.
XDXDXD, hope you enjoyed it! Obviously, I didn't actually beat Stockfish in a real game (the board editor may have helped a little 😅), but this is what the game looked like.
To be clear, I haven't truly defeated Stockfish. Without using the board editor, I wouldn't be able to beat it — but it was still fun to create this game and see how it played out with fool's mate. This isn't the end, there are still people who do defeat Stockfish as high as Stockfish 18, one of the examples being SatishShiva who defeated my bot, @TheTrillionDollar (3116 rating) in a 1+0.
Nothing is impossible, and you can do anything.
One More Thing
As some of you know, I have recently programmed and published my new game on CrazyGames named Brickzo, and I would love it for you guys to try it out. It's a browser-based project I've been building from the ground up, and getting it in front of real players matters a lot more than it might sound like from the outside, since a good chunk of whether a game like this sticks around long-term on the platform comes down to whether people are actually opening it and playing. It's completely free, and I need people to begin playing it for my game to become permanent. Although it isn't directly related to chess, I'd love to receive your feedback on my game, good or bad, since I'm still actively iterating on it and would rather hear about something that feels off now than after it's locked in.
https://www.crazygames.com/game/brickzo-uad
Thanks all for reading my blog — stay tuned, there's more coming on both the chess side and the dev side.
