Après près de cinq ans à vouloir réorganiser mon blog en interne, et quelques rushes au fur et à mesure des années pour y parvenir, j'ai reconstruit tout mon blog en interne, et ai pimpé le design du blog pour que le changement puisse être ressenti par vous (deux fois plutôt qu'une !), chères lectrices et lecteurs.
Tout commence fin 2016. À l'époque, je faisais déjà des projets web depuis au moins deux ou trois ans, le plus souvent en PHP. Ces sites sont partiellement archivés par la Wayback Machine, de la plus vieille version de touhey.fr, archivée en août 2014 à d'autres sites avec mon pseudo de joueur de l'époque sur le thème de Minecraft et de divers serveurs. Je venais également de me mettre à Linux sur mon PC principal à peine l'année précédente, lors d'un petit détour en BTS avant d'entrer à l'école 42, et je découvrais les sites statiques, me donnant envie de faire le mien.
Je fis alors un générateur que je voulais le plus basique possible, sous la forme d'un script bash avec pandoc, qui listait l'ensemble des posts, réalisait une page par post, ainsi qu'un index simple avec un header me présentant, le tout en HTML4 sans CSS, inspiré que j'étais par motherfuckingwebsite.com. Ainsi, mon blog naquit, avec déjà un premier post : fopencookie - faites vos propres flux !.
Cette période fut courte ; si courte qu'aucune archive du site de l'époque n'a pu être archivée par la Wayback Machine, sur laquelle le site passe du simple index de présentation style assembleur que j'avais à l'époque (mai 2016) à la version d'après, en 2017. Cela s'explique par le fait que je m'étais rapidement senti limité à la fois par bash qui n'était pas spécialement adapté à la tâche, et par le fait de devoir implémenter chaque modification que je souhaitais moi-même dans ce langage.
Après quelques recherches, je décidai donc de passer sur Jekyll, un générateur de site statique comprenant toutes les fonctionnalités attendues d'un tel outil généraliste, dont la gestion d'articles, le theming, les plugins, etc. Je repris alors un thème existant, à savoir Researcher, le modifiai un peu pour correspondre à un peu plus à mon style, rédigeai quelques articles en plus, ajoutai un système très basique de multi-langues puisque je voulais rédiger du contenu en anglais et en français, et hop, je me suis retrouvé avec un nouveau site !
Pendant presque huit ans, j'ai donc utilisé un générateur de sites statiques développé en Ruby avec un système d'extensions dans ce même langage. Durant cette période, j'ai réalisé quelques évolutions :
Un thème que j'ai fini par redévelopper entièrement pour tenter de réaliser quelque chose qui me plaise et soit responsive, à savoir dont l'agencement des éléments s'adapte à la taille de l'écran de l'internaute pour un confort de lecture optimal.
Ce thème était entièrement développé en Jekyll Liquid, le système de templating de Jekyll. Dans ce thème, j'avais également incorporé la gestion des éléments suivants :
Des métadonnées correctes pour différents protocoles, notamment OpenGraph et Twitter Cards.
Un système de présentation et de navigation multi-lingue bricolé avec les extensions de fichier (par exemple .fr.md pour les fichiers Markdown pour la variante française du blog).
Le passage à un système de gestion de ressources véritablement bon, jekyll-assets. Si vous utilisez Jekyll dans vos projets, je vous recommande très chaudement ce dernier !
Un plugin pour calculer mon âge (voir myage.rb), pour ne pas avoir à penser à le mettre à jour chaque année.
Quelques fichiers statiques, certains faisant référence à un dossier non géré par Jekyll mais par nginx sur le serveur lui-même, à savoir /up.
À noter que le système multi-lingue a évolué entre 2017 / 2018 et 2024. En effet, entretemps, j'ai acquis le domaine de second niveau touhey.uk, et ai donc décidé de passer mon blog anglais sur thomas.touhey.uk, entraînant à l'époque la séparation du projet en deux dossiers distincts où le thème se répétait et les modifications sur celui-ci devaient être répercutés sur les deux.
De plus, bien que j'avais tenté de faire une navigation proposant la traduction de chaque page, le système se comportait bien mal lorsque la traduction n'existait pas.
Au final, je m'étais retrouvé avec un énorme système de bricolages pénible à maintenir et faire évoluer. J'ai choisi de ne pas apprendre le Ruby, puisque je connaissais déjà Python à côté.
À noter cependant que mon blog était le seul de mes sites statiques qui a terminé avec une telle complexité. J'ai fait beaucoup d'autres sites avec Jekyll, dont beaucoup de sites plus simples, par exemple touhey.pro qui est resté assez simple.
Parallèlement, à partir de 2020, j'ai commencé et appris à aimer écrire de la documentation sur certains projets avec Sphinx, en reStructuredText, dont par exemple thcolor, thox ou même, bien plus tard, Cahute. Cette syntaxe, bien qu'elle aie initialement constitué une barrière de par mon habitude au Markdown, m'a par la suite beaucoup séduite. Un article de l'époque avait beaucoup résonné en moi ; celui-ci mettait en valeur le fait que là où les différentes flavours de Markdown étaient incompatibles entre elles, le reStructuredText est clairement défini et designé pour être extensible à l'aide de directives et rôles personnalisés. Cet argument avait d'autant plus résonné en moi que sur mon blog, pour injecter des éléments à peine avancés, ou même du code, je devais ajouter du Liquid ou du HTML directement dans mon fichier Markdown, et bien que cela marchait, je restais inconfortable avec la méthode.
Aux alentours de 2021, j'ai fini par avoir marre de mon système, et me suis lancé dans différentes expérimentations pour sortir du tas de bidouillages et pouvoir enfin utiliser du reStructuredText sur mon blog. Cette expérience a finalement mené à l'outil que j'utilise aujourd'hui : thblog.
À partir de 2021, constatant ce que j'avais, j'ai progressivement défini la liste suivante de ce que je voulais, qui inclue les éléments suivants :
Un outil extensible en Python 3, qui me permette de rédiger des extensions dans un langage que je connais et apprécie.
Un support correct de reStructuredText, pour que je puisse rédiger l'ensemble de mes contenus écrits dans ce format.
Un support du multi-sites depuis une seule source, avec traductions manuelles et support correct des "alternatives".
Un support des assets correct, avec transformations, détection des dépendances et génération des balises HTML correspondantes sans déclaration préalable, s'approchant de ce que j'ai pu connaître avec jekyll-assets.
Un support de fichiers statiques et avatars, pour que je puisse déployer certains fichiers à des endroits précis pour les rendre disponibles (e.g. /avatars/sili.png ou /resume.pdf).
À l'époque, j'avais commencé à regarder les outils similaires en Python, typiquement Pelican et yozuch, mais ils ne m'avaient pas convaincus. J'avais également exploré le fait d'utiliser Sphinx directement, mais l'outil ne me semblait pas approprié pour l'utiliser avec mon blog. J'ai donc fini par décider de faire mon propre outil en Python, que j'ai appelé thblog.
Pour faire quelques expérimentations, j'ai donc commencé à rédiger mon blog pour mon outil de génération de site statique idéal, en supposant qu'il existait et en imaginant ce qu'il ferait. J'ai donc passé tous mes articles, mes pages, et même mes brouillons en reStructuredText, en organisant ces éléments ainsi que les autres fichiers tels que je voulais les voir organisés ; le résultat m'a plu, et j'ai donc voulu prendre des pas concrets vers un blog publié en reStructuredText.
Le cahier des charges pour l'outil était donc le suivant :
Il s'agit d'un outil privé et spécifique à mon blog, l'idée étant de ne pas viser la généralité trop tôt dans le développement de l'outil et de chercher à ce qu'il réponde d'abord à mes besoins et qu'il soit fonctionnel avant d'en faire quoi que ce soit d'autre.
Il doit être rédigé en Python et doit prendre des articles et pages au format reStructuredText.
Il doit permettre de construire le site pour le publier via scp, vérifier les liens présents pour examiner lesquels ne sont plus trouvés (erreur 404, hôte introuvable, etc, à la manière de linkcheck), et permettre une visualisation en direct des changements à la manière de sphinx-autobuild.
Les URL doivent changer le moins possible par rapport à la version Jekyll de mon blog, parce que les URIs cool ne changent pas.
À noter que je ne supporte pas de theming à ce stade ; en effet, puisque je développe un outil spécifique à mes besoins, il n'a qu'un seul thème, celui que je réalise pour mon blog.
De plus, ce cahier des charges n'est que pour la version initiale. Beaucoup d'évolutions sont possibles à partir de celui-ci ; pour n'en citer que quelques-unes que je viserai probablement après :
Des commentaires !
Cela fonctionnerait avec un petit système externe, du fait de l'aspect statique du blog ; j'aimerais me diriger vers un petit système décentralisé type Isso.
Des annonces !
On peut penser à des annonces stockées dans un cache textuel (e.g. sous format SafeYAML ou JSON) envoyées sur Mastodon, IRC, ou autres.
Des caches !
Dans ce même cache, l'on pourrait stocker des données concernant des tweets (pour l'inclusion des données du tweet sans que le navigateur aie à chercher l'information chez Twitter, tout en gardant un certain style), etc pour les petits contenus.
Du support de Pingback et Webmention, au moins pour la réception !
Cela peut cependant être une idée d'en envoyer également lorsque je cite un autre blog, avec une petite base de données dédiée, textuelle, qui serait aussi versionnée dans le dépôt pour éviter de les répéter à chaque publication. Cela dit, Isso n'en fait pas mention dans sa documentation...
Des métadonnées, du web sémantique !
J'aimerais essayer d'en intégrer davantage sur mon site, par exemple du Dublin Core.
D'autres formats que HTML, par exemple du Gemini ou du WML pour tenter de rendre mon site le plus accessible possible !
Des blocs Geekcode avec un module Python dédié, pour décoder, décortiquer une description, valider le format, et produire des annotations web.
Une barre de recherche !
Sphinx en inclue une avec un petit fichier JSON généré en même temps de la publication du site, pour que la recherche se fasse côté client.
Des (hash)tags !
Ceux-ci pourraient être soit placés dans l'en-tête des posts soit détectés par des rôles spécifiques dans le contenu des posts, pour trouver des articles traitant de sujets similaires.
Du theming !
Si le système fonctionne suffisamment, l'on peut commencer à envisager d'inclure davantage le thème dans le contenu du blog, et ainsi commencer à exporter le système vers d'autres projets.
Et beaucoup d'autres.
La stack technologique que j'ai choisie pour cet outil est la suivante :
docutils pour la gestion des fichiers en reStructuredText (décodage, transformations, export en HTML5) ;
jinja2 pour le templating du blog en HTML5 ;
babel pour l'internationalisation et la localisation ;
pygments pour la coloration du code ;
click pour la ligne de commande.
Le premier thème sous thblog (dont une trace est toujours trouvable sur la Wayback machine) était une expérimentation faite autour d'avril/mai 2024 ; le courant, réalisé en mars 2025, est inspiré de Lagrange, un navigateur pour Gemini, avec les polices d'écriture Atkinson Hyperlegible Next par le Braille Institute.
De la même façon que mon blog en Jekyll, ni l'outil ni le contenu source ne seront en source ouverte, bien que le contenu présent sur l'export HTML du site soit majoritairement sous CC BY-SA 4.0, bien que je suive le code et le contenu sous git dans un dépôt privé sur Gitlab.com. À ce sujet, je rejoins Josh Comeau sur la plupart des raisons qu'il exprime dans Why My Blog Is Closed-Source (pas sur la sécurité, cela dit.) :
Je crois en le fait que les blogs doivent être personnels et représenter, d'autant plus pour les développeurs faisant du web, leur façon de construire un site web, leurs goûts et leurs couleurs. Sans aller jusqu'à dire que tout le monde a besoin d'un site web, quitte à le faire, autant proposer quelque chose d'original et pas copier le site d'un autre et juste changer quelques données ;
Je souhaite me laisser la liberté d'innover sans devoir assurer le support auprès d'autres utilisateurs ou être tenu responsable de l'expérience d'un utilisateur ou d'une utilisatrice sur un site autre que le mien, en tout cas sur ce projet ;
Je souhaite garder mes brouillons privés, bien qu'ils soient dans le même dépôt pour simplifier mon organisation et mon processus de publication.
Cela dit, le développement de cet outil et l'évolution de ce blog restent une expérience que je souhaiterais partager, possiblement dans d'autres posts ; en effet, bien que je ne souhaite pas donner le poisson, je trouve utile et satisfaisant de partager un morceau de la canne à pêche qui m'a servi à le pêcher.
Ce blog reste quelque chose que j'alimente sur mon temps libre, sans aucune obligation de production et lorsque j'ai envie de développer mes talents d'écriture. Cette transition technologique, bien que ne transparaissant pas directement sur le résultat, me permet d'obtenir une plus grande satisfaction dans l'alimentation de ce blog ; je n'exclus pas de sortir plus d'articles que ces sept dernières années.
Cependant, au fil des années, j'ai développé un bon nombre d'idées de sujets que j'aimerais bien traiter dans des billets pour ce blog. Parmi la quinzaine de brouillons que j'ai, l'on trouve parmi les plus aboutis :
Un article sur les chemins de fichiers, leur syntaxe, les exceptions et autres curiosités (il y en a beaucoup parmi celles que j'ai repérées), les standards, etc ;
Un article de réflexion sur les besoins en termes de bases de données d'une application métier moderne ;
Des articles autour de la construction de thblog, notamment de son usage de docutils.
Globalement, je fais ma veille assez régulièrement et enquête sur beaucoup de sujets dans le cadre de mes projets personnels et professionnels, de mes cours, de mes discussions loin du clavier et sur différents réseaux. Je vous conseille donc de vous abonner aux flux RSS de ce blog ; il y en a un par langue proposée, et j'essaye de traduire les articles après leur publication dans la langue originelle dans laquelle je les ai écrit.
À toutes dans mes prochains articles !