Skip to main content
Tillbaka till bloggen
obsidianmiroautomationtoolsopen-source

Jag drar ut mina boards ur Miro och in i Obsidian

Export-knappen i Miro ger dig en PNG eller en PDF — ett foto av datan, inte datan. Om dina boards är load-bearing maps of thinking byggda över år hör de hemma i Obsidian: editable, searchable, i ett lokalt vault. Så här drog jag ut boards ur Miro via REST API och konverterade till Excalidraw / Obsidian Canvas — med positioner, färger, fonts, curved connectors, mindmap nodes — och lärdomen sträcker sig längre än Miro: varje SaaS bör mötas med en exit plan INNAN du öppnar den första gången.

Publicerad 30 juni 20266 min läsning

Vilket verktyg som helst som bor i webbläsaren håller dig som gisslan åt sitt UI. Särskilt när du lagt ner tid, kort, boards — och plötsligt inser att din map of thinking ligger på någon annans server, i ett format du inte kan öppna utan deras sida.

Jag har några Miro-boards som sedan länge blivit load-bearing — reflektioner, planer, mentala kartor uppbyggda över år. Export-knappen ger dig en PNG eller en PDF. Det är inte data, det är ett foto av datan.

Varför dra ut dem

Vendor lock-in är inte ett teoretiskt problem. Det är väldigt konkret: för att ladda ner din egen data via API:t måste du upgrade till Expert tier. Du betalar alltså för tillstånd att hämta tillbaka det som redan är ditt.

Jag lever sedan länge efter Obsidian-first-principen: allt viktigt ligger i ett lokalt vault, som plain files, som jag kan git-a, grep-a och läsa om tio år. Ett verktyg som inte exporterar till det formatet är ett verktyg du behöver dra dig ur innan beroendet blir omöjligt att bryta.

Varför Export inte räddar dig

Export-knappen i Miro ger dig en PNG eller en PDF. Det är raster — strukturen är borta. Du kan inte ändra texten i en box. Du kan inte dra en shape. Du kan inte grep-a en etikett. Det är dödsannonsen för boarden, inte boarden själv.

Obsidian har två alternativ som bor inne i vault:et: Excalidraw-plugin och inbyggda Canvas. Båda är JSON. Båda är editable. Båda är searchable. Båda ligger i ditt vault bredvid anteckningarna, och du kan grep-a texten direkt inifrån Obsidian.

Hur du drar ut dem när det inte finns någon 'Export to Obsidian'-knapp

När UI-Export inte ger dig det du behöver kliver du in i API:t. Miro har en REST API: den returnerar en JSON-beskrivning av varje shape på en board. Excalidraw och Obsidian Canvas är båda open-format JSON. Mellan dem ligger en mapping.

Jag skrev två Python-skript. miro_to_excalidraw.py och miro_to_canvas.py. Standard library only — noll deps. Du kör dem med en token och ett board ID, får tillbaka en fil och slänger in den i vault:et.

Vad som överlevde konverteringen

Uppgiften var inte bara att flytta shapes — det var att bevara det visuella så att boarden läses precis som i Miro.

  • Positioner och storlekar — varje shapes koordinater 1:1
  • Färger med fill opacity (40 % gult förblir 40 % gult)
  • Borders — färg, bredd, stil (solid / dashed)
  • Fonts och alignment — monospace förblir monospace, center förblir center
  • Connectors — pilarna hänger i exakt samma punkter där Miro fäste dem
  • Curved connectors — bow-bågar i stället för raka linjer
  • Images inbäddade i filen (inte externa URL:er)
  • Mindmap nodes — texten dragen ut via experimental Mindmap API
  • Z-ordering — överlappen trasslar inte ihop sig

Där det blev obekvämt

Miros API har ett par hål som jag fick jobba runt med reverse engineering.

  • Curved connectors — Miro exponerar inte control points i API:t. Så i stället för den exakta originalkurvan syntetiserar jag en bow — en båge med fast radie mellan de två endpoints. Visuellt nära, mathematically inte identisk.
  • Z-index — Miros API returnerar överhuvudtaget inget z-fält. Vilken shape ska ligga överst, vilken längst ned? Heuristik: större yta = längre bak. Det funkar för att i riktiga boards sitter de stora containrarna i regel under de mindre elementen.
  • Mindmap — texten i mindmap nodes nås inte via den vanliga items API. Du behöver ett separat anrop till experimental Mindmap endpoint. Filled nodes blir boxes, unfilled blir plain text.

Excalidraw vs Canvas — så väljer du

Om du tänker i drawings — sketchy lines, hand-drawn feel, freeform-kompositioner — välj Excalidraw. Excalidraw-pluginet renderar filen i samma estetik som du sett på whiteboards.

Om dina boards mest är rektanglar med text sammanlänkade av pilar, och du bor i Obsidian som ditt second brain — välj Canvas. Canvas är native, öppnas med ett klick och är hopkopplat med vaultets backlinks och tags.

Jag konverterar vissa boards till Excalidraw (där visual style spelar roll), andra till Canvas (där snabbhet och native feel räknas). Repot stödjer båda formaten — du väljer vid körning.

Summering

Python 3, standard library only. Inget pip install, inget virtualenv, inget node_modules. python3 miro_to_excalidraw.py 'BOARD_ID' 'output.excalidraw' — och filen är i din hand.

Repo: github.com/oleksiimazurenko/miro-to-obsidian. MIT-licens. PR välkomna — särskilt för edge cases jag inte stött på än.

Lärdomen är större än Miro

SaaS lock-in är en drog. De första månaderna är gratis. Efter ett halvår är det en vana. Efter ett år lever din data i ett format som bara deras UI kan läsa. Efter två betalar du Expert tier för att gräva fram det som redan är ditt.

Slutsatsen är inte ”använd inte SaaS”. Slutsatsen är: varje verktyg du låter bli load-bearing behöver en exit plan INNAN du öppnar det första gången. Frågan ”hur tar jag mig ut härifrån när jag behöver” väger lika tungt som ”hur trevligt är UI:t”. Ett verktyg utan plain-text-export eller öppet API är ett verktyg med en dold prislapp du betalar om två år.

Obsidian-first inte för att Obsidian är perfekt. Utan för att plain markdown-filer är ett format som överlever Obsidian självt. På samma sätt som en plain Excalidraw-JSON överlever själva pluginet. På samma sätt som det här Python-skriptet överlever Miro.