Published by January 21, 2025 · Reading time 7 minutes · Created by Cod'Hash Team
Après des années à travailler avec différents CMS pour nos clients — WordPress, Strapi, Contentful, Sanity — un constat s'impose : aucune solution ne répond vraiment aux besoins de nos projets.
Ce n'est pas une critique gratuite. Ce sont des constats concrets, issus de vrais projets de production.
WordPress : une base de données relationnelle utilisée comme un système de fichiers. Chaque plugin ajoute des dizaines de tables. Le moindre article multilingue devient un casse-tête entre WPML, Polylang ou TranslatePress. Résultat ? Des performances catastrophiques et une dette technique qui s'accumule.
Strapi : prometteur sur le papier, mais la réalité est différente. La gestion des relations complexes devient vite un enfer. Le système de permissions manque de granularité. Et surtout, la migration de v3 à v4 a cassé tellement de projets que beaucoup ont préféré tout réécrire.
Contentful & Sanity : excellents pour du contenu structuré, mais leur modèle de pricing explose dès que vous avez un vrai trafic. $500/mois pour gérer 10 blogs d'entreprise ? Vous payez pour des features dont vous n'avez pas besoin.
Le vrai problème ? Ces CMS ne sont pas conçus pour les besoins spécifiques des agences et des SaaS modernes.
En analysant nos 15 derniers projets clients, des patterns clairs se sont dégagés :
Pas besoin de GraphQL complexe avec 50 champs optionnels. Nos équipes frontend veulent :
GET /api/v1/blog/articles → liste des articlesGET /api/v1/blog/articles/[slug] → un article spécifiquePOST /api/v1/blog/articles → créer un articleC'est tout. Des endpoints clairs, une authentification par API key, et ça fonctionne. Pas de documentation de 200 pages à lire.
Quand un client nous demande un blog FR/EN/DE, on ne veut pas :
/fr/article renvoie la version anglaiseNotre solution ? Chaque article a des translations natives. Un slug par langue. Des métadonnées SEO par langue. Le tout dans une structure de données propre et prévisible.
// Structure réelle de notre API
{
"id": "article-123",
"status": "PUBLISHED",
"translations": [
{
"language": "fr",
"slug": "pourquoi-cms-headless",
"title": "Pourquoi un CMS headless ?",
"seoTitle": "CMS Headless : Notre Solution sur-mesure",
"published": true
},
{
"language": "en",
"slug": "why-headless-cms",
"title": "Why a headless CMS?",
"seoTitle": "Headless CMS: Our Custom Solution",
"published": true
}
]
}
Nos clients veulent souvent gérer plusieurs blogs. Mais avec les CMS classiques, ça veut dire :
Notre approche ? Un SaaS multi-tenant. Chaque organisation a son blog, ses API keys, son équipe, sa facturation. Un seul déploiement. Une seule base de données. Une seule codebase.
Un CMS moderne doit gérer des équipes. Voici ce qu'on a implémenté :
Chaque membre peut avoir des permissions sur les API keys :
blog:read — lecture seuleblog:write — création/modificationblog:publish — publication d'articlesblog:manage — gestion complètePas de rôles prédéfinis rigides. Des permissions composables.
Générer un sitemap XML ? C'est un endpoint :
GET /api/v1/blog/sitemap.xml
Un flux RSS ? Même logique :
GET /api/v1/blog/rss.xml
Métadonnées Open Graph, temps de lecture estimé, images optimisées, canonical URLs — tout ça est géré nativement. Pas besoin d'installer Yoast ou un équivalent.
Nous ne sommes pas partis de zéro. Nous avons choisi des technologies éprouvées :
Next.js 15 + React 19 + TypeScript
PostgreSQL + Prisma
.prisma par feature)better-auth
Validation et types
API REST documentée
/api/v1/blog/*)Chaque vue d'article est trackée avec :
Endpoint :
GET /api/v1/blog/analytics
Recherche dans le titre, l'extrait et le contenu. Filtres par catégorie, tag, statut. Tri par date ou popularité.
GET /api/v1/blog/search?q=headless&category=dev&sort=popular
UploadThing pour l'upload. Tracking des dimensions, poids, utilisation. Alt text pour l'accessibilité.
Créez des clés API avec des permissions précises :
{
"name": "Frontend Production",
"permissions": ["blog:read"],
"expiresAt": "2026-01-21"
}
Depuis 6 mois de développement et 3 mois en production :
Performance
Développement
Coûts
Le headless est la bonne approche. Nos clients veulent du Next.js, du Nuxt, du Astro. Ils ne veulent pas d'un thème WordPress.
La simplicité d'API paie. Pas de GraphQL complexe. Des endpoints REST clairs. Une documentation de 2 pages.
Le multilingue natif est essentiel. Ce n'est pas un plugin. C'est au cœur du data model.
La gestion des médias. Pour l'instant, c'est fonctionnel mais basique. Nous prévoyons :
Les webhooks. Actuellement, il faut poll l'API. Nous ajoutons :
L'éditeur de contenu. Tiptap fonctionne, mais nous voulons :
Nous n'avons pas créé ce CMS par ego technique. Nous l'avons créé parce que aucune solution existante ne répondait à nos besoins réels :
Ce CMS n'est pas pour tout le monde. Si vous voulez un site vitrine avec 10 pages statiques, WordPress fera l'affaire.
Mais si vous construisez :
Alors vous rencontrerez les mêmes limites que nous. Et vous comprendrez pourquoi nous avons fait ce choix.
Vous voulez discuter de votre projet ou en savoir plus ? Contactez-nous.