Eine KI-App ohne Server, ohne Konto, und nichts verlässt das Telefon
Ein Samstag im Familienkalender: „Piscine 10h avec Tom“. Am selben Abend bekommt das Kind ein französisches Diktat über den Schwimmbadausflug mit Tom, auf seinem Niveau geschrieben, das die Kongruenzregel übt, die es letzte Woche falsch hatte.
Nichts von diesem Samstag verlässt das Telefon. Nicht der Kalendereintrag, nicht der Vorname des Kindes, nicht seine Fehler. Es gibt kein Konto anzulegen, keinen Server anzurufen, keine Statistik. Schalten Sie das Gerät in den Flugmodus, und die App verhält sich genau wie eine Minute zuvor.
Die App heißt Dictée Ludique. Ich habe sie geschrieben, sie steht im App Store, und sie ist die klarste Antwort, die ich auf eine Frage habe, die Kunden mir inzwischen fast jede Woche stellen: Können wir den KI-Teil machen, ohne die Daten unserer Nutzer irgendwohin zu schicken?
Auf Apple-Hardware lautet die Antwort ja, und es gibt sie heute. Der Rest hier ist, was dafür nötig war, was es mich gekostet hat, und was iOS 27 im September ändert.
Warum nicht einfach einen Chatbot fragen
Das ist die naheliegende Frage, und aus ihr ist die ganze App entstanden.
Ich habe angefangen wie jeder. Ich habe einen Chatbot gebeten, ein Diktat für ein neunjähriges Kind zu schreiben, und er hat eines geschrieben. Sogar ein ordentliches.
Dann habe ich es in der Woche darauf wieder getan und gesehen, was ich wirklich hatte. Ein Chatbot gibt Ihnen einen Text. Er gibt Ihnen kein System. Er weiß nicht, dass dieses Kind die Kongruenz des Partizips im November sicher hatte und sie bis Januar verloren hatte, dass Homophone noch kein einziges Mal geprüft wurden, oder dass die letzten drei Texte alle vom selben Urlaub handelten. Das alles trug ich selbst und tippte es in jeden Prompt neu ein. Das Schreiben war kostenlos. Die Buchführung war die ganze Arbeit.
Was ich wollte, war die Mechanik um das Schreiben herum. Fünfzehn Rechtschreibkompetenzen aus dem Lehrplan, pro Kind verfolgt, jede auf beherrscht, in Arbeit, wackelig oder noch nicht gesehen. Ein Korrekturschritt nach jedem Diktat, der diese Zustände bewegt und die Eltern etwa fünfzehn Sekunden kostet. Dann ein nächster Text, der zuerst auf das Wackelige zielt und danach auf das, was noch nicht vorkam, mit Länge und Dichte nach dem letzten Ergebnis, und ohne eine einzige Einstellung, die jemand konfigurieren müsste.
Es musste sich außerdem wie ein Spiel anfühlen, das ist die andere Hälfte des Namens. Nicht Punkte und Abzeichen. Es gibt bewusst nirgendwo in der App eine Gesamtnote, denn ein Durchschnitt über fünfzehn Kompetenzen bedeutet nichts und wäre die eine Zahl, die ein Kind sich merkt. Das Spiel besteht darin, dass das Kind drei Karten bekommt und eine auswählt, und dass der Text von seinem eigenen Samstag handelt statt von dem eines Fremden. Ein Kind schreibt anders, wenn das Diktat von seinem Geburtstag handelt und nicht von der Katze des Nachbarn.
Die Generierung stellte sich als der kleine Teil heraus. Die Schleife darum herum ist die App, und sie hat alles Weitere entschieden.
Warum die Cloud nie zur Debatte stand
Es gibt einen regulatorischen Grund, und es gibt den, den ich wirklich hatte.
Der regulatorische ist gewöhnlich. Das ist eine Kinder-App, die in Europa verkauft wird, also kommen die Datenschutzfragen mit den ersten Eltern, die den Datenschutzbildschirm öffnen, nicht nach einer Finanzierungsrunde. Nichts zu sammeln heißt, nichts anzugeben, nichts zu verlieren und nichts zu erklären.
Der Grund, der es wirklich entschieden hat: Die App liest einen Familienkalender. Das ist die intimste Datei auf einem Telefon. Darin stehen Krankenhaustermine, Übergaben beim Sorgerecht, Vorstellungsgespräche, die Woche, in der jemand ausgezogen ist. Ich wollte von dort keine Leitung in ein Rechenzentrum bauen, das mir nicht gehört, und keine Datenschutzerklärung, die ich hätte schreiben können, hätte mich damit ruhig schlafen lassen.
Die Einschränkung kam also zuerst, und die Architektur musste damit leben.
Der Kalender wird gefiltert, bevor das Modell ihn sieht
Das ist der Teil, den alle für die Aufgabe der KI halten. Er ist es nicht.
Ein roher Ereignistitel erreicht das Modell nie. Was es erreicht, ist eine kanonische Nominalphrase aus einer geschlossenen Liste von dreiundsiebzig erkannten Formen. Aus „Piscine 10h avec Tom“ wird „la sortie piscine“. Aus „Anniv de Tom“ wird „l’anniversaire de Tom“, und dieser Vorname, von einem bewusst engen Muster erfasst, ist der einzige freie Text in der ganzen Kette.
Verglichen wird an Wortgrenzen, was pedantisch klingt, bis man sieht, was es verhindert. „ski“ darf nicht bei „Kandinsky“ anspringen. „colo“, die französische Kurzform für ein Ferienlager, darf nicht bei „coloscopie“ anspringen. Die längste Form gewinnt, also schlägt „sortie scolaire“ das bloße „sortie“.
Eine zweite Liste aus zweiundsechzig Wörtern disqualifiziert das ganze Ereignis sofort: Krankenhaus, Beerdigung, Scheidung, Arbeitslosigkeit, Gefängnis, und der Rest der Register, von denen ein Familienkalender voll ist. „Anniversaire de mamie à l’hôpital“ ist kein verwendbarer Geburtstag, auch wenn das Wort Geburtstag genau dort steht.
Was die Liste nicht erkennt, behält gar keinen Namen. Es erscheint auf dem Elternbildschirm als Vorschlag ohne Etikett und kann nicht verwendet werden, bevor die Eltern selbst einen Namen dafür eintippen. Einmal abgelehnt, wird es nie wieder vorgeschlagen.
Das Lesefenster ist absichtlich asymmetrisch: zwei Jahre zurück für einmalige Ereignisse, zwei Wochen nach vorn, und nur eine Woche zurück für alles, was sich wiederholt. Ein Kind erinnert sich jahrelang an eine Reise. Eine Judostunde von vor achtzehn Monaten ist Rauschen.
Das alles ist gewöhnliches Swift. Es ist deterministisch, es ist von Tests abgedeckt, und es ist der Teil, der die eigentliche Datenschutzarbeit leistet. Das Modell ist der letzte Schritt, nicht der erste.
Das Modell schreibt den Text und sonst nichts
Die Generierung läuft auf Apples Modell auf dem Gerät über das Foundation Models Framework, das mit iOS 26 kam. Die Ausgabe ist geführt: eine @Generable-Struktur mit einem kurzen Titel und einem Array von Sätzen, gedeckelt bei zwölf.
Sätze als Array statt als ein Block Prosa, denn das Modell hält eine Ziellänge deutlich besser, wenn es die Sätze selbst zählt.
Das Modell wird nie gefragt, wo die Rechtschreibfallen liegen. Das ist die Aufgabe eines deterministischen Analysators mit eigenen Tests. Ein Modell, das seine eigene Ausgabe annotiert, liegt gelegentlich falsch, ohne dass es jemand merkt, und das ist schlimmer als lautstark falsch zu liegen.
Es sieht auch keine Vorlage. Die handgeschriebene Bibliothek muss jedem Kind dienen, also trägt sie Platzhalter und eine Kongruenzmechanik. Hier kennt die App den Vornamen und sein grammatisches Geschlecht bereits, also verlangt sie „Léa est partie“ statt „{ENFANT} est parti{E_ENFANT}“. Eine ganze Fehlerklasse verschwindet.
Kein generierter Text bekommt einen Freifahrtschein
Jeder generierte Text durchläuft dieselbe siebenstufige Validierung wie die handgeschriebene Bibliothek: auf das Schulniveau abgestimmter Wortschatz, erlaubte Zeitformen, Satzlänge, verbotene Register, die Kompetenzen, die das Kind üben soll, sein eigener Vorname, und der tatsächlich erwähnte Kalendermoment.
Ein generierter Text hat kein Vorrecht gegenüber einem von Menschen geprüften Text. Er hat sogar etwas weniger, weil er eine Obergrenze brauchte, die die Bibliothek nie nötig hatte.
Wenn fünf Versuche scheitern, liefert die App einen Text aus der Bibliothek und sagt nichts. Das Kind erfährt nie, dass das Modell eine schlechte Minute hatte.
Was das Modell auf dem Gerät mich wirklich gekostet hat
Dieser Teil steht in keiner WWDC-Session, hier also die Zahlen aus den Protokollen meines eigenen Geräts.
- Eine Generierung lief 48,9 Sekunden davon, bevor sie an „Exceeded model context window size“ starb. Die vier anderen Versuche mit identischen Anweisungen kamen in 2 bis 3,5 Sekunden zurück. Die Eingabe war nie das Problem. Die Ausgabe hörte nicht auf. Daher kommt die Grenze von zwölf Sätzen.
- Der erste Entwurf hat regelmäßig ein Drittel der verlangten Länge. In einer Sitzung gemessen: 29 Wörter, dann 184, dann 34, bei einer Anweisung, die 55 bis 75 verlangte. Die Temperatur zu erhöhen schüttelt nur den Zufall. Dem Modell in klarem Französisch zu sagen, was es gerade verfehlt hat, funktioniert. Die Wiederholungsschleife schickt deshalb jetzt einen Satz zurück, der die Abweichung erklärt, statt nur an der Temperatur zu drehen.
- Das Modell produzierte Texte, die jede Prüfung bestanden und für den Leser trotzdem falsch waren. Elf Sätze für ein neunjähriges Kind, Wortzahl im Bereich, jeder Satz unter der Grenze, und das Kind bekommt ein Telegramm. Jede Vorlage der Bibliothek hatte ein Mensch geschrieben, dieser Fehler existierte dort also nie. Das Modell macht ihn mit bemerkenswerter Beständigkeit, daher die Obergrenze für die Satzanzahl.
- Apples Schutzmechanismen greifen, ohne zu sagen warum. Der Fehler lautet „Detected content likely to be unsafe“ und sonst nichts. Fünf Wiederholungen mit steigenden Temperaturen und denselben Eingaben scheitern fünfmal auf dieselbe Weise. Was die App jetzt macht, ist der Reihe nach wegzunehmen: zuerst den Kalendermoment, weil er der einzige Inhalt ist, den die App nicht selbst geschrieben hat, dann die Inhaltsregel in den Anweisungen. Die Stufe, die entsperrt, ist die Diagnose, und sie geht als solche ins Protokoll.
- EventKit hat mich einen Nachmittag gekostet, aus Gründen, die nichts mit KI zu tun hatten. Ein EKEventStore, der vor der Berechtigung erzeugt wird, behält für die Lebensdauer des Prozesses einen leeren Cache, die Kalenderabfrage liefert also null Ereignisse, auch nachdem die Eltern auf Erlauben getippt haben. Und authorizationStatus(for:) hinkt der Erteilung hinterher: Auf dem iPad kam die Anfrage mit true zurück, während der Status dreizehn Millisekunden später noch notDetermined sagte. Beides sieht genau wie ein Berechtigungsfehler aus, und keines von beiden ist einer.
Eine letzte Einschränkung hat die App mehr geprägt als alle anderen. Fünf Versuche sind die Grenze, wenn ein Kind auf einen Bildschirm „wir schreiben dein Diktat“ schaut. Die App generiert deshalb im Voraus. Ein Diktat laut vorzulesen dauert Minuten, und der Generator arbeitet in diesem Fenster, gedeckelt auf zehn Runden pro Sitzung, an den Lesebildschirm gebunden und beim Schließen abgebrochen. Nichts Unvalidiertes kommt je in den Cache. Das kauft Zeit, keine Nachsicht.
Was iOS 27 ändert
Der Großteil der Liste oben wird von der Version behoben, die im September erscheint, was seltsam über ein Framework zu schreiben ist, das ein Jahr alt ist.
- Das Modell auf dem Gerät wurde neu gebaut, mit besserer Logik, besserem Aufruf von Werkzeugen und Schutzmechanismen, die laut Apple weniger Fehlalarme erzeugen. Das trifft direkt meinen teuersten Fehlermodus. Besseres Befolgen der Anweisungen sollte auch die Zahl der Wiederholungen senken, und das ist der Unterschied zwischen Vorausgenerieren und Generieren auf Abruf.
- response.usage meldet jetzt Eingabe-, Ausgabe-, Cache- und Reasoning-Token, model.contextSize zeigt das Fenster, und tokenCount(for:) zählt einen Prompt vor dem Senden. Mein Ausreißer von 48,9 Sekunden wird damit etwas, das ich kommen sehe, statt es hinterher im Protokoll zu finden.
- Das Modell auf dem Gerät nimmt Bilder an, und das Framework liefert ein OCRTool auf dem Gerät, gestützt auf Vision. An das denke ich ständig. Die Beschreibung im App Store verspricht heute, dass die App die Seite nicht fotografiert, weil Handschrifterkennung Fehler erfindet, die das Kind nie gemacht hat, und eine Rechtschreib-App, die einen Fehler halluziniert, ist schlimmer als gar keine. Datenschutz war dort nie der einzige Grund für ein Nein. Aber es ganz auf dem Gerät versuchen zu können, ohne jeden Upload, ist neu.
- Das LanguageModel-Protokoll erlaubt jedem Modell, eine Sitzung zu tragen. Die App hatte diese Form schon: Eine einzige Anlaufstelle entscheidet zur Laufzeit, ob das Framework auf diesem System existiert, und deshalb bedient ein einzelnes Binary sowohl macOS 15 ohne Apple Intelligence als auch macOS 26 damit. Diese Indirektion gehört jetzt dem Betriebssystem statt mir.
- DynamicProfile lässt eine einzige Sitzung mitten im Gespräch Anweisungen und Werkzeuge wechseln. Ein Diktat zu schreiben und eines zu korrigieren sind in dieser App zwei verschiedene Aufgaben und heute zwei verschiedene Sitzungen.
Apples kostenloses Cloud-Modell, standardmäßig ausgeschaltet
Dieselbe Version macht es sehr leicht, das Gerät zu verlassen.
PrivateCloudComputeLanguageModel bietet ein Kontextfenster von 32.000 Token und eine Reasoning-Einstellung, ohne API-Schlüssel, ohne Konto und ohne Cloud-Rechnung für kleine Entwickler unterhalb einer Schwelle von zwei Millionen Erstinstallationen. Anthropic und Google veröffentlichen Swift-Pakete, die sich an denselben Sitzungstyp anschließen. Diese App umzustellen ist ungefähr eine Zeile, und der Text käme länger, besser strukturiert und deutlich öfter schon beim ersten Versuch gültig zurück.
Es gibt ein echtes Argument dafür, und es ist nicht das, mit dem ich am Anfang gerechnet hatte. Das Modell auf dem Gerät schreibt ein gutes Diktat für ein neunjähriges Kind. Es wird dünn, wenn die fragende Person eine Erwachsene ist, die Französisch lernt und einen längeren Text mit Nebensätzen und breiterem Wortschatz will, oder ein Elternteil, das mehr will, als die Niveautabelle vorschlägt. Diese Leser existieren, sie benutzen die App bereits, und das kleinste Modell auf dem Telefon schreibt nicht wirklich für sie.
In iOS 27 wird die App es deshalb als Einstellung anbieten, und diese Einstellung wird ausgeschaltet ausgeliefert. Installieren Sie die App, ändern Sie nichts, und das Versprechen, das sie heute gibt, gilt weiter: Nichts verlässt das Gerät, und der Flugmodus beweist es in vier Sekunden.
Was diese Option überhaupt anbietbar macht, ist genau die Arbeit weiter oben. Auch bei eingeschaltetem Schalter überquert ein roher Kalendertitel weiterhin nie das Netz. Die Positivliste hat ihn längst auf eine kanonische Nominalphrase reduziert, unterwegs sind also „la sortie piscine“ und ein Vorname, nie „RDV Dr Meunier, résultats“. Der Filter wurde gebaut, um ein Kind vor dem Modell zu schützen. Es stellt sich heraus, dass er die Familie auch vor dem Netz schützt.
Der Datenschutzbildschirm wächst um einen Satz, und das ist der Teil, den ich richtig machen will. Aus einer Zeile, die sagt, dass nichts das Gerät verlässt, werden zwei: Nichts verlässt das Gerät, außer Sie schalten reichere Texte ein, und hier steht genau, was dann hinausgeht. Apples private Cloud ist ein gutes Versprechen und ich glaube es. Es bleibt ein Versprechen, und ein Versprechen gehört hinter einen Schalter, den Eltern bewusst umgelegt haben, nicht in eine Voreinstellung, die sie nie gelesen haben.
Das Modell auf dem Gerät bleibt auch aus einem unglamourösen Grund die Voreinstellung. Ein Diktat im Zug, im Auto, in einem Ferienhaus mit schlechtem WLAN, ist genau der Moment, in dem eine Familie zu dieser App greift. Was die Einstellung auch sagt, es muss ganz ohne Netz weiter funktionieren, die Engine auf dem Gerät geht also nirgendwohin.
Wenn Sie das in Ihrer eigenen App brauchen
Wenn Sie eine App vor sich haben, bei der die Daten das Gerät nicht verlassen dürfen, und Ihnen jemand gesagt hat, das schließe KI aus, dann ist dieser Rat ein Jahr alt. Gesundheit, Bildung, Personalwesen, Recht, alles mit Kindern, alles, wo ein Kundenvertrag das Land nennt, in dem die Daten liegen müssen: Der Weg über das Gerät existiert und er funktioniert jetzt.
Die Vorbehalte, die Sie besser von mir hören, als sie im zweiten Monat zu entdecken:
- Das Modell auf dem Gerät ist klein. Es schreibt einen guten kurzen Text. Es wird sich nicht durch ein langes Dokument denken. Passen Sie die Funktion an das Modell an statt umgekehrt.
- Sie werden eine Validierungsschicht schreiben. Behandeln Sie das Modell als schnellen Schreiber ohne Urteilsvermögen und legen Sie deterministischen Code darum. In diesem Code lebt das Produkt tatsächlich.
- Sie brauchen einen Rückfall für das Gerät, das gar kein Apple Intelligence hat, und er muss unsichtbar sein. Hier steht eine handgeschriebene Bibliothek hinter dem Modell, und ein Kind kann nicht sagen, welches von beiden den heutigen Text geschrieben hat.
- Gerät und Cloud sind keine Wahl zwischen zwei Produkten. Setzen Sie die Filterung vor das Modell statt hinein, dann können Sie die Cloud später als Einstellung anbieten, ohne ein Wort Ihres Datenschutzbildschirms neu zu schreiben.
- Nichts davon ist Webtechnologie. Es ist EventKit, ein Datenschutzmanifest, geführte Generierung und Plattformverhalten, das sich nur auf echter Hardware zeigt, ein Grund mehr, warum nativ einen plattformübergreifenden Wrapper schlägt, wenn der schwierige Teil das Betriebssystem ist.
Das Ganze, inklusive Kalenderfilter, hat Tage gedauert und keine Monate. Der Großteil dieser Zeit ging in die Validierungskette und die Fehlerpfade, nicht in den Prompt.
Brauchen Sie eine App, die nichts nach draußen schicken kann?
Native iOS- und Android-Apps, gebaut um KI auf dem Gerät, EventKit und die Plattform-APIs, die ein Webview nicht erreicht. Eine funktionierende App auf Ihrem eigenen Gerät am Ende von Tag eins, ab 500 € netto.
Über mein Projekt sprechen