How the challenge works
When a client requests a protected page, Anubis returns a challenge: a random number plus a difficulty parameter. The client must find a nonce such that SHA-256(challenge || nonce) has a pre-specified number of leading zeros — five by default. This is the same Hashcash idea Bitcoin mining uses, miniaturised to take a real browser about a second to solve on a laptop.
Once solved, the response is stored as a cookie (techaro.lol-anubis-auth) for roughly a week, after which the client must solve a new challenge. The economic logic: a real human visiting once a week pays a one-second tax; an AI scraper visiting 10,000 pages a day pays an unbearable CPU cost in aggregate.
Why FOSS projects deployed it
Anubis was created in response to Amazon's AI crawler overloading Xe's Git server while ignoring robots.txt. Within months, projects that had been bleeding bandwidth to ChatGPT, Claude, and Perplexity-style crawlers deployed it. The Linux kernel mailing list archive, sourcehut, FFmpeg, Wine, GNOME's GitLab, FreeCAD, and Duke's digital archives all run it. UNESCO digital repositories run it. The shared problem: small infra budgets vs. industrial-scale crawling that does not respect any opt-out signal.
Has it been bypassed?
Yes. Codeberg reported in August 2025 that "many AI scraper bots had learned how to solve the Anubis challenges." Codeberg still considered the protection useful — it had blocked the bulk of scraping for several months — but acknowledged adaptation.
Security researcher Tavis Ormandy demonstrated that native-code solvers (Go, Rust, C) can solve Anubis challenges far more efficiently than the JavaScript implementation ordinary users run, so a determined operator with a dedicated solver pays a fraction of the cost real users pay.
The practical takeaway: Anubis slows scrapers, raises their operational cost, and stops the cheapest ones outright. It does not stop a motivated operator who is willing to ship a native solver, and headless Chromium with JS enabled solves it naturally (just more slowly than a CPU-optimised binary).
