En 2014 jâĂ©crivais un post sur ma recherche dâun Ă©diteur Markdown. Je voulais quelque chose qui affiche un aperçu formatĂ©, gĂšre les images locales, et permette de naviguer entre les pages liĂ©es comme un wiki. Aucun Ă©diteur ne faisait tout ça. Jâavais fini par me contenter de Haroopad.
Douze ans plus tard jâai exactement ce que je cherchais. Et câest aussi ce qui publie ce blog.
Comment jâai dĂ©couvert Obsidian
Quand je travaillais comme dĂ©veloppeur chez 50Factory, jâavais besoin de documenter un projet dâun outil pour configurer des guidons en 3D. Jâutilisais Dendron, un plugin pour VSCode qui transforme lâĂ©diteur en base de notes avec une structure hiĂ©rarchique. CâĂ©tait bien intĂ©grĂ© Ă mon environnement de dĂ©veloppement, mais il fallait rester dans VSCode. Pas trĂšs pratique pour prendre des notes au vol.
Câest en regardant les vidĂ©os de morganeua sur la prise de note que jâai dĂ©couvert Obsidian. Elle explique la mĂ©thode Zettelkasten â des notes atomiques, reliĂ©es entre elles, qui forment un rĂ©seau de connaissance. Je nâai jamais vraiment rĂ©ussi Ă appliquer le Zettelkasten comme il faut, mais Obsidian mâa convaincu en tant quâoutil.
Câest un Ă©diteur Markdown local, qui stocke tout en fichiers texte brut, avec une navigation entre les notes via des liens wiki ([[comme ça]]), un graphe de liens, et suffisamment de plugins pour ne pas avoir envie dâaller voir ailleurs.
La chaĂźne de publication
Ce blog est un vault Obsidian. Les notes que je décide de publier sont marquées avec publish: true dans leur frontmatter.
Le plugin quartz-syncer lit ce marqueur et pousse les fichiers concernés vers un dépÎt GitHub.
Ă chaque commit sur ce dĂ©pĂŽt, Sevalla dĂ©clenche un build. Il gĂ©nĂšre le site statique (et lâhĂ©berge gratuitement) avec Quartz v5, un gĂ©nĂ©rateur pensĂ© spĂ©cifiquement pour les vaults Obsidian. Il gĂšre les wikilinks, le graphe de liens, la recherche, et le rendu Markdown tel quâObsidian le produit.
La grande diffĂ©rence de la v5, câest que le moteur ne contient presque plus de fonctionnalitĂ©s en dur. La recherche, lâexplorateur, les backlinks, la table des matiĂšres, le rendu Obsidian⊠sont des plugins, chacun dans son propre dĂ©pĂŽt GitHub (organisation quartz-community). Ils sont listĂ©s et configurĂ©s dans un fichier quartz.config.yaml, et un fichier quartz.lock.json Ă©pingle leurs versions, comme un lockfile. Au build, Sevalla installe ces plugins avant de gĂ©nĂ©rer le site.
En résumé :
Obsidian â quartz-syncer â GitHub â Sevalla â site statique
Personnaliser sans toucher au moteur
Avec Quartz v4, jâavais modifiĂ© le code du moteur lui-mĂȘme pour deux dĂ©tails. RĂ©sultat : chaque mise Ă jour devenait pĂ©nible, il fallait refaire ou fusionner mes modifications.
Les deux détails en question :
- un titre de site contenant du HTML,
đą<span class="desktop-only"> Shagshag</span>, pour avoir un titre plus court sur petit Ă©cran (seule la tortue sâaffiche en mobile) ; - un emoji comme favicon, via un SVG en data URI (jâen parle dans Utiliser un emoji comme favicon).
En v5 je les ai refaits proprement sous forme de deux petits plugins, sans modifier une ligne de Quartz :
- quartz-html-page-title : un composant de titre qui affiche lâoption
htmlsans lâĂ©chapper. Il remplace le pluginpage-title, que jâai dĂ©sactivĂ© dans la config. - quartz-emoji-favicon : un plugin qui ajoute dans le
<head>un<link rel="icon">SVG construit Ă partir dâun emoji.
Ils sâinstallent comme les autres, avec une ligne source: github:Shagshag/... dans quartz.config.yaml :
plugins:
- source: github:Shagshag/quartz-html-page-title
enabled: true
options:
html: 'đą<span class="desktop-only"> Shagshag</span>'
- source: github:Shagshag/quartz-emoji-favicon
enabled: true
options:
emoji: "đą"
- source: github:Shagshag/redirects-file
enabled: true
options:
aliases: trueJâen ai ajoutĂ© dâautres depuis, toujours sans modifier le moteur. Le dĂ©clencheur : un titre dâarticle comme « class ou alias, un choix de conteneur Symfony⊠» sâaffichait avec ses backticks dans le titre, le fil dâAriane, lâexplorateur, la recherche, les backlinks et les liens, alors que le titre dans le corps de lâarticle Ă©tait bien formatĂ©. Je devais donc le rĂ©pĂ©ter trois fois.
- redirects-file : génÚre le fichier
_redirectsde Sevalla. Il contient la rĂšgle/* /:splat.html 200pour les URLs propres, des redirections 301 explicites pour les anciennes URLs, et une optionaliasesqui transforme lesaliasesdu frontmatter en vrais 301 cĂŽtĂ© serveur. Il remplace du code que jâavais ajoutĂ© dans le moteur, voir Corriger les URLs propres de Quartz sur Sevalla. - quartz-markdown-article-title et quartz-markdown-breadcrumbs : affichent le Markdown inline du titre (code, gras, italique) dans le h1 et le fil dâAriane, au lieu des backticks bruts. Ils remplacent les plugins
article-titleetbreadcrumbs, dĂ©sactivĂ©s dans la config. - quartz-markdown-titles : mĂȘme correction pour lâexplorateur, la recherche et les backlinks (un petit script cĂŽtĂ© navigateur, qui garde le surlignage de la recherche), et pour le texte des liens dans les articles, par exemple un alias de wikilink contenant des backticks (corrigĂ© au build).
Petit point technique : ces plugins nâont pas dâĂ©tape de compilation. Leur dist/index.js est Ă©crit Ă la main et versionnĂ© dans leur dĂ©pĂŽt.
Ce que jâaime dans cette façon de faire
Tout est en Markdown local. Pas de base de donnĂ©es ni de PHP, pas dâinterface dâadministration, pas de WordPress qui se fait pirater Ă 3h du matin, trĂšs peu de fichiers. Si Sevalla disparaĂźt demain, les fichiers sont lĂ , sur mon disque, dans un format lisible par nâimporte quel Ă©diteur.
Le contrÎle sur ce qui est publié est simple : un champ dans le frontmatter. Le reste reste privé dans le vault.
Ce qui est moins parfait
Les images. Le sync des assets entre Obsidian et GitHub est le maillon fragile. Quartz-syncer sâen sort mais il faut faire attention Ă la façon dont Obsidian rĂ©fĂ©rence les fichiers joints.
Et la mise en page standardisĂ©e du site final, câest pas fun. Ăa reste un chantier, mais avec les plugins et le fichier de configuration, la personnalisation passe dĂ©sormais par la config et de petits plugins plutĂŽt que par le code du moteur.