Angefangen hat alles mit einem Party-Ticket. Ich habe es gekauft, es landete als PDF in meinem Postfach, und ich tat, was ich immer tue: Ich wollte es in Apple Wallet bekommen. Ich bin der Typ, der dort alles ablegt. Zweimal die Seitentaste drücken, und es ist alles einfach da, auf dem Sperrbildschirm, genau dann, wenn ich es brauche. Ein PDF, das vier Ebenen tief in meiner Mail vergraben ist, kann das nicht.
Also suchte ich nach einer App, die das PDF in einen Wallet-Pass verwandelt. Ein paar gibt es. Die meisten wollten mein Ticket erst auf irgendeinen Server hochladen, und das Ergebnis war am Ende meist ein bisschen fragwürdig: technisch ein Pass, aber die Felder füllten sich nicht von selbst, und die Server wirkten zwielichtig. Das nagte ungefähr einen Monat an mir. Dann machte es klick: Ich lernte in dem Semester ohnehin gerade, iOS-Apps zu bauen. Statt über die Werkzeuge zu meckern, konnte ich das doch auch einfach selbst ordentlich hinkriegen. NeatPass ist das, was dabei herauskam, und das hier ist die Geschichte vom Bauen.
Was mich wirklich gestört hat
Stell dir den typischen Konverter vor. Eine Seite, die irgendwie „ticket2wallet.irgendwas" heißt, zehn Werbeanzeigen an den Rändern und in der Mitte ein kleiner Upload-Button. Mein Uni-Party-Ticket war harmlos genug, das klaut niemand. Aber sobald man sich vorstellt, ein echtes Konzertticket hochzuladen, wird die Frage unangenehm. Wo geht diese Datei hin? Was wird gespeichert? Was passiert damit? Man gibt einem Fremden eine Datei und hofft auf das Beste.
Denn Tickets sind nicht nur ein Barcode. Auf ihnen stehen dein Name, manchmal deine Adresse, Rechnungsdetails, eine Bestellnummer und ein aktiver QR-Code, der praktisch der eigentliche Wert ist. Ein weiterverkauftes Taylor-Swift-Ticket geht für Hunderte Euro weg. Wirfst du so etwas in eine beliebige Upload-Box, vertraust du demjenigen, der die Box betreibt, ziemlich viel an. Das hat mich so gestört, dass es zum eigentlichen Designprinzip der App wurde. Ich will deine Daten ehrlich nicht haben. Der sauberste Weg, das zu versprechen, ist keine Datenschutzerklärung, sondern etwas zu bauen, das deine Daten erst gar nicht bekommt. Was man nie hatte, kann man nicht verlieren.
Es selbst bauen
Das Ziel war fast peinlich einfach zu beschreiben: Ein Screenshot oder ein PDF geht rein, ein richtiger Apple-Wallet-Pass kommt raus, und das Ganze dauert etwa zwanzig Sekunden. Kein Account. Kein Login. Keine E-Mail. Kein Upload-Schritt, der dein Ticket heimlich irgendwohin schickt. Genau diese letzte Vorgabe ist die, um die sich alles andere biegen musste, und sie hat aus einer Wochenend-Idee ein deutlich interessanteres Engineering-Problem gemacht.
Denn das Schwierige ist, dass ein Ticket wie alles Mögliche aussehen kann. Ein Bahn-PDF, ein Konzert-QR, ein Nahverkehrsticket, eine Mitgliedskarte, eine Hotelbuchung, eine Bordkarte. Jeder Anbieter ordnet seine Informationen anders an, das Datum an einer anderen Stelle, der Sitzplatz in einem anderen Format, der Barcode in einer anderen Ecke. Etwas muss jedes einzelne lesen, den Barcode, das Datum, die Uhrzeit, den Sitzplatz und den Ort finden und sich nicht verwirren lassen. Genau das ohne Server hinzubekommen, ist der Ursprung der beiden interessantesten Entscheidungen im Projekt.
Was zwanzig Sekunden wirklich tun

Von außen soll es sich anfühlen, als wäre nichts passiert. Du teilst einen unaufgeräumten Screenshot aus Mail, Dateien, Safari oder Gmail, machst ein Foto oder fügst aus der Zwischenablage ein, und ein sauberer Pass erscheint. Unter dieser ruhigen Oberfläche läuft ein paar Schritte hintereinander ab, alles auf dem Telefon:
- Den Code finden. NeatPass erkennt und decodiert den Barcode aus einem verrauschten Bild: QR, PDF417 für Airlines, Aztec, Code 128, Data Matrix und ein Dutzend weiterer Formate, und es bewahrt die exakten Code-Daten, damit der Scanner am Einlass sie genauso liest wie das Original.
- Den Rest lesen. Das Modell auf dem Gerät zieht Titel, Datum und Uhrzeit, Sitzplatz, Ort und alles andere heraus, was tatsächlich auf dem Ticket steht, und wählt dann den richtigen Pass-Typ: Event, Bordkarte oder Bonuskarte.
- Den Pass bauen. Es setzt einen echten Apple-Wallet-Pass zusammen, bewahrt dein ursprüngliches PDF oder Bild daneben auf, falls du je das Original brauchst, und legt das Ergebnis in Wallet ab, sodass es auf dem Sperrbildschirm auftaucht, wenn du ankommst.
Zwanzig Sekunden sind kein langsamer Code, sie sind der Preis dafür, das Nachdenken lokal zu erledigen statt ein Rechenzentrum zu mieten. Ich warte lieber zwanzig Sekunden, als mein Ticket das Telefon verlassen zu lassen, und die meisten, mit denen ich geredet habe, treffen dieselbe Entscheidung, sobald sie verstehen, was sie dafür bekommen.
Ein Gehirn, das auf deinem Telefon wohnt
Der naheliegende Weg auf einem modernen iPhone ist, sich auf Apple Intelligence zu stützen, die Systemmodelle, die Apple auf neueren Geräten mitliefert. Ich habe mich aus zwei Gründen dagegen entschieden. Die Performance war für genau diese Extraktionsaufgabe nicht ganz da, wo ich sie haben wollte, und es läuft nur auf der neuesten Hardware. Ich besitze nicht einmal ein Telefon, das es unterstützt, und ich wollte meine eigene App nutzen können. Also suchte ich einen Weg drumherum.
Gelandet bin ich bei einem kleinen offenen Sprachmodell, Qwen, das ich in der App laufen lasse und in viel sorgfältiges Drumherum verpackt habe, damit es genau die Felder in genau der Form zurückgibt, die ich will. Die Weights, das Gehirn, kommen mit der App: ungefähr ein Gigabyte Download. Nichts ist irgendwo gehostet. Es läuft komplett auf deinem Telefon über Apples MLX-Framework, auf der GPU über Metal, vollständig offline. Das Ticket verlässt das Gerät nie, weil es nirgendwo hingehen kann.
Hinter „in Drumherum verpackt" steckt echte Theorie. Ein Sprachmodell sieht dein Ticket nicht so wie du; es sieht Tokens. Ihm beizubringen, zuverlässig sauberen, strukturierten Output auszugeben statt eines geschwätzigen Absatzes, ist eine ganze Menge Arbeit an den Rändern. Mein eigenes Modell mitzuliefern, statt ein universelles aufzurufen, erlaubt mir außerdem, es auf diese eine Aufgabe zu trimmen. Genau deshalb kann ein Ein-Gigabyte-Modell auf einem Telefon einen viel größeren Allzweck-Assistenten beim Lesen einer Bordkarte schlagen.
Das ist der Tausch für das Datenschutzversprechen. Die App ist groß für das, was sie ist, weil sie ihre eigene Intelligenz mitbringt, statt sich fremde Intelligenz aus der Cloud zu leihen. Dafür funktioniert die Erkennung im Flugzeug, im Tunnel, mit Flugmodus an, und auf deutlich mehr iPhones, als es der Apple-Intelligence-Weg je erreichen würde. Für ein Werkzeug, dessen ganzer Pitch ist, dass deine Dokumente bleiben, wo sie sind, fühlte sich das Gehirn mitzutragen genau nach dem richtigen Zusatzgewicht an.
Einen Pass signieren, ohne ihn je zu sehen
Hier ist das Rätsel, das das Datenschutzversprechen echt gemacht hat statt nur Marketing. Apple Wallet akzeptiert nicht einfach jede Datei. Ein Pass muss kryptografisch signiert sein, und der einfache Weg ist, den ganzen Pass an einen Server zu schicken, dort zu signieren und zurückzuschicken. Genau das ist der Upload-Schritt, den ich loswerden wollte. Wie also signiert man etwas, ohne zu sehen, was drinsteht? Es klingt nach einem Widerspruch.
Ist es aber nicht, und der Trick steckt im Format selbst. Ein .pkpass ist eigentlich nur ein Zip-Ordner aus Dateien: die Passdaten, die Icons, die Logos. Darin liegt ein manifest.json, das jede Datei zusammen mit einem SHA-Hash ihres Inhalts auflistet. Entscheidend: Apple verlangt nur, dass man das Manifest signiert, sonst nichts. Ein Hash ist eine Einwegfunktion, also ist das Manifest nur eine Spalte aus Fingerabdrücken ohne Weg zurück zu den Originalen:
Diese Liste ist alles, was mein Server je zu sehen bekommt. Eine Handvoll Hashes, keine Dateinamen, nicht einmal Dateigrößen, schon gar nicht dein Name oder dein Barcode. Der Server signiert das Manifest mit einem Entwicklerzertifikat, das ich bei Apple angefordert habe, gibt die Signatur zurück und wirft die Hashes weg. Der fertige Pass wird auf deinem Telefon zusammengebaut. Außer man besitzt ein paar Quantenrechner, dreht niemand diese Hashes zurück in dein Ticket. Was mich ehrlich wundert, ist, wie wenige Apps so arbeiten, denn es ist genau der Ablauf, den Apple in der eigenen Dokumentation beschreibt. Meine beste Vermutung: Manche wollen die Daten, und manche haben schlicht nie gemerkt, dass es blind geht.
Den Signierer daran hindern, eine Spam-Kanone zu werden
Blindes Signieren erkauft Datenschutz, aber es öffnet eine andere Tür. Eine Signatur sagt nichts über den Inhalt. Wenn ein Server jedes Manifest signiert, das man ihm reicht, könnte im Prinzip jeder damit Pässe signieren, nach denen niemand gefragt hat. Wallet-Pässe können sich über das Netz aktualisieren und auf den Standort reagieren, also könnte ein bösartiger Pass etwa merken, dass du am Flughafen angekommen bist, und dir Spam schicken. Ein Signier-Endpunkt, der alles signiert, ist eine verlockende kleine Kanone, die man auf die Sperrbildschirme anderer Leute richten kann.
Die eigentliche Arbeit war also nicht das Signieren selbst, sondern sicherzustellen, dass nur meine tatsächliche App eine Signatur anfordern kann. Apple gibt Entwicklern genau dafür Werkzeuge: App-Attestierung, eine Möglichkeit für den Server, einen kryptografischen Nachweis zu verlangen, dass eine Anfrage von einer echten, unveränderten Kopie von NeatPass auf einem echten Gerät kommt und nicht von einem Skript, das jemand auf den Endpunkt gerichtet hat. Der Server signiert Hashes, die er nicht lesen kann, aber nur für Aufrufer, von denen er beweisen kann, dass sie die App sind.
Ich tue nicht so, als hätte ich jede Kante davon beim ersten Versuch richtig getroffen; herauszufinden, wie man Missbrauch blockiert, ohne je zu erfahren, was signiert wird, war mit Abstand der fummeligste Teil des ganzen Projekts. Aber es ist der Teil, auf den ich am leisesten stolz bin, denn er ist der Unterschied zwischen einem cleveren Datenschutz-Trick und etwas, das ich ruhigen Gewissens laufen lasse, während Fremde Tickets darauf werfen.
Wenn das Modell anfängt zu fantasieren
Ich tue nicht so, als wäre es perfekt. Ein On-Device-Modell ist notgedrungen klein, und kleine Modelle tun eine sehr spezielle, sehr menschliche Sache: Wenn sie etwas nicht wissen, erfinden sie selbstbewusst. Ich habe von Fällen gehört: Ein Ticket für ein Konzert in Mazedonien kam als Coldplay-Show in London zurück. Jemand scannte ein Ticket der Fantastischen Vier für die Olympiahalle, und die App bestand auf der Kleinen Olympiahalle, einer kleineren Halle, die die Band nie spielen würde, ein Wort, das nirgends auf dem Ticket steht.
Das sind die lustigen Fehler, und es sind ehrliche. Das Modell verliert den Faden, tut dann so, als wüsste es Bescheid, und füllt die Lücke mit etwas Plausiblem. Ganz wegtrainieren kann man das auf einem Telefon nicht, denn ein Modell zu trainieren braucht viel mehr Rechenleistung, als es zu fragen, und das passiert nicht auf deinem Gerät, während du an der Sperre wartest. Ein Beta-Tester scherzte, aus seinem Lokalkonzert eine Londoner Stadionshow zu machen, sei ein Upgrade. Er hat nicht unrecht, aber falsch ist es trotzdem.
Also sind die Lösungen pragmatisch. Mehr Fine-Tuning, gegen einen großen Stapel synthetischer Tickets, die ich gezielt erzeuge, um die Genauigkeit nach oben zu drücken. Und Leitplanken um das Modell herum statt darin: Wenn es „London" schreibt, das Wort London aber nirgends im Ticket vorkommt, markiere es und bitte dich, noch einmal nachzusehen. Das Ziel ist kein Modell, das nie falsch liegt. Es ist eine App, die merkt, wenn sie es wahrscheinlich ist, und die Entscheidung an dich zurückgibt, statt still Erfundenes auf deinen Sperrbildschirm zu schicken.
Damit an die Öffentlichkeit
Als ich etwas Vorzeigbares hatte, postete ich darüber auf Threads. Das Erste, was ich dort je gepostet habe. Ich dachte, ich teste es dort, bevor ich es auch auf X teile. Zwei Tage später hatte dieser Post um die fünfundzwanzigtausend Aufrufe, und die Kommentare kamen schneller rein, als ich antworten konnte. Das hat mich ehrlich überrascht. Offenbar hatten sich viele Leute still über genau dasselbe PDF-Problem geärgert wie ich.
Die Beta lief über TestFlight, Apples System, um Apps vor dem App Store zu verteilen, und das war der beste Teil am Bauen. Leute werfen Tickets hinein, die ich selbst nie hätte sammeln können, von Verkehrsverbünden und Veranstaltungsorten, von denen ich nie gehört habe, in Formaten, die zu testen mir nie eingefallen wäre. Mein Lieblingsbericht aus der Praxis: Jemand fügte ein ganz normales Bahn-Ticket zu NeatPass hinzu, und die App machte daraus einen Wallet-Pass, kein offizielles Bahn-Design, nichts, was ein Schaffner je gesehen hatte. Er hielt den Pass im Zug hoch, und er wurde einfach gescannt. Der Schaffner zuckte nicht mit der Wimper. Es funktionierte ohne Probleme.
Die Feature-Wünsche sortierten sich in zwei klare Stapel, und beide stehen auf der Roadmap:
- Anpassung. Eigenes Logo hochladen, das Banner-Bild zuschneiden und wählen, ob ein Code als QR oder als Barcode dargestellt wird, statt es der App zu überlassen.
- Mehrere Tickets in einem PDF. Familientickets packen oft vier Pässe in eine einzige Datei. Heute schnappt sich die App das erste. Sie sollte alle vier sehen und alle vier erstellen, nebeneinander, so wie zwei Flüge an einem Tag in Wallet nebeneinanderliegen.
Einmal zahlen, für immer deins
Das Geschäftsmodell war eine leichte Entscheidung, weil ich wusste, was ich nicht wollte. Kein Abo. Nicht für ein Werkzeug, das komplett auf deinem eigenen Telefon läuft und mich fast nichts kostet, sobald du es hast. Du bekommst einen Pass gratis, um zu entscheiden, ob es dir gefällt, und danach ist es eine einmalige Zahlung, etwa 4,99 Euro, einmal. Danach bekommst du jedes Update, so lange Apple existiert oder ich, je nachdem, wer zuerst aufgibt.
Das offensichtliche Risiko war immer, dass Apple sich das ansieht, es für eine gute Idee hält und es direkt ins System einbaut. Auf der WWDC 2026 haben sie genau das getan: iOS 27 bekommt in Wallet einen Button „Pass erstellen", der einen Pass aus einer Vorlage baut oder einen Code mit der Kamera scannt. Damit habe ich meinen Frieden gemacht, und ehrlich gesagt bestätigt es die Idee. Aber Apples Variante funktioniert nur mit der Kamera live auf einem Code und nur auf neueren Geräten, nicht aus einem PDF oder Screenshot, während NeatPass ein unaufgeräumtes PDF oder einen Screenshot komplett liest und den Pass für dich ausfüllt. Apple absorbiert manchmal Funktionen, aber ein gesunder App Store voller bezahlter Apps ist auch Teil davon, wie Apple Geld verdient, und die Leute sind klar bereit, für eine kleine Sache zu zahlen, die einfach funktioniert. So oder so baue ich lieber das, was die Leute wollten, als herumzusitzen und zu raten, ob ich es überhaupt darf.
Rückblick
NeatPass begann als ein einmonatiges Jucken wegen eines Party-Tickets und wurde zum Projekt, das mir beigebracht hat, wie man wirklich abliefert. Nicht nur Code schreiben, sondern Entscheidungen über Datenschutz, Performance, Preis und, am schwersten, darüber treffen, wozu man Nein sagt. Die eine Vorgabe, dass alles auf dem Gerät laufen muss, hat jede dieser Entscheidungen geprägt, vom mitgelieferten Modell über das blinde Signieren bis zur Attestierung, und ich finde, die App ist dadurch schärfer.
Während ich das schreibe, ist sie weit über alles hinausgewachsen, was ich erwartet hatte: mehr als 21.000 Menschen nutzen sie, über 300.000 Pässe wurden erstellt, eine 4,5-Sterne-Bewertung aus 184 Bewertungen, ein Feature in Apples „Apps We Love" und ein Stapel Berichterstattung in der deutschen Tech-Presse. Wenn du die längere Geschichte eines seltsamen Nachmittags willst, den das hervorgebracht hat: Ich habe aufgeschrieben, wie es mich in einen Security-Podcast gebracht hat, und über den sich selbst pflegenden Datensatz, den ich gebaut habe, um eine seiner langweiligsten wiederkehrenden Fragen zu beantworten.
Was als Nächstes kommt, ist weniger ein großer Plan als ein Geschmack. Ich mag Apps, die sich anfühlen, als hätte Apple sie machen können, die auf deinem Telefon sitzen, als wären sie immer dafür gedacht gewesen, statt nur drangeschraubt. Davon wird es mehr geben. Wenn du diese hier sehen willst, sie wohnt unter neatpass.app und im App Store.

