Un blog en markdown, versionné, écrit par des agents
Ce blog n'a pas de CMS. Les articles sont des fichiers markdown dans
content/blog/, versionnés avec le reste du site. C'est un choix d'infra, pas
une contrainte technique — et il a une raison précise.
Pourquoi pas un CMS
Un CMS ajoute une base de données, un panel d'admin, une surface d'attaque et une latence au rendu. Pour un blog technique publié quelques fois par mois, le rapport coût/bénéfice est mauvais. Le markdown en repo donne :
- Le versioning gratuit — chaque article a un historique git, un diff, un auteur.
- La review — un article se relit comme du code, dans une pull request.
- Le build statique — les pages sont générées au build, il n'y a rien à interroger à l'exécution.
Le vrai argument : les agents
C'est le point qui a décidé du format. Un agent autonome sait ouvrir une pull request. Il ne sait pas se connecter à un panel d'admin.
En gardant le contenu dans le repo, un draft d'article devient exactement le même objet qu'un patch de code : une branche, un diff, une review humaine avant merge. Le pipeline éditorial et le pipeline de dev sont le même pipeline.
À quoi ressemble un article
Le frontmatter porte les métadonnées, le corps est du markdown standard :
---
title: "Titre de l'article"
date: "2026-07-31"
excerpt: "Résumé affiché dans le listing et dans les metas OG."
tags:
- ia-infra
---
Les tags sont validés au build à partir d'une liste fermée. Un tag inconnu fait échouer la génération plutôt que de créer silencieusement une page orpheline :
function parseTags(raw: unknown, slug: string): BlogTag[] {
if (!Array.isArray(raw)) return [];
const tags: BlogTag[] = [];
for (const tag of raw) {
if (typeof tag !== 'string') continue;
if (!isBlogTag(tag)) {
throw new Error(`Article "${slug}" : tag inconnu "${tag}".`);
}
tags.push(tag);
}
return tags;
}
Ce que ça donne
| Besoin | Solution |
|---|---|
| Rendu markdown | unified + remark + rehype |
| Coloration syntaxique | rehype-highlight |
| Métadonnées | frontmatter YAML via gray-matter |
| Syndication | flux RSS généré au build |
Le reste — pagination, recherche, commentaires — attendra d'être un vrai
besoin. Pour l'instant, publier coûte un git push.