blog.vfg.lol

La suite du blog : un RSS qui répond, 74 articles rapatriés, une bibliothèque par type

Une session de dette : réparer le visible, sauver l'invisible, et rendre navigable tout ce qui n'est pas un article

TL;DR

La migration v2 du blog était close, mais « la suite » commençait par de la dette bien visible : le RSS renvoyait 404 en prod, des liens localhost traînaient dans des pages publiques, et le compte d'articles ne tombait juste nulle part (384 dans le repo, 456 servis en ligne). Cette session a réparé le visible, sauvé l'invisible — 74 articles n'existaient que sur le VPS, jamais revenus dans git — et livré une Bibliothèque qui range enfin les ~500 fichiers markdown non-articles (docs, handoffs, audits, plans, corpus) par type et par filtre. Huit commits, 78 tests verts, zéro perte.


1. Réparer le visible

Le lien RSS de la navigation pointait /feed/rss.xml → 404. La cause n'était pas les feeds (ils existaient sur disque) mais le serveur : le catch-all de src/server.js résolvait les chemins contre la racine du repo, jamais contre public/, et aucun mount statique ne servait /feed/. Un mount fastifyStatic de quatre lignes, à côté de ceux de /lexique/ et /shared/, et le flux répond enfin.

Dans la foulée : les liens http://127.0.0.1:5193 (l'outil Grimoire, local) qui pointaient vers le vide depuis une page publique sont devenus des libellés (local) non cliquables ; les pages figées (devblog.html au 16/06, guide-todos au 30/06 affichant « 179 articles » quand il y en a 458) portent désormais un bandeau « Instantané du JJ/MM — données non à jour » ; et une ligne malformée du .gitignore (deux patterns collés) a été séparée.

2. Sauver l'invisible

Le vrai sujet était le comptage incohérent. mirror:prod — un script en lecture seule qui rapatrie les articles de prod dans .sandbox/ — a tranché : la prod servait 456 articles, le repo n'en versionnait que 384. Différence : 74 articles publiés directement sur le VPS via l'admin API, jamais revenus dans git. Le modèle « local-first » du README ne reflétait pas la réalité — la source la plus complète, c'était la prod.

Ces 74 articles ont été copiés dans devblog/posts/ sans écraser un seul fichier local, portant le total à 458 (les 456 de prod + 2 articles encore locaux). Ils sont désormais dans git et sur GitHub et sur le VPS : triple sauvegarde, rien perdu. Le frontmatter status — qui coexistait en quatre graphies (pub, "pub", "publish", published) — a été ramené au canon pub/draft, et publish-article.mjs rejette maintenant toute valeur inconnue plutôt que de publier un brouillon par accident.

3. Rendre navigable ce qui n'est pas un article

Un blog n'est pas que ses articles. Ce dépôt contient ~500 fichiers markdown non-articles : 178 handoffs, 170 audits, 79 docs, 49 fichiers de corpus, des plans, des statuts. Ils existaient dans un catalogue, mais rangés seulement par dossier — et noyés sous 1000+ fichiers de tooling (.claude, .sandbox).

La refonte ajoute une dimension transversale : le type. Chaque fichier est classé (article, handoff, audit, plan, statut, corpus, doc, workspace) quel que soit son dossier, et le catalogue expose des compteurs par type. En excluant le bruit tooling, il passe de 2163 à 994 entrées réelles.

Au-dessus, une page Bibliothèque (/bibliotheque/) — pas rétro, sur les tokens du design system, en dark mode, accessible (skip-link, landmarks, aria-pressed) — offre des facettes cliquables par type, une recherche, et des groupes par catégorie. Elle remplace « index md » dans la navigation principale.

TypeFichiers
Articles458
Handoffs178
Audits170
Docs & guides79
Corpus & récits49
Statuts13
Workspace13
Plans & roadmaps12
Autres22

4. Ce qui reste

Le fond de la dette est structurel et attend ses propres sessions : unifier les trois générateurs HTML qui coexistent, rendre les articles côté serveur (aujourd'hui un viewer JS affiche « Chargement… », mauvais pour le SEO et les lecteurs d'écran), régénérer les feeds au moment de la publication pour arrêter de les committer, et consolider les ~35 catégories de dossiers. Le plan détaillé vit dans docs/PLAN-BLOG-SUITE-2026-07.md.

La leçon de la session : la dette la plus dangereuse n'est pas celle qu'on voit (un 404 se remarque) mais celle qu'on ne voit pas — 74 articles à un rm -rf du néant, sur un seul disque, parce que le chemin de publication court-circuitait git. Le premier réflexe d'une « suite », c'est de recompter.


Sources : handoff handoffs/2026-07-20-0950-suite-blog-rss-rapatriement-bibliotheque.md · plan docs/PLAN-BLOG-SUITE-2026-07.md · script scripts/mirror-prod-articles.mjs · catalogue src/md-catalog.js · page public/bibliotheque/.

source markdown

Concepts de cet article

handoffVPSGrimoire

Partage le plus de concepts avec