Table of contents

Ce blog n’a pas commencé dans un IDE ou un terminal. Il a commencé par une conversation.

Je me suis assis avec Crush — un assistant de codage IA agentique qui s’exécute en CLI — et j’ai décrit ce que je voulais : un blog personnel appelé Innerspace, hébergé sur thylong.com, construit avec Hugo et le thème monochrome, servi par Redbean, conteneurisé avec Docker, et déployé sur un cluster k3s.

Pourquoi cette stack précisément ? En tant que développeur Go, j’ai longtemps admiré le travail de spf13 — Hugo est une pièce d’ingénierie remarquable, et c’était un choix naturel. De la même manière, j’ai opté pour Redbean dès le départ parce que le travail de Justine sur le projet Cosmopolitan est véritablement impressionnant. L’idée d’un binaire unique qui tourne partout, sans runtime — ça résonne avec ma façon de penser l’infrastructure. J’ai prévu d’héberger ce blog ailleurs à un moment donné, mais j’en parlerai dans un prochain article.

Un mot sur les langues de ce blog : le français est ma langue maternelle, je suis plus ou moins bilingue en anglais, et j’apprends actuellement le chinois de manière intensive. Écrire en trois langues fait partie de l’exercice — une façon de pratiquer, de penser sous des formes différentes.

Qu’est-ce que vous trouverez ici ? Des réflexions personnelles et des plongées profondes dans des sujets qui me passionnent : créativité, histoire, ingénierie logicielle, infrastructure, historiographie, art, minimalisme, et une touche de géopolitique.

Crush s’est chargé du reste. Voici ce que cela a donné.

La Stack

CoucheOutilPourquoi
Générateur de site statiqueHugo Extended v0.146+Support SCSS pour le thème monochrome
Thèmehugo-theme-monochromeMinimal, rapide (~5KB gzippé), mode sombre, recherche
Serveur webRedbeanServeur web mono-binaire du projet Cosmopolitan
ConteneurDocker (multi-stage)Hugo compile en étape 1, Redbean tourne sur scratch en étape 2
Orchestrationk3sKubernetes léger, TLS géré au niveau du cluster

Ce que Crush a fait

Crush a opéré comme un agent entièrement autonome. Je lui ai donné un plan général, et il a :

  1. Scaffoldé le site Hugohugo new site, ajout du thème monochrome comme git submodule
  2. Configuré hugo.toml — baseURL, thème, mode sombre, recherche, TOC, SEO, coloration syntaxique
  3. Mis en place le multilinguisme — 3 langues (English, Français, 中文) avec organisation du contenu par répertoire et fichier i18n `zh.toml personnalisé pour le chinois simplifié (le thème ne livrait que le chinois traditionnel)
  4. Créé le contenu initial — page d’accueil et un hello-world dans les 3 langues
  5. Corrigé un problème de compatibilité RSS — le template RSS du thème utilise .Site.Author.email, ce qui cassait sur Hugo v0.160+. Crush a surchargé le template avec un layouts/_default/rss.xml personnalisé
  6. Écrit build.sh — télécharge Redbean depuis cosmo.zip, lance Hugo, pack la sortie dans le binaire sous thylong.com
  7. Écrit le Dockerfile — multi-stage : hugomods/hugo:exts → build Hugo, debian:bookworm-slim → pack Redbean, scratch → image finale mono-binaire
  8. Créé les manifests k8s — Deployment avec probes, Service ClusterIP, Ingress pour thylong.com
  9. Mis en place le CI/CD — workflow GitHub Actions : build → push vers le registre → kubectl rollout restart
  10. Écrit un Makefiledev, build, docker-build, deploy, hooks, etc.
  11. Ajouté un hook pre-commit — valide les builds Hugo et Docker avant d’autoriser un commit
  12. Mis à jour PLAN.md pour persister les décisions d’architecture

Détails du modèle

Crush tournait sur GLM-5.1 Cloud (via Ollama) comme modèle large, avec Claude Haiku 4.5 comme petit modèle. L’exécution était agentique — Crush planifiait, cherchait dans le codebase, lisait les fichiers, les éditait, lançait les builds, diagnostiquait les erreurs (comme le problème du template RSS), et itérait jusqu’à ce que tout compile proprement. Chaque décision était prise de manière autonome, avec de brefs rapports d’avancement.

Le Résultat

innerspace/
├── hugo.toml              # Configuration multilingue (en/fr/zh)
├── Makefile               # Cibles de build + aide
├── PLAN.md                # Décisions d'architecture
├── README.md
├── build.sh               # Build Hugo + packaging Redbean
├── Dockerfile             # Multi-stage : Hugo → Redbean sur scratch
├── content/
│   ├── en/                # Contenu en anglais
│   ├── fr/                # Contenu en français
│   └── zh/                # Contenu en chinois
├── i18n/
│   └── zh.toml            # Traductions chinois simplifié
├── layouts/_default/
│   └── rss.xml            # RSS personnalisé (correctif Hugo v0.160+)
├── k8s/                   # Deployment, Service, Ingress
├── .githooks/pre-commit   # Validation des builds
├── .github/workflows/     # CI/CD
└── themes/
    └── hugo-theme-monochrome/

Le build final produit 34 pages dans 3 langues, toutes packées dans un seul binaire Redbean qui tourne sur scratch. Un binaire, zéro dépendance, servi depuis k3s.

Ce post lui-même est la dernière chose que Crush a écrit.