Description
Cap est un CAPTCHA moderne, simple et open source, conçu comme une alternative éthique et auto-hébergeable à hCaptcha et reCAPTCHA. Contrairement à ces services, Cap :
- Ne tracke pas les utilisateurs : pas de Google Analytics, pas de fingerprinting
- Respecte le RGPD par design
- N'envoie pas les données à un tiers : tout reste sur votre serveur
- Propose plusieurs niveaux de difficulté (challenge visuel, computation proof-of-work)
- API simple : un widget JS + un endpoint REST
- Multi-tenant : un seul serveur peut servir plusieurs sites
- Themes : clair, sombre, custom
Comment ça marche :
- Le serveur Cap génère un challenge (image puzzle, PoW…)
- Le widget JS du client soumet la réponse
- Le serveur vérifie et renvoie un token
- L'app valide le token côté backend
Types de challenges supportés :
- Image : sélectionner les images qui correspondent (style hCaptcha)
- Proof-of-Work : calcul cryptographique (faible empreinte carbone)
- Mode invisible : détecte les bots sans interaction utilisateur
- Token-based : API REST pour intégration custom
Différence avec reCAPTCHA/hCaptcha : Cap ne vend pas vos données utilisateurs, ne dépend d'aucune API tierce et est gratuit à l'infini.
Cas d'usage :
- Formulaires de contact, login, inscription
- Protection contre le spam de commentaires
- Bot protection pour API
- Sites RGPD-strict (UE, données sensibles)
- Auto-hébergement éthique
Installation
Via Docker Compose (recommandé)
# docker-compose.yml
version: '3.8'
services:
cap:
image: tiagostudio/cap:latest
container_name: cap
restart: unless-stopped
environment:
- PORT=3000
- CAP_ADMIN_PASSWORD=*** - CAP_ALLOWED_ORIGINS=https://example.com,https://app.example.com
volumes:
- cap-data:/app/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.cap.rule=Host(`cap.example.com`)"
- "traefik.http.routers.cap.entrypoints=websecure"
- "traefik.http.services.cap.loadbalancer.server.port=3000"
networks:
- proxy
volumes:
cap-data:
networks:
proxy:
external: true
Standalone (Node.js)
git clone https://github.com/tiagostudio/cap.git cd cap npm install CAP_ADMIN_PASSWORD=*** npm start
Intégration côté client (HTML)
<script src="https://cap.example.com/cap.js"></script> <cap-widget data-cap-api-endpoint="https://cap.example.com/" data-cap-hidden-field-name="cap-token" ></cap-widget> <form> <input type="text" name="email" /> <cap-widget ...></cap-widget> <button type="submit">S'inscrire</button> </form>
Configuration
- CORS :
CAP_ALLOWED_ORIGINSdoit lister tous les domaines clients - Admin :
CAP_ADMIN_PASSWORDpour accéder au dashboard - Challenges : configurer le niveau de difficulté dans
config.toml - Mode invisible : score-based, vérification silencieuse
- Persistence : fichier SQLite par défaut (Docker volume)
- Rate limiting : nombre de challenges par IP (anti-bruteforce)
Alternatives
- hCaptcha (freemium) — Bonne alternative, mais envoie des données à Intuition Machines
- Google reCAPTCHA v3 — Gratuit mais tracking Google massif
- Cloudflare Turnstile — Excellent, gratuit, mais lié à Cloudflare
- Friendly Captcha — Open source partial, proof-of-work, allemand
- mCaptcha — Open source, PoW, indirection intéressante
- Anubis (Proof-of-Work, libre) — Focus protection de pages
Sécurité
- HTTPS obligatoire : le widget ne doit pas être servi en HTTP
- CORS strict : ne jamais mettre
*(l'origine du challenge doit être vérifiée) - Token TTL : tokens à durée limitée (5-15 min)
- Rate limiting : limiter les challenges par IP/empreinte
- Logs : attention à ne pas logger les challenges (anti-replay)
- Admin password : à stocker en secret (Docker secret ou
.env) - Audit : dashboard admin pour voir les abus
