Real-time chess analysis and automated play on Chess.com, Lichess, BlitzTactics, TakeTakeTake and ChessBase Tactics. Mephisto reads the position straight off the page, runs Stockfish (NNUE), Fairy-Stockfish or Maia entirely in your browser — no server, no account — and draws the best move on the board, or plays it for you with timing and move choices tuned to look human.
Click the toolbar icon to toggle a floating panel over the board. Unlike a normal extension popup it stays open while you click and play, so analysis and autoplay keep running for the whole game.
Fair play · Install · Engines · Features · Sites · Settings · Footprint · Roadmap
Using this in a live game against another person violates the Terms of Service of every chess site. Account closures are typically permanent, applied at the device and payment level (so your other accounts go too), and ratings, prizes and tournament results get rolled back.
This extension cannot make you undetectable. What catches engine users is server-side and behavioural: move agreement measured over many games, think-time distributions that look nothing like a person's, accuracy that doesn't fit your rating history. Those are statistical and aggregated across your account — they don't care what your DOM looks like. The anti-detection work here addresses one narrow thing, passive client-side fingerprinting: a site noticing the extension is installed. Even the people writing detection for it call that a corroborating signal that shouldn't trigger a sanction alone. Reducing your footprint changes a footnote in a case file, not the case.
Genuinely good for: reviewing your own finished games · studying openings and endgames · puzzles and tactics · engine development and benchmarking · analysis boards and offline play · unrated games where your opponent knows.
You are responsible for how you use this.
An actively maintained continuation of Mephisto by Alex Petrusca. Installed from upstream today it detects nothing — the 2026 Chess.com and Lichess redesigns broke every scraper. This fork revives it and goes well past it. Everything the original did still works.
New here:
- Engines — modern Stockfish dev / 18, the human-like Maia and Maia-3 nets, and an Elo cap.
- Playing like a person — Humanize, Clock Mode and Mirror Time.
- Automation — Safe Premove, Pondering, Help Mode, Manual Mode and rebindable hotkeys.
- Beyond the engine — the Opening Explorer, an endgame tablebase and the puzzle database.
- On screen — the eval bar, the eval history graph, screen reading and a playable panel board.
- Coverage — Chess.com variants, TakeTakeTake, Chess960 and fourteen languages.
- Under the hood — a zero-iframe panel with no page-visible extension URLs, move-correctness guards, copy FEN/PGN and settings export/import.
Distributed as an unpacked extension, not through the stores.
- Download or clone this repository.
- Open
chrome://extensionsand enable Developer mode. - Load unpacked → select the repository folder.
- Pin it: puzzle icon right of the address bar → pin "Mephisto Chess Extension".
Every release carries two archives:
mephisto-<version>.zip |
~585 MB | First install, always. Everything, engines included. |
mephisto-<version>-update.zip |
~6 MB | Already have it. Code only — extract over your existing folder. |
Nearly all of the full archive is bundled engines: 874 MB of neural nets and WASM under lib/engine, plus 13 MB of
onnxruntime under lib/ort. Those change on almost no release, so the update archive leaves them alone and carries
only the ~1 MB of extension code — about a hundredth the download.
⚠️ Extract the update over your existing install, never into an empty folder. Without the engines it cannot run. If you do it anyway the panel says so rather than failing obscurely — it checks for the bundled engines at startup and tells you to fetch the full archive.
Extract in place. Chrome derives an unpacked extension's id from its folder path, so replacing files in the folder you already loaded keeps the same id — and native engines, which are registered against that id, keep working. Unpacking into a new folder changes the id and means re-running the native-host installer.
To pick up a change: reload on chrome://extensions, then reload the game tab. The panel checks this repository for
a newer release at most once every 12 hours, from the service worker, so the chess page never makes the request.
Chrome never updates an extension you loaded yourself, so Mephisto can do it for you instead — Settings → General → Updates. It is off by default, and nothing about it runs until you switch it on.
Set-up is three steps, once:
- Automatic Updates → On. Chrome asks for permission to download from this repository's releases. Refusing leaves the switch off.
- Choose Extension Folder → pick the folder you loaded as an unpacked extension. Chrome remembers it.
- Install Update when one is offered.
After that it is one button. It downloads the ~6 MB update archive, writes it over that folder and reloads the extension — the same extract in place described above, so your extension id survives and native engines keep working. Reload any game tab you had open afterwards.
Once all three are in place you don't have to come back here at all: the panel's own update notice becomes the button. It reads "Update available — v… — click to install" and does the whole thing. With anything missing it stays what it always was, a link to the releases page, because there would be nothing to click that would work.
What it will not do:
| Install anything by itself | It checks and it tells you. Files are only written when you press Install Update. |
| Touch the bundled engines | The update archive doesn't contain them, so lib/engine and lib/ort are left alone. |
| Write into the wrong folder | A folder is rejected unless its manifest.json is this extension's. |
| Apply a broken download | The whole archive is unpacked and checked in memory first. If anything is off — a bad path, a version that disagrees with the release, a missing file the extension needs to boot — nothing is written at all. |
| Anything at all, while switched off | Every button is disabled, the panel stops offering one click, and the installer refuses outright. Switching off records that choice and keeps it, whether or not Chrome agrees to hand the permission back. |
The permission is scoped to this repository's release downloads, not to github.com. You can see it, and take it back, on
chrome://extensions— or just switch Automatic Updates off, which hands it back for you.
Updating by hand still works exactly as before, and is still the whole story if you'd rather not grant anything.
Everything runs locally via WebAssembly — no server, no account, nothing leaves your machine.
| Engine | Notes |
|---|---|
| Stockfish dev NNUE | Latest development build. Default. |
| Stockfish 18 / 18 Small NNUE | Full dual-net build (large net ships split and is stitched at load), or the lighter net. |
| Stockfish 11 HCE | Classical eval, no NNUE — light and fast. |
| Fairy-Stockfish 14 NNUE | Required for variants; each variant has its own bundled net. |
| Maia-3 | Human-like, not throttled: a transformer conditioned on a rating you set live, 600–2600. |
| Maia | The original Maia-1 nets, one per band (1100–1900, plus a 2200). |
| Tetrarch (4-player) | Four-player chess only — see four-player chess. Needs a one-time install. |
| Remote / native | A real engine binary outside the browser — see full-power engines. |
Maia-3's live rating slider · Atomic analysed by Fairy-Stockfish
Illegal scraped positions (missing king, wrong side in check, back-rank pawns) are blocked before they can crash the engine, and a crashed engine auto-restarts, capped at 3 attempts.
Strength cap — limit any Stockfish/Fairy engine to a target Elo with an engine-aware slider whose stops follow
that engine's real UCI_Elo range. Both ends mean full strength.
Chess960 works on every mainline Stockfish via UCI_Chess960, including every castling case. Fairy-Stockfish
adds all of Lichess's variants (Crazyhouse, King of the Hill, Three-Check, Antichess, Atomic, Horde, Racing Kings)
plus Chess.com's Duck, Minihouse, Seirawan and Chaturanga. The ↻ button beside the variant selector detects the
variant and switches engine for you.
Duck, Minihouse, Seirawan and Chaturanga have nets but the bundled chess.js can't replay them — the panel says so instead of analysing the wrong position.
- Multiple lines — top 1–5 candidates (MultiPV), each drawn with its evaluation.
- Eval bar — vertical bar beside the board, from your perspective, plus an eval history graph shaped like
Lichess's, marking where the opening, middlegame and endgame begin (ported from scalachess's
Divider). - Threat analysis — the opponent's strongest reply, so you see what they're threatening.
- Move confidence — how much better the best move is than the second:
clearly best (+3.7),+0.35 over #2,several equal,only move. Read off the MultiPV lines already on screen, so it costs no extra search. - Explain moves — names the tactic behind the choice (fork, promotion, winning capture, mate). Deliberately conservative: pins, skewers and discovered attacks can't be established from the position alone, so it stays quiet rather than guessing.
- Opening Explorer — how humans played this opening (Lichess database): the name, the most-played replies with their win/draw/loss split, and coloured arrows. Masters, all Lichess, or a club band.
- Read a position off the screen — the camera button captures the tab, finds the board and loads it. Any site: a video, a diagram, an image. Nothing is uploaded. Follow screen re-reads twice a second so a board playing elsewhere keeps the panel in step.
- Playable panel board — click or drag to walk a line, with underpromotion. Every move is kept as a line you can click back into.
Three candidate lines, each its own arrow · the explorer's book moves on the board
Reading a position straight off a YouTube video — a board reading is a guess and says so, naming its least-confident
squares (least sure: e4 pawn 62%).
Analyse a finished game on the extension's own page — Settings → Game Review. Paste a PGN, load a .pgn, or
fetch a player's recent games from chess.com's public archive. Nothing is uploaded: the text stays in the tab and
the search runs in the extension's own engine.
- Any bundled engine, at your budget — a WASM Stockfish at a fixed depth (reproducible on any machine) or a native host at a time per position. 1–10 candidate lines, your own thread and hash counts.
- Accuracy and move quality — Lichess's win% and accuracy formulas, and the same 30/20/10 bands the panel judges live moves by, so a review agrees with what the panel said at the time.
- What you actually gave up — every position is searched once, so the score before a move and the score after it come from the same search at the same budget, and the played move's rank in the engine's own list is exact.
- Eval graph — click anywhere on it to jump the board there. Blunders and mistakes are marked.
- Think time — read from the
[%clk ...]comments chess.com and Lichess both write. - Human model (optional) — a second pass with Maia, which predicts what a human of a chosen rating plays rather than what is best. Different question, different answer, and the combination is the interesting part.
- Fair-play indicators — engine-match rate overall and in the positions where being right is hard, think-time variability, how often the fastest moves were the engine's. Presented as measurements, never a verdict, each with what it is worth and what else explains it.
- Export — one self-contained HTML file with the graph, the move table and the indicators. No scripts, no external anything; it opens anywhere, forever.
- Autoplay — plays the engine's move for you. Help Mode draws the arrows instead and overrides it.
- Safe Premove — while the opponent thinks, certifies a reply to their predicted move: the same move at depth 13, depth 14 and the latest depth. An exact match fires instantly; anything else searches normally, so a wrong guess costs nothing. Forced moves and true recaptures queue as a real site premove, and an illegal one auto-cancels. On Chess.com, a line forced two moves deep queues both replies at once.
- Pondering — searches the opponent's whole think at full threads over their top 5 replies. Off, their turn is capped at two threads (not one: premove certification needs depth 14).
- Play Book Moves — plays the opening from the Explorer, weighted-random among popular replies. Needs 20+ games and within 40cp of the engine's best, so variety never costs you a worse move.
- Endgame tablebase — at 7 pieces or fewer the position is solved, so it asks Lichess's Syzygy tables for the perfect move and outranks both engine and book. Off by default: it sends the position to a third party.
- Manual Mode — thinks indefinitely and plays nothing until you press the play key.
- Background Play (off by default) — moves fire only while the tab is focused and visible; a move that comes due while you're away is deferred and re-issued when you return.
Seven shares set how often it plays the top move, a 2nd/3rd/4th line, an inaccuracy, a mistake or a blunder; separate thresholds set how far each may stray in centipawns, with a live Lichess accuracy estimate of the win-chance drop. Defaults sit on Lichess's own boundaries — 110cp inaccuracy, 230cp mistake, 377cp blunder. Nothing past the blunder threshold is played, and blunders never fire in a decided game.
Timing follows: quick on obvious moves and openings, long thinks in critical positions, and an instant reflex only for true recaptures and forced moves — snapping off a piece that merely moved in to attack looked suspiciously fast. A countdown shows what kind of move is coming.
Clock Mode budgets each move off the page clock (~time/30 + 60% of the increment); Mirror Time paces to the opponent's last spend −10%. Both size the search to the time they'll spend, so the wait becomes a deeper move.
Pace to Clock is separate and off by default. Clock Mode paces the search; this paces the simulated delay — the think pause and the cursor travel — which is what actually costs you time in a scramble. With clock to spare your settings are used exactly as they are: it only ever makes a move shorter, never slower, and never below the point where the click stops looking like a hand moved it.
Priority — Time: Mirror ▸ Clock ▸ Humanize ▸ Search Time. Move: Book ▸ Humanize ▸ engine best.
3999 is the ceiling — there is no higher number Lichess will show you · every action rebindable
Hardest (+600) puzzles back to back, from the database rather than searched. The full clip runs a minute and a half at higher quality.
Puzzle Mode optimises for solving speed — every move is one it actually searched, and the opponent's scripted reply is never analysed. A puzzle page ships no move list, so the position is rebuilt from the pieces alone: en passant is recovered from the last-move highlight and castling rights from the king and rook still at home, because without them an ep capture is illegal and nobody can castle in any puzzle.
Puzzle database — a searched move is not always the puzzle's answer; a puzzle has one line that scores, and an objectively stronger move still fails it. Import Lichess's database and the panel looks the position up instead: on a hit the whole solution is known, so it plays it with no search at all. Works on Training, Storm and Racer.
Lichess only for now, and it doesn't even ask elsewhere — that file is built from Lichess games, so a Chess.com position would be a guaranteed miss.
Chess.com puzzles. The reader shipped in v3.1.207 — the same settings page, the same import button, and the format is detected from the file, so there is nothing extra to choose. Importing both databases gives you both: they key on the position, so neither overwrites the other. A database of 620,000+ Chess.com puzzles with their solutions will be published once the upstream pull request is merged; it covers rated tactics and the daily archive.
Building your own Chess.com puzzle CSV — the exact format the importer accepts
The header row is required and must begin with fen3. That is the only thing that tells the importer this is a
Chess.com file rather than a Lichess one — without it the rows are read as Lichess and every one is discarded.
fen3,id,rating,initialFen,tcnMoveList,colorOfUser,pgn,passRate,averageSeconds,gameLiveId,gameId
| # | column | required | meaning |
|---|---|---|---|
| 0 | fen3 |
yes | board + side to move + castling. Only the first two fields are used as the key. |
| 1 | id |
yes | puzzle id, or daily-N for archive puzzles — the prefix switches the move format |
| 2 | rating |
no | ignored on import |
| 3 | initialFen |
daily only | full 6-field FEN; used to replay the SAN of a daily- row |
| 4 | tcnMoveList |
yes | solution in Chess.com TCN — or SAN for daily- rows |
| 5 | colorOfUser |
tactics | white/black, the side solving. Empty for daily. |
| 6+ | pgn, passRate, averageSeconds, gameLiveId, gameId |
no | never read, but the columns must be in this order |
Whose move comes first differs by row type, and getting it wrong shifts every solution by a ply:
- Rated tactic —
fen3is the opponent to move andcolorOfUseris the solver, so the first move is the opponent's setup move. The importer applies it and keys on the position after it, exactly as it does for Lichess. daily-row — no setup move and nocolorOfUser. The side to move infen3is the solver and the line starts immediately.
TCN is two characters per move over this alphabet, index 0 = a1 and 63 = h8:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?{~}(^)[_]@#$,./&-*++=
A promotion pushes the destination past index 63: the piece is "qnrbkp"[(to - 64) / 3] and the real destination is
from ± 8 + ((to - 64) % 3) - 1, the remainder carrying the file shift (capture left, straight, capture right).
Three rules your generator must respect:
- Write real CSV. The
pgncolumn contains literal newlines and doubled""quotes. The importer reads these rows with a proper streaming parser, so quoting must be correct — but that also means a naive line-per-row generator will produce a file it cannot read. - Key on the first three FEN fields only. Halfmove and fullmove counters vary between sources for the same position; they are not part of what a puzzle is.
- Branch on
idbefore choosing an encoding. Adaily-row holding TCN, or a rated row holding SAN, is silently dropped rather than mis-decoded.
Rows the importer cannot make sense of are skipped, not fatal — the status line reports how many of the rows read were kept.
Importing the puzzle database — about a gigabyte, roughly half an hour, once
Not bundled: the release zip is large enough already. Download lichess_db_puzzle.csv.zst from
database.lichess.org, decompress it (unzstd lichess_db_puzzle.csv.zst —
browsers have no zstd decoder, which is why this step is yours), then pick the .csv under Settings → General →
Puzzle Database. About six million positions, with a live count as it goes. Nothing is sent anywhere; it lives in
the extension's own IndexedDB. If the import is interrupted nothing is lost — run it again and it fills in the rest.
Drag by the title bar, close with ✕. Compact (▣) collapses it to the status line, move and score; minimize
(–) hides it entirely behind a badge while autoplay keeps running. Quick Settings edits every setting inline.
Re-detect (↻) rescans the page. Copy FEN / PGN — a game that began from a custom start exports with
SetUp/FEN tags, so it reads back as the same game. A grid button takes a pasted FEN to analyse any position;
⧉ opens the position on Lichess. An engine health dot shows whether a native host answered, because a missing
host otherwise just looks like a panel that never evaluates.
TakeTakeTake, whose board is a WebGPU canvas with no DOM to scrape.
| Site | Analysis | Autoplay | Premove | Puzzles | Online | Variants |
|---|---|---|---|---|---|---|
| Chess.com | ✅ | ✅ incl. Play Bots | ✅ | ✅ Rush / Storm | ✅ | 3-Check, KotH, Crazyhouse, Antichess, Atomic, Horde, Racing Kings, Duck, Minihouse, Seirawan, Chaturanga + Chess960, 4-player |
| Lichess | ✅ | ✅ incl. AI & From Position | ✅ | ✅ Storm · Racer · Training | ✅ live & correspondence | All Lichess variants + Chess960 |
| TakeTakeTake | ✅ | ✅ bot games | ✅ | — | ✅ Lichess-backed | — |
| BlitzTactics | ✅ | ✅ | — | ✅ puzzle streams | — | — |
| ChessBase Tactics | ✅ | — | — | ✅ Solve / Sprint | — | — |
You don't need this. The bundled WASM engines work with zero setup. But WASM is sandboxed — it can't use all your cores or much RAM, so it runs 5–70× slower than a native binary. Point Mephisto at a native Stockfish and Chrome auto-launches it; there is no server to run. Two extra engines appear in the dropdown, running at all cores and up to 2 GB hash.
Setup — macOS, Linux, Windows
You need a native Stockfish binary (optionally Fairy-Stockfish for variants), Python 3 with
python-chess, and your extension ID — open chrome://extensions with Developer mode on and copy the long id
under Mephisto.
⚠️ An unpacked extension's id changes when you reload it. If native engines stop working after a reload, re-run the install command with the new id.
macOS
brew install stockfish fairy-stockfish
python3 -m pip install chess
native-host/install-native.sh --ext-id YOUR_EXTENSION_IDA binary downloaded from the web is quarantined by Gatekeeper — the installer clears that for its own copy.
Linux
sudo apt install stockfish
python3 -m pip install chess
native-host/install-native.sh --ext-id YOUR_EXTENSION_IDFor Fairy-Stockfish, install it or pass --fairy /path/to/binary.
Windows — the shell installer is macOS/Linux only; native messaging needs a registry key, so this is manual:
install Python and pip install chess, download stockfish.exe, copy native-host/uci-native-host.py somewhere
stable with a sf-native.path file next to it holding the full path to the exe, write a host manifest
com.sf_native.host.json (underscores — Chrome rejects hyphens) pointing at a .bat that runs the host script with
"allowed_origins": ["chrome-extension://YOUR_EXTENSION_ID/"], and add registry key
HKCU\Software\Google\Chrome\NativeMessagingHosts\com.sf_native.host = the manifest path. Prefer the bundled WASM
engines unless you're comfortable with the registry.
The installer registers the host for Chrome, Brave, Edge, Chromium and Vivaldi. Firefox isn't supported for native engines. Any native build unlocks full speed — pick the one matching your CPU (Apple Silicon, AVX2, BMI2); the gap between native builds is small, the jump from WASM to any of them is huge.
Chess.com's 4-player chess (/variants/4-player-chess), analysed by
Tetrarch — a purpose-built engine for 14×14 four-seat boards, because
no two-player engine can be bent into one. Pick Tetrarch (4-player) in the engine dropdown; the panel switches to
it on a four-player board and back to Stockfish when you leave.
Teams mode on Chess.com — the panel's own 14×14 board, rotated so you sit at the bottom, with the engine's move drawn on it and the evaluation bar in team colours.
The panel swaps its own board for a 14×14 one with the corners cut, rotated so you sit at the bottom whichever seat you drew, and draws the suggested move as an arrow. The evaluation is normalised to your team (Red+Yellow against Blue+Green), so it means one thing all game instead of flipping sign every seat. Autoplay works.
Teams mode only, for now. Tetrarch does not search free-for-all, so FFA games are detected and shown but not analysed.
Promotions are played in full: the picker Chess.com opens over the board is found by its shape — a small panel of four pieces in two rows — rather than by a class name, so a generated class changing cannot make it click the wrong piece. If nothing matches that shape it plays the move and leaves the piece to you, which is what it always did. With Multiple Lines above 1 you get an arrow per line on the page board and on the panel's own 14×14 board, with a colour-matched list of scores beneath it.
The mode is read from Chess.com's own mode label, which is a guess about someone else's markup — and it decides the rules the search runs under, since promotion is the 8th rank in free-for-all and the 11th in Teams. When that guess is wrong, Mode in the panel (it takes the Variant row's place for Tetrarch) sets it by hand: Auto-detect, Teams or Free-for-all. Changing it re-analyses the position already on screen rather than waiting for the next move. Autoplay also works on the analysis board, not just in a game — it's your own board, so playing a line out on it affects nobody. The lobby and setup pages stay excluded.
Setup — macOS, Linux, Windows
Tetrarch is the one engine with nothing bundled behind it: it needs a checkout and one run of the installer. Until then the panel says so under the board rather than pretending to analyse.
You need Python 3, a C compiler, and your extension ID — chrome://extensions with Developer mode on, copy
the long id under Mephisto.
macOS and Linux
git clone https://github.com/IchNukeDichWeg/Tetrarchcd Tetrarch && ./setup.shsetup.sh builds the C core and installs what it needs (Homebrew, apt, dnf or yum). Then, from the Mephisto folder:
native-host/install-native.sh --ext-id YOUR_EXTENSION_ID --tetrarch /path/to/TetrarchDrop --tetrarch if the Tetrarch checkout sits beside Mephisto's parent folder — that's where the installer looks by
default. It prints -> tetrarch: <path> when it found it and -- tetrarch: no uci.py at <path> when it didn't.
Windows
Two differences from the above: the C core has to be built as a DLL, and Chrome finds native-messaging hosts through the registry rather than a folder of manifests — so there's a PowerShell installer instead of the shell one.
Install MSYS2, then from its MINGW64 shell:
pacman -S --needed mingw-w64-x86_64-gcccd /c/path/to/Tetrarch && ./setup.shThat produces build\tetrarch.dll. Then, from PowerShell in the Mephisto folder:
powershell -ExecutionPolicy Bypass -File native-host\install-tetrarch.ps1 -ExtId YOUR_EXTENSION_IDAdd -Tetrarch C:\path\to\Tetrarch if the checkout isn't beside Mephisto's parent folder. The installer copies the
host into %LOCALAPPDATA%\Mephisto and registers it for Chrome, Chromium, Edge, Brave and Vivaldi under HKCU — no
administrator rights needed. Python 3 must be on PATH.
The Windows path is built and symbol-checked but not yet run on a real Windows machine — the DLL is cross-compiled and verified in CI-style by
win-crosscheck.shin the Tetrarch repo, which is not the same as someone having played a game on it. If something misbehaves, please open an issue — see Contributing for the four stages worth reporting. WSL works today with no extra steps, since it's the Linux path above.
Settings → Appearance → Language, applied immediately without a reload.
English, Deutsch, Español, Français, Português, Italiano, Nederlands, Polski, Türkçe, Русский, 中文, हिन्दी, 日本語, 한국어 — each listed in its own language, because a list written in English doesn't help someone looking for theirs.
Deliberately not Chrome's chrome.i18n, which follows the browser's UI locale with no way to override it. One
flat JSON per language under src/i18n/locales/, English underneath every other as the fallback. Every string is
translated including the long settings tooltips — the ones explaining what a setting actually does are the ones worth
having in your own language. Engine names, board and piece themes, and chess notation are left alone on purpose.
The options page — right-click the toolbar icon → Options, or the gear in the panel. Quick Settings in the panel is a subset writing to the same storage. Everything applies to the next move without a reload unless noted.
Engine
| Setting | What it does |
|---|---|
| Engine | Which engine analyses the position. The WASM builds need nothing installed; "(local, full power)" entries talk to a real binary and only appear once the native host is installed. Switching reloads the panel — the net and UCI options have to be rebuilt. |
| Elo | Caps strength via UCI_LimitStrength + UCI_Elo. The range follows the engine; out-of-range values are ignored rather than clamped. 0 means no cap. |
| Variant | How the position is read and analysed. Auto-detected on variant pages. Chess960 is the exception: every mainline Stockfish plays it, so it survives an engine switch. |
| Search Time | How long the engine thinks when nothing else sets the pace. Clock Mode, Mirror Time and Humanize all override it; recaptures and forced moves ignore it entirely. |
| Fallback Poll Interval | Position changes are event-driven and instant; this is only a slow safety net that repairs a missed update. Lowering it buys nothing. |
| Multiple Lines | How many candidates the engine reports. The search splits across them, so depth drops — 1 is strongest. Humanize raises it automatically when it needs alternatives. |
| Threads | The default leaves one core for the browser. Capped at 2 on the opponent's turn unless Pondering is on. |
| Memory | Transposition-table size. In-browser engines are clamped to 512 MB whatever the slider says — that's the WebAssembly heap limit, not a choice. Native engines get the full value. |
| Panel Style | Floating panel is the draggable window; it lives in the page, so a site can detect it more easily, and Autoplay and Premove need it. Toolbar popup renders in the browser's chrome and leaves no trace in the page, but closes when you click the board — analysis only. |
Analysis and display
| Setting | What it does |
|---|---|
| Show Computer Evaluation | Score, depth, nps and the win/draw/loss split under the panel board. |
| Show Threat Analysis | A red arrow for the opponent's best reply. Costs a second search per position. |
| "Hand & Brain" Mode | Mephisto plays the Brain — names only the piece type. It deliberately withholds the move, so Autoplay does nothing while it's on. |
| Explain Moves | Names the tactic behind the choice; silent when nothing is certain. |
| Hide Opponent Name | Blurs their username and avatar so a screenshot doesn't expose a real person. Local and cosmetic — but it's the one option that adds a style element to the page, which is why it's off by default. |
| Opponent Mistake Alert | A toast when the opponent plays an inaccuracy, mistake or blunder, by the same Lichess win% method the move mix uses. Only fires when both positions were searched deep enough to trust. |
Automated play
| Setting | What it does |
|---|---|
| Autoplay | Plays the engine's move on the site's board by clicking. Everything else that plays a move needs this on. |
| Premove | Certifies a reply to the opponent's predicted move; an exact hit is instant. A reply that could never be legal after some other move is queued as a real site premove. |
| Pondering | Full threads during the opponent's turn across their top five replies. Costs CPU continuously — it pairs best with Premove. |
| Endgame Tablebase | Perfect play at ≤7 pieces, outranking engine and book. Off by default: it leaves your machine. Never delays a move. |
| Opening Explorer / Opening Database | Human opening data and which games it comes from. Masters is the cleanest play; the Lichess sets look more like a normal opponent. Read-out only. |
| Play Book Moves | Plays from the book instead of the engine's pick — an engine that always opens the same way is itself a tell. 20-game floor, 40cp check. If the lookup is late the engine's move is played. |
| Background Play | Off, moves fire only while the tab is focused. On keeps everything running hidden — Chrome throttles silent background tabs, so the tab is marked as playing audio and shows a speaker icon. |
| Help Mode | Arrows on the site's board, plays nothing. Overrides Autoplay. |
| Humanize / Clock Mode / Mirror Time | Which move is played, and how long it takes. See Humanize. |
| Pace to Clock | Shrinks the simulated think pause and cursor travel when the clock gets short. Off by default; never lengthens a move. |
| Manual Mode | Thinks indefinitely; plays only when you press the play key. Overrides Clock/Mirror/Humanize. |
| Puzzle Mode / Puzzle Database | See Puzzles. Puzzle Mode turns itself on when you open a puzzle page and off when you leave — unless you set it yourself, which is never overridden. |
| Python Backend | Moves the real pointer via a local Python helper instead of synthetic clicks. Needs mephisto-clicker.py and PyAutoGUI permissions. Almost nobody needs this. |
Humanize tuning, hotkeys, appearance
| Setting | What it does |
|---|---|
| Move Mix (%) | Seven categories, must total 100. Giving any share to Third line or worse forces a wider search so a move that bad exists to pick — which costs depth. A pure Top + Second mix stays cheaper. |
| Thresholds (cp) | How much worse than best each category may be. Each value is the top of its band and the one above is the bottom, so bands tile without gaps. |
| Think Time / Variance | The minimum delay after the position is evaluated, plus a random extra. Constant identical timing is itself a tell. |
| Move Time / Variance | The total wall clock for one move, first click to last — promotions get a third leg and are budgeted for. |
| Hotkeys | One rebindable key per action, live on the game page while the panel is open. Click a key and the next press becomes the binding; Esc cancels, Backspace clears. Defaults are single letters, play-move is Space. Clashes with a site shortcut can be rebound to any Ctrl/Alt/Shift/Meta combination. |
| Pieces / Board / Coordinates | The panel's own board only — the site's board is never restyled. |
| Dark Mode / Language | Theme and language for the panel and the settings page. |
| Four-player Mode | Tetrarch only, in the Variant row's place. Which rules a four-player board is played under — Auto-detect reads Chess.com's mode label, Teams and Free-for-all override it. See Four-player chess. |
| Automatic Updates | See Automatic updates. Off by default. On, it asks Chrome for permission to download this repository's releases, then updates the extension in place at the press of a button — the bundled engines are never touched. |
| Verbose Logging · Copy Diagnostics | Diagnostics, not play. The trace is quiet while the game tab is focused; this turns it on. Copy Diagnostics (panel → Engine, or D) copies version, engine, what was detected, why the last move was or was not played, and the recent trace — with no addresses and nothing identifying, so it can go straight into a bug report. |
| Restore Defaults · Export · Import | Reset everything on the page (not the puzzle database or hotkeys); write every setting including hotkeys and tuning to JSON, and read one back. Values that no longer exist are ignored. |
Toolbar popup leaves zero page footprint — it renders in the browser's own chrome, so the page has no handle to it at all. It closes when you click the board, so it's analysis only; Autoplay and Premove need the floating panel. Switch under Settings → General → Panel Style.
While the floating panel is in use, its footprint is minimised:
- No iframe. An iframe is a browsing context — counted by
window.length, throwing on cross-origin access, which a closed shadow root cannot hide. The panel renders directly in the page's isolated world, and the WASM engine moved to an offscreen document that still gets the cross-origin isolation the pthread builds need but that the page cannot see or count. - No extension URLs reach the page.
web_accessible_resourcesis gone from the manifest. Markup, CSS, board textures and piece images are fetched extension-side and injected as inlined bytes ordata:URIs, so nochrome-extension://URL appears in the DOM or in Resource Timing, and the id can't be read back. - Closed shadow root under one attribute-less host node —
document.querySelector('[id^="mephisto-"]')finds nothing andhost.shadowRootisnull. - No branded page globals — MAIN-world probes for canvas boards set no
window.*flag and talk over per-session random event channels, so there's no fixed name to fingerprint. - Human-shaped clicks — a bare from → to, no lead click on an empty square, randomised timings, landing on a center-weighted distribution within each square, preceded by an eased jittered cursor path inside the Move Time budget.
- No config in the site's storage — settings live in
chrome.storage.local. Two values do sit in page storage because they're read while the panel is built (panel geometry, a start-position cache); neither is named after the extension nor holds a setting.
These reduce passive fingerprinting only. See the disclaimer.
No schedule — added whenever I feel like it. Checked means shipped.
- More engines — the lineup covers strong and human-like and not much between. Variety of character, not more strength. lc0 (Leela) in WASM would be for comparing styles, not for strength.
- Duck Chess autoplay — detection and analysis work; the duck-placement step doesn't.
- Four-player chess, the rest of it — Teams mode works, promotions are played and eliminations are handled. What is left: free-for-all needs engine support, and no real game has yet been seen past an elimination, so that path is pinned by synthetic positions rather than by having happened. Chaturaji, 4P Giveaway and Self Partnering are untouched.
- Four-player chess on Windows, confirmed — built and symbol-checked, never run on a real Windows machine. See Contributing for the four stages worth reporting.
- Short videos and more screenshots — a premove firing, Humanize pacing a move, the screen reader following a board. Some of this only makes sense in motion.
- Translate the README — the interface speaks fourteen languages; the documentation still speaks one.
- Shrink the footprint further — what's left is hardening the one rendezvous the MAIN-world probes need and tightening how scraped positions are sanitised. Being straight about the ceiling: the client side is nearly exhausted, and it was never the thing that catches people.
- ChessBase Tactics arrows + autoplay — analysis works; drawing and clicking don't. ChessBase renders its own board with no class to match, and finding it by shape was slow and unreliable.
- Bug fixes, open-ended. Several of the sharpest bugs so far were invisible rather than loud: autoplay that skipped a move with nothing logged, an engine that never loaded, a veto inverted only for Black. Reports of "it did nothing" are worth more than they sound.
- Whatever you want it to do — most of what's here arrived because something was annoying in a real game.
Blocked upstream — no engine supports these, so there's nothing to build against: Fog of War (imperfect information), Setup Chess, Spell Chess, Bughouse and Chess-with-Checkers.
Looked at and dropped — Lichess cloud evaluation. It's a crowdsourced cache of positions other people's browsers have already analysed, not a server-side engine, and its coverage is the problem: deep on openings and popular lines, absent on ordinary middlegames. That's the inverse of where extra depth would change a move, and the openings are already covered by the Opening Explorer and book play. Might be worth revisiting for post-game review, where the hit rate is higher and the eval is context rather than a move to play.
-
Game review (v3.1.218) — a finished game analysed on the extension's own page: accuracy, move quality, alternate lines, an eval graph, think time from the clock comments, an optional Maia pass, and fair-play measurements that deliberately stop short of a verdict. Exports as one self-contained HTML file.
-
Automatic updates (v3.1.214, one-click from the panel v3.1.215) — opt-in: fetches the ~6 MB update archive from this repository and writes it into the extension's own folder in place, so the id and the native hosts survive. Once it is set up the panel's own update notice installs it. Off by default; nothing is installed without pressing the button.
-
Four-player chess (v3.1.199) — chess.com's 4-player variant, driven by Tetrarch; 14×14 panel board, team-relative eval, autoplay. Teams mode only.
-
Panel and settings rework (v3.1.199) — two tabs instead of a wall of rows, the game and engine status moved into the title bar,
−/+steppers for threads, lines and move time, uniform control heights, one typeface per column, and a settings page grouped into sections. -
Four-player chess on Windows (v3.1.200) — DLL build,
.bathost shim and a PowerShell installer that registers underHKCU. Unconfirmed on real hardware, hence the open item above. -
Fourteen languages (v3.1.160) — every string, switchable live in Settings → Appearance.
-
Puzzle database (v3.1.140) — the Lichess puzzle CSV in IndexedDB; known solutions play with no search.
-
Endgame tablebase, move confidence, eval history graph (v3.1.135).
-
Read a position off the screen and the playable panel board (v3.1.124).
-
From-Position capture and on-demand nets (v3.1.125) — an unbundled net downloads on first use; a full install still works offline.
-
Opening Explorer + book play, set up a position, auto-recover on DOM changes (v3.1.119) — if a site renames its move-list tags, the list is found structurally.
-
Pondering and double premove (v3.1.107).
-
Maia-3 (v3.1.95) — 600–2600 slider, one transformer conditioned on rating; reproduces the CSSLab reference exactly (~60% move-match to human play).
-
Maia (v3.1.93) — the original nets, 1100–1900 plus a community-trained 2200. Matches the lc0 reference.
-
Instant reopen with a warm engine, the turn switch (v3.1.92), human cursor travel (v3.1.90).
-
Manual mode, configurable hotkeys, opponent mistake alert, self-test button (v3.1.84).
-
Copy FEN/PGN, compact panel, export/import (v3.1.73); native health badge, smart default threads (v3.1.55).
Open an issue for anything — a bug, a site that stopped being scraped correctly, an engine that misbehaves, a feature you want, or just an idea. You don't need a diagnosis or a reproduction; "it stopped playing moves on lichess this morning" is a perfectly good issue. PRs are welcome too.
If the Windows four-player setup fails, an issue is especially useful — it is built and symbol-checked but has never been run on a real Windows machine, and native-messaging failures there are silent: Chrome reports the host as unavailable and says nothing about why. Testing it in stages turns that into something actionable, so please say which one broke:
./setup.shunder MSYS2 producesbuild\tetrarch.dllpython -c "from tetrarch import core"imports without raisingpython uci.pyanswersgoin a plain terminal- the panel finds the engine in Chrome
A report of "stage 3 hangs" is worth far more than "it doesn't work", because each stage has a different cause.
This project's own source (and the original Mephisto by Alexandru
Petrusca) is MIT (LICENSE). It bundles copyleft components — GPL-3.0 engines and nets, and the
AGPL-3.0 Maia-3 model — so the combined distribution is governed by AGPL-3.0. Before redistributing, read
LICENSING.md and THIRD-PARTY-NOTICES.md; full texts in
licenses/.
Built on the work of others, with thanks:
- Stockfish & Fairy-Stockfish (GPL-3.0), run in the browser via the Lichess Stockfish-web builds.
- Maia / Maia-3 (CSSLab, University of Toronto; GPL-3.0 / AGPL-3.0) and the Maia 2200 net (CallOn84; GPL-3.0); Leela Chess Zero (GPL-3.0) for the input/policy encoding.
- Board recognition — two models from Chess_diagram_to_FEN by Jost Triller (MIT), converted to ONNX; see
lib/engine/vision/. - ONNX Runtime Web (Microsoft; MIT) — in-browser inference.
- chess.js (BSD-2), chessboard.js, jQuery, Materialize and
lru(all MIT).













