Виношу дошки з Miro в Obsidian
Кнопка Export у Miro дає PNG чи PDF — це фото даних, не самі дані. А якщо твої дошки — це load-bearing мапи мислення за роки, вони мають жити в Obsidian: editable, searchable, у локальному vault'і. Як я виніс boards з Miro через REST API і конвертував у Excalidraw / Obsidian Canvas — зі збереженням позицій, кольорів, шрифтів, curved connectors, mindmap nodes — і урок ширший за Miro: SaaS треба сприймати з exit plan'ом ще ДО першого використання.
Будь-який інструмент, що живе в браузері, тримає тебе за заручника свого UI. Особливо коли в нього вкладено час, картки, дошки — і ти раптом розумієш, що твій map of thinking лежить на чужому сервері, у форматі, який неможливо відкрити без їхньої сторінки.
Я маю кілька Miro-дошок, які вже стали load-bearing — на них рефлексії, плани, ментальні карти за роки. Кнопка Export дає тобі PNG чи PDF. Це не дані — це фото даних.
Чому забирати
Vendor lock-in — це не теоретична проблема. Це конкретно: щоб скачати свої власні дані через API, треба upgrade до Expert tier. Тобто ти платиш за дозвіл забрати своє.
Я давно живу за принципом Obsidian-first: усе важливе має лежати в локальному vault'і, у plain files, які можна git-нути, grep-нути, прочитати через 10 років. Інструмент, що не дає експорту в такий формат — це інструмент, з якого треба тікати, поки залежність не стала непереборною.
Чому Export не рятує
Кнопка Export у Miro дає PNG чи PDF. Це raster — структура втрачена. Не можна змінити текст у box'і. Не можна перетягнути shape. Не можна grep'нути напис. Це funeral картки, не сама картка.
В Obsidian є дві альтернативи, що живуть у vault'і: Excalidraw plugin і native Canvas. Обидва — JSON. Обидва — editable. Обидва — searchable. Обидва — у твоєму vault'і поруч із нотатками, і grep'нути по тексту можна прямо з Obsidian.
Як виносити коли нема кнопки 'Export to Obsidian'
Якщо UI Export не дає те, що треба — лізти в API. Miro має REST API: повертає JSON опис кожного shape'а на дошці. Excalidraw і Obsidian Canvas — обидва open-format JSON. Між ними — mapping.
Я написав два Python скрипти. miro_to_excalidraw.py і miro_to_canvas.py. Standard library only — нуль deps. Запускаєш з токеном і board ID, отримуєш файл, кидаєш у vault.
Що збереглось при конвертації
Завдання — не просто перенести shapes, а зберегти візуал так, щоб дошка читалась так само, як на Miro.
- Позиції та розміри — координати кожного shape'а 1:1
- Кольори з fill opacity (40% жовтий лишається 40% жовтим)
- Borders — колір, ширина, стиль (solid/dashed)
- Шрифти та alignment — monospace лишається monospace, center лишається center
- Connectors — стрілки прикріплені у точках, де їх прикріплював Miro
- Curved connectors — bow дуги замість прямих ліній
- Images embedded у файл (а не зовнішні URL)
- Mindmap nodes — текст витягнутий з experimental Mindmap API
- Z-ordering — overlap не плутається
Де було незручно
Miro API має пару дірок, з якими довелось працювати reverse-engineering'ом.
- Curved connectors — Miro не експозить control points у API. Тому замість точного оригінального вигину я синтезую bow — арку фіксованого радіусу між двома endpoint'ами. Візуально близько, mathematically не identical.
- Z-index — Miro API взагалі не повертає поле z. Який shape має бути зверху, який знизу? Heuristic: більший за площею = далі назад. Це працює, бо в реальних дошках великі контейнери, як правило, сидять під дрібнішими елементами.
- Mindmap — текст mindmap nodes недоступний через звичайний items API. Треба окремий call до experimental Mindmap endpoint. Filled nodes стають boxes, unfilled — plain text.
Excalidraw vs Canvas — як вибрати
Якщо ти думаєш у стилі drawings — sketchy lines, hand-drawn feel, freeform compositions — обирай Excalidraw. Excalidraw plugin рендерить файл у тому ж естетичному стилі, який ти бачив у whiteboards.
Якщо твої дошки — це переважно прямокутники з текстом, з'єднані стрілками, і ти живеш у Obsidian як у second brain — обирай Canvas. Canvas — native, відкривається в один клік, інтегрований із backlinks і tags vault'у.
Я конвертую одні дошки в Excalidraw (де важливий visual style), інші — в Canvas (де важлива швидкість і native feel). Repo підтримує обидва формати — обираєш на запуску.
Підсумок
Python 3, standard library only. Без pip install, без virtualenv, без node_modules. python3 miro_to_excalidraw.py 'BOARD_ID' 'output.excalidraw' — і файл у тебе в руках.
Repo: github.com/oleksiimazurenko/miro-to-obsidian. MIT license. PR welcome — особливо для edge case'ів, які я ще не зустрів.
Урок ширший за Miro
SaaS lock-in — це наркотик. Перші місяці він безкоштовний. Шість місяців — звичка. Рік — твої дані живуть у форматі, який можна прочитати тільки через їхній UI. Два — ти платиш Expert tier щоб видобути своє.
Висновок — не "не використовуй SaaS". Висновок — кожен інструмент, який стає load-bearing, треба сприймати з exit plan'ом ще ДО першого використання. Питання "як я звідси вийду коли мені знадобиться" — таке ж важливе, як "наскільки зручний UI". Інструмент без plain-text експорту або open API — це інструмент із прихованою ціною, яку ти платиш через 2 роки.
Obsidian-first не тому що Obsidian ідеальний. А тому що plain markdown файли — це формат, який переживе сам Obsidian. Так само як plain JSON файл Excalidraw переживе сам plugin. Так само як цей Python скрипт переживе сам Miro.