← BlogObsidian · MCP · Cloudflare
Obsidian a emménagé dans mon hub d'IA : une connexion pour tous les services, et des schémas dessinés par l'agent
Mon coffre Obsidian vit désormais sur Cloudflare, et kosh est une seule connexion MCP vers mes tâches, mes notes, Telegram, Go-Alpha, Instagram et mon Mac. L'agent dessine des schémas Excalidraw directement dans le coffre. Comment c'est construit, et où ça s'arrête.
Publié 31 oct. 20267 min de lecture
TL;DR
Mon coffre Obsidian ne vit plus sur le Mac. Il vit sur Cloudflare, dans kosh-vault. Le Mac et l'iPhone se synchronisent avec lui via le plugin Self-hosted LiveSync.
kosh est mon hub d'IA personnel. Une seule connexion MCP, derrière laquelle se trouvent tous mes services : tâches, notes, Telegram, Go-Alpha, Instagram, le chien de garde de mon Mac et un shell dessus.
Et l'agent dessine maintenant des schémas Excalidraw directement dans le coffre. J'ouvre Obsidian et je vois sa pensée sous forme d'image. Je peux la corriger à la main, et l'agent voit mes modifications.
Ce qui coinçait
Il y avait deux problèmes. Sous chacun : comment c'était, et comment c'est maintenant.
1. Chaque service était une connexion à part
AVANT — 5 connexions :
Claude ──▶ tâches
Claude ──▶ Telegram
Claude ──▶ Go-Alpha
Claude ──▶ Instagram
Claude ──▶ notes (sur le Mac seulement)
MAINTENANT — 1 connexion :
Claude ──▶ kosh ──▶ tous ces servicesEt c'était pareil dans chaque client : Claude Code, claude.ai, le téléphone. Un nouveau service devait être ajouté dans chacun séparément. Et Claude ne pouvait modifier les notes que sur le Mac.
2. Les modifications de l'agent faisaient un détour jusqu'à mes notes
AVANT :
agent ──▶ GitHub ──(jusqu'à 2 min)──▶ Mac ──(iCloud)──▶ iPhone
MAINTENANT :
agent ──▶ kosh-vault ──(~1 s)──▶ Mac et iPhoneAvant, le plugin Obsidian Git récupérait la modification sur GitHub : jusqu'à deux minutes, et seulement quand Obsidian était ouvert sur le Mac. Pour atteindre l'iPhone, elle passait en plus par iCloud. Maintenant, le coffre est dans le cloud, et le Mac peut dormir.
Le coffre a déménagé dans le cloud
Je voulais une seule source de vérité. Une source qui ne s'endort pas avec le portable.
Un projet existait déjà : livesync-workers, un backend pour le plugin Self-hosted LiveSync sur Cloudflare Workers. Je l'ai forké et appelé kosh-vault.
La vérité, c'est désormais une base SQLite dans un Durable Object. Obsidian, sur le Mac comme sur l'iPhone, garde une connexion en direct avec elle et reçoit chaque changement en une seconde environ. En gros, Obsidian sur WebSockets.
Le Mac peut dormir : le coffre reste accessible aux agents. Toutes les autres copies ne font que suivre le cloud : une sauvegarde horaire sur GitHub et un miroir en lecture seule dans iCloud.
keepReplicationActiveInBackground: true. Sinon, la synchronisation se met en pause quand la fenêtre d'Obsidian est cachée derrière d'autres, et les modifications de l'agent n'arrivent que quand je regarde.kosh : une seule porte
kosh, ce sont quelques Workers sur Cloudflare. Le nom vient du kosh cosaque, le quartier général de la Sitch.
À l'intérieur, chaque service est resté séparé. Telegram et Go-Alpha tournent dans des Cloudflare Containers. Instagram est un simple Worker. Les notes, c'est kosh-vault. Mais de l'extérieur, il n'y a qu'une entrée : /mcp.
Ce que ça veut dire en pratique :
- Le hub rassemble les outils de tous les services dans une seule liste, sous leurs propres noms. Le client voit une seule connexion.
- Les services se parlent via les service bindings de Cloudflare, pas via des URL publiques avec un token partagé.
- Je colle les clés des services tiers sur une seule page de connexions. Elles sont stockées chiffrées, et rien ne les réaffiche jamais.
- Quand un service tombe, ses outils restent dans la liste, et un appel répond honnêtement : « indisponible ».
Tout l'intérêt de kosh, c'était que tous mes services soient accessibles à travers lui, au lieu de les connecter un par un.
Les tâches, c'est juste du markdown
Mon unique système de tâches, ce sont des notes dans le coffre. Une zone, un fichier. La priorité, c'est un emoji Obsidian Tasks sur la ligne.
L'agent ajoute, déplace et clôt les tâches avec les outils tasks_*. Chaque écriture est vérifiée par rapport au hash du contenu : si le fichier a changé entre-temps, l'opération est relancée. Et chaque modification s'inscrit en une ligne dans le journal.
Le tableau des tâches, kosh le dessine lui-même, dans un fichier Excalidraw. Je modifie une liste à la main, et en moins d'une minute un cron s'en aperçoit et redessine le tableau. Il ne l'écrit que si quelque chose y a vraiment changé.
L'agent dessine des schémas
C'est la partie la plus récente. Quatre outils : drawing_list, drawing_read, drawing_create, drawing_edit.
Je demande : « dessine comment fonctionne ce processus ». L'agent crée un fichier .excalidraw.md dans le coffre. Une seconde plus tard, il est sur mon Mac, et le plugin Excalidraw l'ouvre comme l'un des siens.
agent
│ demande de modifier le schéma (drawing_edit)
▼
kosh
│ écrit le fichier du dessin
▼
kosh-vault (Cloudflare)
│ LiveSync le livre, ~1 s
▼
le dessin ouvert dans Obsidian se met à jourLe plugin Excalidraw a sa propre CLI. Mais elle a besoin d'Obsidian lancé sur le Mac. Alors kosh écrit le fichier lui-même, au format du plugin, et fonctionne même quand le Mac dort. Chaque règle ci-dessous a été testée sur le vrai plugin :
- Chaque élément modifié reçoit une nouvelle version, jamais inférieure à l'heure actuelle en secondes. Sinon, un dessin ouvert ignore la modification sans rien dire.
- On supprime avec le drapeau
isDeleted. Un élément qui disparaît simplement du fichier reste dans la vue ouverte et revient à l'enregistrement suivant. - Le texte change à deux endroits : dans le JSON et dans la section Text Elements. C'est Text Elements qui l'emporte.
- Le fichier est écrit compressé, comme le plugin l'écrit lui-même. La vue ouverte n'a alors aucune raison de le réenregistrer.
L'agent n'a pas à calculer la mise en page : il y en a une automatique. 80 blocs et 118 flèches en six sections se placent en 2,9 secondes. J'ai regardé le premier vrai schéma dans mon Obsidian et j'ai dit : « oui, c'est parfait ».
Les limites, honnêtement
Le point le plus faible, c'est un dessin ouvert sur mon écran pendant que l'agent le modifie.
Après la première modification externe, le plugin enregistre le dessin encore une fois. Si l'agent réécrit avant que cet enregistrement ait atteint le cloud, LiveSync se retrouve avec un conflit.
Un conflit ne fait rien perdre : LiveSync garde les deux versions. Mais la note se fige sur le disque, et une boîte de dialogue « Conflicting changes » s'affiche. Voici ce qu'a montré un test en conditions réelles, avec des modifications à la suite sur un dessin ouvert :
| Pause entre modifications | Écritures acceptées | Dialogues de conflit |
|---|---|---|
| 15 s | 25 | 0 |
| 5 s | 30 | 1 |
| 1 s | 3 | 1 |
| sans pause | 6 | 1 |
Les échantillons sont petits. C'est une tendance, pas une statistique. Une pause n'est pas une garantie.
Alors kosh a appris à fusionner ces conflits tout seul. Il prend l'ancêtre commun des deux versions et les compare élément par élément. J'ai modifié le bloc C, l'agent le bloc A ? Les deux modifications restent, et la boîte de dialogue se ferme toute seule en une dizaine de secondes. Le même test après les corrections :
| Pause entre modifications | Écritures acceptées | Dialogues de conflit |
|---|---|---|
| 5 s | 24 | 0 |
| 1 s | 29 | 1 — fermé tout seul en 12 s |
Ce que kosh ne fusionne pas, volontairement : quand les deux côtés ont modifié le même élément. Les deux versions peuvent être mon propre travail, donc cette boîte de dialogue me revient. kosh ne touche pas non plus à un conflit entre deux de mes appareils : seulement à un conflit dont l'une des versions vient de lui.
Les pièges dans lesquels je suis tombé
- Linter cassait les dessins. L'une de ses règles mettait les titres de section en minuscules. Le plugin Excalidraw les cherche en respectant la casse : il ne les voyait donc plus, et chaque enregistrement ajoutait une section de plus. Solution : exclure
.excalidraw.mdde Linter. - Ne lance pas un second Obsidian sur le même Mac. Une copie de test avec son propre dossier personnel a fait apparaître une boîte de dialogue système proposant de réinitialiser mon trousseau.
- Le shell du Mac n'est pas un bac à sable. kosh peut exécuter une commande sur mon portable en mon nom. Donc tout ce qui supprime, installe, fait un push ou touche à des clés ne passe qu'après mon « oui » à cette commande précise. Et je peux couper le canal avec un fichier sur le Mac lui-même.
- livesync-workers est un projet jeune, avec un seul auteur. D'où le fork et la sauvegarde horaire sur GitHub.
Ce que ça m'apporte
J'ouvre n'importe quel client Claude : sur le Mac, dans le navigateur ou sur le téléphone. Il a déjà tout : tâches, notes, Telegram, recherches, l'état du Mac.
Et ce qui est difficile à garder en tête, l'agent le pose sur une toile. Je regarde, je corrige à la main, et l'agent voit mes modifications.
Vous voyez une erreur ?
Un fait erroné, une traduction bancale, quelque chose qui sonne faux dans cet article ? Écrivez-moi — dans votre propre langue.