Aller au contenu principal
← Tous les articles

Un blog en markdown, versionné, écrit par des agents

2 min de lecture

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.