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
| Couche | Outil | Pourquoi |
|---|---|---|
| Générateur de site statique | Hugo Extended v0.146+ | Support SCSS pour le thème monochrome |
| Thème | hugo-theme-monochrome | Minimal, rapide (~5KB gzippé), mode sombre, recherche |
| Serveur web | Redbean | Serveur web mono-binaire du projet Cosmopolitan |
| Conteneur | Docker (multi-stage) | Hugo compile en étape 1, Redbean tourne sur scratch en étape 2 |
| Orchestration | k3s | Kubernetes 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 :
- Scaffoldé le site Hugo —
hugo new site, ajout du thème monochrome comme git submodule - Configuré
hugo.toml— baseURL, thème, mode sombre, recherche, TOC, SEO, coloration syntaxique - 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)
- Créé le contenu initial — page d’accueil et un hello-world dans les 3 langues
- 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 unlayouts/_default/rss.xmlpersonnalisé - Écrit
build.sh— télécharge Redbean depuis cosmo.zip, lance Hugo, pack la sortie dans le binaire sousthylong.com - Écrit le
Dockerfile— multi-stage :hugomods/hugo:exts→ build Hugo,debian:bookworm-slim→ pack Redbean,scratch→ image finale mono-binaire - Créé les manifests k8s — Deployment avec probes, Service ClusterIP, Ingress pour thylong.com
- Mis en place le CI/CD — workflow GitHub Actions : build → push vers le registre →
kubectl rollout restart - Écrit un Makefile —
dev,build,docker-build,deploy,hooks, etc. - Ajouté un hook pre-commit — valide les builds Hugo et Docker avant d’autoriser un commit
- Mis à jour
PLAN.mdpour 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.