Skip to main content
Назад до блогу
obsidianmiroautomationtoolsopen-source

Виношу дошки з 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'ом ще ДО першого використання.

Опубліковано 30 червня 2026 р.6 хв читання

Будь-який інструмент, що живе в браузері, тримає тебе за заручника свого 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.