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-нуть и прочитать через десять лет. Инструмент, который не даёт экспорта в такой формат, — это инструмент, из которого надо уходить, пока зависимость не стала непреодолимой.

Почему Export не спасает

Кнопка Export в Miro даёт тебе PNG или PDF. Это raster — структура потеряна. Нельзя поменять текст в box'е. Нельзя перетащить shape. Нельзя grep-нуть надпись. Это похоронка по доске, а не сама доска.

В Obsidian есть две альтернативы, которые живут в vault'е: плагин Excalidraw и нативный 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 должен быть сверху, какой снизу? Эвристика: больше по площади = дальше назад. Это работает, потому что в реальных досках крупные контейнеры, как правило, сидят под более мелкими элементами.
  • 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 композиции — выбирай Excalidraw. Плагин Excalidraw рендерит файл в той же эстетике, которую ты видел на whiteboards.

Если твои доски — это в основном прямоугольники с текстом, соединённые стрелками, и ты живёшь в Obsidian как в second brain — выбирай Canvas. Canvas нативный, открывается в один клик, встроен в backlinks и tags vault'а.

Я конвертирую одни доски в Excalidraw (когда важен visual style), другие — в Canvas (когда важна скорость и нативный 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 экспорта или открытого API — это инструмент со скрытой ценой, которую ты заплатишь через два года.

Obsidian-first не потому, что Obsidian идеальный. А потому, что plain markdown файлы — это формат, который переживёт сам Obsidian. Так же, как plain JSON-файл Excalidraw переживёт сам плагин. Так же, как этот Python-скрипт переживёт сам Miro.