A Blundermind bot is a layered configuration that wraps a chess engine in a personality.
Each layer adds constraints and biases on top of the engine's raw move candidates, producing a bot with a
distinctive — and reproducible — playing style. Bots can be saved, loaded, and shared as .json files.
The Engine section determines which brain generates move candidates and how strong it plays. There are three engines, and one strength dial — the Elometer — serves all of them: Maia runs ELO 600–2600, Flounder ELO 600–2400.
A neural network trained on tens of millions of human Lichess games. Maia produces a ranked probability distribution over legal moves rather than a single best move, which makes it uniquely suited for human-like, stylistic play. Strength is set directly in ELO — the network itself is conditioned on it. A one-time 44 MB download; until it is downloaded, a Maia bot plays Flounder at the same rating.
Stockfish 18 lite does the chess; Flounder decides which of Stockfish's evaluated moves to play. Each turn one Stockfish search scores every legal move, Flounder draws how much the move should cost from a human-error curve measured for the chosen rating, and plays the legal move nearest that cost — so a 1200 Flounder makes mistakes of the size, and at the rate, a 1200 player does. Each rating was measured by playing it against Maia at the same rating. Nothing to download.
Blends Flounder and Maia by weight, move by move, each slot at its own rating. A 70/30 Maia/Flounder split plays mostly human-style, with Flounder's rated choices mixed in.
Puts an opening book in front of whichever engine is chosen. While the position is still in the Lichess explorer at the book's rating, the bot plays what real players of that rating chose, in proportion to how often they chose it; once the game leaves the book, Maia or Flounder takes over for the rest of the game. The book's rating is pinned to the Elometer by default, or can be set on its own — a master-level opening on a club-level middlegame, or the reverse.
Flounder is not a Stockfish release and is not endorsed by or affiliated with the Stockfish project. The name and the mistakes are Blundermind's; the chess is Stockfish's. See the credits for the full attribution and licence.
On Maia, temperature reshapes Maia's probability distribution before sampling — the formula and presets below.
On Flounder there is no probability distribution to flatten, so the same slider sets the shape of its mistakes instead, and the panel labels it that way (Error shape: Steady · Neutral · Streaky · Wild). Toward Wild, Flounder plays more moves that cost nothing at all, punctuated by rarer but bigger blunders; toward Steady, its mistakes are smaller and more even. Neutral leaves the measured rating exactly as calibrated; away from Neutral the rating moves too — an estimated 100–150 ELO at the ends, not yet measured — so the readout shows the shape parameter it is actually setting.
| Preset | T value | Behaviour |
|---|---|---|
| Top move | argmax | Fully deterministic — always Maia's #1 pick |
| Focused | 0.4 | Mostly top 1–2 moves; small variation |
| Neutral | 1.0 | Samples Maia's unmodified distribution |
| Varied | 1.8 | Wider sample; surprise moves more frequent |
| Wild | 3.0 | Even low-probability moves get meaningful weight |
The slider accepts any value from 0.1 to 4.0. The live chart shows the full per-move pipeline on a reference position: Maia's raw distribution → after temperature → after the personality reweighting scaled by the CP Budget. Note that on Maia, temperature governs only the sampled 70% of moves — 30% of the time the bot plays its top-ranked choice outright. Flounder has no such split: every move is drawn from its error curve.
On Maia, the personality layer operates on the ranked list of candidate moves Maia produces. On Flounder it works inside a band: Flounder's rating picks a move, the band holds every legal move within the CP Budget of that move's cost, and the attractors choose among them — so a strong personality can pull a Flounder bot toward better moves as well as worse ones.
The Centipawmeter sets the personality's allowance: the most real, engine-calculated centipawns a personality-driven pick may lose versus Maia's most-popular move. It does double duty — it scales how hard the attractor sliders push, and on Maia it is enforced literally: when the personality's pick differs from the popular move, a quick Stockfish evaluation checks both, and a pick over budget is rejected (the bot walks down its preference list until a move fits). On Flounder the budget is the width of the band described above, so no pick can leave it. At 0 cp personality traits are effectively disabled; at 300 cp the bot can genuinely sacrifice a knight to satisfy its style. On each move a Maia bot plays its top-ranked choice outright 30% of the time and temperature-samples the other 70% — opinionated, but never perfectly predictable.
A separate slider (always ≥ Budget) that is the absolute backstop on everything else — temperature sampling, Luck, Bad Day, and time-pressure mechanics. No played move may be more than the Floor's centipawns worse than the most-popular move, engine-checked. Slide it to the top (Off) and nothing is capped — a beginner-level bot can genuinely hang its queen, which keeps games winnable and fun for novices. The Engine panel shows both values beside the Elometer, with a one-click recommendation matched to the chosen ELO. Budget and Floor get separate ELO-scaled recommendations: Budget is the persistent per-move style spend (10 cp at master level up to ~120 cp for novices), while the Floor bounds the worst single move (80 cp up to ~520 cp). The Floor applies to Maia moves only, and the panel greys it out for a bot that only ever plays Flounder, saying why: Flounder chooses its moves by Stockfish's evaluation, and its occasional real mistake is the rating working as measured, so capping it afterwards would remove exactly what the rating is supposed to produce.
A dual-thumb slider that selects a band within the candidate list ranked by Maia probability — how often players at the chosen rating play each move, which is not the same as engine quality. The right thumb excludes the most-expected mainstream moves; the left thumb excludes the rare tail. The tail isn't a defect zone: sharp tactics and unconventional ideas often live there, so restrict it only if you want predictable, book-standard play. Default: 0–100% (the full distribution).
The 11-spoke radar summarises the active attractor profile. Drag any spoke node directly, or use the sliders below the radar. The radar updates live.
Each attractor adds a continuous bias score to candidate moves. Scores are summed across all active attractors and re-rank the whole candidate list; the bot then plays its top-ranked choice 30% of the time and temperature-samples the re-ranked list the other 70%, with the CP Budget verifying the final pick's real cost. Sliders run −5 (left label) to +5 (right label); 0 = neutral (no effect).
| Attractor | Left (−) | Right (+) | Mechanism |
|---|---|---|---|
| Chaos Agent | Simplifier | Chaos Agent | Scores via Stockfish MultiPV σ (std-dev of top-N evaluations). High σ = tactical, branching position. |
| Complicate When Winning | Simplify when winning | Complicate when winning | Activates when eval ≥ +100 cp. Boosts (or suppresses) moves that increase MultiPV variance — keeping complications alive vs. trading into a clean win. |
| Space Cadet | Space Waster | Space Cadet | Counts weak squares (empty, unattacked) in own camp before/after each candidate using full attack maps. Positive = reduce weak squares; negative = cede space. |
| Fort Knox | Glass Cannon | Fort Knox | Sums total defender count across all own pieces. Positive = maximise defensive support; negative = expose pieces aggressively. |
| Gambito | Gambit Shy | Gambito | Opening phase only (first 20 moves). Boosts ECO-matched gambit lines; falls back to pawn-sacrifice detection (pawn moving to an opponent-attacked, undefended square). |
| Trade Seeker | Trade Avoider | Trade Seeker | Reweights by capture and threat value. Positive = boost captures and new threats (a threat never scores above a capture); negative = avoid exchanges. |
| Structure | Loose structure | Rigid structure | Pawn-structure penalty counted before and after the move (pawn islands, doubled and isolated pawns); only the bot's own pawn moves can change it. Positive = consolidate; negative = open, mobile structure. |
| Hustle | Overthinker | Coffeehouse Hustler | Scales think-time allocation: t = base × (1 − v × 0.15). Also feeds directly into the degradation curve input — a hustler at +5 thinks ~0.3 s and sees steep ELO drops. |
| Luck | Good day | Bad day | Shifts the sampling window within Maia's ranked list. Positive = sample from the tail (off-form, lower-probability moves); negative = sample from the top of the distribution. |
| Panicky | Calm under pressure | Panicky | Scales the steepness of the time-pressure ELO degradation curve. Positive = sharper ELO drop in the final seconds; negative = flat curve regardless of clock. |
| Attacker | Peacemaker | Attacker | Two tiers: captures first, then attacks. Every capture outranks every quiet move; among quiet moves, the one that adds the most attacks on enemy pieces wins. Capture: 0.75 + 0.25 × tanh(Δattacks / 2); quiet: 0.5 × tanh(Δattacks / 2). A capture keeps credit for the attacks on the piece it took. Negative (Peacemaker) avoids captures most, then new threats — for calm that still trades, use Tension → Defuser. |
Six additional sliders bias move selection toward or away from moves that involve specific piece types. Range −5 to +5. Example: a Queen +4 bot will preferentially find moves where the queen participates, within the cp budget.
Boosts/suppresses pawn advances and pawn captures. Does not affect forced captures.
Rewards knight manoeuvres. Combines well with closed-position preferences (rigid structure + Fort Knox).
Boosts diagonal play and bishop-pair exploitation. Works well with a loose-structure preference.
Rewards rook lifts and file seizure. Most impactful in the middlegame/endgame transition.
Positive = active queen, early development, queen-led attacks. Negative = conservative, avoid premature queen exposure.
Positive = king activity and endgame aggression. Negative = king-safety priority, prefer the castled position.
Pre-configured attractor profiles that set all 11 attractors at once. Any individual slider can be tweaked after applying a personality — the name clears when a manual edit is made.
| Name | Tag | Character |
|---|---|---|
| Captain Entropy | Chaos | Maximises complexity; keeps complications alive; attacks aggressively. Chaos +4, Gambit +3, Attacker +2. |
| Norm | Order | Prefers closed, simplified positions. Chaos −4, Complicate −4, Structure +4, Defuser −2. |
| Attacky McTackerson | Captures | Takes whatever it can within the cp ceiling; with nothing to take, piles attacks onto your pieces. Attacker +5, Trade +3 — nothing else shares its budget. |
| Overthinker | Methodical | Deliberate; long think times; likely gets into time trouble. Hustle −4, Panicky −3, Structure +3. |
| Coffeehouse Hustler | Fast | Fast imprecise early play, tightens in the endgame. Hustle +5, Luck +2, Gambit +2. |
| The Blunderer | Human | Plays well then cracks unexpectedly under pressure. Luck +3, Panicky +5. |
| The Hoarder | Material | Never sacrifices material voluntarily. Trade −3, Gambit −3, Luck −2, Defuser −2. |
| Pawn Chain Gang | Pawns | Maximises connected pawns and pawn structure. Structure +5. |
| Spite Check | Checks | Always checks if a check exists. Chaos +3, Attacker +3, Trade +2. |
| Clock Watcher | Clock | Conservative when ahead on time; reckless when behind. Panicky −3, Complicate −2. |
| Grandmaster Bad Day | Human | Maia 2400 skill but samples from low-probability moves. Luck +5, Panicky +2. |
Custom controls let you write board-feature rules not covered by the fixed attractors. Each control selects a metric, optionally gates on game phase, advantage state, and time pressure, then applies a continuous bias to move candidates that increase (or decrease) that metric.
| Category | Metric | What it measures |
|---|---|---|
| Pawns | Passed pawns | Own passed pawns (no enemy pawn ahead on file or adjacent files) |
| Pawn advancement | How far own pawns have advanced from the start rank | |
| Doubled pawns | Own doubled pawns | |
| Isolated pawns | Own isolated pawns (no friendly pawn on an adjacent file) | |
| Pawn islands | Number of separate pawn groups | |
| Connected pawns | Pawns supported by a neighbour (phalanx or chain) | |
| Pawn structure | Overall health — fewer islands, doubled and isolated pawns | |
| Pieces & activity | Centralization | Rewards knights, bishops, rooks and queens near the centre |
| Outposts | Minor pieces on advanced squares defended by own pawn, unchallenged | |
| Mobility | Total squares own pieces attack — proxy for activity | |
| Bishop pair | Whether own side holds both bishops | |
| Rooks on open files | Own rooks on files with no pawns | |
| Rooks on the 7th | Own rooks on the enemy's second rank | |
| Development | Knights and bishops off the back rank. Best gated to the Opening phase. | |
| Material | Material balance | Own material minus opponent's (P=1, N/B=3, R=5, Q=9) |
| Pieces on board | Total pieces — slide left to simplify, right to complicate | |
| Queens on board | Queens still on the board | |
| King | Enemy king pressure | Own attacks on the 9 squares around the enemy king |
| My king safety | Enemy attacks on the 9 squares around own king | |
| My pawn shield | Friendly pawns sheltering own king | |
| Gives check | Boosts moves that put the enemy king in check | |
| Threats | Enemy pieces attacked | Distinct enemy pieces own side attacks after the move |
| Loose enemy pieces | Enemy pieces attacked and undefended — free-material radar | |
| My hanging pieces | Own undefended attacked pieces | |
| Piece defense | Total defensive coverage of own pieces | |
| Square control | My weak squares | Empty squares in own camp no longer controlled |
| Holes in enemy camp | Empty squares in the enemy half the opponent doesn't control | |
| Central control | Control of d4, e4, d5 and e5 | |
| Space | Empty squares in the enemy half own side controls |
Any — fires every move
Opening — first ~20 moves
Middlegame — pieces on board
Endgame — few pieces remain
Any result — always active
When winning — eval ≥ +100 cp
When losing — eval ≤ −100 cp
When equal — |eval| < 100 cp
Any clock — always active
Bot pressured — bot < 30 s or < 15%
Opp pressured — opponent in time trouble
Either side — either clock low
Custom controls can be stacked. All active controls score candidates simultaneously; the scores are summed with the attractor scores before selection.
No opening book. The engine picks from move 1.
Follows the most popular book moves from either the Lichess Masters database or the Lichess community database, up to a configurable book depth (default 20 moves). A "Modern only" filter restricts to games from 2010 onward. White and Black can have separate settings.
Define up to several opening lines by name (e.g. "Sicilian Defence", "King's Gambit"). Each line gets a percentage weight. The bot randomly selects a line each game according to the weights, then follows the Lichess book within that opening. White and Black repertoires are configured independently.
Book sources: Lichess Masters · Lichess Community
Think time is computed before the engine is queried. It combines the timing mode, the Hustle attractor, clock-pressure shortcuts, and a ±20% jitter to produce an actual seconds value — which then feeds directly into the time-pressure degradation curves.
| Mode | Behaviour |
|---|---|
| Fixed interval | Constant pause between all moves. Set the delay in seconds. Simplest and most predictable. |
| Instantaneous | Responds at engine speed (effectively 0 delay). Useful for analysis or speed variants. |
| Complexity scaled | Think time scales with position complexity (measured as the spread of Stockfish's top evaluations). Tactical positions get more time; forced sequences get less. Mimics human time allocation. |
| Mirror user | Bot matches the human's move rhythm ± a configurable offset. If you played fast the bot plays fast; if you took 30 seconds it will too. Creates a psychologically realistic feel. |
The Hustle attractor (from the Personality section) acts as a global multiplier on the timing mode's base time:
A Hustle +5 bot cuts think time by 75%. This same t_actual value is the input to both degradation
curves — not a clock percentage.
Each mode's setting sits directly beneath it in the panel — Fixed interval has its Duration, Mirror user its Speed offset — so you can see what every mode is tuned by without selecting it first.
Three modifiers layer on top of whichever mode you pick, and they are what make the pacing feel human rather than mechanical:
| Modifier | What it does |
|---|---|
| Reconsideration pauses | Occasionally hesitates and takes noticeably longer, as if changing its mind mid-thought. |
| Move blink on forced moves | Plays obvious recaptures and forced replies almost instantly (200–500 ms) — the human reflex of not thinking about a move that has only one sensible answer. |
| Clock-pressure mirroring | Speeds up when your clock runs low, the way a real opponent presses when they smell a flag. |
Blink overrides your timing mode. It is checked before the mode is consulted, so a bot set to a fixed 22-second interval will still snap out obvious recaptures in a fraction of a second. So that the interval you set is the interval you get, selecting Fixed interval switches blink off and highlights the row to say why. Switch it back on whenever you want that behaviour — the panel respects your choice.
In fast chess, players premove: they queue their reply before the opponent has moved, so it fires the instant the opponent's move lands. It saves precious seconds — but it commits blind. The premove doesn't react to what you actually played. That is the whole point, and the reason it can be punished.
Switch premoving on and the bot does the same thing: it guesses your reply using Maia, decides its own answer in advance, and plays that answer the moment you move — whatever you actually played.
How to trap it. Play a move the bot didn't predict and its committed reply can walk a piece onto a square you control, or leave something hanging. If your move makes the premove illegal — you pin the piece, capture it, or move its target away — the premove is busted: the bot has to think from scratch and burns extra time on its own clock. Baiting premoves is a real bullet skill, and this is where to practise it.
| Control | What it does |
|---|---|
| Min confidence | The one that matters most. How sure Maia must be of your reply before the bot commits. 85% mirrors real play — humans premove on near-forced replies, not coin flips. Drop it far below ~60% and the bot premoves into positions a human never would, so its play looks erratic rather than fast. |
| Premove rate | Of the moves that already cleared the confidence bar, the percentage it actually premoves — not a percentage of all moves. 100% = every time it's confident. |
| Only when low on clock | Optional. Restricts premoving to time scrambles, as humans do. Two independent triggers sit under it — your clock, or the bot's — and either one alone is enough to start it premoving. |
| Busted-premove delay | Extra thinking time when you bust one — the "didn't see that coming" stall. This is your reward for springing the trap. It can never flag the bot. |
Premoving requires the Maia 3 model, since the prediction runs on it. Live counts of premoves armed, fired and busted appear in the panel while you play, and the collapsed Move Timing header always reports whether premoving is on — a bot that answers instantly looks broken if you don't know the setting is active.
Two independent curves describe how the bot's play deteriorates as its clock runs low.
As think time per move shrinks, the bot's effective ELO is reduced. The curve starts on a power-law time–rating model: D(s) = 339 − 1442·s−0.283, shifted so the bot plays its full configured ELO at the nominal pace of the chosen time control (base/60 + increment seconds per move) and degrades from there — halving think time costs roughly 100 ELO at rapid pace, more in blitz. It is a fit of IM Kenneth Regan's rating-loss vs time-control data, from his Perpetual Chess Podcast interview with Ben Johnson. The Max ELO drop slider caps how far the curve can fall, and every control point stays draggable, so you can reshape the curve directly on the chart.
A bot configured at ELO 2400 in time trouble does not suddenly play like a calm 1900 — it plays like a stressed 2300: still strong, but more likely to pick from the wrong part of the distribution.
Separately, the move quality window shifts under time pressure. At full time the bot samples from its normal quality range. As time runs low, the window shifts downward (toward weaker moves) by a configurable amount. This captures the empirical finding that time-pressured players don't just play at a lower "level" — they make a specific kind of mistake: playing the first plausible move rather than the best one.
Both curves can be disabled with the Pressure Off toggle — for a bot that never cracks no matter the clock.
Any bot configuration can be saved as a .json file and reloaded in any Blundermind session.
Click Start to lock in the current configuration. Use the Save bot file
button to download a .json snapshot. Optionally give the bot a name — the name is stored in the file.
Click Load bot file and select a .json file. All settings are restored: engine,
ELO, temperature, all attractors, piece preferences, custom controls, openings, timing, and degradation curves.
The loaded bot's name is displayed above the controls.
What is saved: engine mode, ELO, temperature value, all 11 attractor values, 6 piece-preference values, all custom controls (metric, phase, advantage gate, time-pressure gate, strength), opening mode and repertoire for each colour, book source and depth, timing mode and parameters, both degradation curves, and the personality name if one is selected.
Configure the bot in the Bot Controls panel. Select your colour (White / Black / Random). Set the time control (untimed, or any Fischer/delay format). Press Start. The board switches to playing mode, and Bot Controls remains open to let you monitor the bot's active state during the game.
Resign — ends the game immediately; prompts for confirmation.
Draw offer — handled by the bot's draw behaviour (Personality → Draws & Desperation): it can
accept and offer draws judged at its own rating's blurred evaluation, and seek stalemate swindles when
lost — or leave it all off for a bot that always plays on.
Save game — download the game as PGN at any point.
Rematch — immediately restarts with the same bot settings and swaps colours.
In Expert (pro) mode: the result is displayed in the notation column; Resign and Draw buttons disable after game over.
While playing a bot, all board-vision indicators remain available in Learning mode: threat circles, capture safety, pins, forks, discovered attacks, x-ray pressure, overloaded pieces, weak squares, and the check-threat overlay. These are independent of the bot and provide real-time positional feedback.
| Goal | Key settings |
|---|---|
| Human-like club player | Maia 1200–1500 · Neutral temp · Luck +2 · Panicky +1 · Fixed timing 3–8 s |
| Tactical slugger | Maia or Flounder 1800 · Varied temp · Attacker +4 · Chaos +3 · Trade +3 |
| Positional grinder | Flounder 1600 · Steady error shape · Structure +3 · Fort Knox +2 · Hustle −3 |
| Gambit specialist | Maia 1400 · Varied temp · Gambito +4 · Chaos +2 · Repertoire openings |
| Time-trouble simulator | Any engine · Pressure degradation enabled · Panicky +3 · Hustle +3 |
| Openings trainer | Flounder 2200 + Lichess Opening Book · Repertoire with target lines · Depth 25 · Instant timing |
| Endgame trainer | Flounder 2000 · Steady error shape · Pawn-advancement custom control (Endgame gate) |
| Bad-day Grandmaster | Maia 2400 · Wild temp · Luck +5 · Panicky +2 · "Grandmaster Bad Day" preset |
All ELO values are relative playing strengths within the Blundermind engine; they are not official FIDE ratings. · Back to top ↑