---
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](https://capjs.js.org/) |
| **GitHub** | [tiagostudio/cap](https://github.com/tiagostudio/cap) |
| **License** | Apache-2.0 |
| **Langage** | TypeScript (server) + JS/TS (client) |
| **Étoiles GitHub** | 6 776 ⭐ |
| **Catégorie** | [[cat-development\|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** :

1. Le serveur Cap génère un challenge (image puzzle, PoW…)
2. Le widget JS du client soumet la réponse
3. Le serveur vérifie et renvoie un token
4. 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é)

```yaml
# 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)

```bash
git clone https://github.com/tiagostudio/cap.git
cd cap
npm install
CAP_ADMIN_PASSWORD=*** npm start
```

### Intégration côté client (HTML)

```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

1. **CORS** : `CAP_ALLOWED_ORIGINS` doit lister tous les domaines clients
2. **Admin** : `CAP_ADMIN_PASSWORD` pour accéder au dashboard
3. **Challenges** : configurer le niveau de difficulté dans `config.toml`
4. **Mode invisible** : score-based, vérification silencieuse
5. **Persistence** : fichier SQLite par défaut (Docker volume)
6. **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

- [Documentation officielle](https://capjs.js.org/)
- [GitHub tiagostudio/cap](https://github.com/tiagostudio/cap)
- [Démo en ligne](https://capjs.js.org/)
- [Pourquoi pas reCAPTCHA ?](https://capjs.js.org/#why-cap)

## 🔗 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)
