Developers - official-stockfish/Stockfish GitHub Wiki
Stockfish's improvement over the last decade has been a great community effort.
Nowadays most development talk takes place on Discord.
There are many ways to contribute to Stockfish:
- Stockfish (C++)
- nnue-pytorch (C++ and Python)
- Donating hardware
If you want to contribute to Stockfish directly, you can do so in a couple of ways.
Follow the steps described in our Fishtest wiki to create your first test.
It is advised to first follow the development setup steps for your platform.
New commits to stockfish can mostly be categorised in 2 categories:
- Non functional changes: These are changes that don't change the search behaviour and can be directly submitted as pull requests.
- Functional changes: These change the search behaviour and lead to a different search tree. Every functional patch has to be verified by Fishtest, our testing framework.
NNUE Pytorch is the trainer for Stockfish's neural network.
Usually changes here are tested by training a new network and testing it against the current network via Fishtest.
Improving Stockfish requires a massive amount of testing.
You can donate your hardware resources by installing the Fishtest Worker and view the current tests on Fishtest.
This section provides instructions for setting up your environment to develop and compile Stockfish on different operating systems.
Show more
- https://www.msys2.org/
- Download the installer
In the MSYS2 Installer change the installation folder to:
C:\tools\msys64
In the URTC64
Shell run:
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
Download LLVM 20
Run the executable and in the installer choose:
Add LLVM to the system PATH for current user
There's a much higher quality version of this available on our Discord.
output.mp4
More in depth information about various compilers can be found here.
Show more
On Unix-like systems you will most likely have all the tools installed,
which are required to build Stockfish. Except clang-format
which we use to format our codebase.
sudo apt install build-essential git
From your normal package manager or through the install script found at https://apt.llvm.org/.
sudo apt install clang-format-20
Show more
On MacOS you will need to install the Xcode Command Line Tools.
It is enough to run the following command in your terminal, instead of installing the full Xcode.
sudo xcode-select --install
brew install clang-format@20
Note
Only really useful for maintainers.
Place the following file into .git/hooks/pre-push
and make it executable (chmod +x .git/hooks/pre-push
).
This specific Git Hook (pre-push) prevents pushes to the master branch if there are uncommitted changes, formatting issues, or if commit messages do not contain a "Bench" or "No functional change" entry.
Show more
#!/bin/bash
if ! which clang-format-18 >/dev/null; then
CLANG_FORMAT=clang-format
else
CLANG_FORMAT=clang-format-18
fi
# Extracted from the Makefile
SRCS=$(awk '/^SRCS = /{flag=1; sub(/^SRCS = /,""); print} /^$/{flag=0} flag && !/^SRCS = /{print}' ./src/Makefile | tr -d '\\' | xargs echo | tr ' ' '\n' | sed 's|^|./src/|')
HEADERS=$(awk '/^HEADERS = /{flag=1; sub(/^HEADERS = /,""); print} /^$/{flag=0} flag && !/^HEADERS = /{print}' ./src/Makefile | tr -d '\\' | xargs echo | tr ' ' '\n' | sed 's|^|./src/|')
while read local_ref local_sha remote_ref remote_sha; do
if [[ "$remote_ref" == "refs/heads/master" ]]; then
# Check open diffs
if [[ -n $(git status --porcelain) ]]; then
echo "Please commit or stash your changes before pushing."
exit 1
fi
# Check formatting
if ! $CLANG_FORMAT --dry-run -Werror -style=file $SRCS $HEADERS; then
echo "Please run 'make format' to fix formatting issues and rebase the last commit."
exit 1
fi
# Iterate through commits
for commit in $(git rev-list --no-merges $remote_sha..$local_sha); do
commit_msg=$(git log --format=%B -n 1 $commit)
# bench regex as defined in ci
# check for the existence of a bench in the commit message
bench_regex='\b[Bb]ench[ :]+[1-9][0-9]{5,7}\b'
if echo "$commit_msg" | grep -m 1 -o -x -E "$bench_regex" >/dev/null; then
continue
fi
# check for the existence of "No functional change" in the commit message
no_functional_change_regex='\b[Nn]o[[:space:]][Ff]unctional[[:space:]][Cc]hange\b'
if echo "$commit_msg" | grep -o -x -E "$no_functional_change_regex" >/dev/null; then
continue
fi
echo "Commit $commit does not contain a Bench or 'No functional change'."
exit 1
done
fi
done
exit 0
- Review the Terms of Use: First and foremost, you should read our Terms of Use and adhere to them carefully.
- Understand the UCI Protocol: Stockfish is a UCI chess engine, meaning it communicates via the Universal Chess Interface (UCI) protocol. You can find a detailed explanation of this protocol here. Basic demonstrations of the available commands are available in UCI & Commands.
-
Implement Process Communication: Your application will need to interact with the Stockfish executable. This typically involves:
- Opening the Stockfish executable.
- Writing commands to its
stdin
. - Listening for Stockfish's output, which will appear on its
stdout
.
-
NodeJS: You can follow this guide on how to communicate with a program.
- Basic example of using Stockfish on the web: https://github.com/Disservin/html-js-stockfish
-
Python: Use python-chess (
pip install chess
): https://python-chess.readthedocs.io/en/latest/engine.html - C++: Boost.Process can be used for easy process communication.
- Rust: Examine the documentation on how to spawn a Command.
I want Stockfish to comment on the move it made, what do I need to do?
That is not possible. You will have to write your own logic to create such a feature.
I want to get an evaluation of the current position.
In order to get an accurate evaluation of the current position, you need to use the UCI go
command with a specified limit (e.g., time, depth, nodes).
An eval
command is available, but it only provides a static and very rough evaluation of the position without any search involved and is not recommended for most use cases.
Stockfish is free and distributed under the GNU General Public License version 3 (GPL v3). Essentially, this means you are free to do almost exactly what you want with the program, including distributing it among your friends, making it available for download from your website, selling it (either by itself or as part of some bigger software package), or using it as the starting point for a software project of your own. This also means that you can distribute Stockfish alongside your proprietary system, but to do this validly, you must make sure that Stockfish and your program communicate at arm's length, that they are not combined in a way that would make them effectively a single program.
The only real limitation is that whenever you distribute Stockfish in some way, you MUST always include the license and the full source code (or a pointer to where the source code can be found) to generate the exact binary you are distributing. If you make any changes to the source code, these changes must also be made available under GPL v3.