Plainva 0.5.2: Umziehen aus 27 Apps — und ein Import, der ehrlich ist
0.5.0 hat einen Import ausgeliefert. In 0.5.2 habe ich herausgefunden, was der eigentlich getan hat.
Der Bericht, der gelogen hat
Plainvas Import schrieb am Ende jedes Laufs einen Bericht: wie viele Notizen ankamen, was übersprungen wurde, was nur eingeschränkt mitkam. Auf diesen Bericht war ich ziemlich stolz. Er war das, was den Import vertrauenswürdig gemacht hat.
Bei Notion war er falsch.
Der Notion-Import über die API holte Seiten, wandelte Blöcke um, löste Relationen zwischen Datenbanken auf — und verlor dabei still jedes Bild. Nicht „meldete eine Warnung und machte weiter”. Verlor. Und der Bericht sagte anschließend, alles sei angekommen, weil nichts einen Fehler geworfen hatte. Von außen sah der Import aus, als hätte er funktioniert. Die Löcher hättest Du Wochen später gefunden, in einer Notiz, die Du zufällig aufmachst.
Das war die einzige unehrliche Stelle im ganzen System, und sie ist das, was ich in diesem Release am dringendsten loswerden wollte.
Der Entpacker, der nur Text gelesen hat
Dann habe ich gesucht, warum auch bei Datei-Importen keine Anhänge ankamen — und etwas Schlimmeres gefunden.
Plainva entpackte Import-Archive in JavaScript. Dieser Entpacker hatte einen Filter: Er las Einträge, deren Endung nach Text aussah. Markdown, HTML, JSON, CSV. Alles andere übersprang er.
Das heißt: Bei jedem Datei-Import, den Plainva je gemacht hat, konnten Anhänge nicht ankommen. Nicht „schlugen manchmal fehl”. Konnten nicht. Deine Evernote-Bilder, Deine Keep-Fotos, die PDFs in einem Notion-Export — der Code, der sie geschrieben hätte, wurde nie erreicht, weil der Code, der sie hätte lesen sollen, sich weigerte.
Das Entpacken läuft jetzt über Rust: Es streamt, statt ein Archiv im Speicher der Oberfläche zu halten, es hat harte Grenzen, damit eine Zip-Bombe die App nicht umwirft, und es überspringt Symlink-Einträge, statt ihnen irgendwohin zu folgen. Und es liest jeden Eintrag — darum ging es ja die ganze Zeit.
„Alles heute”
Die dritte Sache, die still falsch war: die Datumsangaben.
Jede importierte Notiz bekam den Zeitstempel des Moments, in dem sie auf die Platte geschrieben wurde. Importiere zehn Jahre Evernote, und Du bekommst zehn Jahre Notizen, die alle behaupten, von heute Nachmittag zu sein. „Zuletzt geöffnet” ist wertlos, die Heatmap ist ein einziger Block, und nach Datum zu sortieren sagt gar nichts.
Zeitstempel kommen jetzt aus dem Export. Deine Notiz von 2017 sagt 2017.
Eine Einschränkung, ehrlich gesagt: Notizen, die Du vor diesem Release importiert hast, behalten ihre falschen Daten. Gegen eine Nachbesserung habe ich mich bewusst entschieden — sie müsste raten, aus welchem Import eine Notiz stammt und wo der ursprüngliche Export liegt, und falsch geraten wäre schlimmer als ein falsches Datum. Wenn es Dir wichtig ist: erneut in einen frischen Ordner importieren macht es richtig.
Und ja: 27 Apps
Als die Mechanik saß, wurde das Hinzufügen von Quellen billig. Plainva importiert jetzt aus:
Notion (über die API und aus einem Datei-Export), Evernote, Google Keep, Logseq, Simplenote, einem schlichten Markdown-Ordner — und dann der ganzen Markdown-Familie, die etwas Ähnliches exportiert: Joplin, Bear, Notesnook, Capacities, Amplenote, Supernotes, Heptabase, UpNote, Craft, Anytype. Dazu Standard Notes, die OPML-Outliner (Workflowy, Dynalist), Trilium, Roam, Reflect, TiddlyWiki, Tana, RemNote — und ein HTML-Ordner-Import, der einen Confluence-Bereichsexport liest und die Links zwischen den Seiten so umbiegt, dass sie weiter funktionieren.
Zwei Entscheidungen darin sind ein „Nein”, und beide sollen benannt sein:
Evernotes API stand im Plan, unter der Bedingung, dass ein Entwickler-Token frei verfügbar ist. Ist er nicht — also bleibt es beim ENEX-Dateiweg.
Confluence sollte einen eigenen Adapter bekommen. Sein Speicherformat ist ein XHTML-Dialekt rund um Makros, und ein Bereichsexport braucht Adminrechte — ich hätte das nicht ehrlich testen können. Der HTML-Ordner-Import erledigt dieselbe Aufgabe durch die Tür, die tatsächlich offen steht.
Der Sync, der nicht sagen konnte, was er überträgt
Die andere Hälfte dieses Release begann mit einer Frage, nicht mit einer Fehlermeldung: Was überträgt der Einstellungs-Sync eigentlich? Auf iOS kommt es an, auf Android nicht.
Ich konnte sie nicht beantworten. Nicht „ich musste nachsehen” — es gab keine Stelle im Code, die sagte, was der Sync überträgt. Der Desktop führte eine Liste von 22 Speicher-Schlüsseln. Das Telefon führte zwei von Hand geschriebene Zeichenketten. Ich hatte beide geschrieben, anderthalb Jahre auseinander, und keine wusste von der anderen. Eine Einstellung, die die eine Seite synchronisierte, kam auf der anderen schlicht nie an — und weil sich nirgends etwas als die maßgebliche Liste ausgab, konnte die Lücke auch niemandem auffallen.
Jetzt gibt es einen Katalog. Beide Seiten lesen ihn. Wenn eine Seite kein Feld für einen Eintrag hat, muss sie das begründen — und ein Test wird rot, wenn die Begründung fehlt. Eine kleine Sache, die eine ganze Fehlerklasse unmöglich macht.
Beide Oberflächen sagen außerdem, was der letzte Lauf getan hat, und in welchem der drei stillen Zustände ein Gerät steckt: nicht eingeschaltet, gesperrt, oder kein Anbieter verbunden. Diese drei sahen von außen identisch aus — was heißt: Sie sahen alle nach „kaputt” aus.
Außerdem in diesem Release
Ein Login für ein ganzes Google-Konto. Dateien, Kalender und Aufgaben hielten je eine eigene Kopie des Tokens. Jetzt teilen sie sich eines, über denselben Broker, den Microsoft in 0.5.1 bekommen hat — eine Anmeldung zu erneuern bringt also alle drei zurück statt einer.
Aufgaben auf dem Telefon, richtig. Beide Sektionen, Filter, Befördern, Status-Menü, Wiederholung, Zeit blocken. Dieselbe Liste wie am Schreibtisch, kein Nur-Lesen-Schatten davon.
Mail läuft auf dem iPhone wieder. Das Socket-Plugin war das einzige von fünf ohne CAPBridgedPlugin-Vertrag — iOS konnte es überhaupt nicht sehen. Ein fehlender Vertrag, eine komplett unsichtbare Funktion.
Ein Ordner für Anhänge. Abgelegte, eingefügte und fotografierte Dateien landeten neben der Notiz. Für eine Notiz ist das in Ordnung, für einen Vault unerträglich — Anhänge verstreut über jeden Ordner, der je einen abbekommen hat, und beim Verschieben einer Notiz bleiben sie liegen. Jetzt gibt es einen Ordner, pro Vault einstellbar, und Telefon und Desktop sind sich einig.
Der letzte Punkt ändert, wo neue Dateien in bestehenden Vaults landen. Absichtlich, und ohne Migration: Alles, was schon abgelegt ist, bleibt genau da und funktioniert weiter. Wer es lieber wie vorher hat, leert die Einstellung und hat es zurück.
Was nicht behoben ist
Der verschlüsselte Workspace ist weiterhin als experimentell gekennzeichnet, und das bleibt so, bis jemand, der nicht ich ist, die Kryptographie geprüft hat. Windows-Builds sind weiterhin unsigniert — das Zertifikat ist eine Kostenfrage, keine technische. Und das Handbuch sagt jetzt klar, dass Plainva Google-Tokens nicht im Hintergrund erneuert: Im Consent-Status „Testing” verfallen sie mit ihm. Das hatte ich in zehn Sprachen falsch beschrieben.