Architecture du pipeline
Le flux de publication repose sur six briques : Org‑mode comme format source, Emacs comme éditeur, d2 pour les diagrammes déclaratifs, Pandoc pour la conversion vers Markdown, Blogatto pour la génération HTML et Lustre comme moteur de template. Le tout est orchestré par Nix (flakes et devenv) qui fige les versions des dépendances et assure la reproductibilité du build. Chaque modification du fichier .org déclenche, via Babel, l’évaluation des blocs de code, la création d’images d2 et la conversion en Markdown, avant que Blogatto ne consomme le résultat pour produire les pages finales.
Rôle de Gleam et du typage
Le cœur du site statique est écrit en Gleam, un langage fonctionnel à typage statique. Le code ci‑dessous montre la fonction qui construit la page d’index des articles :
pub fn posts_page (posts : List (Post (msg))) -> Element (msg) {
let sorted = list.sort (posts, fn (a, b) {
timestamp.compare (b.date, a.date)
})
layout ("Posts", [
html.h2 ([], [html.text ("Posts")]),
case sorted {
[] -> html.p ([], [html.text ("No posts yet.")])
_ -> html.ul ([], list.map (sorted, post_link))
}
])
}
Cette fonction exploite les modules list et timestamp de la bibliothèque standard de Gleam, garantissant à la compilation que chaque Post possède un champ date correctement typé. Le tri décroissant assure que les articles les plus récents apparaissent en tête, sans risque d’erreur d’exécution liée à des comparaisons de types incompatibles. Le rendu final est un arbre Element que Blogatto transforme en HTML grâce à Lustre.
Gestion de l’environnement avec Nix
Nix fournit un flake décrivant les versions exactes de Gleam, Pandoc, d2, Emacs et des plugins Babel. Le fichier devenv.nix crée un conteneur de développement où chaque binaire est accessible via le même chemin, éliminant les conflits de version entre projets. Cette approche rend le pipeline « pleasantly uneventful » : aucune installation manuelle n’est requise, et la construction du site reproduit exactement les mêmes artefacts sur n’importe quelle machine.
Analyse des limites et perspectives
Le principal point de friction réside dans la dépendance à Emacs : la génération de diagrammes d2 et l’évaluation des blocs Babel ne fonctionnent que dans cet éditeur, ce qui empêche l’utilisation d’un CI / CD classique sans émuler un environnement Emacs complet. De plus, le choix de Blogatto, bien que typé, impose une courbe d’apprentissage pour les développeurs non familiers avec Gleam. Enfin, la conversion double (Org → Markdown → HTML) introduit une étape intermédiaire qui peut générer des divergences de rendu si Pandoc change ses filtres. Malgré ces contraintes, le pipeline démontre la viabilité d’une chaîne de production entièrement typée et reproductible, ouvrant la voie à des workflows similaires pour d’autres formats de documentation.