Skip to main content

← BloggObsidian · MCP · Cloudflare

Obsidian flyttade in i min AI-hubb: en anslutning till alla tjänster och diagram som agenten ritar

Mitt Obsidian-valv bor nu på Cloudflare, och kosh är en enda MCP-anslutning till uppgifter, anteckningar, Telegram, Go-Alpha, Instagram och min Mac. Agenten ritar Excalidraw-diagram direkt i valvet. Hur det är byggt och var gränserna går.

Publicerad 31 okt. 20267 min läsning

TL;DR

Mitt Obsidian-valv bor inte längre på Macen. Det bor på Cloudflare, i kosh-vault. Macen och iPhonen synkar med det via pluginet Self-hosted LiveSync.

kosh är min personliga AI-hubb. En enda MCP-anslutning med alla mina tjänster bakom: uppgifter, anteckningar, Telegram, Go-Alpha, Instagram, min Macs vakthund och ett skal på den.

Och agenten ritar nu Excalidraw-diagram direkt i valvet. Jag öppnar Obsidian och ser dess tanke som en bild. Jag kan rätta den för hand, och agenten ser mina ändringar.

Det som skavde

Det fanns två problem. Under vart och ett: hur det var och hur det är nu.

1. Varje tjänst var en egen anslutning

FÖRE – 5 anslutningar:

Claude ──▶ uppgifter
Claude ──▶ Telegram
Claude ──▶ Go-Alpha
Claude ──▶ Instagram
Claude ──▶ anteckningar (bara på Macen)

NU – 1 anslutning:

Claude ──▶ kosh ──▶ alla dessa tjänster

Så var det i varje klient: Claude Code, claude.ai, telefonen. En ny tjänst fick läggas till i var och en för sig. Och anteckningar kunde Claude bara redigera på Macen.

2. Agentens ändringar tog en omväg till mina anteckningar

FÖRE:

agent ──▶ GitHub ──(upp till 2 min)──▶ Mac ──(iCloud)──▶ iPhone

NU:

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

Förut hämtade pluginet Obsidian Git ändringen från GitHub – upp till två minuter, och bara medan Obsidian var öppet på Macen. Till iPhonen gick den dessutom via iCloud. Nu ligger valvet i molnet, och Macen får sova.

Valvet flyttade till molnet

Jag ville ha en enda sanningskälla. En som inte somnar med laptopen.

Det fanns ett färdigt projekt: livesync-workers, en backend för pluginet Self-hosted LiveSync på Cloudflare Workers. Jag forkade det och döpte det till kosh-vault.

Sanningen är nu en SQLite-databas i ett Durable Object. Obsidian på Macen och på iPhonen håller en levande anslutning till den och får varje ändring på ungefär en sekund. I princip Obsidian över websockets.

Macen får sova – valvet finns ändå där för agenterna. Alla andra kopior följer bara molnet: en säkerhetskopia till GitHub varje timme och en skrivskyddad spegel i iCloud.

En inställning som ”live” inte fungerar utan: LiveSync behöver keepReplicationActiveInBackground: true. Annars pausas synken när Obsidian-fönstret ligger bakom andra, och agentens ändringar kommer först när jag tittar.

kosh – en enda dörr

kosh är några Workers på Cloudflare. Namnet kommer från kosackernas kosj, högkvarteret i Sitj.

Inuti fick varje tjänst förbli separat. Telegram och Go-Alpha körs i Cloudflare Containers. Instagram är en vanlig Worker. Anteckningarna är kosh-vault. Men utifrån finns en enda ingång: /mcp.

Vad det betyder i praktiken:

  • Hubben samlar alla tjänsters verktyg i en lista, under deras egna namn. En klient ser en anslutning.
  • Tjänsterna pratar med varandra via Cloudflares service bindings, inte via publika adresser med en delad token.
  • Nycklar till tredjepartstjänster klistrar jag in på en enda anslutningssida. De lagras krypterade, och inget visar dem någonsin igen.
  • Om en tjänst ligger nere stannar dess verktyg kvar i listan, och ett anrop svarar ärligt: ”inte tillgänglig”.

Hela poängen med kosh var att alla mina tjänster skulle nås genom den, i stället för att ansluta var och en för sig.

Uppgifter är bara markdown

Mitt enda uppgiftssystem är anteckningar i valvet. En zon, en fil. Prioriteten är en Obsidian Tasks-emoji på raden.

Agenten lägger till, flyttar och stänger uppgifter med verktygen tasks_*. Varje skrivning kontrolleras mot innehållets hash: har filen ändrats under tiden körs operationen om. Och varje ändring hamnar som en rad i loggen.

Uppgiftstavlan ritar kosh själv, i en Excalidraw-fil. Jag ändrar en lista för hand, och inom en minut märker ett cron-jobb det och ritar om tavlan. Den skrivs bara när något på den verkligen har ändrats.

Agenten ritar diagram

Det här är den nyaste delen. Fyra verktyg: drawing_list, drawing_read, drawing_create, drawing_edit.

Jag ber: ”rita hur den här processen fungerar”. Agenten skapar en .excalidraw.md-fil i valvet. En sekund senare finns den på min Mac, och Excalidraw-pluginet öppnar den som sin egen.

agent
  │ ber om att ändra diagrammet (drawing_edit)
  ▼
kosh
  │ skriver ritningsfilen
  ▼
kosh-vault (Cloudflare)
  │ LiveSync levererar den, ~1 s
  ▼
den öppna ritningen i Obsidian uppdateras

Excalidraw-pluginet har ett eget CLI. Men det kräver att Obsidian körs på Macen. Därför skriver kosh filen själv, i pluginets format, och fungerar även när Macen sover. Varje regel nedan är testad mot det riktiga pluginet:

  • Varje ändrat element får en ny version, inte lägre än aktuell tid i sekunder. Annars ignorerar en öppen ritning ändringen i tysthet.
  • Radera med flaggan isDeleted. Ett element som bara försvinner ur filen stannar kvar i den öppna vyn och kommer tillbaka vid nästa sparning.
  • Text ändras på två ställen: i JSON och i avsnittet Text Elements. Text Elements vinner.
  • Filen skrivs komprimerad, så som pluginet självt skriver den. Då har en öppen vy ingen anledning att spara om den.

Agenten behöver inte räkna ut layouten själv: det finns en automatisk. 80 block och 118 pilar i sex avsnitt placeras ut på 2,9 sekunder. Jag tittade på det första riktiga diagrammet i mitt Obsidian och sa: ”ja, allt är toppen”.

Ärliga gränser

Den svagaste punkten är en ritning som är öppen på min skärm medan agenten redigerar den.

Efter den första ändringen utifrån sparar pluginet ritningen en gång till. Om agenten skriver igen innan den sparningen har nått molnet uppstår en konflikt i LiveSync.

Vid en konflikt går ingenting förlorat: LiveSync behåller båda versionerna. Men anteckningen fryser på disken, och en dialog ”Conflicting changes” dyker upp. Så här blev det i ett skarpt test, med ändringar tätt efter varandra i en öppen ritning:

Paus mellan ändringarGodkända skrivningarKonfliktdialoger
15 s250
5 s301
1 s31
ingen paus61

Urvalen är små. Det är en tendens, inte statistik. En paus är ingen garanti.

Därför har kosh lärt sig att slå ihop sådana konflikter själv. Den tar de två versionernas gemensamma förfader och jämför dem element för element. Jag ändrade block C och agenten block A? Båda ändringarna blir kvar, och dialogen stängs av sig själv efter ungefär 10 sekunder. Samma test efter rättningarna:

Paus mellan ändringarGodkända skrivningarKonfliktdialoger
5 s240
1 s291 – stängdes av sig själv efter 12 s

Det kosh medvetet inte slår ihop: när båda sidor har ändrat samma element. Båda versionerna kan vara mitt eget arbete, så den dialogen lämnas åt mig. En konflikt mellan två av mina enheter rör kosh inte heller – bara en där en av versionerna är dess egen.

Fällor jag gick i

  • Linter förstörde ritningar. En av dess regler skrev om avsnittsrubrikerna med liten begynnelsebokstav. Excalidraw-pluginet letar efter dem skiftlägeskänsligt, så det slutade se dem – och varje sparning lade till ännu ett avsnitt. Lösning: undanta .excalidraw.md från Linter.
  • Starta inte ett andra Obsidian på samma Mac. En testkopia med en egen hemmapp fick upp en systemdialog som erbjöd sig att återställa min nyckelring.
  • Skalet på Macen är ingen sandlåda. kosh kan köra ett kommando på min laptop i mitt namn. Därför går allt som raderar, installerar, pushar eller rör nycklar bara efter mitt ”ja” till exakt det kommandot. Och jag kan stänga av kanalen med en fil på själva Macen.
  • livesync-workers är ett ungt projekt med en enda utvecklare. Därav forken och säkerhetskopian till GitHub varje timme.

Vad det ger mig

Jag öppnar vilken Claude-klient som helst – på Macen, i webbläsaren eller på telefonen. Den har redan allt: uppgifter, anteckningar, Telegram, research, Macens hälsa.

Och det som är svårt att hålla i huvudet lägger agenten på en duk. Jag tittar, rättar för hand – och agenten ser mina ändringar.

En anslutning, en sanningskälla – och ett diagram i stället för en vägg av text.

Hittade du ett fel?

Ett felaktigt faktum, en skev översättning, något som känns falskt i den här artikeln? Skriv till mig — på ditt eget språk.