Cap

Cap

Checkbox up front, WebAssembly proof of work underneath

Cap is an open-source CAPTCHA that swaps the image grid for a computation. Visitors see a checkbox while their browser works through a proof of work in WebAssembly. The Cap server checks the answer and hands back a token, which the site's backend then confirms with that same server using a secret key.

The server comes in two shapes. Cap Standalone, the one the docs recommend, is a Docker container with a dashboard and support for several site keys. capjs-core, the library Standalone is built on, does the same job statelessly with signed JWTs, inside an existing backend or on Cloudflare Workers.

The comparison of self-hosted CAPTCHAs sets what Cap stops against what the other tools stop.

GPU-resistant HashWX plus a DOM check for real browsers

  • Proof of work built against GPUs: new Standalone keys use HashWX, which generates a fresh hash function for each challenge. By the measurements of its designer, tevador, a GPU clears about twice as many challenges as a CPU, against roughly 150 times as many with SHA-256, still the default in capjs-core.
  • A browser check on top of the computation: for every request, Standalone generates a JavaScript program that works on the DOM inside an iframe, and the server knows the expected result. Proof of work shows the client spent CPU time; this second challenge, on by default, shows it did so in a real browser.
  • Optional blocking of automated browsers: seven checks target Selenium, Playwright, Puppeteer and their stealth variants. Tampered native functions, which privacy extensions also patch, never block on their own and come back as a risk flag instead.
  • Moving off reCAPTCHA: Standalone's /siteverify takes the same secret and response parameters as Google's. What changes is the URL, now your own instance, and the encoding, now JSON.

Needs Valkey, loads from jsDelivr, still lets some bots through

Standalone needs Valkey or Redis. Since v3 all of its data lives there; the bundled Compose file starts Valkey next to the Cap container, which runs on Bun (around 50 MB idle, per the docs). The instance has to be reachable from the internet, but behind a reverse proxy: Cap takes the client IP from X-Forwarded-For without checking it, so a container exposed directly lets anyone dodge the rate limit.

What the server keeps about visitors. No cookies. Standalone's code keeps counters per site key: passed, failed and rate-limited challenges and latency, bucketed by hour, plus platform and OS parsed from the User-Agent. The IP serves as the rate-limit key and expires a few seconds later. Country and ASN are recorded only if you set them up, through a proxy header or an IP database: DB-IP Lite or MaxMind GeoLite2, downloaded to the server, or the IPInfo API, which then receives every address.

By default, the browser calls jsDelivr. The documented script tag loads the widget from cdn.jsdelivr.net, and the widget fetches its two WASM files from there at solve time. Keeping every request on your own domain means serving those files yourself, from npm or from Standalone's asset server, which is off by default.

What still gets through. According to the docs, undetected-chromedriver and nodriver driving a headed Chrome pass all seven checks, and so does headless Firefox. Against them only the proof of work remains, which makes each request cost more without stopping it. HashWX needs WebAssembly, so for clients without it the key has to fall back to SHA-256. At the default difficulty, solving took 1.1 to 5.9 seconds on the phones the project measured.

Apache 2.0, no hosted plan. Cap has no paid tier and no managed service, and its docs point anyone who refuses to host anything toward Turnstile or FriendlyCaptcha. ALTCHA, under MIT, ships a widget plus libraries you wire into your own backend. mCaptcha is AGPL-3.0 and has not published a release since v0.1.0 in March 2024.

One maintainer, frequent releases. The repository dates from January 2025, and one developer authored 668 of its 709 commits. Standalone v3, out in April 2026, brought Valkey storage; 25 Standalone releases have shipped since January 2026, the latest Docker image (3.1.14) on September 24.