Импорт
Импорт затаскивает существующую базу знаний в пространство (space) одним аплоадом: выгрузки claude.ai и ChatGPT, MCP memory-server, проекты и память Claude, а также обычные Markdown- и текстовые файлы. Формат распознаётся по содержимому, а не по имени файла, так что вам не нужно ничего готовить вручную — движок сам разберёт архив и разложит его по папкам.
Импорт — зеркало экспорта: экспорт читает файлы-истину с диска, импорт парсит источник и пишет заметки обычным путём записи. Каждая заметка попадает в пространство ровно так же, как если бы её создал человек в редакторе, — с версионированием, провенансом и индексацией.
Какие форматы понимает
Один архив Claude или ChatGPT обычно содержит несколько видов данных сразу; импорт распознаёт и переносит всё, что умеет:
| Источник | Файл в выгрузке | Что становится заметкой |
|---|---|---|
| Беседы Claude | conversations.json | Одна заметка на разговор, сообщения как ### Human/Assistant |
| Беседы ChatGPT | conversations.json (в т.ч. шардированный conversations-000.json…) | Одна заметка на разговор, транскрипт по времени |
| MCP-память | memory.json (JSONL) | Заметка на сущность; связи → [[wikilinks]] |
| Проекты Claude | projects.json или projects/<uuid>.json | Папка проекта: документы + инструкции |
| Память Claude | memories.json | Заметка на каждый блок памяти аккаунта |
| Дизайн-чаты Claude | design_chats/<uuid>.json | Одна заметка на чат |
| Markdown / текст | .md, .txt | Одна заметка, тело файла = тело заметки |
Формат определяется анализом содержимого (все сервисы шлют файл с именем conversations.json, поэтому имя ненадёжно). Пустые сообщения и разговоры без единого содержательного фрагмента не создают «сиротских» заметок — число пропущенных видно в сводке импорта. Если внутри архива попался нераспознанный JSON, он тоже попадает в сводку как unsupported — потеря данных всегда видна в сводке, а не происходит незаметно.
Как импортировать
Импорт живёт на вкладке Import в настройках пространства (/s/<space>/management/import). Каждая опция — отдельная секция:
- Файл — выберите файл выгрузки (
conversations.json, ZIP-выгрузку целиком илиmemory.json). Отдельный.md/.txtимпортируется перетаскиванием (см. ниже), а не через этот диалог. - Skip existing notes — что делать при повторном импорте (см. ниже).
- Memory entries — куда класть сущности памяти (см. ниже).
Долгий импорт идёт устойчивой задачей (durable job): прогресс-бар с живым счётчиком записанных заметок, фаза и кнопка Cancel. Можно уйти со вкладки и вернуться — импорт продолжит идти в фоне, а по возвращении вы снова увидите прогресс или итоговую сводку.
Отдельный аплоад-диалог не обязателен: перетащите .md- или .txt-файл прямо в окно приложения — он станет заметкой. Дроп на папку в дереве кладёт заметку в неё, дроп в область содержимого — в папку открытой заметки или в корень. Это тот же пайплайн импорта, просто второй вход в него.
Опция «Skip existing notes»
Имя файла заметки детерминировано и завязано на идентичность источника. Благодаря этому повторный импорт того же экспорта перезаписывает те же файлы, а не плодит дубли, — и полсотни разговоров «Untitled» не сталкиваются друг с другом.
- Выключено (по умолчанию для повторной заливки — upsert) — существующие заметки перезаписываются по пути, идемпотентно.
- Включено — заметки, чей путь уже существует, пропускаются. Это кейс «дозалил обновлённую историю — не перезатирай уже поправленное вручную».
Опция «Memory entries»
Сущности из memory.json можно направить в одно из трёх мест:
- folder — видимые пользовательские заметки под корневой папкой импорта.
- space — в скрытый mount памяти агента пространства (
.notarium/memory): такие записи не показываются в дереве, ленте и поиске, но доступны агенту черезrecall. - skip — не импортировать память вовсе.
Вариант space кладёт записи в память агента конкретного пространства. Отдельного UI-браузера этой памяти внутри пространства нет — она видна агенту через recall. Это память конкретного пространства, а не глобальный персональный домен памяти (тот открывается линзой Memory в дереве-проводнике) — в него этот импорт не пишет.
Как раскладываются данные
Импорт создаёт предсказуемое дерево папок внутри выбранного корня:
conversations/claude/ — беседы Claude
conversations/chatgpt/ — беседы ChatGPT
projects/<проект>/ — проекты Claude (+ docs/, prompt-template.md)
memory/claude/ — память аккаунта Claude
memory/<тип-сущности>/ — сущности из memory.json
design-chats/<проект>/ — дизайн-чаты Claude
Даты сохраняются как данные
Наивный импорт датировал бы всю историю «сегодня», и лента свалила бы сотни бесед в одну кучу. Notarium вместо этого протягивает дату создания как данные: у каждой заметки во frontmatter пишется created: со временем, когда разговор реально произошёл. Лента раскладывает импортированную историю по настоящим дням, а связка «экспорт → импорт» сохраняет даты — перенос идёт без потерь.
Поле «Created» можно и поправить вручную из редактора (метаданные заметки) — например, при миграции или корректировке историчности. Время последнего изменения (modified) при этом остаётся реальным временем правки файла и не редактируется.
Как это работает под капотом
Импорт устроен так, чтобы выдержать и гигабайтные архивы, и обрыв связи:
- Потоковая обработка. Аплоад стримится на диск, ZIP распаковывается по одному члену, JSON-массив бесед парсится поэлементно — один разговор за раз. Пиковая память не зависит от размера архива, поэтому 600-МБ выгрузка не роняет сервер.
- Устойчивая задача. Когда у хоста есть служебная БД (норма для self-host), импорт по умолчанию — устойчивая задача: аплоад сохраняется в staging, а фоновый воркер пишет заметки вне запроса. Закрытая вкладка, потерянное соединение и даже рестарт сервера не теряют прогресс.
- Кооперативность. Массовый импорт не монополизирует сервер: запись уступает интерактивным запросам, фоновая индексация приостанавливается на время потока и догоняет после. Поиск и навигация остаются отзывчивыми даже во время заливки тысяч заметок.
flowchart LR
src([Архив / файл]) -->|аплоад| stage[Staging на диске]
stage -->|задача import| worker[Фоновый воркер]
worker -->|write-path| notes[(Markdown-заметки)]
worker -.->|прогресс| ui([Вкладка Import])
На хосте без служебной БД (а она отсутствует только в режиме AUTH_MODE=none) слоя задач нет: импорт идёт синхронным потоковым путём в рамках одного запроса, с тем же ядром и живым счётчиком. Прогресс и сводка выглядят так же; отличается лишь то, что импорт не переживёт рестарт сервера.
Границы
- Отмена, но не пауза. Задачу можно отменить (кооперативно), но не поставить на паузу и возобновить.
- Индикатор — indeterminate. Число заметок в архиве заранее неизвестно, поэтому прогресс показывает фазу и живой счётчик записанных заметок, а не проценты и ETA.
- Прерванный аплоад начинается заново. Устойчивость включается после того, как байты доехали: если заливка большого архива оборвалась, она начинается заново.
- Бинарные вложения не импортируются. Текст из вложений встраивается в тело заметки, а сами бинарные файлы — нет (так же, как в экспорте).
- Импорт ложится в корень пространства. В диалоге импорта целевая папка не выбирается — заметки попадают в корень; при перетаскивании корень определяется зоной дропа.
Дальше
- Экспорт — забрать пространство или папку обратно архивом Markdown.
- Агенты и MCP — как агент работает с импортированной памятью через
recall.