The CAPTCHA service is MIT-licensed and published at
github.com/hauju/bollwark-api. It is
a single Rust binary with no database server, no Redis and no message queue —
one container and a volume is a complete deployment.
What you get
Everything that decides whether a visitor is a bot:
GET /v1/puzzle,POST /v1/verifyandGET /v1/widget.js— the whole data plane.- The full risk-signal pipeline: address reputation, rate, geography, TLS fingerprint, honeypot, behavioural counters.
POST /v1/sitesand/v1/admin/*as an operator API, plus the decision log and validation dashboard.- Every scoring weight and tier threshold as a configuration knob.
The widget, the puzzle engine and the scorer are not a limited edition. The hosted service runs this same binary, unmodified.
What you don't get
The service is single-tenant on purpose: one ADMIN_TOKEN, one operator,
and sites with no owner field. There are no accounts, no orgs, no plan limits
and no billing.
That is what keeps self-hosting simple. You are the operator, the admin token
is yours, and every site on the instance is yours. Multi-tenancy is what
bollwark.eu adds on top for the hosted service — it is not missing from the
appliance, it is above it.
Where the reference lives
These pages cover the shape of a deployment. The authoritative reference travels with the code, because it has to move when the code does:
| Document | Covers |
|---|---|
CONFIGURATION.md |
The source of truth for every environment variable — score weights, tier thresholds, file formats. |
DEPLOYMENT.md |
Running the container: image tags, volumes, healthchecks, upgrades. |
INTEGRATION.md |
The integrator-facing flow in full detail. |
We don't restate the variable table here. A copy drifts from the repository it documents, and a stale configuration reference fails in an unhelpful way: somebody sets a knob that no longer exists and nothing complains.