
DEVONthink: Migration zu TagSpaces (Notizen-Datenbank)
Migration von DEVONthink zu TagSpaces am Beispiel der Notizen-Datenbank
Die Migration zu DEVONthink beginnt mit der Notizen-Datenbank: Überschaubare Datenmenge, geringe manuelle Vorarbeit, keine Verschlüsselung gewünscht, somit als Test-Ballon gut geeignet.
Manuelle Vorarbeiten#
- Replikate auflösen. Replikate sind Dateien, die mehreren Gruppen zugewiesen sind. TagSpaces unterstützt dies nicht und mit symbolischen oder hard links möchte ich unter Linux nicht arbeiten.
- Unnütze reine macOS-Formate konvertieren: webArchive zu PDF, Numbers zu TSV oder OnlyOffice.
Als spezielles Problem stellte sich eine Numbers-Datei heraus:
Apple Numbers ist einzigartig, weil es einen freien Canvas verwendet — Tabellen sind dort schwebende Objekte, die man beliebig platzieren kann, genau wie Bilder. Alle klassischen Tabellenkalkulationen (Excel, LibreOffice Calc, Google Sheets) verwenden dagegen ein festes Zellgitter als Fundament. Das macht die exakte Nachbildung des Numbers-Workflows schwierig.
Dafür gibt es also keine vollständige Alternative, da meine Tabellen glücklicherweise keine Berechnungen durchführen existiert ein Workaround in Form von OnlyOffice:
| LibreOffice Draw | OnlyOffice Presentation | |
|---|---|---|
| Plattform | macOS + Linux ✓ | macOS + Linux ✓ |
| Dateiformat | .odg (ODF) | .pptx (OOXML) |
| Bild in Hintergrund | ✓ | ✓ |
| Tabellen frei platzierbar | ✓ | ✓ |
| Open Source | ✓ | ✓ |
| UI-Modernität | klassisch | moderner |
Migration#
Wie üblich: Claude Code entwickelt alles.
Umwandlung von Tags und Labels#
./1-devonthink-export-tags.sh "Datenbankname"bashLiest alle Dateien der angegebenen DEVONthink-Datenbank rekursiv aus (inkl. Untergruppen) und erstellt eine CSV-Datei devonthink-Datenbankname.csv.
Exportierte Daten:
- Gruppenpfad (Ordnerstruktur in DEVONthink)
- Aktueller Dateiname (aus dem DEVONthink-Pfad)
- Schlagworte (Tags)
- Label (als Sterne-Bewertung)
- Erstellungsdatum
- URL
- Finder Comment
- Custom Fields: Kcal, Portionen, Preis, Glasbreite (mm)
Generierter neuer Dateiname:
Format basisname[datum label tag1 tag2].suffix — Tags in PascalCase, alphabetisch sortiert (nach Datum und Label).
Validierung:
- macOS (APFS): max. 255 Unicode-Zeichen
- ext4: max. 255 UTF-8-Bytes
- Duplikat-Erkennung

CSV-Spalten#
| Spalte | Beschreibung |
|---|---|
gruppenpfad | Ordnerstruktur aus DEVONthink, führender / |
aktueller_dateiname | Dateiname aus dem DEVONthink-Pfad |
duplikat | nein oder ja (Nx) bei mehrfach vorkommenden Namen |
neuer_dateiname | Generierter Name mit Tags in eckigen Klammern |
schlagworte | Kommagetrennte Liste aller Tags |
unicode_zeichen | Länge des neuen Namens in Unicode-Zeichen |
utf8_bytes | Länge des neuen Namens in UTF-8-Bytes |
macos_gueltig | ja/nein — gültig unter macOS (APFS) |
macos_bemerkung | Begründung bei Ungültigkeit |
ext4_gueltig | ja/nein — gültig unter Linux (ext4) |
ext4_bemerkung | Begründung bei Ungültigkeit |
url | URL aus DEVONthink |
finder_comment | Finder Comment |
kcal | Custom Field |
portionen | Custom Field |
preis | Custom Field |
glasbreite_mm | Custom Field |
Prüfung des DEVONthink-Exports#
DEVONthink kann alle Dateien und Gruppen in einen lokalen Ordner exportieren. Ein Skript prüft anschließend, ob die im ersten Schritt ermittelten Gruppen und Original-Dateinamen korrekt aufgelöst werden können.
python3 2-check-paths.py devonthink-Datenbankname.csv /pfad/zum/startverzeichnisbashPrüft, ob alle Gruppenpfade als Ordner und alle Dateinamen im Startverzeichnis existieren. Listet fehlende Ordner und Dateien auf.
Bei 1% der Dateien sind manuelle Nacharbeiten in DEVONthink erforderlich, weil DEVONthink beim Export den Dateinamen auf den Titel verändert: Es genügt, den Titel einmalig zu bearbeiten, damit DEVONthink den Dateinamen auf den Titel ändert, sodass alles wieder synchron ist und erneut exportiert und getestet werden kann.
Dateien umbenennen#
python3 3-rename-files.py devonthink-Datenbankname.csv /pfad/zum/startverzeichnisbashBenennt alle Dateien gemäß der CSV-Datei um (aktueller Name → neuer Name mit Tags). Verifiziert jede Umbenennung durch Rücklesen aus dem Dateisystem. Identische Namen werden übersprungen.
Löschen leerer Ordner#
python3 4-remove-empty-dirs.py /pfad/zum/startverzeichnisbashLöscht rekursiv leere Ordner (bottom-up). Jede Löschung erfordert eine Bestätigung (j/N). .DS_Store-Dateien werden als leer betrachtet.
Sidecar-Dateien erstellen#
Da Tags im Dateinamen stehen, ist die Erstellung separater Sidecar-Dateien eigentlich nicht erforderlich. In DEVONthink sind allerdings weitere Metadaten enthalten, die übernommen werden sollen. Hierfür bietet TagSpaces leider nur ein unstrukturiertes Description-Feld an, welches aber immerhin mit Markdown befüllt werden kann. Dies ist ein Feature der Pro-Version, aber auch die Lite-Version liest derartige Sidecar-Dateien ein und stellt die Informationen dar, man kann die Description nur nicht mehr in der Oberfläche ändern. Für die Datenmigration ist dies gut genug und ein fünftes Skript erstellt die Sidecar-Dateien.

python3 5-create-sidecars.py devonthink-Datenbankname.csv /pfad/zum/startverzeichnisbashErstellt TagSpaces-Sidecar-Dateien (.ts/dateiname.json) für alle Einträge mit URL, Finder Comment oder Custom Fields. Die Metadaten werden als Markdown-Tabelle in der Description gespeichert.
Mögliche Tabellenfelder:
| Feld | Quelle |
|---|---|
| URL | DEVONthink URL-Feld |
| Comment | Finder Comment |
| Kcal | Custom Field |
| Portionen | Custom Field |
| Preis | Custom Field |
| Glasbreite (mm) | Custom Field |
DEVONthink-Dateireste entfernen#
find . -name "DEVONtech_storage" -type f -deleteshellÜbernahme nach TagSpaces#
Dateien kopieren#
Als Ergebnis der Skripte liegen alle Daten im Dateisystem vor und können zu einem Ort kopiert werden, den TagSpaces einlesen soll: TagSpaces-Locations/Notizen.
Einrichtung Location#
In TagSpaces wird anschließend dieser Ordner als Location eingerichtet:

TagSpaces liest dann die Daten ein:

Synchronisierung#
TagSpaces überlässt die Art der Synchronisierung und somit auch Verschlüsselung einem selbst. Vom Sync zweier Rechner im selben WLAN per Syncthing bis zu verschlüsselten Cloud-Services ist jedes Szenario denkbar. In meinem Fall werden die Daten mittels Nextcloud synchronisiert:

Die andere Seite: TagSpaces unter Linux#
Die Schritte sind einfach:
- Nextcloud installieren
- Notizen-Ordner synchronisieren
- TagSpaces downloaden und installieren (.deb)
- Neue Location für den Notizen-Ordner konfigurieren
- Extensions an die passende Stelle im Dateisystem kopieren
Nach einem Neustart liest TagSpaces den Ordner ein, findet die dort enthaltene Tag-Library und auch meine Extensions funktionieren.
