Vizier
A UCI chess engine in portable C11, with bitboards, no dependencies, and a search you can read.
Perft
Count every legal move, then check the count.
Perft walks the tree of legal moves to a fixed depth and counts the positions at the bottom. The totals for a few standard positions are published, so a move generator either matches them or has a bug. Vizier’s is checked this way. Pick a position and count it yourself.
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
Twenty moves each side. The tree grows fast.
| Depth | Published | Counted here | Time |
|---|---|---|---|
| 1 | 20 | — | — |
| 2 | 400 | — | — |
| 3 | 8,902 | — | — |
| 4 | 197,281 | — | — |
| 5 | 4,865,609 | — | — |
It all runs in your browser, nothing is sent anywhere.
The search
The standard techniques, written out plainly.
Underneath is a bitboard board, with magic bitboards for the sliding pieces and Zobrist hashing for positions. On top of that:
ID · PVSIterative deepening
It searches one move deep, then two, then three, so a best move is always ready. Principal variation search looks hard at the expected best line and checks the rest with a narrow window.
TTTransposition table
Positions are keyed by a Zobrist hash, so one reached by a different move order isn’t searched twice.
qsearchQuiescence search
At the edge of the search it keeps following captures, so it doesn’t judge a position halfway through a trade.
null move · LMRPruning
Null-move pruning gives the opponent a free move to see if a line is already won. Late moves in the list get searched less deeply.
killer · historyMove ordering
Moves that caused cutoffs before are tried first, which is what makes the pruning pay off.
UCI
Any chess interface can drive it.
Vizier reads standard UCI on stdin and answers on stdout. It’s the engine that comes with ChessViz, and it works with any other UCI GUI too. It’s portable C11, so it builds anywhere there’s a C compiler.
# what an interface sends uci # the engine names itself, then uciok isready # readyok position startpos moves e2e4 e7e5 go depth 12 # info lines as it deepens, then bestmove
Capabilities
What it does.
Chess programmers who want an engine they can study.
- 01
Magic-bitboard move generation checked against published perft counts
- 02
Iterative deepening PVS with a transposition table and quiescence search
- 03
Null-move pruning, late-move reductions, and killer and history heuristics
- 04
Portable C11 that builds anywhere and works with any UCI GUI
Specification
What it’s built with, and when.
Pulled from the repository each time this site is built.
- State
- In development
- Discipline
- Applications
- Shape
- Installed software
- Last change
- Jul 2026
- C11
- Bitboards
- UCI
Related work
Built alongside Vizier
Next
Get Vizier
Ask about availability, a build for your platform, or a license.