🧠 Obsidian · & le vault autoportant

Chapitre 08
Le problème : une configuration illisible et non rejouable

Objectifs du chapitre

1. Le constat

Tu as passé sept chapitres à configurer un vault : neuf plugins, leurs réglages, un dossier de notes quotidiennes, un template de dossier, une capture, un raccourci. Cette configuration a de la valeur — elle représente des dizaines de décisions.

Où vit-elle ? Dans .obsidian/, mélangée à trois choses de natures très différentes :

$ du -sh ~/vault/.obsidian/* | sort -rh | head -6
12M     /home/moi/vault/.obsidian/plugins
6,1K    /home/moi/vault/.obsidian/workspace.json
909     /home/moi/vault/.obsidian/types.json
697     /home/moi/vault/.obsidian/core-plugins.json
276     /home/moi/vault/.obsidian/hotkeys.json
208     /home/moi/vault/.obsidian/community-plugins.json

2. Les trois réponses qui ne marchent pas

Tout versionner

On met .obsidian/ sous git et on n'en parle plus. En pratique : un commit à chaque fermeture d'Obsidian à cause de workspace.json, un conflit systématique dès qu'on travaille sur deux machines, et une mise à jour de plugin qui produit un diff de plusieurs milliers de lignes de JavaScript minifié. L'historique devient inexploitable, ce qui revient à ne pas en avoir.

Ne rien versionner

On met .obsidian/ dans le .gitignore — c'est la pratique la plus répandue, et c'est ce que fait la plupart des tutoriels. L'historique reste propre, et la configuration n'existe nulle part. Machine neuve : tout à refaire de mémoire. Aucune trace des décisions.

La documenter

On écrit un README qui liste les plugins et les réglages importants. Il est juste le jour où on l'écrit. Trois semaines plus tard, quelqu'un — toi — change un réglage à la souris et ne met pas le document à jour. Rien ne le signale.

Les trois échecs ont la même racine : on traite .obsidian/ comme une chose unique, alors qu'il mélange du code, de l'état et des décisions. Chacun appelle un traitement différent.

3. Le renversement

L'idée tient en deux phrases :

Un fichier manifeste, lisible et versionné, décrit la configuration voulue. .obsidian/ n'est plus qu'un produit de ce manifeste, et peut être supprimé et reconstruit à tout moment.

C'est le même renversement qu'entre une machine configurée à la main et une machine décrite par un fichier d'infrastructure. Ce qui fait foi n'est plus l'état, c'est la description.

Trois conséquences immédiates :

  1. .obsidian/ est entièrement gitignoré. Sans exception — c'est ce qui rend la promesse vérifiable.
  2. Un réglage qui n'est pas dans le manifeste n'existe pas. Il sera écrasé à la prochaine reconstruction. Contrainte forte, et volontaire.
  3. L'écart entre le manifeste et la réalité devient une notion de premier plan : la dérive. Il faut savoir la détecter, et savoir la promouvoir en décision.

4. À quoi ressemble un manifeste

Extrait du manifeste réel du vault de référence, 90-meta/manifest.yaml. Il fait 361 lignes en tout ; voici sa structure.

obsidian_min: "1.9"

core_plugins:
  enabled: [daily-notes, backlink, graph, global-search, templates,
            file-explorer, command-palette, properties, bookmarks, ...]
  disabled: [publish, sync, slides, footnotes, ...]
  settings:
    daily-notes:
      folder: 10-journal
      format: YYYY/YYYY-MM-DD
      template: 90-meta/templates/daily
    templates:
      folder: 90-meta/templates

appearance:
  theme: obsidian
  base_font_size: 16

plugins:
  - id: dataview
    repo: blacksmithgu/obsidian-dataview
    version: "0.5.70"
    sha256:
      main.js: "3f2a…"
      manifest.json: "9c11…"
      styles.css: "aa47…"
    settings:
      enableDataviewJs: true

  - id: templater-obsidian
    repo: SilentVoid13/Templater
    version: "2.24.3"
    sha256: { ... }
    settings:
      templates_folder: 90-meta/templates
      trigger_on_file_creation: true
      trigger_on_file_creation_mode: folder
      folder_templates:
        - folder: 10-journal
          template: 90-meta/templates/daily.md

  - id: obsidian-kanban
    repo: mgmeyers/obsidian-kanban
    version: "2.0.51"
    sha256: { ... }
    # pas de bloc settings : réglages non gérés

hotkeys:
  quickadd:choice:61a731e5-7663-49b9-8676-ae7024578ed0: "Ctrl+Shift+I"

Chaque bloc a une destination précise dans .obsidian/ :

Bloc du manifesteProduit
core_plugins.enabled/disabledcore-plugins.json
core_plugins.settings.<nom><nom>.json — un fichier par plugin cœur configuré
appearanceappearance.json, avec traduction des noms de champs
plugins[].idla liste de community-plugins.json
plugins[].repo + version + sha256 le téléchargement vérifié de plugins/<id>/
plugins[].settingsplugins/<id>/data.json
hotkeyshotkeys.json, converti en structure Obsidian

Les empreintes

Chaque plugin porte sa version et l'empreinte SHA-256 de chacun de ses fichiers. Ce n'est pas de la paranoïa : une release GitHub peut être retirée, re-taguée, ou remplacée. Sans empreinte, « version 0.5.70 » est une promesse ; avec, c'est une vérification.

Corollaire : une empreinte ne s'écrit pas à la main. Le chapitre 9 présente la commande qui les calcule, et qui est le seul chemin autorisé pour changer une version.

5. Le compromis : ce qu'on gère et ce qu'on subit

Regarde à nouveau la dernière entrée ci-dessus : pas de bloc settings. Ce n'est pas un oubli.

Un plugin écrit son data.json tout seul, et le remplit de valeurs par défaut qu'il réécrira à sa prochaine mise à jour. Le cas qui a tranché la question dans le vault de référence était Excalidraw : 26 Ko de JSON à lui seul, faisant passer le manifeste de 361 à 1199 lignes. C'est-à-dire lui faire perdre sa lisibilité, qui était la raison de le préférer à un .obsidian/ versionné.

D'où la règle du vault de référence : un plugin déclaré sans bloc settings est installé mais ses réglages ne sont pas pilotés. La reconstruction n'écrit pas son data.json, la détection de dérive l'ignore, et l'export le signale sans le recopier.

Contrepartie assumée : sur une machine neuve, Kanban repart de ses valeurs par défaut. C'est acceptable pour un tableau de pilotage ; ça ne le serait pas pour QuickAdd, dont la capture est la configuration — et qui, lui, a bien son bloc settings.

Épilogue du cas Excalidraw : le vault l'a finalement retiré au profit de Mermaid, natif et textuel (chapitre 7). La règle, elle, reste — elle s'applique désormais à Kanban, Advanced Tables, Style Settings et Tasks. Un plugin bavard n'est pas une exception, c'est le cas courant.

Le critère de décision : ce réglage est-il une décision que j'ai prise, ou une valeur que le plugin s'est donnée ? Les premières vont au manifeste, les secondes restent où elles sont.

6. Ce que ça donne comme outillage

Le manifeste ne sert à rien sans les commandes qui l'exploitent. Le chapitre 9 les détaille ; voici la carte.

CommandeSensQuestion à laquelle elle répond
applymanifeste → .obsidian/ « Fabrique-moi la configuration décrite. »
pinreleases → manifeste « Quelle version et quelles empreintes pour ces plugins ? »
doctorcomparaison « Le réel correspond-il encore à la description ? »
export.obsidian/ → manifeste « J'ai réglé quelque chose à la souris, comment le rends-je officiel ? »

doctor et export forment le couple qui rend le système vivable. Sans eux, la première fois que tu bouges un curseur dans les réglages d'Obsidian, ta modification est condamnée à disparaître au prochain apply, sans prévenir.

Récapitulatif

Exercices

Exercice 1 — Trier les réglages

Pour chacun, dis s'il va au manifeste ou non : (a) le dossier des notes quotidiennes ; (b) la largeur du panneau latéral ; (c) la version de Dataview ; (d) le dernier fichier ouvert ; (e) la clé d'API d'un plugin d'intelligence artificielle.

Voir la solution

(a) Oui — décision structurante, et le template en dépend.

(b) Non — état d'interface, dans workspace.json, hors périmètre par construction.

(c) Oui — c'est même le cœur du dispositif, avec ses empreintes.

(d) Non — état, même remarque qu'en (b).

(e) Non, surtout pas. Le manifeste est versionné et poussé sur un dépôt distant : un secret qui y entre est un secret publié, définitivement, même si on l'efface ensuite. Un plugin qui stocke un secret dans son data.json est une bonne raison de le laisser non géré — l'exception qui justifie la règle du chapitre.

Exercice 2 — Prédire une reconstruction

Tu supprimes entièrement .obsidian/ puis tu lances apply. Qu'est-ce qui revient à l'identique, et qu'est-ce qui est perdu ?

Voir la solution

Revient à l'identique : les neuf plugins à leur version épinglée et vérifiée, l'état activé/désactivé des plugins cœur, le thème et la taille de police, les réglages des plugins gérés (Dataview, Templater, Git, QuickAdd), les réglages de notes quotidiennes et de templates, et le raccourci de capture.

Perdu : la disposition des panneaux (workspace.json a disparu avec le dossier), les réglages des plugins non gérés — Kanban et Advanced Tables repartent de leurs valeurs par défaut — et tout thème ou extrait CSS que tu aurais installé, puisqu'ils vivaient dans .obsidian/themes/.

Nuance importante : apply préserve normalement workspace.json, themes/ et snippets/ lors d'une reconstruction. Ici, c'est toi qui les as supprimés avant. C'est la différence entre « reconstruire » et « repartir de zéro ».

Exercice 3 — Critiquer le compromis

À l'époque où Excalidraw était encore installé, un collègue objecte : « S'il n'est pas géré, ton vault n'est pas vraiment autoportant. Autant tout importer, quitte à avoir un manifeste de 1200 lignes. » Que réponds-tu ?

Voir la solution

L'objection est recevable sur le principe : la promesse est effectivement partielle. Trois arguments pour le compromis :

  1. Un manifeste illisible ne remplit plus sa fonction. Sa raison d'être était d'être relisible par un humain, contre un .obsidian/ qui ne l'est pas. À 1200 lignes dominées par des défauts d'un plugin de dessin, on a reconstruit le problème qu'on voulait résoudre.
  2. Ces valeurs ne sont pas des décisions. Personne n'a choisi les 26 Ko d'Excalidraw : le plugin les a écrits seul et les réécrira à sa prochaine version. Les figer dans le manifeste, c'est promettre de les maintenir à la main à chaque mise à jour.
  3. Le coût du non-géré est mesuré : sur une machine neuve, un plugin de dessin repart de ses défauts. Le coût du tout-géré est un écart à repromouvoir à chaque mise à jour de chaque plugin, pour toujours.

Ce qu'il faut concéder : le choix doit être explicite et visible. C'est pourquoi export signale les plugins non gérés au lieu de les taire — chapitre 9. Un compromis assumé et affiché n'est pas la même chose qu'un trou.