Changelog for python-chess

New in v1.2.1

The primary location for the published package is now Thanks to Kristian Glass for transferring the namespace.

The old will remain an alias that installs the package from the new location as a dependency (as recommended by PEP423).

New in v1.2.0

New features:

  • Added chess.Board.ply().

  • Added chess.pgn.GameNode.ply() and chess.pgn.GameNode.turn().

  • Added chess.engine.PovWdl, chess.engine.Wdl, and conversions from scores: chess.engine.PovScore.wdl(), chess.engine.Score.wdl().

  • Added chess.engine.Score.score(*, mate_score: int) -> int overload.


  • The PovScore returned by chess.pgn.GameNode.eval() is now always relative to the side to move. The ambiguity around [%eval #0] has been resolved to Mate(-0). This makes sense, given that the authors of the specification probably had standard chess in mind (where a game-ending move is always a loss for the opponent). Previously, this would be parsed as None.

  • Typed chess.engine.InfoDict["wdl"] as the new chess.engine.PovWdl, rather than Tuple[int, int, int]. The new type is backwards compatible, but it is recommended to use its documented fields and methods instead.

  • Removed chess.engine.PovScore.__str__(). String representation falls back to __repr__.

  • The en_passant parameter of chess.Board.fen() and chess.Board.epd() is now typed as Literal["legal", "fen", "xfen"] rather than str.

New in v1.1.0

New features:

  • Added chess.svg.board(..., orientation). This is a more idiomatic way to set the board orientation than flipped.

  • Added chess.svg.Arrow.pgn() and chess.svg.Arrow.from_pgn().


  • Further relaxed chess.Board.parse_san(). Now accepts fully specified moves like e2e4, even if that is not a pawn move, castling notation with zeros, null moves in UCI notation, and null moves in XBoard notation.

New in v1.0.1


  • chess.svg: Restored SVG Tiny compatibility by splitting colors like #rrggbbaa into a solid color and opacity.

New in v1.0.0

See CHANGELOG-OLD.rst for changes up to v1.0.0.