Self-hosting Bollwark

What you get, what stays behind, and where the authoritative reference lives.

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/verify and GET /v1/widget.js — the whole data plane.
  • The full risk-signal pipeline: address reputation, rate, geography, TLS fingerprint, honeypot, behavioural counters.
  • POST /v1/sites and /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.