Saco mis tableros de Miro y los llevo a Obsidian
El botón Export de Miro te da un PNG o un PDF — una foto de los datos, no los datos. Si tus tableros son load-bearing maps of thinking acumulados durante años, su sitio es Obsidian: editables, searchable, en un vault local. Cómo saqué los boards de Miro vía REST API y los convertí a Excalidraw / Obsidian Canvas — conservando posiciones, colores, fuentes, curved connectors, mindmap nodes — y la lección va más allá de Miro: a todo SaaS hay que mirarlo con un exit plan ANTES del primer uso.
Cualquier herramienta que vive en el navegador te tiene de rehén de su UI. Sobre todo cuando le has metido tiempo, tarjetas, tableros — y de pronto te das cuenta de que tu map of thinking está en el servidor de otro, en un formato que no puedes abrir sin su página cargada.
Tengo unos cuantos tableros de Miro que ya son load-bearing — reflexiones, planes, mapas mentales acumulados durante años. El botón Export te da un PNG o un PDF. Eso no son datos, es una foto de los datos.
Por qué sacarlos
El vendor lock-in no es un problema teórico. Es muy concreto: para bajar tus propios datos por API tienes que upgrade al Expert tier. O sea, pagas por el permiso de llevarte lo que ya es tuyo.
Hace tiempo que vivo bajo el principio Obsidian-first: todo lo importante vive en un vault local, en plain files que puedo gitear, grepear y leer dentro de diez años. Una herramienta que no exporta a ese formato es una herramienta de la que hay que salir antes de que la dependencia sea irrompible.
Por qué Export no te salva
El botón Export de Miro te da un PNG o un PDF. Eso es raster — la estructura se perdió. No puedes cambiar el texto de un box. No puedes mover un shape. No puedes grepear una etiqueta. Es la esquela del tablero, no el tablero.
Obsidian tiene dos alternativas que viven dentro del vault: el plugin Excalidraw y el Canvas nativo. Ambos son JSON. Ambos son editables. Ambos son searchable. Ambos viven en tu vault al lado de tus notas, y puedes grepear el texto desde el propio Obsidian.
Cómo sacarlos cuando no hay botón 'Export to Obsidian'
Si el Export del UI no te da lo que necesitas, te metes en la API. Miro tiene una REST API: devuelve una descripción JSON de cada shape del tablero. Excalidraw y Obsidian Canvas son ambos open-format JSON. En medio hay un mapping.
Escribí dos scripts en Python. miro_to_excalidraw.py y miro_to_canvas.py. Standard library only — cero deps. Los ejecutas con un token y un board ID, obtienes un archivo y lo tiras al vault.
Qué sobrevivió a la conversión
El trabajo no era solo mover shapes — era preservar lo visual para que el tablero se lea igual que en Miro.
- Posiciones y tamaños — coordenadas de cada shape 1:1
- Colores con fill opacity (un amarillo al 40 % se queda al 40 %)
- Borders — color, grosor, estilo (solid / dashed)
- Fuentes y alignment — monospace sigue siendo monospace, center sigue siendo center
- Connectors — las flechas se enganchan en los mismos puntos donde las enganchó Miro
- Curved connectors — arcos bow en lugar de líneas rectas
- Images embebidas en el archivo (no URLs externas)
- Mindmap nodes — texto extraído a través de la experimental Mindmap API
- Z-ordering — los overlaps no se enredan
Dónde se puso incómodo
La API de Miro tiene un par de agujeros con los que tocó trabajar por reverse engineering.
- Curved connectors — Miro no expone los control points en la API. Así que en vez de la curva original exacta sintetizo un bow — un arco de radio fijo entre los dos endpoints. Visualmente cercano, mathematically no idéntico.
- Z-index — la API de Miro directamente no devuelve un campo z. ¿Qué shape va arriba y cuál abajo? Heurística: mayor área = más al fondo. Funciona porque en tableros reales los contenedores grandes suelen estar debajo de los elementos pequeños.
- Mindmap — el texto de los mindmap nodes no llega por la items API normal. Necesitas una llamada aparte al endpoint experimental de Mindmap. Los filled nodes se vuelven boxes, los unfilled, plain text.
Excalidraw vs Canvas — cómo elegir
Si piensas en estilo drawings — sketchy lines, hand-drawn feel, composiciones freeform — elige Excalidraw. El plugin Excalidraw renderiza el archivo con la misma estética que has visto en whiteboards.
Si tus tableros son sobre todo rectángulos con texto unidos por flechas y vives en Obsidian como tu second brain — elige Canvas. Canvas es nativo, se abre con un clic e integra los backlinks y tags del vault.
Algunos tableros los convierto a Excalidraw (donde importa el visual style) y otros a Canvas (donde importa la velocidad y el feel nativo). El repo soporta los dos formatos — eliges al arrancar.
Resumen
Python 3, standard library only. Sin pip install, sin virtualenv, sin node_modules. python3 miro_to_excalidraw.py 'BOARD_ID' 'output.excalidraw' — y el archivo está en tus manos.
Repo: github.com/oleksiimazurenko/miro-to-obsidian. Licencia MIT. PRs bienvenidos — sobre todo para edge cases que aún no me he topado.
La lección va más allá de Miro
El SaaS lock-in es una droga. Los primeros meses son gratis. A los seis meses, ya es costumbre. Al año, tus datos viven en un formato que solo su UI sabe leer. A los dos años pagas el Expert tier para sacar lo que ya era tuyo.
La conclusión no es «no uses SaaS». La conclusión es que toda herramienta que se vuelve load-bearing necesita un exit plan ANTES del primer uso. La pregunta «cómo salgo de aquí cuando me haga falta» pesa tanto como «qué cómodo es el UI». Una herramienta sin export en plain text o sin una API abierta es una herramienta con un precio escondido que pagarás dentro de dos años.
Obsidian-first no porque Obsidian sea perfecto. Sino porque los plain markdown files son un formato que sobrevivirá al propio Obsidian. Igual que un plain JSON de Excalidraw sobrevivirá al propio plugin. Igual que este script de Python sobrevivirá al propio Miro.