Dokumente scannen, ohne sie hochzuladen

Reisepässe, Verträge, Gehaltsabrechnungen, Arztbriefe. Genau die Dokumente, die sich am ehesten zu scannen lohnen, gibt man am wenigsten gern auf den Server eines Fremden. ScanPDF ist so gebaut, dass dieses Weggeben nicht Teil der Abmachung ist.

Was ein üblicher Online-Konverter tut

Die typische „Foto zu PDF“-Seite ist ein Webformular vor einem Server. Ihre Datei wird hochgeladen, irgendwo umgewandelt, wo Sie es nicht sehen können, und als Download zurückgegeben. Irgendwo in den Bedingungen steht das Versprechen, sie nach einer Stunde oder einem Tag zu löschen.

Dieses Versprechen mag durchaus gehalten werden. Aber es ist ein Versprechen und kein Mechanismus, und es deckt die Teile nicht ab, von denen nie die Rede war: über wie viele Maschinen die Datei lief, was protokolliert wurde, welcher Unterauftragsverarbeiter das Backup aufbewahrte oder was ein künftiger Sicherheitsvorfall offenlegt. Für ein Ausweisdokument oder einen unterschriebenen Vertrag lautet die ehrliche Risikoeinschätzung: Sobald der Upload durch ist, liegt der Ausgang nicht mehr bei Ihnen.

Was ScanPDF stattdessen tut

Es gibt keinen Upload-Schritt, weil es nichts zum Hochladen gibt. ScanPDF ist eine statische Seite. Ihr Browser liest das Foto von der Festplatte, und alles danach passiert im Tab:

  • Die Kantenerkennung läuft auf einem WebAssembly-Build von OpenCV, ausgeführt auf Ihrer CPU.
  • Perspektivkorrektur und Filter werden im Arbeitsspeicher auf das Bild in voller Auflösung angewendet.
  • Das PDF entsteht lokal mit pdf-lib und wird dem Browser als ganz normaler Download übergeben.

Keine Anfrage transportiert Ihre Bilddaten, weil es eine solche Anfrage im Code nicht gibt. Das Ganze funktioniert mit gezogenem Netzwerkkabel, sobald die Anwendung geladen ist. Auch Fotos, die Sie aus einer anderen App über Teilen und dann ScanPDF schicken, werden auf dem Gerät übergeben: Der Service Worker der Anwendung beantwortet diese Anfrage selbst, übertragen wird nichts. Einen Grenzfall sollten Sie kennen: Wenn Sie die Websitedaten löschen, während die App unter Android noch installiert ist, gibt es auf dem Gerät nichts mehr, was das nächste Teilen entgegennimmt; der Browser schickt diese Fotos dann an den Webhost, der sie nicht annimmt. Öffnen Sie die App nach dem Löschen der Daten einmal, und das Teilen bleibt wieder auf dem Gerät.

Überprüfbar, nicht nur behauptet

Eine Datenschutzaussage, die man nicht nachprüfen kann, ist wenig wert, deshalb ist diese hier auf drei Wegen überprüfbar angelegt.

  • Sehen Sie selbst nach. Öffnen Sie die Entwicklerwerkzeuge Ihres Browsers, wechseln Sie auf den Netzwerk-Tab und scannen Sie ein Dokument. Nachdem die Dateien der Anwendung geladen sind, wird nichts weiter gesendet.
  • Lesen Sie den Quellcode. Die gesamte Anwendung steht unter MIT-Lizenz auf GitHub - ein paar hundert Zeilen schlichte JavaScript-Module ohne Build-Schritt, der etwas verschleiern könnte, und zwei über URL und SHA-256 festgenagelte Abhängigkeiten.
  • Lassen Sie es den Browser erzwingen. Der selbst gehostete Container bringt eine strikte Content-Security-Policy mit, die Verbindungen auf den eigenen Ursprung beschränkt. Damit wird eine versehentliche Anfrage an einen fremden Host vom Browser blockiert und ist nicht nur zufällig im Code nicht vorhanden.

Die gehostete Demo gegenüber Selbst-Hosting

Hier lohnt sich Genauigkeit, weil die meisten Seiten sie vermissen lassen.

Die Demo auf scanpdf.io ist derselbe Code, ausgeliefert über GitHub Pages. Auch dort läuft die Verarbeitung vollständig clientseitig, und Ihre Dokumente verlassen den Rechner weiterhin nicht. Der Unterschied liegt darin, wer die Antwort-Header kontrolliert: Bei GitHub Pages ist das GitHub, weshalb die strikte CSP aus der nginx-Konfiguration des Projekts dort nicht greift. GitHub sieht außerdem die ganz gewöhnliche Webserver-Anfrage nach der Seite selbst, wie jeder Hoster das täte.

Wenn Sie die Garantie vom Browser erzwungen haben möchten, statt sich darauf zu verlassen, dass der Code das tut, was er sagt, betreiben Sie ihn selbst. Ein Befehl startet den Container, und zur Laufzeit braucht er überhaupt keinen Netzzugang.

Kein Konto, keine Telemetrie, keine Cookies

Es gibt nichts, wofür man sich anmelden müsste, also liegt auch keine E-Mail-Adresse vor. Es gibt kein Analyse-Skript, kein Tracking-Pixel, keinen Fehlerberichtsdienst und kein A/B-Test-Framework. Die Anwendung setzt keine Cookies. Auf Ihrem Gerät behält sie nur Ihre Oberflächeneinstellungen wie Farbschema und Seitenformat, eine Kopie ihrer eigenen Dateien, damit sie sich offline öffnet, und für einen Moment Fotos, die aus einer anderen App geteilt wurden; diese werden gelöscht, sobald sich der Scanner öffnet. Ihre Seiten existieren nur im Arbeitsspeicher; laden Sie die Seite neu, und von der Sitzung ist keine Spur mehr da.

Das ist weniger eine Richtlinie als eine Architektur. Eine statische Seite ohne Backend hat schlicht keinen Ort, an dem sie die Daten ablegen könnte, die sie zum Missbrauch bräuchte.

Ausprobieren

Öffnen Sie den Scanner und legen Sie ein Dokument hinein, das Sie nirgendwo hochgeladen hätten. Genau darum geht es. Wenn Sie Papier zum ersten Mal abfotografieren, zeigt die Scan-Anleitung, wie das Ergebnis gleich beim ersten Versuch sauber wird.