Ich hole meine Boards aus Miro nach Obsidian
Der Export-Button in Miro liefert dir ein PNG oder PDF — ein Foto der Daten, nicht die Daten selbst. Wenn deine Boards load-bearing Denkkarten aus jahrelanger Arbeit sind, gehören sie in Obsidian: editierbar, durchsuchbar, im lokalen Vault. Wie ich Boards per REST API aus Miro gezogen und nach Excalidraw bzw. Obsidian Canvas konvertiert habe — mit Positionen, Farben, Fonts, Curved Connectors, Mindmap Nodes — und die Lehre reicht weiter als Miro: jedes SaaS gehört mit einem Exit Plan betrachtet, BEVOR du es zum ersten Mal öffnest.
Jedes Tool, das im Browser lebt, hält dich an seiner UI als Geisel. Vor allem, wenn du Zeit, Karten und Boards reingesteckt hast — und dann merkst, dass deine Map of Thinking auf einem fremden Server liegt, in einem Format, das du ohne deren Seite nicht öffnen kannst.
Ich habe ein paar Miro-Boards, die längst load-bearing geworden sind — Reflexionen, Pläne, mentale Karten aus mehreren Jahren. Der Export-Button gibt dir ein PNG oder ein PDF. Das sind keine Daten, das ist ein Foto der Daten.
Warum sie rausziehen
Vendor Lock-in ist kein theoretisches Problem. Es ist sehr konkret: um deine eigenen Daten per API runterzuladen, musst du auf den Expert Tier upgraden. Du zahlst also für die Erlaubnis, dir zurückzuholen, was dir gehört.
Ich lebe seit langem nach dem Obsidian-first-Prinzip: alles Wichtige liegt im lokalen Vault, als plain files, die ich git-en, grep-en und in zehn Jahren noch lesen kann. Ein Tool, das keinen Export in so ein Format anbietet, ist eins, aus dem du fliehen musst, bevor die Abhängigkeit unlösbar wird.
Warum Export dich nicht rettet
Der Export-Button in Miro liefert dir ein PNG oder PDF. Das ist Raster — die Struktur ist weg. Du kannst den Text in einer Box nicht ändern. Du kannst keine Shape verschieben. Du kannst keine Beschriftung greppen. Das ist die Trauerkarte für das Board, nicht das Board selbst.
Obsidian hat zwei Alternativen, die im Vault leben: das Excalidraw Plugin und natives Canvas. Beides JSON. Beides editierbar. Beides durchsuchbar. Beides liegt im Vault neben deinen Notizen, und du kannst direkt aus Obsidian heraus über den Text greppen.
Wie man sie rauszieht, wenn es keinen 'Export to Obsidian'-Button gibt
Wenn der UI-Export nicht das liefert, was du brauchst, kletterst du in die API. Miro hat eine REST API: sie gibt dir eine JSON-Beschreibung jeder Shape auf einem Board zurück. Excalidraw und Obsidian Canvas sind beide open-format JSON. Dazwischen liegt ein Mapping.
Ich habe zwei Python-Skripte geschrieben. miro_to_excalidraw.py und miro_to_canvas.py. Standard library only — null deps. Du startest sie mit Token und Board ID, bekommst eine Datei und wirfst sie in den Vault.
Was die Konvertierung überlebt hat
Die Aufgabe war nicht, einfach Shapes rüberzuschieben — es ging darum, das Visuelle so zu bewahren, dass sich das Board genauso liest wie in Miro.
- Positionen und Größen — Koordinaten jeder Shape 1:1
- Farben mit Fill Opacity (40 % Gelb bleibt 40 % Gelb)
- Borders — Farbe, Breite, Stil (solid / dashed)
- Fonts und Alignment — monospace bleibt monospace, center bleibt center
- Connectors — Pfeile sitzen an genau den Punkten, an denen Miro sie befestigt hat
- Curved Connectors — Bow-Bögen statt gerader Linien
- Images in die Datei eingebettet (keine externen URLs)
- Mindmap Nodes — Text aus der experimentellen Mindmap API gezogen
- Z-Ordering — Overlap gerät nicht durcheinander
Wo es unbequem wurde
Die Miro API hat ein paar Löcher, um die ich mich per Reverse Engineering herumarbeiten musste.
- Curved Connectors — Miro legt die Control Points nicht über die API offen. Statt der originalen Kurve synthetisiere ich also einen Bow — einen Bogen mit festem Radius zwischen den beiden Endpoints. Visuell nah dran, mathematisch nicht identisch.
- Z-Index — die Miro API gibt das z-Feld überhaupt nicht zurück. Welche Shape liegt oben, welche unten? Heuristik: größere Fläche = weiter hinten. Das funktioniert, weil in echten Boards große Container in der Regel unter den kleineren Elementen sitzen.
- Mindmap — der Text der Mindmap Nodes ist über die normale items API nicht erreichbar. Du brauchst einen separaten Call zum experimentellen Mindmap-Endpoint. Filled Nodes werden zu Boxes, unfilled zu plain text.
Excalidraw vs. Canvas — wie wählen
Wenn du in Drawings denkst — sketchy lines, hand-drawn feel, freeform Kompositionen — nimm Excalidraw. Das Excalidraw Plugin rendert die Datei im gleichen ästhetischen Stil, den du von Whiteboards kennst.
Wenn deine Boards vor allem Rechtecke mit Text, verbunden durch Pfeile sind und du Obsidian als dein Second Brain nutzt — nimm Canvas. Canvas ist nativ, öffnet mit einem Klick und ist mit Backlinks und Tags des Vaults verzahnt.
Manche Boards konvertiere ich nach Excalidraw (wenn der Visual Style zählt), andere nach Canvas (wenn Geschwindigkeit und der native Feel wichtig sind). Das Repo unterstützt beide Formate — du wählst beim Start.
Fazit
Python 3, standard library only. Kein pip install, kein virtualenv, kein node_modules. python3 miro_to_excalidraw.py 'BOARD_ID' 'output.excalidraw' — und du hast die Datei in der Hand.
Repo: github.com/oleksiimazurenko/miro-to-obsidian. MIT-Lizenz. PRs willkommen — besonders für Edge Cases, denen ich noch nicht begegnet bin.
Die Lehre reicht weiter als Miro
SaaS Lock-in ist eine Droge. Die ersten Monate sind gratis. Nach sechs Monaten ist es Gewohnheit. Nach einem Jahr liegen deine Daten in einem Format, das nur deren UI lesen kann. Nach zwei Jahren zahlst du den Expert Tier, um dir herauszuholen, was dir gehört.
Die Schlussfolgerung ist nicht „nutz kein SaaS”. Die Schlussfolgerung ist: jedes Tool, das load-bearing wird, gehört mit einem Exit Plan betrachtet, BEVOR du es zum ersten Mal öffnest. Die Frage „wie komme ich hier wieder raus, wenn ich muss” wiegt genauso viel wie „wie angenehm ist die UI”. Ein Tool ohne Plain-Text-Export oder offene API ist ein Tool mit verstecktem Preisschild, das du in zwei Jahren bezahlst.
Obsidian-first nicht, weil Obsidian perfekt wäre. Sondern weil plain markdown files ein Format sind, das Obsidian selbst überleben wird. Genauso wie eine plain Excalidraw-JSON-Datei das Plugin überlebt. Genauso wie dieses Python-Skript Miro überleben wird.