obsidian-sync.fr.md
docs/i18n/integrations/obsidian-sync.fr.md
Synchronisation bidirectionnelle Obsidian — conception proposée
<!-- translations:start -->
English · 한국어 · 中文 · 日本語 · Русский · Español · Deutsch
<!-- translations:end -->
Statut : Proposé (2026-05-17). Ce document est une spécification de conception, pas encore une fonctionnalité. Il décrit comment Tesserae pourrait permettre aux utilisateurs de modifier dans Obsidian les pages wiki projetées et faire en sorte que ces modifications survivent au prochain
project compile. La mise en œuvre est conditionnée à l'adoption de cette conception.
Aujourd'hui, l'export Obsidian est strictement à sens unique : le graphe typé dans .tesserae/graph.json est projeté vers le vault, et project compile écrase les fichiers projetés. Les utilisateurs ont demandé l'inverse également — modifier une description dans Obsidian et la voir survivre à la recompilation.
Ce document précise comment cela fonctionnerait sans rendre incohérent le modèle de données.
Changement stratégique, énoncé clairement
Le README actuel décline toute responsabilité concernant l'édition en direct :
Tesserae choisit la compilation depuis la source plutôt que l'édition en direct. Si vous voulez éditer des notes dans une UI, utilisez Logseq ou Obsidian.
La synchronisation bidirectionnelle modifie ce contrat pour un sous-ensemble de champs. Cela mérite d'être délibéré. L'objectif n'est pas qu'« Obsidian devienne l'éditeur » — c'est que « les modifications de l'utilisateur dans Obsidian ne soient pas silencieusement détruites lors de la recompilation ».
L'idée centrale : des surcouches, pas des fusions
Plutôt que d'essayer de fusionner deux copies divergentes du même nœud, traitez le vault comme une couche de diff par-dessus la projection :
source markdown ──extract──▶ base_graph
+
vault_overrides ◀── computed from vault
↓
final_graph ──project──▶ vault (.md files)
vault_overrides.json réside dans .tesserae/ et est calculé, pas rédigé manuellement. À chaque compilation, Tesserae parcourt le vault, compare chaque page projetée à ce que la projection précédente avait écrit, et enregistre chaque modification introduite par l'utilisateur sous forme d'entrée de surcouche. Le graphe final est base_graph avec les surcouches appliquées. La projection suivante réécrit le résultat sur disque.
Round-trip stable. Recompiler le même vault sans changements côté source ne produit aucun diff.
Propriété par champ
Chaque champ d'un nœud a un propriétaire. La propriété détermine ce qui se passe lorsque la source et le vault divergent.
| Champ | Propriété source | Surcharge vault possible | Notes |
|---|---|---|---|
id, type | oui | non | Contrôlé par le schéma ; appartient à l'extracteur |
name | initial | oui | L'utilisateur connaît souvent mieux le nom canonique que l'extracteur |
aliases | initial | oui | Ajout-seulement depuis le vault ; les entrées du vault sont toujours préservées |
description | initial | oui | La modification Obsidian la plus fréquente |
source_path | oui | non | Provenance ; ne peut pas être effacé par édition |
metadata (clés déclarées) | initial | oui | Ex. arxiv_id, github_repo — l'utilisateur peut corriger |
metadata.user.* | s/o | oui | Espace de noms réservé aux clés utilisateur uniquement ; l'extracteur n'y écrit jamais |
| Arêtes sortantes (typées) | oui | non | Les arêtes vivent dans l'ontologie, pas dans le vault |
| Nouveaux wikilinks tapés par l'utilisateur | s/o | oui | Exposés comme edge_type=user_link, écrits dans le graphe |
Bloc de corps <!-- user-notes --> | jamais écrit | toujours préservé | Zone en ajout-seulement que le projecteur ne touche jamais |
Cas de conflit et valeurs par défaut
| Cas | Par défaut | Pourquoi |
|---|---|---|
La description du vault diffère de la description ré-extraite de la source | Le vault gagne, journalisé dans .tesserae/lint-report.md sous « champs divergents » | Respecter l'édition utilisateur : l'utilisateur a clairement voulu cette modification. La piste d'audit permet de revoir plus tard. |
| Fichier source supprimé, page projetée toujours dans le vault | Retirer le nœud du graphe, le lister dans .tesserae/orphans.md | La source fait foi pour l'existence ; le journal des orphelins vous laisse décider de restaurer ou d'accepter |
| L'utilisateur a écrit un wikilink vers un slug qui n'existe pas | Créer un nœud tombstone (type Stub), faire apparaître dans le lint report | Ne pas perdre l'intention de l'utilisateur ; signaler pour nettoyage |
| L'utilisateur a ajouté une clé de frontmatter que le schéma ne connaît pas | Préserver en tant que metadata.user.<key>, ne jamais écraser | Compatible avec l'avenir sans polluer le graphe typé |
| Deux vaults sur des machines différentes éditent le même nœud, tous deux synchronisés via Obsidian Sync | Hors périmètre pour la v1. Last-writer wins au niveau du système de fichiers. | La vraie fédération multi-vaults est de Tier 3 ; à différer jusqu'à un cas d'usage réel |
Zone d'ajout user-notes
Chaque page projetée se voit dotée d'une zone délimitée que le projecteur ne touche jamais :
> [!quote] Paper
> Headline contribution and method sketch projected from the graph...
<!-- user-notes:start -->
Your notes here. Anything between the markers survives recompile forever.
Wikilinks here become `user_link` edges in the graph on the next pull.
<!-- user-notes:end -->
## Outgoing
- ...
Deux effets pratiques :
- Les utilisateurs peuvent annoter n'importe quelle page (par ex. « voir le chapitre 4 de mes notes ») sans rien perdre lors d'une reconstruction.
- La passe de pull scanne le bloc user-notes à la recherche de wikilinks et les expose comme arêtes typées ontologiquement
user_link, leur donnant une accessibilité dans le graphe sans polluer les types d'arêtes formels.
Transport distant — non-objectif explicite
Tesserae ne construit pas de serveur de synchronisation, de couche d'authentification, de démon de résolution de conflits, ni de vault hébergé. « Bidirectionnel » signifie ici « la compilation lit depuis le vault » — ce qui amène le vault jusqu'à la machine qui compile est le problème de l'utilisateur, résolu par des outils qui existent déjà :
| Stack | Coût | Notes |
|---|---|---|
| Obsidian Sync | Payant, 4-8 $/mois | Chiffré de bout en bout, officiel, ultra simple |
| iCloud / Dropbox / OneDrive | Inclus avec l'OS | Fonctionne mais l'UX en cas de conflit est hostile |
| Syncthing | Gratuit, auto-hébergé | Idéal pour le solo multi-appareils |
| Git (vault commité) | Gratuit | L'UX de conflit est la meilleure pour les utilisateurs techniques |
| LiveSync (plugin CouchDB) | Gratuit, requiert un serveur | Temps réel multi-appareils |
Les cinq sont compatibles avec le modèle de surcouches parce que Tesserae voit le vault comme des fichiers sur disque, pas comme un flux de mutations.
Surface CLI (proposée)
# Pull-only sync (Tier 1a): overlay reader runs as part of compile by default.
tesserae project compile # always pulls vault overrides if vault exists
# Inspect what would change before letting compile apply
tesserae project obsidian-sync --dry-run
# Skip the pull for a single compile (recovery mode)
tesserae project compile --no-vault-pull
# Long-running watch (Tier 2)
tesserae project obsidian-sync --watch --vault ~/Documents/tesserae-vault
Phasage
| Tier | Périmètre | Effort |
|---|---|---|
| 1a | Lecteur de surcouches : parcourir le vault, construire vault_overrides.json, appliquer à la compilation. Le lint signale les divergences. | ~3 jours |
| 1b | Zones d'ajout user-notes : le projecteur ne touche jamais aux blocs <!-- user-notes:start --> ... <!-- user-notes:end -->. | ~1 jour |
| 2 | Mode watch : un obsidian-sync --watch long-running rejoue la surcouche sur les événements du système de fichiers, demande confirmation avant d'appliquer. | ~1 semaine |
| 3 | Fédération multi-vaults : le graphe stocke la provenance par vault, prend en charge les éditions concurrentes à travers les vaults synchronisés. | ~1 mois, différé jusqu'à un cas d'usage réel |
Non-objectifs (explicitement)
- Un serveur de sync / une authentification / un backend hébergé.
- L'édition collaborative en temps réel à l'intérieur d'Obsidian (utilisez LiveSync si vous en avez besoin).
- Réécrire l'extracteur pour faire un round-trip de chaque champ — la source markdown reste canonique pour tout ce qui se trouve en dehors de la table de surcharges.
- La synchronisation du site HTML statique (
build-sitereste exclusivement de la projection).
Décisions ouvertes avant implémentation
Celles-ci ont des valeurs par défaut proposées, mais méritent une dernière revue avant que le code n'atterrisse :
- Forme du lint report. Les champs divergents devraient-ils apparaître comme un fichier
.tesserae/diverged-fields.mdséparé, ou comme une nouvelle section dans lelint-report.mdexistant ? Proposé : fichier dédié pour qu'il puisse être diffé en git. - Type de nœud tombstone. Ajouter
Stubcomme véritable type du schéma, ou se greffer surOpenQuestionavec un discriminant_kind: stub? Proposé : type réel, nomméStub, masqué des index publics. - Pull-on-compile par défaut. Activé par défaut ou désactivé par défaut ? Proposé : activé lorsqu'un vault existe au chemin configuré, avec une invite de confirmation unique la première fois qu'il s'active, afin que les utilisateurs y consentent délibérément.
- Ce qui compte comme « la projection précédente » pour faire le diff. Un snapshot stocké dans
.tesserae/vault_snapshot.json, ou re-projeter à la volée à chaque compilation ? Proposé : snapshot, écrit à la fin de chaque compilation. Moins coûteux et évite que le non-déterminisme de l'extracteur ne fuite dans la surcouche. - Projection vault multilingue. La projection actuelle est monolingue (la source). Les surcouches devraient-elles être locale-aware (par ex. une modification de
descriptiondans un vault coréen ne s'applique qu'à la projection coréenne) ? Proposé : hors périmètre pour la v1 ; le vault est monolingue, correspondant à la langue principale du projet.
Comment cela apparaît dans obsidian.md
Le guide destiné aux utilisateurs reste centré sur « vous pouvez lire et interroger le vault ». Une courte section « Synchronisation bidirectionnelle » à la fin renverra ici une fois l'implémentation livrée, avec un résumé d'une ligne : « Modifiez des champs dans Obsidian, ils survivent à la recompilation. Voir obsidian-sync.md pour le modèle complet. »
D'ici là, l'avertissement read-only existant dans obsidian.md reste en place — cette conception est une feuille de route, pas une fonctionnalité livrée.