Backend
CMS
Frontend
Rust
Svelte

Directus : mon choix de CMS pour les clients qui ont besoin d'éditer leur contenu

J'ai commencé ma carrière (il y a 15 ans) en développant des thèmes WordPress entièrement personnalisés. Mais je dois avouer que je n'ai jamais trouvé cette solution très satisfaisante : une interface d'administration très peu user-friendly et une sensation globale de lourdeur, entre autre choses.

Après plusieurs années sans avoir utilisé de CMS sur mes missions, un client a exprimé le besoin d'avoir un site multilingue, avec des news, et globalement du contenu qui évolue régulièrement, tout en embarquant une partie applicative avec une interface de calcul complexe. J'ai tout de suite pensé qu'il lui faudrait un CMS pour qu'il soit autonome dans la gestion de son contenu, mais je voulais vraiment lui proposer quelque chose de facile à utiliser, et qui me permettrait d'intégrer tout ça avec un framework frontend pour la partie formulaire de calcul. J'ai donc fait un état de l'art de ce qui ce faisait en terme de CMS, et c'est là que j'ai découvert le concept de "Headless CMS", qui m'a semblé être la solution parfaite pour mon besoin.

J'ai donc envisagé et testé plusieurs solutions (Strapi, Ghost, Contentful...), et j'ai finalement été très séduit par Directus, pour des raisons que je vais détailler dans cette article. Cela fait maintenant plusieurs années que je l'utilise sur différents projets, et tout le monde en est vraiment satisfait : les clients ont une interface simple d'utilisation, moi car je peux me concentrer sur les aspects techniques et intégrer le contenu avec un backend Rust et un frontend Svelte, Yew ou html simple.

Un back-office que les clients ont envie d'ouvrir

D'abord un mot sur l'interface de gestion, qui me permet de paramétrer très facilement le Data Model, c'est à dire les typologies de contenu que le client pourra éditer : pages uniques, collections, menus, formulaires etc. Chaque model peut avoir une icône pour facilement le différencier dans l'interface, et il y a une grande variété de type de champs disponibles (simple champs texte, éditeur WYSIWYG, Markdown, Code, Toggle, Datetime, Map, Color, Dropdown, Image, File...) que l'on peut organiser par section.

On peut ensuite gérer les permissions de manière très fine, et associer rôles et utilisateurs avec des droits d'ajout, modification, suppression sur chaque model de manière distincte, ce qui permet d'autoriser certains utilisateurs à modifier uniquement certaines sections du site, mais aussi d'éviter les erreurs de manipulation (ex: permettre d'ajouter, éditer, mais pas supprimer). On peut aussi mettre en place un cycle de validation avec des statuts pour chaque model, ou encore le versionning automatique.

Enfin, la gestion des traductions, ultra flexible, qui permet notamment d'avoir le contenu de deux langues côte à cote sur chaque page.

Tout ça dans une interface ultra rapide, claire, simple et (je n'ai jamais eu besoin de faire de formation spécifique de plus de 5 minutes, à des personnes non techniques), avec un thème paramétrable très facilement.

Un contenu que l'on peut intégrer n'importe où

Récupérer le contenu est ensuite un jeu d'enfant, grâce aux API REST et GraphQL automatiquement générées par DIrectus, qui permettent aussi de filtrer, trier, paginer le texte et de gérer le format des images retournées. De plus les API sont mise à jour en temps réel quand on édite le contenu, pas besoin de rechargement ni quoi que ce soit.

Dans mes projets client où j'ai un backend Rust, j'utilise plutôt l'API GraphQL qui me permet de récupérer les schémas et de générer automatiquement les types associés aux modèles. Avec la stack Rocket + rocket_dyn_templates, cela permet de récupérer le contenu côté serveur, puis de l'injecter dans un template Handlebars, et enfin retourner uniquement du html au browser. Cela donne des pages très légères côté client, sans javascript.

Dans le cas où j'utilise plutôt un framework frontend tel que Svelte, j'utilise plutôt l'API REST via des script serveur Svelte, qui permettent d'injecter directement le contenu dans les composants. Dans cette configuration, il faut cependant générer manuellement les interfaces TypeScript. À noter aussi que Directus gère les filtres profonds, ce qui permet de requeter de manière assez complexe et de gérer les relations afin d'obtenir le contenu souhaiter en une seule requête, ce qui est assez pratique pour les traductions, les métadonnées SEO etc.

Gérer le contenu par la conversation

Faisant écho à l'engouement actuel pour l'IA générative, les développeurs de Directus offrent depuis peu la possibilité d'activer un serveur MCP sur nos propres instances, qui permet d'exposer les collections, items et fichiers à n'importe quel LLM compatible. Très sincèrement, j'avais des doutes sur l'utilité de cette fonctionnalité, comme beaucoup de "solutions" IA en ce moment. Mais j'ai trouvé un cas d'usage qui m'a vraiment servi : la traduction.

Tout d'abord, la configuration de l'intégration est vraiment bien faite. On peut connecter son compte OpenAI, Anthropic ou Google, ainsi que n'importe quel provider ayant une API compatible (Ollama par exemple). Il est possible de gérer quels modèles peuvent être utilisés et désactiver la capacité de supprimer des données par exemple. Personnellement j'ai testé avec Claude, et toutes les intéractions sont vraiment bien faites, le modèle décrit ce qu'il fait, demande systématiquement la permission d'effectuer ses actions etc.

Comme je le disais, j'ai donc testé l'intégration pour traduire mon contenu. J'avais rempli le contenu de ma page en français, et j'ai simplement demandé à Claude de me "traduire la page X du français vers l'anglais" et en quelques secondes, c'était fait ! Tous les champs étaient correctement formatés, y compris les champs complexes en html où les bonnes expressions étaient en gras par exemple. Vraiment bluffant ! Je n'ai pas eu d'autres besoins pour le moment, mais on voit bien le potentiel.

Conclusion

Pour finir, selon moi, Directus réussit là où la plupart des CMS échouent : il est réellement utilisable par des éditeurs non-techniques, confortable à intégrer aussi bien depuis un langage compilé et fortement typé comme Rust qu'avec un framework frontend comme Svelte, et l'ajout du serveur MCP est loin d'être un gadget, en permettant d'effectuer des opérations en masse qui prendraient un après-midi à cliquer dans l'admin (traduire cinquante fiches, auditer une relation sur neuf cents références, normaliser des valeurs de champs inconsistantes...) en quelques minutes grâce à une simple conversation.