Tempest logo

Tempest

A chess engine written from scratch in C++. No Stockfish, no Leela, no borrowed code — every bitboard, every pruning rule and, since September, a neural-network evaluation trained only on its own games. It plays rated games on lichess as ProsperoBot, as CalibanBot on a Raspberry Pi 4, and as TrinculoBot, a one-ply ladder that measures the evaluation alone. It is still getting stronger — 180 blitz points in the four days after the network went live.

The neural network

An evaluation that trains itself on its own games

In August the hand-written evaluation was joined by a small neural network — HalfKP features, one 256-wide hidden layer — trained on nothing but Tempest's own self-play. No foreign engine labels a single position. A loop of play, label, train and test now runs around the clock across a small fleet of machines, and each generation that beats the reigning net in a gate match goes live on all three bots within minutes. This is where the loop is right now.

Right now reading the training status… Full dashboard →

Strength against the hand-written evaluation, generation by generation

Zero is the old evaluation. The first net, trained on 60,000 games, was more than 400 Elo behind. Eleven generations closed that gap a few points each and never crossed it. Then a code review found that the two king-perspective halves of the network had "own" and "opponent" swapped for one colour. Retraining generation 11 on identical data with that one fix took the net from level to roughly 370 Elo ahead with the full search behind it, and every generation since has been promoted by the gate. That fix, live on ProsperoBot from the evening of 5 September, is the jump on the rating chart below.

The engine

Everything in it was built here

Tempest is a complete alpha-beta chess engine: bitboard move generation, a principal-variation search with the modern pruning stack, a hand-written tapered evaluation, endgame tablebases, and time management that knows when to keep thinking. It speaks UCI, so it runs under any chess interface — but it spends most of its life on lichess, playing strangers.

On honesty about strength. This site quotes no invented Elo. The engine's rating is whatever lichess says it is after a few thousand rated games, and the Elo figures attached to individual changes come from self-play matches under a sequential probability ratio test — colour-swapped opening pairs, stopped when the likelihood ratio resolves, not when the number looks good.

Changes that failed that test were reverted, including several that seemed obviously correct at the time.

Playing strength

Four thousand rated games, in public

Every point on this chart was earned against a real opponent on lichess. The engine arrived in July at roughly 2200 and spent the month climbing — not smoothly, and not without the two visible collapses that followed changes later found to be regressions. Through August it held near 2480 blitz while the neural network was still losing to the hand-written evaluation in private. On 5 September the fixed network went live, and the chart did something it had never done before: blitz 2456 to 2638, bullet 2489 to 2570, rapid 2484 to 2513 in four days, with the rating still climbing when this page was last refreshed.

Score against the field

Measured over 200 recent games. The amber marker is what its rating says it should score. Tempest punishes weaker opponents far above expectation and under-performs against stronger ones — the signature of an engine that converts mistakes well but struggles to create an advantage on its own.

Changes that survived testing

Elo measured in self-play against the immediately preceding build. The early large gains were all structural — search shape and time allocation. Since the August evaluation programme, tuned evaluation terms have started earning their place on this list too.

Recent development

What has changed lately

Development runs in rounds: mine the engine's own games for a defect, reproduce it as a failing test, fix it, then prove the fix in a few thousand games before it ships.

The fleet

One engine, three bots

Since August the same binary plays on lichess under three names. Together they answer three different questions: how strong is it, how much of that strength is hardware, and is the evaluation actually getting better?

ProsperoBot

The flagship, on an Apple M1 Pro: four threads at roughly a million nodes per second each. Around 2640 blitz after 4,000 rated games, up from 2480 before the network. Everything else on this page is its story.

CalibanBot

The identical engine on a Raspberry Pi 4 — hardware measured at five to seven times slower. It answers the silicon question: around 2520 blitz, roughly 120 points behind the Mac, which is less than the hardware gap suggests. With the network it now plays at the level the Mac reached in August.

TrinculoBot

Search capped at a single ply: the raw evaluation playing bare, no lookahead to hide behind. Around 1490 blitz, and the one number on this page the network has not lifted yet — a bare net without search is a different animal from a bare hand-written evaluation. Every net that ships is tested here in public.

Sample games

Games worth a look

Real rated games from lichess, each linked to its page there for the full replay and analysis. Four wins against opponents rated 2600 and above, one six-move mate, and — because they are more instructive — two losses to the opponents it cannot beat. All from July, before the network; for what it plays like now, the live board is one click away.

Nemeses

The opponents it cannot beat

Every engine has them. What makes these interesting is that Tempest does not blunder against them — against bot_adario it errs at less than half its own average rate and still loses. It is not making mistakes. It is being outplayed, which is a much harder problem to find and a much harder one to fix.

And the ones it feasts on

The other half of the picture. Against opponents it out-rates, Tempest scores far above what its rating predicts.

Roadmap

Where the remaining strength is hiding

For a while the plan was to mine lost games for evaluation blind spots. That work was real but the findings kept coming back small, and the reason turned out to be structural: an audit that compares the evaluation against a search using that same evaluation can only ever detect self-contradiction, never self-consistent error. The current plan targets the search itself.