The two clips on "Ring escape and territory battle Shorts with a free, open-source simulator" https://skulitom.github.io/Pixelbolt/compare/ring-escape-and-territory-battle-shorts/ Each clip is one Pixelbolt command (every frame, as PNGs) and one ffmpeg command (the MP4). Needs: Node.js 20 or newer (npm's registry for npx), and ffmpeg with libx264 for the MP4. Run in a new, empty folder holding the recipe (and, to check the frames, the matching *-frames-sha256.txt from the page's data folder). Bash shown; Git Bash on Windows works. RING BREAK-OUT ("How many hits to break out?") Recipe: ring-hits.bodies.json SHA-256 122941c68ddec7beebc0f3352da0a94353ef37fa16c7bfcbbfc50932fc534bc2 npx -y pixelbolt@0.14.0 sequence ring-hits.bodies.json --out frames --fps 30 --size 1080x1920 Writes frames/ring-hits-ring-hits_0001.png ... _0760.png (1080x1920, 30 fps, 25.33 s), frames/sequence.json and frames/README.txt. Check every frame: cd frames && sha256sum -c ../ring-frames-sha256.txt && cd .. or all at once: cat frames/ring-hits-ring-hits_*.png | sha256sum expect 4e743b3991bf7991ca399536ce74c5107b8cf51feb96fb075e771168d3f51d77 frames/sequence.json expect b4aedacfbf566dd1b0cecbf178fbbde027fa0fe99598ffa908a7669aa907b2bb cd frames ffmpeg -hide_banner -loglevel error -y -framerate 30 -start_number 1 -i "ring-hits-ring-hits_%04d.png" -c:v libx264 -preset slow -crf 4 -pix_fmt yuv420p -vf "scale=out_color_matrix=bt709:flags=neighbor,setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv" -colorspace bt709 -color_primaries bt709 -color_trc bt709 -fps_mode passthrough -an -movflags +faststart -threads 8 -x264-params asm=MMX2,SSE,SSE2,SSE2Fast,SSE3,SSSE3,SSE4.1,SSE4.2,Cache64 ../ring-escape.mp4 cd .. With ffmpeg n9.0.2-22-g46d8f462ee-20261001 (BtbN win64 GPL build) this gave ring-escape.mp4, 279,724 bytes, SHA-256 5e6bb746711d9d8ef7ec407d27fc862e71bc66198b9825d06c259441efd5b0ac. TERRITORY BATTLE ("Red starts with 10%. Can it come back?") Recipe: comeback.bodies.json SHA-256 f371056c19ef35342a6d161e31bc1fb47f9e9005da80f076a3186e84f08941bd npx -y pixelbolt@0.14.0 sequence comeback.bodies.json --out frames --fps 30 --size 1080x1920 --seconds 34 --background "#11131c" Writes frames/comeback-match_0001.png ... _1020.png (1080x1920, 30 fps, 34 s: the 960-frame match runs 31.68 s and its last frame, with the answer, is held to 34 s). Check: cd frames && sha256sum -c ../territory-frames-sha256.txt && cd .. or: cat frames/comeback-match_*.png | sha256sum expect eaa1e718519e37687800eaf7aa37afca4466a5cd3b59bddb27224cd1a5059863 frames/sequence.json expect 5fb5cba3902d824e0bc1beb6da5fb165a391a4f6f5bfb8e663839587a0a66984 The match's frames are 33 ms apart on a 30 fps grid, so 9 of its 960 frames (99, 199 ... 899) fall between video frames and are not shown. On two of them (99 and 799) a cell changes hands; the new score shows from the next video frame, about 33 ms later. The answer is not on one. cd frames ffmpeg -hide_banner -loglevel error -y -framerate 30 -start_number 1 -i "comeback-match_%04d.png" -c:v libx264 -preset slow -crf 4 -pix_fmt yuv420p -vf "scale=out_color_matrix=bt709:flags=neighbor,setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv" -colorspace bt709 -color_primaries bt709 -color_trc bt709 -fps_mode passthrough -an -movflags +faststart -threads 8 -x264-params asm=MMX2,SSE,SSE2,SSE2Fast,SSE3,SSSE3,SSE4.1,SSE4.2,Cache64 ../territory-battle.mp4 cd .. With the same ffmpeg build: territory-battle.mp4, 489,379 bytes, SHA-256 7f29690f158fe549302e8d159df4d9c54f38122e55d5b5f2bad4f8da3e403171. WHICH HASHES HOLD WHERE The PNG frames are Pixelbolt's exact output: the same bytes from 0.13.0 (npm and a checkout of the release tag) and 0.14.0 (npm, twice under Node.js 24.19.0, once each under 20.20.2 and 22.23.4), on every run we made, all on one Windows x64 PC, 8 and 9 November 2026. That is the check to use. We haven't checked macOS or Linux, where the same pixels could be compressed into different PNG bytes; if a hash differs there, compare the decoded pixels. The MP4 is a lossy encode of those frames. Its bytes depend on the ffmpeg/x264 build, the thread count and the CPU instructions x264 uses, which is why the line pins -threads 8 and an asm list. Another ffmpeg build will give a different (but equivalent-looking) file. The pinned build is a "latest" autobuild that its publisher replaces, so it may not be downloadable later. WHERE THE NUMBERS COME FROM frames/sequence.json -> "figures": each frame's cells per team ("territory.counts"), the cells that changed hands ("territory.flips"), the leader at the end, and the frame a ball left the board ("escaped"). Ring: 116 brick cells; the ball knocks out 53 of them in 51 hits (twice it took out two bricks at once; see "figures.hits": 51). The on-screen "HITS: {hits}" counter shows the cells of the ball's team, i.e. bricks knocked out, so it reads 53. The ball leaves the board at match frame 706. Territory: 300 cells; red starts with 30 (10%) and ends with 148 (49%); 278 cells changed hands. The question and answer lines are text in each recipe's "hud"; the answers were written after the test runs that picked these matches (see "How these matches were picked" on the page). The counters and percentages are filled in by Pixelbolt on every frame. Both recipes, these clips and this file are MIT-licensed, like Pixelbolt. Credit is welcome, not required.