Cap

Cap

Grille d'images remplacée par un calcul en WebAssembly

Cap est un CAPTCHA libre qui remplace la grille d'images par un calcul. Le visiteur voit une case à cocher pendant que son navigateur résout une preuve de travail en WebAssembly. Le serveur Cap la valide et rend un jeton, que le backend du site lui fait ensuite confirmer avec une clé secrète.

Ce serveur existe sous deux formes. Cap Standalone, celle que recommande la documentation, est un conteneur Docker avec tableau de bord et plusieurs clés de site. La bibliothèque capjs-core, sur laquelle il est bâti, fait le même travail sans état, par jetons JWT signés, dans un backend existant ou sur Cloudflare Workers.

Le comparatif des CAPTCHA hébergés chez soi met en regard ce que Cap arrête et ce qu'arrêtent les autres outils.

HashWX réduit l'avantage des GPU, un défi DOM teste le navigateur

  • Une preuve de travail pensée contre les GPU : les nouvelles clés de Standalone utilisent HashWX, qui génère une fonction de hachage par défi. Selon les mesures de son concepteur, tevador, un GPU y résout environ deux fois plus de défis qu'un CPU, contre 150 fois plus en SHA-256, resté le défaut de capjs-core.
  • Un contrôle de l'environnement en plus du calcul : pour chaque requête, Standalone génère un programme JavaScript qui manipule le DOM dans une iframe, et dont le serveur connaît le résultat. La preuve de travail montre que le client a dépensé du calcul ; ce second défi, actif par défaut, montre qu'il l'a fait dans un vrai navigateur.
  • Navigateurs pilotés bloqués, en option : sept contrôles visent Selenium, Playwright, Puppeteer et leurs variantes furtives. Les fonctions natives réécrites, que touchent aussi les extensions anti-pistage, ne bloquent pas : elles remontent comme indicateur de risque.
  • Migration depuis reCAPTCHA : le /siteverify de Standalone attend les mêmes paramètres secret et response que celui de Google. Changent l'adresse, qui devient celle de l'instance, et l'encodage, qui passe en JSON.

Valkey requis, et certains navigateurs pilotés passent les contrôles

Standalone exige Valkey ou Redis. Depuis la v3, toutes ses données y vivent ; le Compose fourni lance Valkey à côté du conteneur Cap, qui tourne sous Bun (environ 50 Mo au repos selon la documentation). L'instance doit être joignable depuis Internet, mais derrière un reverse proxy : Cap lit l'IP du client dans X-Forwarded-For sans la contrôler, et un conteneur exposé en direct laisse contourner la limite de débit.

Ce que le serveur garde des visiteurs. Aucun cookie. Le code de Standalone tient des compteurs par clé de site : défis réussis, échoués ou limités et latence, heure par heure, plus la plateforme et le système d'exploitation tirés du User-Agent. L'IP sert de clé à la limite de débit et s'efface quelques secondes après. Pays et ASN ne s'ajoutent que si on les configure, par un en-tête du proxy ou une base d'IP : DB-IP Lite ou MaxMind GeoLite2, téléchargées sur le serveur, ou l'API IPInfo, qui reçoit alors chaque adresse.

Par défaut, le navigateur appelle jsDelivr. La balise documentée charge le widget depuis cdn.jsdelivr.net, et le widget y prend ses deux fichiers WASM au moment du calcul. Pour qu'aucune requête ne quitte le domaine, il faut les servir soi-même, par npm ou par le serveur d'assets de Standalone, désactivé par défaut.

Ce qui passe quand même. Selon la documentation, undetected-chromedriver et nodriver pilotant un Chrome avec interface passent les sept contrôles, Firefox sans interface aussi. Reste alors la preuve de travail, qui renchérit chaque requête sans l'interdire. HashWX exige WebAssembly : pour les clients qui n'en ont pas, la clé doit repasser en SHA-256. À la difficulté par défaut, le calcul a pris de 1,1 à 5,9 secondes sur les téléphones mesurés par le projet.

Apache 2.0, sans offre hébergée. Cap n'a ni version payante ni service géré, et sa documentation oriente ceux qui ne veulent rien héberger vers Turnstile ou FriendlyCaptcha. ALTCHA, sous MIT, fournit un widget et des bibliothèques à brancher dans son propre backend. mCaptcha est sous AGPL-3.0 et n'a publié aucune version depuis la v0.1.0 de mars 2024.

Un mainteneur, des versions rapprochées. Le dépôt date de janvier 2025 et un développeur signe 668 de ses 709 commits. La v3 de Standalone, sortie en avril 2026, a apporté le stockage Valkey ; 25 versions de Standalone ont paru depuis janvier 2026, la dernière image Docker (3.1.14) le 24 septembre.

SOURCES

DÉPÔThttps://github.com/tiagozip/cap
SITEhttps://trycap.dev/
LICENCEApache-2.0