Tap to Play!

Back

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#

  1. 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.
  2. 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 DrawOnlyOffice Presentation
PlattformmacOS + Linux ✓macOS + Linux ✓
Dateiformat.odg (ODF).pptx (OOXML)
Bild in Hintergrund
Tabellen frei platzierbar
Open Source
UI-Modernitätklassischmoderner

Migration#

Wie üblich: Claude Code entwickelt alles.

Umwandlung von Tags und Labels#

./1-devonthink-export-tags.sh "Datenbankname"
bash

Liest 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

Screenshot 2026-03-09 at 17.06.13

CSV-Spalten#

SpalteBeschreibung
gruppenpfadOrdnerstruktur aus DEVONthink, führender /
aktueller_dateinameDateiname aus dem DEVONthink-Pfad
duplikatnein oder ja (Nx) bei mehrfach vorkommenden Namen
neuer_dateinameGenerierter Name mit Tags in eckigen Klammern
schlagworteKommagetrennte Liste aller Tags
unicode_zeichenLänge des neuen Namens in Unicode-Zeichen
utf8_bytesLänge des neuen Namens in UTF-8-Bytes
macos_gueltigja/nein — gültig unter macOS (APFS)
macos_bemerkungBegründung bei Ungültigkeit
ext4_gueltigja/nein — gültig unter Linux (ext4)
ext4_bemerkungBegründung bei Ungültigkeit
urlURL aus DEVONthink
finder_commentFinder Comment
kcalCustom Field
portionenCustom Field
preisCustom Field
glasbreite_mmCustom 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/startverzeichnis
bash

Prü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/startverzeichnis
bash

Benennt 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/startverzeichnis
bash

Lö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.

Screenshot 2026-03-09 at 18.19.25

python3 5-create-sidecars.py devonthink-Datenbankname.csv /pfad/zum/startverzeichnis
bash

Erstellt 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:

FeldQuelle
URLDEVONthink URL-Feld
CommentFinder Comment
KcalCustom Field
PortionenCustom Field
PreisCustom Field
Glasbreite (mm)Custom Field

DEVONthink-Dateireste entfernen#

find . -name "DEVONtech_storage" -type f -delete
shell

Ü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:

Location-Dialog

TagSpaces liest dann die Daten ein:

Notizen-Datenbank in TagSpaces mit Ordner-Baum, Dateiansicht, Metadaten und Dateiinhalt einer Markdown-Datei

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:

Konfiguration vom Nextcloud-Sync

Die andere Seite: TagSpaces unter Linux#

Die Schritte sind einfach:

  1. Nextcloud installieren
  2. Notizen-Ordner synchronisieren
  3. TagSpaces downloaden und installieren (.deb)
  4. Neue Location für den Notizen-Ordner konfigurieren
  5. 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.

TagSpaces unter Linux