Built this mostly with AI assistance (vibe-coded). Stockfish 16 runs in the browser via WASM. Constraints are parsed in two layers: a hand-written rule parser handles common patterns (no captures, piece restrictions, no castling, etc.), and anything it can't match falls through to Claude Haiku, which generates a JavaScript matches(uciMove, chess) function on the fly. That function runs client-side and filters the list of legal UCI moves before being passed to Stockfish's searchmoves parameter, so Stockfish's skill level, depth, and randomness all still apply correctly within the allowed set.Constraints can target the engine, the player, or both. Shareable via URL (FEN + constraints + ELO encoded as query params).
Pre-loaded challenge if you want to skip setup:
https://constrainedchess.vercel.app/?skill=5&c=player%7Ccan%...
vunderba|1 day ago
Hmmm... I can immediately think of a reason this won't work.
If I create a constraint that says "Bishops are only capable of moving 4 squares maximum", the set of valid moves you are passing into Stockfish only affects the initial move.
But as soon as it starts to build the minimax-equivalent search tree, it's no longer enforcing that constraint.
To make this work, you’d have to get Stockfish to continuously enforce the “bishop move” rule at every ply during its search.
Caveat - unless this is something you are enforcing in searchmoves? I don't have a lot of experience with in-depth usage of Stockfish.
Alternatively, you could look into Fairy-Stockfish, which allows you to define rule variants.
https://fairy-stockfish.github.io
gus_massa|8 hours ago
vigrant|1 day ago
https://constrainedchess.vercel.app/?fen=2b1kb2%2F8%2F8%2F8%...