Skip to main content

← BlogObsidian · MCP · Cloudflare

Obsidian s-a mutat în hubul meu de AI: o singură conexiune pentru toate serviciile și diagrame desenate de agent

Seiful meu Obsidian stă acum pe Cloudflare, iar kosh este o singură conexiune MCP către sarcini, notițe, Telegram, Go-Alpha, Instagram și Mac-ul meu. Agentul desenează diagrame Excalidraw direct în seif. Cum e construit și unde sunt limitele.

Publicat 31 oct. 20267 min de citit

TL;DR

Seiful meu Obsidian nu mai stă pe Mac. Stă pe Cloudflare, în kosh-vault. Mac-ul și iPhone-ul se sincronizează cu el prin pluginul Self-hosted LiveSync.

kosh este hubul meu personal de AI. O singură conexiune MCP, în spatele căreia stau toate serviciile mele: sarcini, notițe, Telegram, Go-Alpha, Instagram, paznicul Mac-ului meu și un shell pe el.

Iar agentul desenează acum diagrame Excalidraw direct în seif. Deschid Obsidian și îi văd gândul sub formă de imagine. Pot s-o corectez de mână, iar agentul îmi vede modificările.

Ce mă durea

Erau două probleme. Sub fiecare: cum era și cum e acum.

1. Fiecare serviciu era o conexiune separată

ÎNAINTE — 5 conexiuni:

Claude ──▶ sarcini
Claude ──▶ Telegram
Claude ──▶ Go-Alpha
Claude ──▶ Instagram
Claude ──▶ notițe (doar pe Mac)

ACUM — 1 conexiune:

Claude ──▶ kosh ──▶ toate aceste servicii

Și așa era în fiecare client: Claude Code, claude.ai, telefonul. Un serviciu nou trebuia adăugat în fiecare, separat. Iar notițele, Claude le putea edita doar pe Mac.

2. Modificările agentului făceau un ocol lung până la notițele mele

ÎNAINTE:

agent ──▶ GitHub ──(până la 2 min)──▶ Mac ──(iCloud)──▶ iPhone

ACUM:

agent ──▶ kosh-vault ──(~1 s)──▶ Mac și iPhone

Înainte, pluginul Obsidian Git prelua modificarea de pe GitHub — până la două minute, și doar cât timp Obsidian era deschis pe Mac. Până la iPhone mai trecea și prin iCloud. Acum seiful e în cloud, iar Mac-ul poate dormi.

Seiful s-a mutat în cloud

Voiam o singură sursă de adevăr. Una care nu adoarme odată cu laptopul.

Exista deja un proiect gata făcut: livesync-workers, un backend pentru pluginul Self-hosted LiveSync pe Cloudflare Workers. I-am făcut un fork și l-am numit kosh-vault.

Adevărul e acum o bază de date SQLite într-un Durable Object. Obsidian, pe Mac și pe iPhone, ține o conexiune vie cu ea și primește fiecare schimbare în aproximativ o secundă. Practic, Obsidian prin websockets.

Mac-ul poate dormi — seiful rămâne la îndemâna agenților. Toate celelalte copii doar urmează cloudul: un backup pe GitHub în fiecare oră și o oglindă doar pentru citire în iCloud.

O setare fără de care „live” nu funcționează: LiveSync are nevoie de keepReplicationActiveInBackground: true. Altfel, sincronizarea se pune pe pauză cât timp fereastra Obsidian e ascunsă în spatele altora, iar modificările agentului ajung abia când mă uit.

kosh — o singură ușă

kosh înseamnă câteva Workers pe Cloudflare. Numele vine de la koșul cazacilor, cartierul general al Siciei.

Înăuntru, fiecare serviciu a rămas separat. Telegram și Go-Alpha rulează în Cloudflare Containers. Instagram e un Worker obișnuit. Notițele sunt kosh-vault. Dar din afară există o singură intrare: /mcp.

Ce înseamnă asta în practică:

  • Hubul adună instrumentele tuturor serviciilor într-o singură listă, sub numele lor originale. Clientul vede o singură conexiune.
  • Serviciile vorbesc între ele prin service bindings Cloudflare, nu prin adrese publice cu un token comun.
  • Cheile serviciilor terțe le lipesc pe o singură pagină de conexiuni. Sunt stocate criptat și nimic nu le mai afișează vreodată.
  • Când un serviciu cade, instrumentele lui rămân în listă, iar un apel răspunde cinstit: „indisponibil”.

Tot rostul lui kosh era ca toate serviciile mele să fie accesibile prin el, în loc să le conectez pe fiecare separat.

Sarcinile sunt doar markdown

Singurul meu sistem de sarcini sunt notițele din seif. O zonă, un fișier. Prioritatea e un emoji Obsidian Tasks pe rând.

Agentul adaugă, mută și închide sarcini cu instrumentele tasks_*. Fiecare scriere e verificată după hash-ul conținutului: dacă fișierul s-a schimbat între timp, operația se reia. Și fiecare modificare ajunge ca un rând în jurnal.

Tabla de sarcini o desenează kosh singur, într-un fișier Excalidraw. Schimb o listă de mână, iar în mai puțin de un minut un cron observă asta și redesenează tabla. O scrie doar când pe ea s-a schimbat cu adevărat ceva.

Agentul desenează diagrame

E partea cea mai nouă. Patru instrumente: drawing_list, drawing_read, drawing_create, drawing_edit.

Îi cer: „desenează cum funcționează procesul ăsta”. Agentul creează un fișier .excalidraw.md în seif. O secundă mai târziu e pe Mac-ul meu, iar pluginul Excalidraw îl deschide ca pe al lui.

agent
  │ cere să schimbe diagrama (drawing_edit)
  ▼
kosh
  │ scrie fișierul desenului
  ▼
kosh-vault (Cloudflare)
  │ LiveSync îl livrează, ~1 s
  ▼
desenul deschis în Obsidian se actualizează

Pluginul Excalidraw are propriul CLI. Dar are nevoie de Obsidian pornit pe Mac. Așa că kosh scrie singur fișierul, în formatul pluginului — și merge chiar și când Mac-ul doarme. Fiecare regulă de mai jos a fost testată pe pluginul real:

  • Fiecare element modificat primește o versiune nouă, nu mai mică decât ora curentă în secunde. Altfel, un desen deschis ignoră în tăcere modificarea.
  • Ștergerea se face cu marcajul isDeleted. Un element care pur și simplu dispare din fișier rămâne în vizualizarea deschisă și revine la următoarea salvare.
  • Textul se schimbă în două locuri: în JSON și în secțiunea Text Elements. Câștigă Text Elements.
  • Fișierul se scrie comprimat, așa cum îl scrie pluginul însuși. Atunci vizualizarea deschisă n-are niciun motiv să-l salveze din nou.

Agentul nu trebuie să calculeze singur așezarea: există una automată. 80 de blocuri și 118 săgeți în șase secțiuni se așază în 2,9 secunde. M-am uitat la prima diagramă adevărată în Obsidian-ul meu și am zis: „da, totul e super”.

Limitele, sincer

Cel mai slab punct e un desen deschis pe ecranul meu în timp ce agentul îl editează.

După prima modificare din afară, pluginul mai salvează o dată desenul. Dacă agentul scrie din nou înainte ca salvarea asta să ajungă în cloud, în LiveSync apare un conflict.

La un conflict nu se pierde nimic: LiveSync păstrează ambele versiuni. Dar notița îngheață pe disc, iar pe ecran apare dialogul „Conflicting changes”. Iată ce a arătat un test real, cu modificări una după alta pe un desen deschis:

Pauză între modificăriScrieri acceptateDialoguri de conflict
15 s250
5 s301
1 s31
fără pauză61

Eșantioanele sunt mici. E o tendință, nu o statistică. O pauză nu e o garanție.

Așa că kosh a învățat să îmbine singur astfel de conflicte. Ia strămoșul comun al celor două versiuni și le compară element cu element. Eu am schimbat blocul C, agentul blocul A? Ambele modificări rămân, iar dialogul se închide singur în vreo 10 secunde. Același test după corecturi:

Pauză între modificăriScrieri acceptateDialoguri de conflict
5 s240
1 s291 — s-a închis singur în 12 s

Ce nu îmbină kosh, în mod deliberat: când ambele părți au schimbat același element. Ambele versiuni pot fi munca mea, așa că dialogul ăsta îmi rămâne mie. Nici de un conflict între două dintre dispozitivele mele nu se atinge kosh — doar de unul în care una dintre versiuni e a lui.

Capcane în care am călcat

  • Linter strica desenele. Una dintre regulile lui scria titlurile secțiunilor cu literă mică. Pluginul Excalidraw le caută ținând cont de majuscule și minuscule, așa că nu le mai vedea — și fiecare salvare mai adăuga o secțiune. Soluția: excluderea .excalidraw.md din Linter.
  • Nu porni un al doilea Obsidian pe același Mac. O copie de test cu propriul folder de utilizator a scos un dialog de sistem care se oferea să-mi reseteze Keychain-ul.
  • Shellul de pe Mac nu e un sandbox. kosh poate rula o comandă pe laptopul meu, în numele meu. De aceea, tot ce șterge, instalează, face push sau atinge chei trece doar după „da”-ul meu pentru exact acea comandă. Iar canalul îl pot opri cu un fișier chiar de pe Mac.
  • livesync-workers e un proiect tânăr, cu un singur autor. De aici forkul și backupul orar pe GitHub.

Ce îmi aduce

Deschid orice client Claude — pe Mac, în browser sau pe telefon. Are deja totul: sarcini, notițe, Telegram, cercetări, starea Mac-ului.

Iar ce e greu de ținut în minte, agentul îl pune pe o pânză. Mă uit, corectez de mână — și agentul îmi vede modificările.

O conexiune, o sursă de adevăr — și o diagramă în loc de un zid de text.

Ai găsit o greșeală?

Un fapt greșit, o traducere stângace, ceva ce sună fals în acest articol? Scrie-mi — în limba ta.