Chapitre 08
Le problème : une configuration illisible et non rejouable
Objectifs du chapitre
- Nommer précisément ce qui ne va pas avec
.obsidian/, et pourquoi les trois réponses évidentes échouent. - Comprendre le renversement du manifeste : la configuration devient du texte qui fait
autorité, et
.obsidian/devient jetable. - Lire un manifeste réel et savoir ce que chaque bloc produit.
- Accepter la contrepartie : ce qui n'est pas déclaré n'est pas reconstruit.
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
- 12 Mo de code tiers — du JavaScript compilé, réécrit intégralement à chaque mise à jour de plugin ;
- de l'état d'interface —
workspace.json, réécrit à chaque fermeture de panneau ; - quelques kilooctets de décisions, noyés dans le reste.
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 :
.obsidian/est entièrement gitignoré. Sans exception — c'est ce qui rend la promesse vérifiable.- Un réglage qui n'est pas dans le manifeste n'existe pas. Il sera écrasé à la prochaine reconstruction. Contrainte forte, et volontaire.
- 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 manifeste | Produit |
|---|---|
core_plugins.enabled/disabled | core-plugins.json |
core_plugins.settings.<nom> | <nom>.json
— un fichier par plugin cœur configuré |
appearance | appearance.json, avec traduction des
noms de champs |
plugins[].id | la liste de community-plugins.json |
plugins[].repo + version + sha256 |
le téléchargement vérifié de plugins/<id>/ |
plugins[].settings | plugins/<id>/data.json |
hotkeys | hotkeys.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.
| Commande | Sens | Question à laquelle elle répond |
|---|---|---|
apply | manifeste → .obsidian/ |
« Fabrique-moi la configuration décrite. » |
pin | releases → manifeste | « Quelle version et quelles empreintes pour ces plugins ? » |
doctor | comparaison | « 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
.obsidian/mélange 12 Mo de code tiers, de l'état d'interface et quelques kilooctets de décisions. Les trois appellent des traitements différents.- Tout versionner pollue l'historique ; ne rien versionner perd la configuration ; la documenter produit un document qui ment.
- Le manifeste fait autorité,
.obsidian/devient un produit jetable et entièrement gitignoré. - Un réglage absent du manifeste n'existe pas : il sera écrasé.
- Les empreintes SHA-256 transforment « la version 0.5.70 » d'une promesse en une vérification.
- Un plugin sans bloc
settingsest installé sans être piloté — compromis assumé entre fidélité et lisibilité.
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 :
- 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. - 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.
- 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.