5.5 KiB
5.5 KiB
title: Cap (Captcha) created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, development, captcha, securite, anti-bot, self-hosted] confidence: high contested: false sources: [https://selfh.st/apps/?tag=Development, https://github.com/tiagostudio/cap]
💻 Cap (Captcha)
CAPTCHA open source auto-hébergé, alternative à hCaptcha et Google reCAPTCHA, sans tracking, sans envoi de données à un tiers, sans dépendance cloud.
📋 Informations Générales
| Champ | Valeur |
|---|---|
| Site web | capjs.js.org |
| GitHub | tiagostudio/cap |
| License | Apache-2.0 |
| Langage | TypeScript (server) + JS/TS (client) |
| Étoiles GitHub | 6 776 ⭐ |
| Catégorie | cat-development |
| Note | 100% gratuit et open source, auto-hébergeable, RGPD-friendly (pas de tracking Google), pas d'édition payante. |
📝 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
📚 Ressources
🔗 Pages Liées
- cat-development — Catégorie Development
- app-traefik — Reverse proxy HTTPS
- securisation-home-lab — Bonnes pratiques sécurité
- recettes-docker-compose — Templates Docker
- app-authentik / app-authelia — Authentification (CAPTCHA complémentaire)