Import
Der Import holt eine bestehende Wissensbasis mit einem einzigen Upload in einen Space: Exporte von claude.ai und ChatGPT, einen MCP-Memory-Server, Projekte und Gedächtnis von Claude sowie einfache Markdown- und Textdateien. Das Format wird anhand des Inhalts erkannt, nicht anhand des Dateinamens — du musst also nichts von Hand vorbereiten: Die Engine zerlegt das Archiv selbst und sortiert es in Ordner ein.
Der Import ist das Spiegelbild des Exports: Der Export liest die Source-of-Truth-Dateien von der Festplatte, während der Import die Quelle parst und Notizen über den normalen Schreibpfad schreibt. Jede Notiz landet im Space genau so, als hätte sie ein Mensch im Editor angelegt — mit Versionierung, Provenienz und Indexierung.
Welche Formate der Import versteht
Ein einzelnes Claude- oder ChatGPT-Archiv enthält meist mehrere Datenarten gleichzeitig; der Import erkennt und übernimmt alles, was er verarbeiten kann:
| Quelle | Datei im Export | Was zur Notiz wird |
|---|---|---|
| Claude-Konversationen | conversations.json | Eine Notiz pro Konversation, Nachrichten als ### Human/Assistant |
| ChatGPT-Konversationen | conversations.json (auch geshardet: conversations-000.json…) | Eine Notiz pro Konversation, Transkript in zeitlicher Reihenfolge |
| MCP-Gedächtnis | memory.json (JSONL) | Eine Notiz pro Entität; Beziehungen → [[wikilinks]] |
| Claude-Projekte | projects.json oder projects/<uuid>.json | Ein Projektordner: Dokumente + Anweisungen |
| Claude-Gedächtnis | memories.json | Eine Notiz pro Gedächtnisblock des Kontos |
| Claude-Design-Chats | design_chats/<uuid>.json | Eine Notiz pro Chat |
| Markdown / Text | .md, .txt | Eine Notiz, Dateiinhalt = Notizinhalt |
Das Format ergibt sich aus der Analyse des Inhalts (jeder Dienst liefert eine Datei namens conversations.json, der Name allein ist also unzuverlässig). Leere Nachrichten und Konversationen ohne ein einziges sinnvolles Fragment erzeugen keine „verwaisten“ Notizen — wie viele übersprungen wurden, steht in der Zusammenfassung des Imports. Stößt der Import im Archiv auf nicht erkanntes JSON, landet auch das als unsupported in der Zusammenfassung — Datenverlust ist immer in der Zusammenfassung sichtbar, statt unbemerkt zu geschehen.
So importierst du
Der Import befindet sich auf dem Tab Import in den Einstellungen des Space (/s/<space>/management/import). Jede Option ist ein eigener Abschnitt:
- File — wähle die Datei des Exports (
conversations.json, den gesamten ZIP-Export odermemory.json). Eine einzelne.md- oder.txt-Datei importierst du per Drag-and-drop (siehe unten), nicht über diesen Dialog. - Skip existing notes — was bei einem erneuten Import geschehen soll (siehe unten).
- Memory entries — wohin die Entitäten des Gedächtnisses kommen (siehe unten).
Ein langer Import läuft als dauerhafter Job: ein Fortschrittsbalken mit einem Live-Zähler der geschriebenen Notizen, die aktuelle Phase und eine Schaltfläche Cancel. Du kannst den Tab verlassen und später zurückkommen — der Import läuft im Hintergrund weiter, und bei deiner Rückkehr siehst du wieder den Fortschritt oder die abschließende Zusammenfassung.
Der separate Upload-Dialog ist nicht zwingend: Zieh eine .md- oder .txt-Datei direkt ins App-Fenster, und sie wird zu einer Notiz. Ein Drop auf einen Ordner im Baum legt die Notiz dort ab, ein Drop in den Inhaltsbereich legt sie in den Ordner der geöffneten Notiz oder in die Wurzel. Es ist dieselbe Import-Pipeline, nur mit einem zweiten Einstiegspunkt.
Die Option „Skip existing notes“
Der Dateiname einer Notiz ist deterministisch und an die Identität der Quelle gebunden. Deshalb überschreibt ein erneuter Import desselben Exports dieselben Dateien, statt Duplikate zu erzeugen — und fünfzig Konversationen namens „Untitled“ kommen sich nicht gegenseitig in die Quere.
- Aus (Standard beim erneuten Hochladen — Upsert) — bestehende Notizen werden pfadgenau und idempotent überschrieben.
- Ein — Notizen, deren Pfad bereits existiert, werden übersprungen. Das ist der Fall „Ich habe eine aktualisierte Historie erneut importiert — überschreib nicht, was ich schon von Hand korrigiert habe“.
Die Option „Memory entries“
Entitäten aus memory.json lassen sich an einen von drei Orten leiten:
- folder — sichtbare, nutzerseitige Notizen unter dem Wurzelordner des Imports.
- space — in den versteckten Mount des Agentengedächtnisses im Space (
.notarium/memory): Diese Einträge tauchen weder im Baum noch im Feed noch in der Suche auf, doch der Agent erreicht sie überrecall. - skip — das Gedächtnis gar nicht importieren.
Die Option space legt die Einträge in das Agentengedächtnis genau dieses Space. Einen eigenen UI-Browser für dieses Gedächtnis gibt es innerhalb des Space nicht — der Agent sieht es über recall. Es ist das Gedächtnis eines konkreten Space, nicht die globale persönliche Gedächtnis-Domäne (die sich als Memory-Linse im Explorer-Baum öffnet) — dorthin schreibt dieser Import nicht.
Wie die Daten abgelegt werden
Der Import legt innerhalb der gewählten Wurzel einen vorhersehbaren Ordnerbaum an:
conversations/claude/ — Claude-Konversationen
conversations/chatgpt/ — ChatGPT-Konversationen
projects/<project>/ — Claude-Projekte (+ docs/, prompt-template.md)
memory/claude/ — Gedächtnis des Claude-Kontos
memory/<entity-type>/ — Entitäten aus memory.json
design-chats/<project>/ — Claude-Design-Chats
Datumsangaben bleiben als Daten erhalten
Ein naiver Import würde die gesamte Historie auf „heute“ datieren, und der Feed würde Hunderte Konversationen auf einen Haufen kippen. Notarium reicht das Erstellungsdatum stattdessen als Daten durch: Jede Notiz bekommt in ihrem Frontmatter ein created: mit dem Zeitpunkt, an dem die Konversation tatsächlich stattfand. Der Feed verteilt die importierte Historie auf ihre echten Tage, und der Zyklus Export → Import bewahrt die Datumsangaben — beim Umzug geht nichts verloren.
Das Feld „Created“ lässt sich auch von Hand im Editor bearbeiten (in den Metadaten einer Notiz) — etwa bei einer Migration oder wenn du das Datum einer Notiz korrigierst. Der Zeitpunkt der letzten Änderung (modified) spiegelt dagegen immer wider, wann die Datei tatsächlich bearbeitet wurde, und lässt sich nicht verändern.
So funktioniert es unter der Haube
Der Import ist darauf ausgelegt, sowohl Archive im Gigabyte-Bereich als auch einen Verbindungsabbruch zu überstehen:
- Streaming-Verarbeitung. Der Upload wird auf die Festplatte gestreamt, das ZIP Eintrag für Eintrag entpackt und das JSON-Array der Konversationen Element für Element geparst — eine Konversation nach der anderen. Der Spitzenbedarf an Speicher hängt nicht von der Größe des Archivs ab, deshalb bringt auch ein 600-MB-Export den Server nicht in die Knie.
- Dauerhafter Job. Hat der Host eine Metadaten-Datenbank (der Normalfall beim Self-Hosting), ist der Import standardmäßig ein dauerhafter Job: Der Upload wandert ins Staging, und ein Hintergrund-Worker schreibt die Notizen außerhalb der Anfrage. Ein geschlossener Tab, eine abgerissene Verbindung, selbst ein Neustart des Servers — nichts davon kostet dich Fortschritt.
- Kooperativität. Ein Massenimport monopolisiert den Server nicht: Das Schreiben lässt interaktiven Anfragen den Vortritt, und die Indexierung im Hintergrund pausiert für die Dauer des Streams und holt danach auf. Suche und Navigation bleiben reaktionsschnell, selbst während Tausende Notizen geschrieben werden.
flowchart LR
src([Archiv / Datei]) -->|Upload| stage[Staging auf der Festplatte]
stage -->|Import-Job| worker[Hintergrund-Worker]
worker -->|Schreibpfad| notes[(Markdown-Notizen)]
worker -.->|Fortschritt| ui([Import-Tab])
Auf einem Host ohne Metadaten-Datenbank (und sie fehlt nur im Modus AUTH_MODE=none) gibt es keine Job-Schicht: Der Import nimmt den synchronen Streaming-Weg innerhalb einer einzigen Anfrage, mit demselben Kern und demselben Live-Zähler. Fortschritt und Zusammenfassung sehen gleich aus; der einzige Unterschied ist, dass der Import einen Neustart des Servers nicht übersteht.
Grenzen
- Abbrechen, aber nicht pausieren. Ein Job lässt sich (kooperativ) abbrechen, aber nicht anhalten und wieder aufnehmen.
- Die Fortschrittsanzeige ist unbestimmt. Wie viele Notizen in einem Archiv stecken, ist vorab nicht bekannt; deshalb zeigt der Fortschritt die Phase und einen Live-Zähler der geschriebenen Notizen statt Prozentwert und ETA.
- Ein unterbrochener Upload beginnt von vorn. Die Dauerhaftigkeit greift erst, wenn die Bytes angekommen sind: Reißt der Upload eines großen Archivs ab, fängt er wieder von vorn an.
- Binäre Anhänge werden nicht importiert. Text aus Anhängen wandert in den Inhalt der Notiz, die Binärdateien selbst nicht (genau wie beim Export).
- Der Import landet in der Wurzel des Space. Im Import-Dialog lässt sich kein Zielordner wählen — die Notizen kommen in die Wurzel; bei Drag-and-drop bestimmt die Drop-Zone die Wurzel.
Weiter
- Export — einen Space oder Ordner als Markdown-Archiv wieder herausholen.
- Agenten und MCP — wie ein Agent über
recallmit importiertem Gedächtnis arbeitet.