Une alternative à Contentful et DatoCMS

Un panneau, N projets, une facture qui ne suit pas le trafic

CMS headless multi-tenant et API-first. Le chemin de lecture n'atteint jamais l'API — quand les visiteurs augmentent, c'est votre taux de cache qui monte, pas votre facture.

Vos données sur des serveurs que nous exploitonsAucun service tiers facturé à l'usageInstallation sur vos propres serveurs avec le plan Entreprise

Le chemin de lecture en chiffres

Requêtes en base par lecture
0
Requêtes HTTP par page
2
Réponse de la recherche tolérante aux fautes
<50 ms
Modules désactivables séparément
7+

Chaque composant sur notre propre infrastructure

PostgreSQL
Valkey
Typesense
Garage · compatible S3
cache en périphérie nginx
NestJS
Drizzle
Next.js

Fonctionnalités

L'infrastructure de contenu, sans les tracas

Tout se trouve derrière l'API ; aucune fonctionnalité n'est enfermée dans le panneau.

Multi-tenant et RLS

Chaque projet est un espace distinct. L'isolation se joue dans la base de données, pas dans l'application : la sécurité au niveau des lignes de PostgreSQL empêche les données d'un tenant de fuiter vers un autre, même si la couche applicative se trompe.

Moteur de schéma et rôles de champ

Les types de contenu ne sont pas figés dans le code ; vous les définissez depuis le panneau ou l'API. Les champs portent des rôles comme title, slug et body — le pipeline de build et la génération SEO regardent le rôle, pas le nom du champ.

Architecture modulaire

Médias, recherche, webhooks, SEO, GraphQL, import, analytics — chacun séparé et désactivable. Désactiver n'efface aucune donnée ; réactivez un module et il reprend là où il s'était arrêté.

Lectures servies depuis la périphérie

Le contenu publié est écrit à une adresse immuable au moment du build, puis servi depuis le cache en périphérie nginx. Ni le nombre d'entrées ni le nombre de visiteurs n'augmente le coût d'une lecture.

Bibliothèque de médias

Stockage objet compatible S3 (Garage), images répliquées sur trois zones et dérivés automatiques. Les fichiers que vous téléversez restent sur notre propre infrastructure et ne partent jamais vers un CDN facturé à l'usage.

Recherche tolérante aux fautes de frappe

Recherche plein texte multilingue propulsée par Typesense. Le visiteur qui tape « Istanul » trouve quand même la bonne entrée, et la réponse revient en moins de 50 millisecondes.

Webhooks

Publication, mise à jour, suppression — vos systèmes sont prévenus à chaque événement. La livraison est conservée dans une file d'attente durable et réessayée avec un backoff exponentiel ; même si le processus meurt, l'événement survit.

GraphQL

Le schéma ne s'écrit pas à la main : il est dérivé des types de contenu de l'espace. Ajoutez un type et il devient interrogeable. Les limites de profondeur et de longueur sont obligatoires, en protection contre les bombes de requêtes.

SDK typé

@corpusctl/client avec des adaptateurs React, Vue et Next.js. Les rendus de blocs arrivent avec zéro style par défaut — nous n'imposons pas une ligne de CSS, le design est entièrement le vôtre.

Exemples de code

Depuis le panneau, ou en une seule commande

Tout ce que vous faites dans le panneau a son équivalent API ; aucune fonctionnalité n'est enfermée dans l'interface.

publish.sh
# 1) Définir le type de contenu — le schéma n'est pas figé dans le code
curl -X PUT "$API/v1/content-types/post" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -H "content-type: application/json" \
  -d '{
    "name": "post",
    "title": "Post",
    "fields": [
      { "name": "title", "type": "text",   "role": "title", "required": true },
      { "name": "slug",  "type": "slug",   "role": "slug",  "required": true },
      { "name": "body",  "type": "blocks", "role": "body" }
    ]
  }'

# 2) Créer un brouillon
curl -X POST "$API/v1/documents" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -d '{ "type": "post", "data": { "title": "Hello", "slug": "hello" } }'

# 3) Publier — validation, build et mise en périphérie en un seul appel
curl -X POST "$API/v1/documents/$ID/publish" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT"

# → { "data": { "version": 3, "contentHash": "…", "durationMs": 42 } }

Le chemin de lecture ne touche pas à la base de données

  • Cache adressé par contenu. L'adresse est le hash du contenu. Comme elle ne peut pas changer, elle se conserve indéfiniment — la « donnée périmée » cesse d'être un problème.
  • Plus de trafic ne veut pas dire plus de coût. Parce que les requêtes de lecture n'atteignent jamais l'API, il n'y a aucun appel à compter ; la facture ne grimpe pas avec vos visiteurs.
  • Écriture et lecture dans des classes séparées. ReadClient ne porte aucun jeton secret et peut tourner dans le navigateur ; ManagementClient reste côté serveur. S'il n'y avait qu'une seule classe, laisser fuir un jeton serait une erreur d'une ligne.

Architecture

Chemin d'écriture séparé, chemin de lecture séparé

Le bouton Publier déclenche un build ; le visiteur lit le résultat de ce build, pas le système lui-même.

CHEMIN D'ÉCRITURECHEMIN DE LECTURE (RAPIDE)Panneau · ManagementClientAPI — NestJSPostgreSQLRLS · partitionpublierPipeline de buildFrontend · ReadClientcache en périphérie nginxhit → réponse en msen cas d'échecorigine — nginxStockage objet — compatible S3<tenant>/c/<hash>.json · immuableécrirelire
Les deux chemins ne se rejoignent qu'au stockage objet. Comme le trafic des visiteurs n'atteint ni l'API ni PostgreSQL, la charge côté écriture est totalement indépendante du côté lecture.

Adresse immuable

Le contenu est adressé par son hash. Une même adresse ne renvoie jamais un contenu différent, elle peut donc être mise en cache 30 jours ; le manifeste est rafraîchi au moment de la publication.

Le manifeste est fragmenté

Le fragment de manifeste à lire est calculé côté client à partir du slug. Même dans un espace de dix mille entrées, un seul petit fichier est téléchargé.

Versions et planification

Chaque enregistrement est versionné et une version antérieure peut être restaurée dans le brouillon. Une publication peut être planifiée à une date future ; le planificateur déclenche le build lui-même.

Comparatif

Où nous sommes devant, et où nous ne le sommes pas

Nous ne gagnons pas chaque ligne. Ce tableau existe pour que vous voyiez clairement ce que vous choisissez.

corpusctl comparé à Contentful et DatoCMS — d'après les informations produit publiques au août 2026.
CritèrecorpusctlContentfulDatoCMS
Modèle tarifaireForfait fixe. Comme les requêtes de lecture n'atteignent jamais l'API, il n'y a aucun appel à compter.Facturé par appel d'API, par enregistrement et par utilisateur ; dépassements payants.Facturé par appel d'API et par bande passante.
Gestion multi-projetsAu cœur du produit. Un panneau, un nombre illimité d'espaces ; un utilisateur porte un rôle distinct dans chacun.Chaque projet est un « space » ; la plupart des plans facturent par space.Chaque projet est un environnement distinct ; un plan par projet.
Isolation des tenantsAu niveau de la base — sécurité au niveau des lignes de PostgreSQL (RLS).Au niveau applicatif ; détails non divulgués.Au niveau applicatif ; détails non divulgués.
Localisation des donnéesDes serveurs que nous exploitons ; entièrement chez vous avec le plan Entreprise.Le cloud de l'éditeur ; choix de région sur les plans supérieurs.Le cloud de l'éditeur ; choix de région sur les plans supérieurs.
Services tiers facturés à l'usageAucun. PostgreSQL, Valkey, Typesense, Garage, nginx — tout sur notre propre infrastructure.Oui ; les couches recherche, images et CDN sont facturées à l'usage.Oui ; le CDN d'images et les transformations sont facturés à l'usage.
Rendu imposéAucun. Les rendus de blocs arrivent avec zéro style par défaut ; un bloc inconnu est ignoré, jamais fatal.Un moteur de rendu rich text est fourni ; les choix de style vous appartiennent.Un moteur de rendu de texte structuré est fourni ; les choix de style vous appartiennent.
Désactivation des fonctionnalitésChaque fonctionnalité est un module désactivable ; désactiver n'efface aucune donnée, un passage à un plan inférieur non plus.Les limites du plan rendent la fonctionnalité inaccessible.Les limites du plan rendent la fonctionnalité inaccessible.
Réseau de périphérie mondialCache en périphérie sur une seule région. Nous n'avons pas de réseau de PoP mondial.CDN mondial multi-régions.CDN mondial multi-régions.
Place de marché d'applicationsAucune. Les intégrations s'écrivent avec les webhooks et l'API.Un écosystème d'applications large et mature.Un écosystème de plugins est disponible.
Maturité entrepriseProduit jeune ; le SSO et un SLA formel sont à la feuille de route.SOC 2, SSO, SLA — mature.SSO et SLA sur les plans supérieurs.
Si vous servez une audience mondiale à la milliseconde et qu'il vous faut une place de marché d'intégrations toute prête, la réponse honnête est que Contentful est aujourd'hui plus mature. Mais pour les équipes qui servent la Turquie et l'Europe, gèrent plusieurs projets et refusent que le nombre de visiteurs fasse bouger leur facture, corpusctl est un compromis délibérément meilleur.

FAQ

Questions fréquentes

Si vous n'avez pas trouvé ce que vous cherchiez, écrivez à [email protected].

Ouvrez votre premier espace aujourd'hui

Créer un compte prend quelques minutes : une adresse e-mail, un mot de passe et un nom pour votre espace suffisent. Nous ne demandons pas de carte. Si vous avez besoin d'aide pour migrer, écrivez-nous.