Skip to content
 
 

Repository files navigation

Mephisto

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.

Analysis with five candidate lines drawn on the board

Fair play · Install · Engines · Features · Sites · Settings · Footprint · Roadmap


Fair play — read this first

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.


Why this fork

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 personHumanize, Clock Mode and Mirror Time.
  • AutomationSafe 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.
  • CoverageChess.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.

Install

Distributed as an unpacked extension, not through the stores.

  1. Download or clone this repository.
  2. Open chrome://extensions and enable Developer mode.
  3. Load unpacked → select the repository folder.
  4. Pin it: puzzle icon right of the address bar → pin "Mephisto Chess Extension".

Which download?

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.

Automatic updates (opt-in)

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:

  1. Automatic Updates → On. Chrome asks for permission to download from this repository's releases. Refusing leaves the switch off.
  2. Choose Extension Folder → pick the folder you loaded as an unpacked extension. Chrome remembers it.
  3. 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.


Engines

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 with the 600-2600 rating slider Atomic on Lichess, analysed by Fairy-Stockfish

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.

Variants

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.


Features

Analysis

  • 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 with its own coloured arrow The opening explorer, with each book move drawn on the board

Three candidate lines, each its own arrow · the explorer's book moves on the board

Reading a position straight off a YouTube video

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%).

Game review

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.

The game review page

Automated play

  • 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.

Humanize

The move mix and move-quality thresholds, with live accuracy estimates

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.

PriorityTime: Mirror ▸ Clock ▸ Humanize ▸ Search Time. Move: Book ▸ Humanize ▸ engine best.

Puzzles

3999 — as high as the Lichess puzzle rating goes The hotkeys page, each action rebindable

3999 is the ceiling — there is no higher number Lichess will show you · every action rebindable

Hardest (+600) puzzles solved back to back, from the database rather than searched

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 tacticfen3 is the opponent to move and colorOfUser is 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 no colorOfUser. The side to move in fen3 is 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:

  1. Write real CSV. The pgn column 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.
  2. 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.
  3. Branch on id before choosing an encoding. A daily- 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.

The panel

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.


Supported sites

TakeTakeTake, whose board is a WebGPU canvas with no DOM to scrape

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

Full-power native engines (optional)

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_ID

A 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_ID

For 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.


Four-player chess

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.

Four-player chess on Chess.com, with the 14x14 panel board and the suggested move drawn on it

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 IDchrome://extensions with Developer mode on, copy the long id under Mephisto.

macOS and Linux

git clone https://github.com/IchNukeDichWeg/Tetrarch
cd Tetrarch && ./setup.sh

setup.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/Tetrarch

Drop --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-gcc
cd /c/path/to/Tetrarch && ./setup.sh

That produces build\tetrarch.dll. Then, from PowerShell in the Mephisto folder:

powershell -ExecutionPolicy Bypass -File native-host\install-tetrarch.ps1 -ExtId YOUR_EXTENSION_ID

Add -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.sh in 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.


Languages

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.


Settings reference

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.

Page footprint

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_resources is gone from the manifest. Markup, CSS, board textures and piece images are fetched extension-side and injected as inlined bytes or data: URIs, so no chrome-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 and host.shadowRoot is null.
  • 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.


Roadmap

No schedule — added whenever I feel like it. Checked means shipped.

Planned

  • 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 droppedLichess 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.

Shipped

  • 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, .bat host shim and a PowerShell installer that registers under HKCU. 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).


Contributing

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:

  1. ./setup.sh under MSYS2 produces build\tetrarch.dll
  2. python -c "from tetrarch import core" imports without raising
  3. python uci.py answers go in a plain terminal
  4. 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.

License & credits

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:

About

Actively maintained Mephisto fork — in-browser Stockfish / Fairy-Stockfish chess analysis & autoplay for Chess.com, Lichess, BlitzTactics & TakeTakeTake. Best-move arrows, eval bar, Humanize, clock management, Chess960 & variants. It can play automatically for you and beat anyone

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages