Skip to content
Webservice to render Gifs of chess positions and games, and stream them frame by frame
Rust Python Shell
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/workflows
src
theme
.gitignore
Cargo.lock
Cargo.toml
LICENSE
README.md
example-frame.gif
example.gif
lichess-deploy.sh

README.md

lila-gif

Webservice to render Gifs of chess positions and games, and stream them frame by frame.

Example: DrDrunkenstein vs. Zhigalko_Sergei

size render time frames colors width height
334 KiB ~200 ms 93 63 720 px 840 px

HTTP API

GET /image.gif

curl http://localhost:6175/image.gif?fen=4k3/6KP/8/8/8/8/7p/8 --output image.gif
name type default description
fen ascii starting position FEN of the position. Board part is sufficient.
white utf-8 none Name of the white player. Known chess titles are highlighted. Limited to 100 bytes.
black utf-8 none Name of the black player. Known chess titles are highlighted. Limited to 100 bytes.
comment utf-8 https://github.com/niklasf/lila-git Comment to be added to GIF meta data. Limited to 255 bytes.
lastMove ascii none Last move in UCI notation (like e2e4).
check ascii none Square of king in check (like e1).
orientation white Pass black to flip the board.

POST /game.gif

{
  "white": "Molinari", // optional
  "black": "Bordais", // optional
  "comment": "https://www.chessgames.com/perl/chessgame?gid=1251038", // optional
  "orientation": "white", // default
  "delay": 50, // default frame delay in centiseconds
  "frames": [
    // [...]
    {
      "fen": "r1bqkb1r/pp1ppppp/5n2/2p5/2P1P3/2Nn2P1/PP1PNP1P/R1BQKB1R w KQkq - 1 6",
      "delay": 500, // optionally overwrite default delay
      "lastMove": "b4d3", // optionally highlight last move
      "check": "e1" // optionally highlight king
    }
  ]
}

GET /example.gif

curl http://localhost:6175/example.gif --output example.gif

Render an example game.

Technique

Instead of rendering vector graphics at runtime, all pieces are prerendered on every possible background. This allows preparing a minimal color palette ahead of time. (Pieces are not just black and white, but need other colors for anti-aliasing on the different background colors).

Sprite

All thats left to do at runtime, is copying sprites and Gif encoding. More than 95% of the rendering time is spent in LZW compression.

For animated games, frames only contain the changed squares on transparent background. The example below is the last frame of the animation.

Example frame

License

lila-gif is licensed under the GNU Affero General Public License, version 3 or any later version, at your option.

The generated images include text in Noto Sans (Apache License 2.0) and a piece set by Colin M.L. Burnett (GFDL or BSD or GPL).

You can’t perform that action at this time.