Fastchess(7)
๐ NAME ๐
okay so bestie, gather round โ this is fastchess, the manual page (that's the Fastchess(7) one, miscellaneous information section, if you're keeping track ๐). it's a command-line tool for managing chess games with engines. yes. engines. plural. it's giving chess matchmaker energy and honestly? obsessed. ๐
โจ SYNOPSIS โจ
like, the whole vibe in one line:
fastchess [OPTIONS]
that's it. that's the entrance. you show up with some [OPTIONS] and fastchess does the rest ๐
๐ฆ DESCRIPTION ๐ฆ
so here's the tea, bestie: Fastchess is a command-line tool built to manage and orchestrate chess games between engines, and the way that it literally just handles all of that for you? iconic. it's not out here playing chess itself โ it's the main character organizer, the group-chat admin of your engine matchups ๐ซถ
and it comes stacked with a whole range of options so you can configure, like, everything:
- ๐ฎ game settings โ all the rules-of-play stuff, your call
- ๐ง engine parameters โ the knobs and dials for the engines themselves
- โก concurrency โ more than one thing happening at once, no cap
- ๐ output formats โ how you want the results to come out looking
lowkey the important thing to remember: fastchess is the orchestrator, not the player. it sets the stage, you bring the engines ๐โจ
and that's just the opening act โ there's more coming, so don't go anywhere, the rest of this page is gonna eat ๐ฅ
๐ OPTIONS ๐
okay bestie, here's the whole menu of options โจ they're grouped by what they actually do so you're not scrolling forever, and just so you know โ the default value is always the first value in the parentheses. iykyk ๐ซถ
๐ General & Help ๐
-versionโ prints the fastchess version number and dips. that's it, that's the whole job ๐-helpโ prints this help message and exits. your little safety net ๐ง
๐ธ Tournament Setup ๐ธ
-quick cmd=ENGINE1 cmd=ENGINE2 book=BOOKโ the shortcut for a whole predefined setup: two engines, time controls, rounds, and concurrency. literally the "just make it work" button ๐ฅ-concurrency (1|N)โ play N games at the same time, capped by how many hardware threads you've got. default is1.-force-concurrencyโ ignores that hardware concurrency limit and forces whatever concurrency you asked for. bold of you, but slay ๐-rounds (2|N)โ play N rounds, where every game inside a round uses the same opening. default is2.-games (2|N)โ play N games in each round. default is2. and ngl, setting this higher than 2 doesn't give you meaningful results โ so like, don't ๐ซ-repeatโ sets the number of games to2. it's literally equivalent to-games 2.-sprt elo0=ELO0 elo1=ELO1 alpha=ALPHA beta=BETA model=(normalized|logistic|bayesian)โ sets the parameters for a Sequential Probability Ratio Test (SPRT). the mathy main character energy โจmodel:normalizedโ uses nElo (this is the default).logisticโ uses regular/logistic Elo.bayesianโ uses BayesElo.
-tournament (roundrobin|gauntlet)โ picks the tournament type ๐roundrobinโ every engine plays every other engine (default).gauntletโ the first-seedsengines play against all the other engines.
-seeds (1|N)โ the first N engines are the ones playing the gauntlet. default is1.-variant (standard|fischerandom)โ choose your chess variant, bestie:standardโ play Standard Chess (default).fischerandomโ play Fischer Random Chess. chaos, but chess ๐ฆ
-noswapโ prevents the swapping of colors.-reverseโ uses a tournament schedule with reversed colors.-wait (0|N)โ waits N milliseconds between games. default is0.
๐ Engine Configuration ๐
-each OPTIONSโ applies the OPTIONS you give it to both engines. equal love ๐ซถ-engine OPTIONSโ applies the OPTIONS you give it to the next engine.cmd=COMMANDโ specify the engine command.name=NAMEโ set the engine name. if you don't specify one, the executable's filename gets used.args="ARGS"โ pass multiple arguments usingargs="ARG1 ARG2".tc=moves/minutes:seconds+incrementโ time control in Cute-Chess format.timemargin=Nโ time margin for exceeding the time limit.st=Nโ movetime in seconds.nodes=Nโ max number of nodes to search.restart=(off|on)โ enable or disable engine restarts between games. default isoff.plies=Nโ max number of plies (depth) to search. the aliasdepthworks too.proto=uciโ specify the engine protocol. onlyuciis supported, so yeah.dir=DIRECTORYโ working directory for the engine.option.name=VALUEโ set engine-specific options. for a button option, the value should betrueorfalse๐
๐ฅ Adjudication & Rules ๐ฅ
-draw movenumber=(0|N) movecount=(1|N) score=(0|N)โ turns on draw adjudication based on number of moves, move count, and the score threshold.movenumberโ number of moves before it starts checking for a draw. default is0.movecountโ number of consecutive moves below the score threshold. default is1.scoreโ the score threshold (in centipawns) for a draw. default is0.
-resign movecount=(1|N) score=(0|N) [twosided=(false|true)]โ configures engine resignation based on move count and score threshold.movecountโ number of consecutive moves above the score threshold. default is1.scoreโ the score threshold (in centipawns) to resign. default is0.twosidedโ iftrue, enables two-sided resignation. defaults tofalse.
-maxmoves Nโ enables draw adjudication if the game reaches N moves without a result.-tb PATHSโ adjudicates games using Syzygy tablebases.PATHShas to be a semicolon-separated list (on Windows) or a colon-separated list (on other platforms) of paths to the tablebase directories. only the WDL tablebase files are required โ you don't need the whole buffet ๐-tbpieces Nโ only uses tablebase adjudication for positions with N pieces or less.-tbignore50โ disables the fifty move rule for tablebase adjudication. yeah, we're bending the rules, don't @ me.-tbadjudicate (BOTH|WIN_LOSS|DRAW)โ controls when tablebase adjudication gets applied.SETTINGcan be:BOTHโ adjudicate both wins and draws (default).WIN_LOSSโ only adjudicate won/lost positions.DRAWโ only adjudicate drawn positions.
๐ฆ Opening Book Management ๐ฆ
-openings file=NAME format=(epd|pgn) [order=(sequential|random)] [plies=(Max plies|N)] [start=(1|N)]โ specifies an opening book file and its format for the starting positions of games.formatโ the file format, eitherepdorpgn.orderโ the order of the openings,randomorsequential. default issequential.pliesโ number of plies forpgn. defaults to the max available plies.startโ starting index of the opening book. default is1.
-srand SEEDโ specifies the seed for opening book randomization. deterministic vibes only โจ
๐ Output & Reporting ๐
-output format=(fastchess|cutechess)โ picks the output format for game results,fastchessorcutechess. default isfastchess.-pgnout [file=NAME] [notation=(san|lan|uci)] [append=(true|false)] [nodes=(false|true)] [seldepth=(false|true)] [nps=(false|true)] [hashfull=(false|true)] [tbhits=(false|true)] [pv=(false|true)] [timeleft=(false|true)] [latency=(false|true)] [min=(false|true)] [match_line=REGEX]โ exports games in PGN format with the notation you pick, plus optional tracking of nodes, seldepth, and the rest of the crew ๐notation:sanโ Standard Algebraic Notation (default).lanโ Long Algebraic Notation.uciโ Universal Chess Interface.
fileโ specify the filename. default isfastchess_(date)_(time).pgn.appendโ append to the file. default istrue.nodesโ track node count. default isfalse.seldepthโ track seldepth. default isfalse.npsโ track nps. default isfalse.hashfullโ track hashfull. default isfalse.tbhitsโ track tbhits. default isfalse.pvโ track the full pv. default isfalse.timeleftโ track time left at the end of the move. default isfalse.latencyโ track the difference between measured time and the engine-reported time at the end of the move. default isfalse.minโ minimal PGN format. default isfalse.match_lineโ adds lines to the PGN that match the given regex.
-epdout [file=NAME] [append=(true|false)]โ exports the final position of each game in EPD format.fileโ specify the filename. default isfastchess_(date)_(time).epd.appendโ append to the file. default istrue.
-event NAMEโ sets the event name for the PGN header.-site NAMEโ sets the site name for the PGN header.-ratinginterval (10|N)โ sets the rating interval for the report. default is10. set it to0to disable it entirely.-scoreinterval (1|N)โ forcutechessoutput, sets the interval for printing score results. default is1.-report penta=(true|false)โ reports pentanomial statistics (for Fastchess output). defaults totrue.
๐ Persistence & Recovery ๐
-config [file=NAME] [discard=(false|true)] [outname=(config.json|NAME)] [stats=(true|false)]โ loads engine configurations so you can resume games from previous sessions. your little save file ๐ซถfileโ the file name to load the configuration from.discardโ discards the loaded configuration after loading. defaults tofalse. this lets you specify a filename to save the configuration to, while ignoring it for the current session.outnameโ the auto-generated file name of the config. default isconfig.json.statsโ loads the stats from the config file, and ignoresappend=falsefor-pgnoutand-epdout. defaults totrue.
-recoverโ enables crash recovery, so it tries to recover the engine after a crash and keep the tournament going ๐โก๏ธ๐-autosaveinterval (20|N)โ automatically saves the tournament state every N games. default is20. set it to0to disable.
โญ Testing & Debugging โญ
--compliance ENGINE_PATH [ARGS]โ checks the UCI compliance of an engine by running it with the specified arguments.-crc32 pgn=trueโ calculates the CRC32 checksum for the PGN file.-check-mate-pvsโ checks that PVs for mate scores have the correct length and end in checkmate.-show-latencyโ shows the "think" latency (the difference between measured and reported time) for each engine. quick heads up bestie: a lot of engines add1msto the time they report, so the latency will be1mshigher than the actual latency. it's also possible for the latency to be negative, thanks to different measurement methods or missing synchronization of the clocks between different threads ๐ญ-testEnvโ specifies that the program is running in a test environment (OpenBench/Fishtest). this changes some outputs/settings.-strictโ makes fastchess exit and return1on any warning. zero tolerance, periodt ๐-log file=NAME level=(warn|trace|info|err|fatal) append=(true|false) compress=(false|true) realtime=(true|false) engine=(false|true)โ specifies a log file with a specific log level. setappendtofalseto overwrite an existing file โ default istrue. setcompresstotrueto write to a gzipped file with a timestamp (this ignoresappend) โ default isfalse. by default engine logs are disabled, so setenginetotrueto enable them.LEVEL:traceinfowarn(default)errfatal
-use-affinity [CPUS]โ enables thread affinity for binding engines to CPU cores.CPUSโ the cpus to use, as a list of the form"3,5,7-11,13".
-startup-ms Nโ sets the maximum time to wait for engine UCI initialization, in milliseconds. default is10000.-ucinewgame-ms Nโ sets the maximum time to wait for engine UCI new game initialization, in milliseconds. default is60000.-ping-ms Nโ sets the maximum time to wait for engine ping responses, in milliseconds. this is everything else which doesn't fit the above categories. default is60000.
โจ EXAMPLES โจ
Okay so you wanna see this in action? Say less, bestie. These are the exact command lines from the page, no cap.
๐ Example 1: match with random openings ๐
To start a match between two engines using random openings from book.epd:
$ fastchess -engine cmd=Engine1.exe name=Engine1 -engine cmd=Engine2.exe \
name=Engine2 -openings file=book.epd format=epd order=random \
-each tc=60+0.6 option.Hash=64 -rounds 200 -repeat -concurrency 4
๐ง Example 2: big SPRT test ๐ง
To start a SPRT test between two engines up to 100000 rounds (200000 games) with 3 concurrent games with one engine playing with 2 million nodes per move and 1 thread and the other playing with 1 million nodes per move and 2 threads, and both having a time control of 5 minutes plus 5 seconds increment per move, using random openings from UHO_Lichess_4852_v1.epd, Fishtest adjudication rules, and saving the games to a file in a specific folder with SAN notation and nodes count:
$ fastchess \
-engine cmd=Engine1.exe name=Engine1 option.Threads=1 nodes=2000000 \
-engine cmd=Engine2.exe name=Engine2 option.Threads=2 nodes=1000000 \
-openings file=UHO_Lichess_4852_v1.epd format=epd order=random \
-each tc=300+5 -resign movecount=3 score=600 -draw movenumber=34 movecount=8 score=20 \
-sprt elo0=0 elo1=2 alpha=0.05 beta=0.05 \
-rounds 100000 -concurrency 3 -pgnout notation=san nodes=true file=./games/sprt.pgn
๐ AUTHORS ๐
Fastchess was written by Disservin, Szil, PGG106, and contributors.
๐ซถ REPORTING BUGS ๐ซถ
Report any bugs to https://github.com/Disservin/fastchess/issues.
๐ COPYRIGHT ๐
This software is licensed under the MIT license. See the LICENSE file for details.
๐ Thatโs the whole page, bestie. The footer/source-version line says Fastchess(7), and thereโs no date printed in that footer. Now go slay your engine testing era ๐
โจ
๐ฆ where this page comes from
- nixpkgs unstable: fastchess 1.8.2-alpha
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms