Skip to main content
Tilbake til bloggen
obsidianmiroautomationtoolsopen-source

Jeg drar boardene mine ut av Miro og inn i Obsidian

Export-knappen i Miro gir deg en PNG eller en PDF — et bilde av dataene, ikke dataene. Hvis boardene dine er load-bearing maps of thinking bygget opp gjennom år, hører de hjemme i Obsidian: editable, searchable, i et lokalt vault. Sånn dro jeg boards ut av Miro via REST API og konverterte til Excalidraw / Obsidian Canvas — med posisjoner, farger, fonts, curved connectors, mindmap nodes — og lærdommen strekker seg lenger enn Miro: enhver SaaS bør møtes med en exit plan FØR du åpner den for første gang.

Publisert 30. juni 20266 min lesing

Et hvilket som helst verktøy som bor i nettleseren holder deg som gissel for sitt UI. Spesielt når du har lagt tid, kort og boards i det — og plutselig innser at din map of thinking ligger på en andres server, i et format du ikke får åpnet uten siden deres.

Jeg har et par Miro-boards som for lengst er blitt load-bearing — refleksjoner, planer, mentale kart bygd opp gjennom år. Export-knappen gir deg en PNG eller en PDF. Det er ikke data, det er et bilde av dataene.

Hvorfor hente dem ut

Vendor lock-in er ikke et teoretisk problem. Det er svært konkret: for å laste ned dine egne data via API-et må du upgrade til Expert tier. Du betaler altså for tillatelse til å hente tilbake det som allerede er ditt.

Jeg har lenge levd etter Obsidian-first-prinsippet: alt som betyr noe ligger i et lokalt vault, som plain files som jeg kan git-e, grep-e og lese om ti år. Et verktøy som ikke eksporterer til det formatet er et verktøy du må trekke deg ut av før avhengigheten blir umulig å bryte.

Hvorfor Export ikke redder deg

Export-knappen i Miro gir deg en PNG eller en PDF. Det er raster — strukturen er borte. Du kan ikke endre teksten i en box. Du kan ikke flytte en shape. Du kan ikke grep-e en etikett. Det er en dødsannonse for boardet, ikke boardet selv.

Obsidian har to alternativer som lever inne i vaultet: Excalidraw-pluginet og innebygd Canvas. Begge er JSON. Begge er editable. Begge er searchable. Begge ligger i vaultet ditt ved siden av notatene, og du kan grep-e teksten direkte fra Obsidian.

Hvordan hente dem ut når det ikke finnes noen 'Export to Obsidian'-knapp

Når UI-Export ikke gir deg det du trenger, klatrer du inn i API-et. Miro har en REST API: den returnerer en JSON-beskrivelse av hver shape på et board. Excalidraw og Obsidian Canvas er begge open-format JSON. Mellom dem ligger en mapping.

Jeg skrev to Python-skript. miro_to_excalidraw.py og miro_to_canvas.py. Standard library only — null deps. Du kjører dem med en token og en board ID, får en fil og slenger den inn i vaultet.

Hva som overlevde konverteringen

Oppgaven var ikke bare å flytte shapes — det var å bevare det visuelle slik at boardet leses akkurat som i Miro.

  • Posisjoner og størrelser — koordinatene til hver shape 1:1
  • Farger med fill opacity (40 % gul forblir 40 % gul)
  • Borders — farge, bredde, stil (solid / dashed)
  • Fonts og alignment — monospace forblir monospace, center forblir center
  • Connectors — pilene henger i nøyaktig de punktene Miro festet dem i
  • Curved connectors — bow-buer i stedet for rette linjer
  • Images innebygget i filen (ikke eksterne URL-er)
  • Mindmap nodes — teksten hentet ut via experimental Mindmap API
  • Z-ordering — overlappet floker seg ikke

Der det ble ubehagelig

Miros API har et par hull jeg måtte jobbe rundt med reverse engineering.

  • Curved connectors — Miro eksponerer ikke control points i API-et. Så i stedet for den eksakte originalkurven syntetiserer jeg en bow — en bue med fast radius mellom de to endpoints. Visuelt nært, mathematically ikke identisk.
  • Z-index — Miros API returnerer overhodet ikke noe z-felt. Hvilken shape skal ligge øverst, hvilken nederst? Heuristikk: større areal = lenger bak. Det funker fordi i ekte boards sitter de store containerne som regel under de mindre elementene.
  • Mindmap — teksten i mindmap nodes er ikke tilgjengelig gjennom den vanlige items API. Du trenger et separat kall til experimental Mindmap endpoint. Filled nodes blir boxes, unfilled blir plain text.

Excalidraw vs Canvas — hvordan velge

Hvis du tenker i drawings — sketchy lines, hand-drawn feel, freeform-komposisjoner — velg Excalidraw. Excalidraw-pluginet renderer filen i samme estetikk som du har sett på whiteboards.

Hvis boardene dine mest er rektangler med tekst koblet sammen med piler, og du bor i Obsidian som ditt second brain — velg Canvas. Canvas er native, åpnes med ett klikk og er sydd inn i vaultets backlinks og tags.

Noen boards konverterer jeg til Excalidraw (der visual style betyr noe), andre til Canvas (der fart og native feel teller). Repoet støtter begge formater — du velger ved kjøring.

Oppsummering

Python 3, standard library only. Ingen pip install, ingen virtualenv, ingen node_modules. python3 miro_to_excalidraw.py 'BOARD_ID' 'output.excalidraw' — og fila er i hendene dine.

Repo: github.com/oleksiimazurenko/miro-to-obsidian. MIT-lisens. PR-er velkomne — særlig for edge cases jeg ennå ikke har truffet på.

Lærdommen er større enn Miro

SaaS lock-in er et stoff. De første månedene er gratis. Etter et halvt år er det en vane. Etter ett år lever dataene dine i et format som bare UI-et deres kan lese. Etter to betaler du Expert tier for å grave ut det som allerede var ditt.

Konklusjonen er ikke «ikke bruk SaaS». Konklusjonen er: ethvert verktøy du lar bli load-bearing trenger en exit plan FØR du åpner det første gang. Spørsmålet «hvordan kommer jeg meg ut herfra når jeg må» veier like tungt som «hvor hyggelig er UI-et». Et verktøy uten plain-text-eksport eller åpent API er et verktøy med en skjult prislapp du betaler om to år.

Obsidian-first ikke fordi Obsidian er perfekt. Men fordi plain markdown-filer er et format som overlever Obsidian selv. På samme måte som en plain Excalidraw-JSON overlever selve pluginet. På samme måte som dette Python-skriptet overlever Miro.