Chessroll

Turn chess positions
into short-form stories.

A deterministic TypeScript/Node CLI — real Stockfish analysis and real chess rules, not screen-recorded from a website.

Watch demos View on GitHub

Six templates, one deterministic pipeline

Every video below is generated from the source position or game shown beside it — click a poster to play.

Find the Best Move

A position, a countdown, an oxblood reveal, then the engine's best move plays out to its forced payoff.

demo/puzzle/position.fen

6k1/8/8/8/8/8/R7/K6R w - - 0 1

Spot the Blunder

The mistake plays out on screen first, unflagged — then the countdown, the reveal, and the engine's actual punishment.

demo/blunder/game.pgn

[Event "Chessroll fixture"]
[Site "-"]
[Date "????.??.??"]
[Round "-"]
[White "Fixture"]
[Black "Fixture"]
[Result "*"]

1. e4 e5 2. Nf3 Nc6 3. Bc4 Bc5 4. O-O Nf6 5. d3 d6 6. c3 O-O 7. Bg5 h6 8. Bh4
Nxe4 *

Find the Brilliant Move

A Chessroll-selected standout move — a near-unique best move or a real material sacrifice that still wins — proven out by a forced continuation.

demo/brilliant/game.pgn

[Event "Chessroll fixture"]
[Site "-"]
[Date "????.??.??"]
[Round "-"]
[White "Fixture"]
[Black "Fixture"]
[Result "*"]
[SetUp "1"]
[FEN "3q1r1k/pp4pp/7N/3QN3/8/8/PPP2PPP/6K1 w - - 0 1"]

1. Qg8+ Rxg8 2. Nef7# *

Game Replay

The whole game, importance-weighted — quiet moves run fast, critical moments pause, highlight, and get annotated.

demo/replay/game.pgn

[Event "Chessroll Fixture Open"]
[Site "-"]
[Date "2024.03.15"]
[Round "-"]
[White "A. Rowan"]
[Black "B. Voss"]
[Result "0-1"]
[WhiteElo "2100"]
[BlackElo "2050"]

1. e4 e5 2. Nf3 Nc6 3. Bc4 Bc5 4. c3 Nf6 5. d4 exd4 6. cxd4 Bb4+ 7. Bd2 Bxd2+
8. Nbxd2 d5 9. exd5 Nxd5 10. Qb3 Nce7 11. O-O O-O 12. Rfe1 c6 13. Ne4 Nb6
14. Qxb6 axb6 15. Nc5 b5 16. Bd3 Ra3 0-1

Game in 60 Seconds

The same full-game story, bounded to a target duration — every move's pace scaled down to fit, never padded out artificially.

demo/game60/game.pgn (rendered with --target 25)

[Event "Chessroll Fixture Championship"]
[Site "-"]
[Date "2023.11.02"]
[Round "-"]
[White "C. Ibarra"]
[Black "D. Solheim"]
[Result "*"]
[WhiteElo "2210"]
[BlackElo "2190"]

1. e4 e5 2. Nf3 Nc6 3. d4 exd4 4. Nxd4 Nf6 5. Nxc6 bxc6 6. Qe2 Be7 7. e5 Nd5
8. c4 Nb6 9. Qc2 d5 10. exd6 cxd6 11. Bd3 h6 12. O-O O-O 13. Nc3 d5 14. b3
dxc4 15. bxc4 Nd7 16. Rd1 Qc7 17. Ne2 Bd6 18. Bg6 fxg6 19. Rxd6 Qxd6 20. Bb2
Qe7 21. Nd4 Qe8 22. Qc3 Nf6 23. Re1 Qd7 24. Nf3 Kh7 25. Ne5 Qc7 26. Nxg6 Kxg6
27. h3 h5 28. Qe3 Qd7 29. c5 Qd5 30. Qe7 Re8 31. Qxg7+ Kxg7 32. Rxe8 Qd1+
33. Kh2 Qb1 34. Re7+ Kg6 35. Bd4 Qb4 *

Guess the Move

You are put in a real player's seat at the game's most decisive moment — guess the move, then get an honest engine comparison, never a false claim that the played move was objectively best.

demo/guess/game.pgn

[Event "Chessroll Fixture Invitational"]
[Site "-"]
[Date "2025.06.21"]
[Round "-"]
[White "E. Marchetti"]
[Black "F. Kwon"]
[Result "*"]
[WhiteElo "2340"]
[BlackElo "2295"]

1. e4 e5 2. Nf3 Nc6 3. d4 exd4 4. Nxd4 Nf6 5. Nxc6 bxc6 6. Bd3 d5 7. e5 Ng4
8. O-O Bc5 9. Bf4 g5 10. Bd2 O-O 11. b4 Bd4 12. Bc3 Bxc3 13. Nxc3 Qe7 *

How it works

Stockfish analysis

Every position is analyzed by a real Stockfish process over UCI — never a hand-rolled heuristic. Raw scores are always relative to the side to move; a single normalization step flips them to White's perspective before anything else in the app sees them, and mate scores are never coerced into a fake centipawn number.

Deterministic rendering

Every frame is a pure function of its timestamp — renderAtTime(t) — with no wall clock, no CSS transitions, and no dependency on any previously rendered frame. The same input always produces the same video, byte for byte on the same machine.

CLI quick start

pnpm install
pnpm build
node dist/cli.js test/fixtures/puzzle.fen --template puzzle -o puzzle.mp4 --show-eval

See the README for every template, flag, and the full CLI reference.

Architecture

PGN / FEN chess model Stockfish analysis story scene timeline renderAtTime(t) Chromium frames FFmpeg MP4