Skip to main content

← BlogObsidian · MCP · Cloudflare

Obsidian flyttede ind i min AI-hub: én forbindelse til alle tjenester og diagrammer, som agenten tegner

Min Obsidian-vault bor nu på Cloudflare, og kosh er én MCP-forbindelse til opgaver, noter, Telegram, Go-Alpha, Instagram og min Mac. Agenten tegner Excalidraw-diagrammer direkte i vaulten. Hvordan det er bygget, og hvor grænserne går.

Udgivet 31. okt. 20267 min læsning

TL;DR

Min Obsidian-vault bor ikke længere på Mac'en. Den bor på Cloudflare, i kosh-vault. Mac'en og iPhonen synkroniserer med den via pluginet Self-hosted LiveSync.

kosh er min personlige AI-hub. Én MCP-forbindelse med alle mine tjenester bag: opgaver, noter, Telegram, Go-Alpha, Instagram, vagthunden på min Mac og en shell på den.

Og agenten tegner nu Excalidraw-diagrammer direkte i vaulten. Jeg åbner Obsidian og ser dens tanke som et billede. Jeg kan rette den til selv, og agenten ser mine ændringer.

Det, der gjorde ondt

Der var to problemer. Under hvert af dem: hvordan det var, og hvordan det er nu.

1. Hver tjeneste var sin egen forbindelse

FØR – 5 forbindelser:

Claude ──▶ opgaver
Claude ──▶ Telegram
Claude ──▶ Go-Alpha
Claude ──▶ Instagram
Claude ──▶ noter (kun på Mac'en)

NU – 1 forbindelse:

Claude ──▶ kosh ──▶ alle disse tjenester

Sådan var det i hver klient: Claude Code, claude.ai, telefonen. En ny tjeneste måtte tilføjes i hver enkelt for sig. Og noter kunne Claude kun redigere på Mac'en.

2. Agentens ændringer tog en omvej til mine noter

FØR:

agent ──▶ GitHub ──(op til 2 min)──▶ Mac ──(iCloud)──▶ iPhone

NU:

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

Før hentede pluginet Obsidian Git ændringen fra GitHub – op til to minutter, og kun mens Obsidian var åbent på Mac'en. Til iPhonen gik den desuden via iCloud. Nu ligger vaulten i skyen, og Mac'en må gerne sove.

Vaulten flyttede op i skyen

Jeg ville have én sandhedskilde. En, der ikke falder i søvn sammen med laptoppen.

Der fandtes et færdigt projekt: livesync-workers, en backend til pluginet Self-hosted LiveSync på Cloudflare Workers. Jeg forkede det og kaldte det kosh-vault.

Sandheden er nu en SQLite-database i et Durable Object. Obsidian på Mac'en og på iPhonen holder en levende forbindelse til den og får hver ændring på cirka et sekund. I bund og grund Obsidian over websockets.

Mac'en må gerne sove – vaulten er der stadig for agenterne. Alle andre kopier følger bare skyen: en backup til GitHub hver time og et skrivebeskyttet spejl i iCloud.

Én indstilling, som »live« ikke virker uden: LiveSync skal have keepReplicationActiveInBackground: true. Ellers sættes synkroniseringen på pause, når Obsidian-vinduet ligger bag andre, og agentens ændringer kommer først, når jeg kigger.

kosh – én dør

kosh er nogle få Workers på Cloudflare. Navnet kommer fra kosakkernes kosj, hovedkvarteret i Sitj.

Indeni er hver tjeneste stadig for sig. Telegram og Go-Alpha kører i Cloudflare Containers. Instagram er en almindelig Worker. Noterne er kosh-vault. Men udefra er der én indgang: /mcp.

Hvad det betyder i praksis:

  • Hubben samler alle tjenesters værktøjer i én liste under deres egne navne. En klient ser én forbindelse.
  • Tjenesterne taler sammen via Cloudflares service bindings, ikke via offentlige adresser med et delt token.
  • Nøgler til tredjepartstjenester indsætter jeg på én forbindelsesside. De gemmes krypteret, og intet viser dem nogensinde igen.
  • Er en tjeneste nede, bliver dens værktøjer stående på listen, og et kald svarer ærligt: »ikke tilgængelig«.

Hele pointen med kosh var, at alle mine tjenester skulle kunne nås gennem den i stedet for at forbinde hver enkelt for sig.

Opgaver er bare markdown

Mit eneste opgavesystem er noter i vaulten. Én zone, én fil. Prioriteten er en Obsidian Tasks-emoji på linjen.

Agenten tilføjer, flytter og lukker opgaver med værktøjerne tasks_*. Hver skrivning tjekkes mod indholdets hash: Har filen ændret sig undervejs, køres operationen igen. Og hver ændring havner som en linje i loggen.

Opgavetavlen tegner kosh selv, i en Excalidraw-fil. Ændrer jeg en liste i hånden, opdager et cron-job det inden for et minut og tegner tavlen igen. Den skrives kun, når noget på den faktisk har ændret sig.

Agenten tegner diagrammer

Det er den nyeste del. Fire værktøjer: drawing_list, drawing_read, drawing_create, drawing_edit.

Jeg beder: »tegn, hvordan denne proces fungerer«. Agenten opretter en .excalidraw.md-fil i vaulten. Et sekund senere er den på min Mac, og Excalidraw-pluginet åbner den som sin egen.

agent
  │ beder om at ændre diagrammet (drawing_edit)
  ▼
kosh
  │ skriver tegningsfilen
  ▼
kosh-vault (Cloudflare)
  │ LiveSync leverer den, ~1 s
  ▼
den åbne tegning i Obsidian opdateres

Excalidraw-pluginet har sin egen CLI. Men den kræver, at Obsidian kører på Mac'en. Derfor skriver kosh filen selv, i pluginets format – og virker også, mens Mac'en sover. Hver regel herunder er testet mod det rigtige plugin:

  • Hvert ændret element får en ny version, ikke lavere end det aktuelle tidspunkt i sekunder. Ellers ignorerer en åben tegning ændringen i al stilhed.
  • Slet med flaget isDeleted. Et element, der bare forsvinder fra filen, bliver i den åbne visning og kommer tilbage, næste gang filen gemmes.
  • Tekst ændres to steder: i JSON'en og i sektionen Text Elements. Text Elements vinder.
  • Filen skrives komprimeret, sådan som pluginet selv skriver den. Så har en åben visning ingen grund til at gemme den igen.

Agenten behøver ikke selv at regne layoutet ud: der er et automatisk. 80 blokke og 118 pile i seks sektioner bliver placeret på 2,9 sekunder. Jeg kiggede på det første rigtige diagram i mit Obsidian og sagde: »ja, alt er super«.

Ærlige grænser

Det svageste punkt er en tegning, der er åben på min skærm, mens agenten redigerer den.

Efter den første ændring udefra gemmer pluginet tegningen én gang til. Skriver agenten igen, før den lagring har nået skyen, opstår der en konflikt i LiveSync.

Ved en konflikt går intet tabt: LiveSync beholder begge versioner. Men noten fryser på disken, og en »Conflicting changes«-dialog dukker op. Det viste en test under rigtige forhold, med ændringer tæt efter hinanden i en åben tegning:

Pause mellem ændringerGodkendte skrivningerKonfliktdialoger
15 s250
5 s301
1 s31
ingen pause61

Stikprøverne er små. Det er en tendens, ikke statistik. En pause er ingen garanti.

Derfor har kosh lært selv at flette den slags konflikter. Den tager de to versioners fælles forfader og sammenligner element for element. Jeg ændrede blok C, agenten blok A? Begge ændringer bliver, og dialogen lukker af sig selv efter cirka 10 sekunder. Samme test efter rettelserne:

Pause mellem ændringerGodkendte skrivningerKonfliktdialoger
5 s240
1 s291 – lukkede af sig selv efter 12 s

Det, kosh bevidst ikke fletter: når begge sider har ændret det samme element. Begge versioner kan være mit eget arbejde, så den dialog er overladt til mig. En konflikt mellem to af mine enheder rører kosh heller ikke – kun en, hvor en af versionerne er dens egen.

Fælder, jeg trådte i

  • Linter ødelagde tegninger. En af dens regler skrev sektionsoverskrifterne med lille forbogstav. Excalidraw-pluginet leder efter dem med forskel på store og små bogstaver, så det holdt op med at se dem – og hver lagring tilføjede endnu en sektion. Løsning: undtag .excalidraw.md fra Linter.
  • Start ikke et andet Obsidian på samme Mac. En testkopi med sin egen hjemmemappe fik en systemdialog frem, der tilbød at nulstille min nøglering.
  • Shellen på Mac'en er ingen sandkasse. kosh kan køre en kommando på min laptop som mig. Derfor går alt, der sletter, installerer, pusher eller rører nøgler, kun igennem efter mit »ja« til netop den kommando. Og jeg kan slå kanalen fra med en fil på selve Mac'en.
  • livesync-workers er et ungt projekt med én forfatter. Deraf forken og backuppen til GitHub hver time.

Hvad det giver mig

Jeg åbner en hvilken som helst Claude-klient – på Mac'en, i browseren eller på telefonen. Den har allerede det hele: opgaver, noter, Telegram, research, Mac'ens tilstand.

Og det, der er svært at holde i hovedet, lægger agenten på et lærred. Jeg kigger, retter selv til – og agenten ser mine ændringer.

Én forbindelse, én sandhedskilde – og et diagram i stedet for en mur af tekst.

Fandt du en fejl?

Et forkert faktum, en skæv oversættelse, noget der virker usandt i denne artikel? Skriv til mig — på dit eget sprog.