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 html sans l’échapper. Il remplace le plugin page-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: true

J’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 _redirects de Sevalla. Il contient la rĂšgle /* /:splat.html 200 pour les URLs propres, des redirections 301 explicites pour les anciennes URLs, et une option aliases qui transforme les aliases du 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-title et breadcrumbs, 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.