A formal specification language and model checker to specify distributed systems.
Try out now at Fizzbee Online Playground. No installation needed.
If you are familiar with TLA+, this would be a quick start: From TLA+ to Fizz
On Mac, with brew:
brew tap fizzbee-io/fizzbee
brew install fizzbee
Alternately, prebuilt binaries are available for macOS and Linux. Please click the link below to get the latest release: Download the latest release.
You can try without installation at https://fizzbee.io/play
You can try without installation at https://fizzbee.io/play.
If you want to run the model checker locally, Download a correct pre-built release from https://github.com/fizzbee-io/fizzbee/releases, after extracting downloaded package, run:
./fizz path_to_spec.fizz
If you are a Mac user, and have trouble if you download the pre-built binary through browser, please check #152.
Dependencies:
- Bazel: You need bazel installed to build. Bazelisk is the recommended way to use bazel. Rename the binary to bazel and put it part of your PATH.
- gcc: This project uses protobuf. Bazel proto_library does not use precompiled protoc, and it builds from scratch. It requires g++ compiler.
sudo apt update; sudo apt install g++
Build:
bazel build parser/parser_bin
bazel build //:fizzbee
Run:
./fizz path_to_spec.fizz
Example:
./fizz examples/tutorials/19-for-stmt-serial-check-again/ForLoop.fizz
Note: Generally, you won't need to rebuild the binary, but most likely will be required after each git pull.
1. Build error on macOS with Protobuf
If you see a build error in Mac like this:
ERROR: /private/var/tmp/_bazel_jp/64463e3d7652188cb285edbcf54b686c/external/protobuf+/src/google/protobuf/io/BUILD.bazel:99:11: Compiling src/google/protobuf/io/printer.cc [for tool] failed: (Exit 1): cc_wrapper.sh failed: error executing CppCompile command (from target @@protobuf+//src/google/protobuf/io:printer) external/rules_cc++cc_configure_extension+local_config_cc/cc_wrapper.sh -U_FORTIFY_SOURCE -fstack-protector -Wall -Wthread-safety -Wself-assign -Wunused-but-set-parameter -Wno-free-nonheap-object ... (remaining 50 arguments skipped)
Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
In file included from external/protobuf+/src/google/protobuf/io/printer.cc:12:
bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h:918:19: error: 'get<std::function<bool ()>, std::string, std::function<bool ()>>' is unavailable: introduced in macOS 10.13
value = absl::get<Callback>(that.value);
^
bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h:863:11: note: in instantiation of function template specialization 'google::protobuf::io::Printer::ValueImpl<false>::operator=<true>' requested here
*this = that;
^
bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/protobuf+/src/google/protobuf/io/_virtual_includes/printer/google/protobuf/io/printer.h:1150:12: note: in instantiation of function template specialization 'google::protobuf::io::Printer::ValueImpl<false>::ValueImpl<true>' requested here
return ValueView(it->second);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/variant:1577:22: note: 'get<std::function<bool ()>, std::string, std::function<bool ()>>' has been explicitly marked unavailable here
constexpr const _Tp& get(const variant<_Types...>& __v) {
^
1 error generated.
This is a known issue with protobuf compilation in the recent version of protobuf.
You can fix it by adding the following to your .bazelrc file:
build --host_cxxopt=-std=c++14 --cxxopt=-std=c++14
The .bazelrc file is located in the root directory of the project. If it does not exist, you can create it.
That is, run the following command:
echo "build --host_cxxopt=-std=c++14 --cxxopt=-std=c++14" >> .bazelrc
2. macOS quarantine warning for prebuilt binaries
When running the fizzbee-20250213-macos_arm binary on macOS Sequoia 15.3 (build 24D60), you may encounter this warning:
Apple could not verify "python3" is free of malware that may harm your Mac or compromise your privacy.
To fix this, you can download the macos_arm release archive manually using this command:
curl -sL $(curl -s https://api.github.com/repos/fizzbee-io/fizzbee/releases/latest | grep "http.*macos_arm.tar.gz" | awk '{print $2}' | sed 's|[\"\,]*||g') | tar xzvf -FizzBee provides skills for AI coding assistants (Claude Code, Cursor, Gemini CLI, and other tools that support the Agent Skills standard). The skills give your AI assistant built-in knowledge of the FizzBee language, how to run the model checker, how to debug specs, and how to write model-based tests — without you having to explain any of it.
Four skills are included:
| Skill | Auto-invoked when... |
|---|---|
fizz-spec |
Writing or editing .fizz specification files |
fizz-check |
Verifying a spec or running the model checker |
fizz-debug |
A spec fails, produces unexpected results, or is slow |
fizz-mbt |
Writing Go adapter code alongside a .fizz spec |
If you installed fizzbee via brew, run:
fizz install-skillsThis installs skills and reference docs to ~/.claude/skills/, making them available across all your projects. To preview without making changes:
fizz install-skills --checkTo remove:
fizz install-skills --removeWithout a local fizzbee install, you can use the standalone script instead:
curl -fsSL https://raw.githubusercontent.com/fizzbee-io/fizzbee/main/install-claude-skills.sh | bashRe-run fizz install-skills after upgrading fizzbee to get updated skills and docs:
brew upgrade fizzbee && fizz install-skillsOnce installed, just work normally — your AI assistant will automatically use the right skill based on what you're doing. You can also invoke them explicitly: /fizz-spec, /fizz-check, /fizz-debug, /fizz-mbt.
To run all tests:
bazel test //...
To regenerate BUILD.bazel files,
bazel run //:gazelle
To add a new dependency,
bazel run //:gazelle -- update-repos github.com/your/repo
or
gazelle update-repos github.com/your/repo
When making grammar changes, run
antlr4 -Dlanguage=Python3 -visitor *.g4
and commit the py files. TODO: Automate this using gen-rule, so the generated files are not required in the repository
Only the go model checker is cross compiled to linux.
On local machine, run bazel build //:fizzbee.
To dockerize or to run on the linux server:
bazel build --platforms=//:linux_arm //:fizzbee
or
bazel build --platforms=//:linux_x86 //:fizzbee
Python seems to work without platforms flag but unfortunately, passing platforms flag actually breaks the build.
Official images are published to GitHub Container Registry for linux/amd64
and linux/arm64:
docker pull ghcr.io/fizzbee-io/fizzbee:latestMount the directory containing your spec and pass the spec path relative to it:
docker run --rm -v "$PWD":/workspace ghcr.io/fizzbee-io/fizzbee:latest path/to/Spec.fizzOutput (state graphs, traces) is written to out/ next to your spec via
the mount.
Add the following to your .bashrc or .zshrc:
alias fizz='docker run --rm -v "$PWD":/workspace ghcr.io/fizzbee-io/fizzbee:latest'Then run specs as if fizz were installed locally: fizz Spec.fizz.
ghcr.io/fizzbee-io/fizzbee:<version>(e.g.0.5.3) — pinned to a FizzBee release. The FizzBee code in a version tag never changes: it is always installed from that release's published assets. The image digest may still change if the tag is republished on a refreshed base image.ghcr.io/fizzbee-io/fizzbee:latest— the latest release, rebuilt monthly on a freshly patched base image even when there is no new FizzBee release.ghcr.io/fizzbee-io/fizzbee@sha256:...— an exact immutable image.
Use latest in CI to automatically receive OS-level security fixes; a
version tag for a stable FizzBee release; a digest for bit-for-bit
reproducibility.
The image is a thin wrapper around the official release tarball — the
exact artifact the pre-built binary installation uses — on a
python:3.12-slim-trixie (Debian stable) base. The FizzBee payload is
designed to add no scanner findings beyond the base image; verify
the current state yourself:
docker scout quickview ghcr.io/fizzbee-io/fizzbee:latest
# the Target and Base image rows should show identical countsIf a scan attributes findings to the FizzBee payload itself, please file an issue so we can investigate — the policy is to fix or explicitly document any payload-attributed finding.
Findings inherited from the Debian base are present in every image on that base. Their status is tracked by the Debian Security Tracker (see the per-package pages, e.g. perl). The monthly rebuild re-pulls the latest base image, so Debian fixes are picked up automatically once they become available in the base image.
The Dockerfile packages a published release (it does not build from the source checkout), so a release version is required:
docker build --build-arg FIZZBEE_VERSION=v0.5.3 -t fizzbee .To model-check with unreleased code, build from source directly instead (see Build from Source).