A Caddy module that blocks unwanted requests using a sha256 PoW challenge
Go
188
105 commits
updated Sep 10, 2026
Cerberus guards the gates of open source infrastructure using a sha256 PoW challenge to protect them from unwanted traffic. It provides a Caddy handler that can be applied to existing Caddy servers.
This project started as a Caddy port of Anubis and is now a standalone project. While Anubis focuses on protecting websites from AI scrapers, Cerberus serves a different purpose: it's designed as a last line of defense to protect volunteer-run open source infrastructure from abusive traffic. We would do whatever it takes to stop them, even if it means sacrificing a few innocent cats.
For now, the project is still mostly a re-implementation of Anubis, but it's actively developed, and will eventually employ more aggressive techniques. You can check the Roadmap section for more details.
Sometimes the official binaries are not up to date. In that case please build from source.
caddy add-package github.com/sjtug/cerberus
Please build against the dist branch or a release tag:
# Build with a specific version
xcaddy build --with github.com/sjtug/[email protected]
# Or build with the latest dist branch
xcaddy build --with github.com/sjtug/cerberus@dist
Check Caddyfile for an example configuration.
This is the first divergence from Anubis. Now, we require a user to repeat the challenge every few accesses. This is to ensure that we waste an attacker's computational resources to the extent that it becomes non-sustainable for the attacker to perform the attack.
This will surely slow down legitimate users, but we believe that this is a necessary evil to protect our infrastructure. After all, a slow down is better than a complete outage.
You need to first generate necessary go files before developing:
$ devenv tasks run go:codegen
If you modified any web asset, you need to run the following command to build the dist files:
$ devenv tasks run dist:build
Please run tests and lints before submitting a PR:
$ direnv test # or go test
$ devenv tasks run go:lint
This repository uses a two-branch strategy:
To create a release:
Version constant in core/const.go.8,476 followers · starred Apr 2025
4,261 followers · starred Jun 2025
739 followers · starred Jun 2025
487 followers · starred Apr 2025
A Caddy module that blocks unwanted requests using a sha256 PoW challenge
Go
188
105 commits
updated Sep 10, 2026
Cerberus guards the gates of open source infrastructure using a sha256 PoW challenge to protect them from unwanted traffic. It provides a Caddy handler that can be applied to existing Caddy servers.
This project started as a Caddy port of Anubis and is now a standalone project. While Anubis focuses on protecting websites from AI scrapers, Cerberus serves a different purpose: it's designed as a last line of defense to protect volunteer-run open source infrastructure from abusive traffic. We would do whatever it takes to stop them, even if it means sacrificing a few innocent cats.
For now, the project is still mostly a re-implementation of Anubis, but it's actively developed, and will eventually employ more aggressive techniques. You can check the Roadmap section for more details.
Sometimes the official binaries are not up to date. In that case please build from source.
caddy add-package github.com/sjtug/cerberus
Please build against the dist branch or a release tag:
# Build with a specific version
xcaddy build --with github.com/sjtug/[email protected]
# Or build with the latest dist branch
xcaddy build --with github.com/sjtug/cerberus@dist
Check Caddyfile for an example configuration.
This is the first divergence from Anubis. Now, we require a user to repeat the challenge every few accesses. This is to ensure that we waste an attacker's computational resources to the extent that it becomes non-sustainable for the attacker to perform the attack.
This will surely slow down legitimate users, but we believe that this is a necessary evil to protect our infrastructure. After all, a slow down is better than a complete outage.
You need to first generate necessary go files before developing:
$ devenv tasks run go:codegen
If you modified any web asset, you need to run the following command to build the dist files:
$ devenv tasks run dist:build
Please run tests and lints before submitting a PR:
$ direnv test # or go test
$ devenv tasks run go:lint
This repository uses a two-branch strategy:
To create a release:
Version constant in core/const.go.8,476 followers · starred Apr 2025
4,261 followers · starred Jun 2025
739 followers · starred Jun 2025
487 followers · starred Apr 2025