Eine kindersichere Windows-Kiosk-Lern-App: Nach dem Login startet LernTor im Vollbild und sperrt den PC, bis das Kind Lesen, den Tipptrainer, News, Übungsaufgaben in den freigeschalteten Fächern und das Abschlussquiz durchlaufen hat. Erst dann wird der PC freigegeben. Eltern legen im Eltern-Bereich fest, welche der 15 verfügbaren Fächer für den Tag/das Profil überhaupt aktiv sind (siehe "Bereiche deaktivieren").
Zielgruppe: deutsch-türkische Kinder (ca. 10–15 Jahre) in Berlin, Lehrplan-Themen orientiert am Berliner Rahmenlehrplan, Klasse 6, 7 und 9 vollständig ausgebaut; Klasse 8 und 10 nutzen die Pools ihres Doppeljahrgangs (7/8 bzw. 9/10). Alle 15 Fächer haben einen eigenen Klasse-7-Pool mit eigenen Themen - kein Fach wiederholt für Klasse-7-Profile mehr den Klasse-6-Stoff. Einzige Ausnahme ist der KI-Bereich, der bewusst nur Klasse 6 und 9 hat und für Klasse 7 auf Klasse 6 zurückfällt (siehe docs/CURRICULUM.md).
Seit dem Schuljahr 2026/27 wählt LernTor die Schulfächer des Tages nach dem Stundenplan des Kindes aus: geübt wird, was am nächsten Schultag dran ist, plus Türkisch (siehe „📚 Fächer nach Stundenplan“ unten).
| Dokument | Inhalt |
|---|---|
| docs/DESIGN.md | Designs (seit 3.0): Farbrollen, Kontrastregeln, ein Design hinzufügen, Bildschirmfotos der CI |
| docs/NAECHSTES-LEVEL-3-1.md | Version 3.1 – Funktion (Plan und Stand): jede Frage vorlesen (auch englische und türkische Sätze in der richtigen Stimme), Lernkalender, zwei neue Belohnungs-Designs, Lehrplan-Lücken, Schulkalender 2027/28 |
| docs/NAECHSTES-LEVEL-3.md | Plan vom 30.09.2026 (Version 3.0): wählbare Designs, Schrift und Textgröße, Bildschirmfotos und Kontrasttests in der CI, Entwicklungsumgebung, Fahrplan bis 2028 |
| docs/NAECHSTES-LEVEL.md | Plan vom 29.09.2026: .NET 10, Abzeichen, Meisterschaft je Thema, größere Pools |
| docs/NAECHSTE-SCHRITTE.md | Was als Nächstes zu tun ist, und was am 28.09.2026 erledigt wurde |
| docs/WIEDERHERSTELLUNG.md | Notfall: Sicherung einspielen, App startet nicht, Kiosk lösen |
| docs/STUNDENPLAENE-2026-27.md | Stundenpläne der Kinder zum Einfügen |
| docs/TESTPLAN.md | Testprotokoll nach Rollen |
| docs/PLAN.md | Plan nach Risiko, mit Begründungen |
| docs/BUILD.md | Bauen, Installieren, Datenbankschema |
| docs/CURRICULUM.md, docs/FAECHER-SYSTEM.md | Themen je Fach und Stufe, Verdrahtung neuer Fächer |
| docs/TIPPTRAINER.md, docs/FUEHRERSCHEIN.md | Tipptrainer, Führerschein-Bereich |
| docs/PILOT-CHECKLISTE.md | Installation und Bypass-Härtetest am echten PC |
Mehrere Kinder am selben PC wählen beim Start ihr eigenes Profil aus einem Kachel-Dashboard: jede Kachel zeigt den selbst gewählten Avatar (Emoji, beim Anlegen aus einer Auswahl wählbar - bewusst Emoji statt Bilddateien: keine Assets zu pflegen, rendert nativ), einen Fortschrittsring für die heutige Lernsession (grün + Häkchen, wenn heute schon freigeschaltet wurde) und Name/Alter/Klasse auf sanft rotierenden Pastell-Hintergründen. Darüber steht eine tageszeitabhängige Begrüßung (morgens/nachmittags/abends, DE/TR). Über "Neues Profil ➕" wird ein weiteres Profil mit eigener Klassenstufe (6 oder 9) und Avatar angelegt. Jedes Profil hat seinen eigenen Fortschritt, sein eigenes Abschlussquiz-Ergebnis und sein eigenes Aktivitätsprotokoll (im Eltern-Bereich per Dropdown auswählbar; dort lassen sich Profile samt aller zugehörigen Daten auch löschen - mit Rückfrage, das letzte verbleibende Profil ist geschützt). Beim ersten Start werden automatisch zwei Beispielprofile angelegt. Nach Auswahl/Erstellung wird der Profilname dauerhaft oben rechts im Kiosk-Fenster angezeigt (👤 Name), damit jederzeit erkennbar ist, welches Kind gerade angemeldet ist.
LernTor.Core/Services/ReadingContentProvider.cs; die Tagespaarung kombiniert
je einen literarischen/Allgemeinwissen-Text mit einer Pop-Kultur-Geschichte - zwei ganze Texte statt
künstlich verlängerter Einzeltexte, denn den echten, gemeinfreien Gedichten eine zweite Strophe
anzudichten würde die Werke verfälschen). Beide werden gleichzeitig auf Deutsch, Türkisch und
Englisch nebeneinander angezeigt, damit dasselbe Stück in allen drei Sprachen gelesen werden kann. Über Sprach-Tabs lässt sich alternativ eine einzelne Sprache größer
und mit mehr Zeilenabstand anzeigen; ein Vorlesen-Button liest den Text der gewählten Sprache
vor - komplett offline, zweistufig: Haben die Eltern im Eltern-Bereich einmalig die natürlichen
Piper-Stimmen heruntergeladen (~230 MB: piper.exe + je eine neuronale "medium"-Stimme für
Deutsch/Türkisch/Englisch, auch die türkische Aussprache stimmt), wird satzweise per piper.exe
zu WAV synthetisiert und abgespielt - satzweise, damit die Wiedergabe sofort startet, während der
nächste Satz schon im Hintergrund erzeugt wird (PiperTtsEngine/TextToSpeechService). Ohne
Piper-Stimmen liest als Rückfall die Windows-eigene Sprachausgabe (System.Speech - eine
türkische SAPI-Stimme ist auf Windows oft nicht vorinstalliert; ohne passende Stimme liest die
Standardstimme). Ein LLM wäre hierfür das falsche Werkzeug: Sprachmodelle erzeugen Text, keine
Audiodaten - Piper ist das passende (und viel kleinere) dedizierte TTS-Modell. Soll laut
vorgelesen werden. Ein 5-Minuten-Timer läuft; "Weiter" ist erst danach nutzbar - es gibt bewusst
keine Überspringen-Funktion. Ob tatsächlich (laut) gelesen wurde, kann technisch nicht geprüft
werden – das ist eine bekannte, akzeptierte Grenze dieser Funktion. Der Pool gliedert sich in
zwei Kategorien:
NewsCategoryClassifier) - eine Minecraft-Meldung von tagesschau.de landet trotzdem in 🎮 Spiele.
Der Katalog umfasst 44 Quellen in drei Sprachen (Deutsch, Türkisch, Englisch - Englisch als
nebenbei-Lesetraining für die Fremdsprache ab Klasse 6). Abgerufen werden aber nicht alle:
RssNewsService.SelectFeedsForDay zieht täglich so viele Quellen, wie im Eltern-Bereich als
Nachrichten pro Tag eingestellt sind (Presets 6/10/12/15/20, Standard 12), verteilt die
Plätze über die Sprachen und wandert über die Tage durch den ganzen Katalog. Die Auswahl ist
aus dem Datum abgeleitet und innerhalb eines Tages stabil - beim zweiten Öffnen stehen dieselben
Artikel da. Aus jeder ausgewählten Quelle kommt genau der neueste Artikel.
Jugendschutz (NewsSuitability): hart gesperrt und nie ausgewählt ist, was in einer
Kinder-App nichts zu suchen hat (sexualisierte Gewalt, Suizid, Folter, Missbrauch, Massaker) -
das gilt in jeder Filterstufe. Der Umgang mit heiklen, aber lehrplanrelevanten Themen
(Krieg, Kriminalität, Unfälle) ist dagegen pro Kind im Eltern-Bereich einstellbar
(NewsFilterStrictness): Streng sperrt sie ganz, Normal (Voreinstellung) lässt sie zu,
behandelt sie aber nachrangig - aus einer Quelle gewinnt der unbedenklichste Artikel, erst bei
Gleichstand entscheidet die Aktualität -, Locker wertet nur noch die harte Sperre aus. Unter
zehn Jahren gilt unabhängig von der Einstellung immer Streng: eine Einstellung soll den Schutz
für ein Grundschulkind nicht aushebeln können. Die Stichwortlisten sind nach Sprache getrennt und prüfen ganze Wörter -
sonst hätte das englische "war" jeden deutschen Satz mit "war" getroffen.
Jeder Artikel erhält: Rubrik-Chip mit Emoji, geschätzte Lesedauer, Schwierigkeitsgrad
(🟢/🟡/🔴, Satz-/Wortlängen-Heuristik), sofort erklärte schwierige Wörter (kuratiertes
KidTermGlossary, ~55 Begriffe von Inflation bis Deepfake) und EINE Verständnisfrage, die
echtes Lesen verlangt: ein Lückentext aus der Zusammenfassung mit ausgeblendetem Schlüsselwort
(frühere Fragetypen wurden auf Nutzerwunsch entfernt: die „Nenne ein wichtiges Wort aus der
Überschrift"-Frage war ohne Lesen lösbar, und eine zusätzliche Rubrik-Frage erwies sich als
unnötig und bei Fehlklassifikation sogar unfair; ebenso die Einordnungs-Boxen „Warum ist das
wichtig?"/„Was bedeutet das für dich?" - der Fokus liegt auf der Nachricht selbst). Gibt die
Zusammenfassung keinen Lückentext her, bleibt der Artikel ohne Frage. Diese Verständnisfragen
zählen NICHT ins Abschlussquiz - sie werden ausschließlich hier im News-Bereich gestellt.
Mindest-Lesezeit: wie
bei den Fach-Übungen wird „Weiter" erst frei, wenn die Frage(n) beantwortet sind UND ein
20-Sekunden-Countdown abgelaufen ist - Nachrichten sollen gelesen, nicht weggeklickt werden.
Verstörende Themen (Krieg, Gewalt – auch türkischsprachige Schlüsselwörter) werden im Ranking
stark heruntergestuft. Finanzwissen: weil es zu Finanzthemen kaum kindtaugliche Tagesmeldungen
gibt, wird täglich ein rotierendes, kuratiertes Erklärstück angehängt (Was ist Geld? Inflation,
Sparen, Börse, Taschengeld, Berufswelt – mit handgeschriebenen Verständnisfragen, siehe
FinanceKnowledgeArticles). Wetter-Widget: oben rechts zeigt eine kleine Karte das heutige
Berlin-Wetter (Open-Meteo-API, kostenlos/ohne Schlüssel/ohne Konto) mit Emoji, Temperaturen und
einem kindgerechten Tages-Tipp („Pack einen Schirm ein!"); schlägt der Abruf fehl, bleibt das
Widget einfach ausgeblendet. Bezirks-Chip statt Karte: Artikel mit Berliner Ortsbezug
bekommen einen 📍-Chip mit dem Bezirk (BerlinDistrictDetector: alle 12 Bezirke plus ~45
bekannte Ortsteile/Kieze wie Wedding → Mitte; mehrdeutige Alltagswörter wie „Mitte" allein
werden bewusst nur in eindeutigen Formen wie „Berlin-Mitte" erkannt) - eine Offline-Karte ohne
Cloud-Kartendienst wäre unverhältnismäßig, der Kiez-Bezug ist die eigentliche Information.
Eine Marker-Leiste im Kopf zeigt je Artikel einen Kreis (grün mit ✓ =
Fragen beantwortet, auch aus einer früheren Session desselben Tages nach Absturz/Neustart;
lila = aktueller Artikel; grau = offen). Die Marker sind klickbar (direkt zum Artikel
springen). „Weiter" führt zum nächsten noch offenen Artikel; der Abschluss-Button
erscheint erst, wenn wirklich ALLE Artikel beantwortet sind. Automatischer Altersfilter:
bis einschließlich 9 Jahren (Profil-Alter) werden Artikel mit verstörenden Schlüsselwörtern
komplett ausgefiltert statt nur herabgestuft. Tages-Archiv & Offline-Rückfall (zweistufig):
Stufe 1 pro Feed - jeder erfolgreiche Feed-Abruf wird roh gecacht (FeedCache, komprimiert in
%LOCALAPPDATA%\LernTor\newscache); ist ein einzelner Feed nicht erreichbar, wird stattdessen
sein letzter Stand verwendet, sofern er jünger als 48h ist. Stufe 2 für den Totalausfall - die
aufbereiteten Tagesartikel werden automatisch ~7 Tage archiviert (ArchivedArticleRepository,
inkl. Verständnisfragen); sind morgens alle Feeds (auch per Cache) unerreichbar, liest das Kind
Artikel aus dem Archiv statt vor einem fast leeren News-Teil zu stehen. Der Vorrat reicht
21 Tage (vorher 7 - das deckt einen Router-Ausfall ab, aber keinen Urlaub), und welcher
Archiv-Tag genommen wird, wandert mit der Dauer des Ausfalls: am ersten Tag der jüngste
Stand, am zweiten der davor. Vorher kam immer derselbe, das Kind sah also jeden Morgen
dieselben Nachrichten inklusive derselben Verständnisfragen
(beides im Fehlerprotokoll vermerkt). (Eine frühere Lesezeichen-/Suchfunktion im News-Teil wurde auf
Nutzerwunsch wieder entfernt - im geführten Pflicht-Ablauf brachte sie keinen Mehrwert und
verschob das Layout.)ReviewQuestionRepository/ReviewQuestionEntity;
die neue Tabelle legt der automatische Schema-Abgleich selbst an.
Adaptive Übungsauswahl: die tägliche Aufgabenauswahl gewichtet Themen nach der
Trefferquote der letzten 30 Tage - Themen mit vielen Fehlern werden bis zu 3x so häufig
gezogen (AdaptiveTopicWeighting), sodass automatisch dort geübt wird, wo es hakt. Kein Thema
verschwindet dabei ganz, und Themen mit zu wenig Datenbasis (unter 3 Antworten) bleiben
neutral.
Spaced Repetition für richtig beantwortete Aufgaben: einmal richtig beantwortet (egal ob im
Übungsteil oder im Abschlussquiz), pausiert der exakte Fragetext für dieses Profil - aber nicht
für immer, denn Wissen zerfällt: nach wachsenden Abständen (Stufe 1 = 7 Tage, Stufe 2 = 30 Tage,
ab Stufe 3 alle 90 Tage, vereinfachtes Anki-Prinzip) wird die Aufgabe wieder fällig und kommt
zur Auffrischung erneut dran. Besteht das Kind die Auffrischung, steigt die Stufe; scheitert
sie, verfällt die Meisterung und die Fehler-Kartei übernimmt, bis die Aufgabe neu gemeistert
ist. Nebeneffekt: gemeisterte Aufgaben füllen die endlichen Themen-Pools (20 kuratierte
Beispiele je Thema, siehe docs/CURRICULUM.md) über die Zeit wieder auf.
Ist ein Themen-Pool aktuell komplett ausgeschlossen, greift die Aufgabenauswahl als Rückfall auf
Wiederholungen zurück, statt weniger Aufgaben als angefordert zu liefern. Siehe
MasteredPromptRepository/MasteredPromptEntity/SpacedRepetitionSchedule.
Mindest-Lernzeit pro Aufgabe: „Weiter" wird erst frei, wenn die Frage beantwortet ist UND ein
20-Sekunden-Countdown abgelaufen ist (sichtbar unter dem Button) - gegen das beobachtete wilde
Durchklicken, nur um schnell zum Quiz zu kommen. Erklärung-gelesen-Pflicht bei Fehlern:
nach einer falschen Antwort muss zusätzlich der Button „✔ Erklärung gelesen" gedrückt werden,
bevor „Weiter" freigegeben wird - das Feedback ist der eigentliche Lernmoment und darf nicht
ungelesen weggeklickt werden. Das Abschlussquiz hat bewusst weder Countdown noch
Bestätigungspflicht: dort bestraft sich Raten von selbst (unter der eingestellten Schwelle beim
ersten Versuch gibt es eine Wiederholung, siehe unten).Fortschritt wird laufend in einer lokalen SQLite-Datenbank gespeichert (%LOCALAPPDATA%\LernTor\lerntor.db),
ein Absturz oder Neustart verliert also keinen Fortschritt.
.NET 10 (LTS) + WPF, kein WinUI 3, kein Electron. (Bis 29.09.2026 .NET 8; umgestellt, weil dessen Support am 10.11.2026 endet - .NET 10 wird bis November 2028 unterstützt.) Begründung: Die sicherheitskritischste Anforderung (Kiosk-Sperre: Task-Manager deaktivieren, Windows-Taste/Alt+Tab abfangen) ist mit klassischen Win32-APIs (P/Invoke) am zuverlässigsten umsetzbar, und WPF hat dafür die geringste Reibung bei gleichzeitig moderner, gut stylebarer UI. Details siehe Projekt-Chatverlauf/Architektur-Entscheidung.
src/
LernTor.Core Domänenmodelle, Fortschritts-/Scoring-Logik (plattformunabhängig)
LernTor.ContentGen Regelbasierte Aufgabengeneratoren (Mathe/Deutsch/Türkisch/NaWi) + Quiz-Composer
LernTor.News RSS-Ingestion, Vereinfachung, Verständnisfragen-Generierung
LernTor.Data SQLite-Persistenz (EF Core): Fortschritt, Aktivitätsprotokoll, Einstellungen,
eigene (elternerstellte) Aufgaben
LernTor.Security Kiosk-Lock (Keyboard-Hook), Task-Manager-Policy, Autostart, Admin-Auth
LernTor.App WPF-UI (Kiosk-Shell, alle Bildschirme, DE/TR-Lokalisierung)
LernTor.Installer Inno-Setup-Skript + PowerShell-Autostart-Helfer
tests/
LernTor.Tests xUnit-Tests für Core/ContentGen/News
Umgesetzt ist ein Soft-Lock: Vollbild-Topmost-Fenster ohne Rahmen, globaler Keyboard-Hook
(blockiert Windows-Taste, Alt+Tab, Strg+Esc, Alt+Esc, Alt+F4) und eine Registry-Richtlinie, die den
Task-Manager deaktiviert, solange LernTor läuft. Start erfolgt über einen Windows-Autostart-Task
(Anmeldung-Trigger), kein Shell-Ersatz (explorer.exe bleibt unangetastet).
Bewusste Grenze: Strg+Alt+Entf (Secure Attention Sequence) kann von keiner Windows-Anwendung im User-Modus abgefangen werden – das ist ein OS-Schutzmechanismus. Die Task-Manager-Registry-Sperre greift aber auch dann, wenn ein Kind versucht, darüber den Task-Manager zu öffnen (es erscheint eine "vom Administrator deaktiviert"-Meldung). Ein sehr technisch versiertes Kind mit Admin-Wissen könnte dies dennoch umgehen – für den Einsatzzweck (Motivation/Struktur für 10-15-Jährige) ist das eine angemessene, dokumentierte Grenze. Ein härterer Shell-Ersatz-Modus wäre als spätere Erweiterung möglich, birgt aber das Risiko, den Desktop bei einem App-Absturz komplett unbenutzbar zu machen, und wurde deshalb bewusst nicht umgesetzt.
LearningProgressTracker): auf demselben Bildschirm steht Fach für
Fach, wie sich das Kind entwickelt hat - "Mathematik 20 % → 70 %, ↑ 50 Punkte besser". Verglichen
werden die letzten 14 Tage mit den 14 Tagen davor, aus dem vorhandenen Aktivitätsprotokoll.
Hintergrund: die Kinder tragen die ganze Arbeit, sahen davon aber als Einziges eine Sternezahl -
und die sagt nichts darüber, ob man besser geworden ist, und hängt daran, dass Eltern Belohnungen
eintragen. Kein Vergleich mit dem Geschwisterkind: der ist eine bewusste Eltern-Entscheidung
und steht abschaltbar im Eltern-Bericht; hier geht es ausschließlich um das Kind und sein früheres
Ich. Ein Fach erscheint nur, wenn es in beiden Zeiträumen mindestens 5 Aufgaben gab - eine
Aussage aus drei Aufgaben ist Zufall, kein Fortschritt; ein neu begonnenes Fach zeigt deshalb
nicht "0 % → 80 %". Veränderungen unter 5 Punkten gelten als "gleich geblieben". Rückschritte
werden gezeigt, aber nicht angeprangert: sie zu verschweigen wäre unehrlich, sie rot zu
markieren wäre eine Strafe für etwas, das jedem passiert - hervorgehoben werden nur
Verbesserungen, der Rest steht neutral da.TopicMasteryCalculator): jedes geübte Thema steht auf einer von vier Stufen – 🌱 angefangen
(unter 5 Antworten), 📘 vertraut, ✅ sicher (zuletzt ab 70 % richtig), 🏆 gemeistert (zuletzt ab
90 % und zwei Fragen daraus haben nach Tagen eine Wiederholung bestanden – Behalten, nicht nur
frisch Können). Gezählt werden die letzten 10 Antworten, damit Fortschritt sichtbar wird; Stufen
können auch wieder sinken. Erreichbar über „🏆 Mein Fortschritt“ auf der Startseite, auch aus dem
Planer heraus. Bewusst kein Rot für schwache Themen. Eltern sehen dieselbe Auswertung je Fach im
Bericht.AchievementCatalog): 25 Abzeichen für echte
Leistungen – 100/500/1000 richtige Aufgaben, 10/50/100 Lerntage (gesamt, keine Serie),
korrigierte Fehler aus der Fehler-Kartei, sichere und gemeisterte Themen, „Dreisprachig“,
„Allrounder“, fehlerfreies Abschlussquiz, Tipptrainer, alle Verkehrszeichen. Nichts verfällt:
ein Abzeichen wird einmal gespeichert und nie entzogen. Neue erscheinen nach dem bestandenen
Abschlussquiz als goldene Zeile, alle zusammen in „Mein Fortschritt“ (offene blass mit dem Weg
dorthin; Abzeichen abgeschalteter Bereiche werden ausgeblendet).LearningCalendar): oben in „Mein Fortschritt“ die letzten
zwölf Wochen als Kalender – gelernt (grün mit Häkchen), Schultag, schulfrei (nur Rand; Wochenende,
Feiertage, Ferien) – dazu „42 Lerntage insgesamt · 11 in den letzten vier Wochen“. Keine Serie.SpeechSegmenter): neben jeder Frage in Übung, Nachrichten
und Abschlussquiz. Deutsche Anweisungen liest die deutsche Stimme, englische und türkische Sätze
ihre eigene; nach dem Antworten lässt sich die englische/türkische Lösung anhören. Der Knopf
erscheint nur, wenn es für jede Sprache der Frage eine Stimme gibt (Piper oder Windows).Eigener Lernbereich mit drei Unterbereichen (Verkehrszeichen, Theoriefragen, Theorie-Kurs),
angelehnt an den Aufbau von fahrschule24.de. Details in docs/FUEHRERSCHEIN.md.
src/LernTor.App/Assets/Verkehrszeichen/QUELLEN.md), als
Resource in LernTor.App.csproj eingebettet statt als lose Dateien - sie überstehen damit den
Single-File-Publish unverändert, die App bleibt vollständig offline. TrafficSignVisual
zeichnet die Bilddatei; ein nachgezeichneter Pfad (SignPictograms, Geometriepfade in einem
0..100-Feld) bleibt als Rückfallebene stehen, falls für eine Nummer je keine Bilddatei vorläge.Eigener Bereich zwischen KI-Bereich und Führerschein, pro Kind im Eltern-Bereich abschaltbar.
Auf der Startseite eine Kachel, im Eltern-Bereich die vollständige Liste.
SchoolCalendar). Die App ist ein Kiosk ohne
verlässliche Netzverbindung; ein Kalender, der beim Start hängt oder leer bleibt, wäre schlimmer
als gar keiner. Termine ändern sich einmal im Jahr - das Nachtragen ist ein normaler Code-Review.Unten links führt ein Knopf aus jeder Etappe zurück zu Hausaufgaben und Klausurplan - und von dort mit "Zurück zum Lernen" an genau dieselbe Stelle. Vorher kam man dort nur vor dem ersten Bereich hin; wer schon losgelegt hatte, musste bis zum Abschlussquiz durch, um nachzusehen, was aufhat.
Zwei Dinge daran sind wichtig:
IPausableStage). Liefe
sie weiter, wäre der Planer der bequemste Weg, eine Mindestverweildauer abzusitzen: aufmachen,
warten, zurück. Freigeschaltet oder übersprungen wird durch den Planer nichts.Auch nach dem Abschlussquiz. Auf dem "Geschafft!"-Bildschirm steht derselbe Knopf - dort heißt er nur "Zurück zum Ergebnis" statt "Zurück zum Lernen", weil es nichts mehr zu lernen gibt. Genau in diesem Moment will ein Kind wissen, was morgen ansteht: Stundenplan, Hausaufgaben, Klausurtermine. Ohne den Knopf führte von dort nur noch "PC jetzt benutzen" weiter - und damit beendet sich LernTor, der Plan war weg.
PauseMode in Core (mit Tests) statt zweimal ausgeschrieben. Der Entsperren-
Knopf hängt an genau derselben Bedingung wie der Bildschirm: läuft keine Pause, existiert weder
das eine noch das andere - es gibt keine Abkürzung um die tägliche Lernstrecke herum. Beendet ein
Elternteil die Pause im Eltern-Bereich, verschwindet der Bildschirm samt Knopf sofort, nicht erst
beim nächsten Start.SubjectTimeAnalyzer): wie viel Zeit ein Fach gekostet hat, die
typische Dauer je Aufgabe (Median) und - der eigentliche Punkt - was beides zusammen mit der
Trefferquote bedeutet. Eine niedrige Quote allein unterscheidet nicht zwischen geraten
(schnell und falsch) und nicht verstanden (langsam und falsch); das sind zwei verschiedene
Probleme mit zwei verschiedenen Reaktionen. "Schnell" und "langsam" sind dabei relativ zum
Kind selbst definiert (Vergleich mit dem Median über alle seine Fächer) - ein gründliches Kind
braucht überall länger, das darf nicht jedes Fach als Problem markieren.FeedHealthLog, gespeichert in %LOCALAPPDATA%\LernTor\feedhealth.json) - "✓ heute geladen"
oder "⚠ vor 3 Tagen fehlgeschlagen: …", fehlgeschlagene rot. Der Zeitpunkt steht bewusst dabei:
seit der Tagesrotation wird nicht mehr jede Quelle täglich abgerufen, ein Eintrag kann also Tage
alt sein. Nötig, weil die App tote Feeds geräuschlos überspringt - bei 44 Quellen könnte sonst
die Hälfte kaputt sein, ohne dass es auffällt.TimetableToday, nutzt denselben
SchoolCalendar wie die Ferien-Kachel). Die laufende Stunde ist hervorgehoben.
Das Zeitraster hängt am Profil, nicht an der App: die beiden Kinder gehen auf verschiedene
Schulen mit verschiedenen Anfangs- und Endzeiten, ein fest eingebautes Raster hätte bei einem
von beiden immer danebengelegen. Eingetragen wird im Eltern-Bereich in einem Raster Mo–Fr ×
10 Stunden mit den Uhrzeiten daneben; wer lieber tippt, kann den Plan auch als Text einlesen
(Mo: 1 Deutsch, 2 Mathe, 3 Sport (TH1) - füllt nur das Raster, gespeichert wird erst
ausdrücklich). Das Fach bleibt freier Text, kein Subject-Enum: auf einem echten Plan
stehen NaWi, GeWi, Sport, WPU Spanisch oder Klassenrat, und die kennt LernTor als Lernbereich
nicht - angezeigt wird deshalb genau das, was auf dem Plan der Schule steht; die Zuordnung zu
einem LernTor-Fach entscheidet über das Symbol davor und über die Fächer des Tages (siehe
nächster Punkt).TimetableSubjectPlanner). Die Pläne 2026/27 zum Einfügen stehen in
docs/STUNDENPLAENE-2026-27.md.
Bewusst kein PDF-Importeur: die Pläne der beiden Schulen sehen völlig verschieden aus - der
eine ein eingescannter Untis-Ausdruck, dessen Textebene aus OCR stammt und sichtbare Lesefehler
enthält, der andere eine Word-Tabelle mit umbrochenen Zellen. Ein Importeur müsste bei jedem
neuen Plan neu raten, und ein still falsch übernommener Stundenplan ist schlechter als gar
keiner, weil ihn niemand nachprüft.DeleteAsChildAsync), nicht nur an der
Oberfläche. Die Herkunft steht an jedem Eintrag. Ab sieben Tagen vor dem Termin bekommt das
betroffene Fach automatisch mehr Übungsaufgaben, steigend bis zum Doppelten am Vortag
(ExamEntry.LearningWeight, nach oben auf +8 Aufgaben gedeckelt). Der Lernplan macht das
sichtbar (ExamStudyPlanner): an der Klausur steht, was heute deswegen dran ist - "Heute
dran: Bruchrechnen". Vorher erhöhte die Gewichtung die Aufgabenzahl still; das Kind merkte nur,
dass es plötzlich mehr Mathe gibt, ohne den Zusammenhang zu sehen. Die eingetragenen Themen
werden über die Vorlauftage verteilt und dabei wiederholt durchlaufen - bei zwei Themen und
sieben Tagen kommt jedes mehrfach dran, und genau das ist der Sinn des Vorlaufs. Höchstens zwei
Themen pro Tag (eine lange Liste ist kein Plan), der Tag vor der Klausur ist Wiederholung
über alles - am Vorabend ein neues Thema anzufangen hilft niemandem. Ohne eingetragene Themen
wird nichts erfunden: dann steht dort nur "Deshalb gibt es heute mehr Mathe-Aufgaben", denn
ein ausgedachter Plan wäre schlimmer als keiner - das Kind würde ihm glauben. Bewusst lokal statt Google
Calendar: OAuth bräuchte einen echten Browser, und ein Browserfenster in einer Kiosk-App ist
genau das Loch, das die Kiosk-Sperre verhindern soll. Die Lern-Gewichtung ginge zudem nur online.
Als Brücke gibt es ICS-Import und -Export (IcsCalendar, RFC 5545): eine .ics-Datei ist
reiner Text, den Schulportal, Outlook, Apple und Google alle lesen und schreiben - ohne Konto,
ohne Netz. Beim Import wird das Fach aus dem Titel erraten ("Mathearbeit" → Mathematik); passt
nichts, bleibt es offen, statt still ein falsches Fach zu setzen und damit die Übungsgewichtung
zu verstellen. Vergangene Termine werden gar nicht erst angeboten.=/;/Tabulator/Bindestrich als Trenner). Die Vokabeln laufen in den
bestehenden Fächern Englisch und Türkisch mit und ersetzen dort bis zur Hälfte der Aufgaben,
statt den Tag zu verlängern. Abgefragt wird abwechselnd in beide Richtungen; eine richtig
beantwortete Vokabel pausiert 7/30/90 Tage und kehrt dann zur Auffrischung zurück. Anders als bei
der Fehler-Kartei verschwindet eine Vokabel nie aus dem Bestand - sie gehört zum Wortschatz.VACUUM INTO (konsistenter Snapshot bei laufender App); der Import ersetzt
die aktive Datenbank nach Bestätigung und beendet die App, beim nächsten Start ist der gesicherte
Stand aktiv. Auch eine Sicherung aus einer älteren App-Version funktioniert (der automatische
Schema-Abgleich ergänzt fehlende Tabellen/Spalten beim Start).AutoBackupPolicy / AutoBackupService): die App legt beim Start
selbst Kopien der Datenbank unter %LOCALAPPDATA%\LernTor\sicherungen\ an - einmal täglich
und, viel wichtiger, immer bevor sich am Aufbau der Datenbank etwas ändert. Hintergrund: der
Schema-Abgleich beim Start (siehe unten) kann nur additive Änderungen; bei einer umbenannten
Spalte oder umgedeuteten Werten bliebe sonst nur "lerntor.db löschen" - und damit wären Sterne,
Fortschritte und Fehler-Kartei beider Kinder weg. Erkannt wird das an einem Fingerabdruck des
EF-Modells (SchemaFingerprint, Datei neben der Datenbank), der vor dem Abgleich mit dem zuletzt
gespeicherten verglichen wird - danach gezogen wäre die Sicherung wertlos, weil sie schon den
neuen Stand enthielte. Es bleiben die fünf neuesten liegen, plus dauerhaft die neueste
Sicherung vor einer Schemaänderung: lernt ein Kind danach eine Woche weiter, hätten die
täglichen Kopien genau die eine verdrängt, die den Umbau rückgängig machen könnte. Fehler beim
Sichern (volle Platte, gesperrte Datei) werden protokolliert und geschluckt - ein Kind, das
wegen einer Sicherung nicht lernen kann, wäre der schlechtere Zustand. Das ersetzt die
Sicherung von Hand nicht: diese Kopien liegen auf derselben Platte und überleben deren Defekt
nicht. Der Eltern-Bereich zeigt Anzahl und Datum der neuesten und öffnet den Ordner per Knopf.DictationEvaluator / DictationContentProvider): ein Satz wird
vorgelesen statt angezeigt (Piper bzw. Windows-Sprachausgabe, siehe Lesen), das Kind tippt
ihn, die App vergleicht Wort für Wort. Rechtschreibung ist der eine Bereich des
Deutschunterrichts, den Multiple Choice strukturell nicht abdecken kann: sobald die richtige
Schreibweise als Option dasteht, wird wiedererkannt statt geschrieben. Zwei bewusste
Entscheidungen bei der Bewertung: Satzzeichen entscheiden nicht über richtig/falsch - die
Sprachausgabe spricht kein Komma, und einem Kind vorzuwerfen, es habe etwas nicht geschrieben,
das es nicht hören konnte, wäre unfair; Groß- und Kleinschreibung entscheidet dagegen sehr
wohl - sie ist im Deutschen regelbasiert und damit genau das, worum es bei einem Diktat geht.
Vorlesen ist beliebig oft möglich (eine Lehrkraft liest ein Diktat auch mehrmals). Die
Rückmeldung nennt nicht nur "falsch", sondern welches Wort es war ("belt" → "bellt"); der
richtige Satz erscheint erst nach dem Absenden. 40 Sätze (20 je Stufe), jeder auf eine
Rechtschreibfalle gebaut - das/dass, ss/ß, Dehnungs-h, Groß-/Kleinschreibung,
Doppelkonsonanten -, 6 bis 10 Wörter lang. Läuft als normales Deutsch-Thema mit: Fehler-Kartei
und Spaced Repetition greifen unverändert.ReadingTextImport): roher Extraktionstext hat harte
Zeilenumbrüche mitten im Satz, am Zeilenende getrennte Wörter ("Wan-/derer"), Seitenzahlen und
unsichtbare Sonderzeichen zwischen den Absätzen - einem Kind so etwas vorzusetzen wäre schlimmer,
als es abzutippen. Absätze werden zusammengefasst, Trennungen aufgelöst, Seitenzahlen entfernt
(aber als Absatztrenner behandelt, damit nicht zwei Absätze verkleben), zu lange Texte an einer
Absatz- oder Satzgrenze gekürzt (nie mitten im Wort) und die Kürzung wird gemeldet. Bewusst
regelbasiert ohne LLM - für "Zeilenumbrüche zusammenfassen" ein Mehr-Gigabyte-Modell zu laden
wäre die falsche Größenordnung. Gefüllt wird das Formular, nicht die Datenbank: kein Extraktor
trifft aus einem Schulbuch-PDF auf Anhieb genau den gemeinten Abschnitt, also prüfen und speichern
die Eltern. Bei eingescannten Seiten (Bild statt Text) sagt die App ehrlich, dass nichts zu holen
ist, statt ein leeres Formular stehen zu lassen.WorksheetExport): erzeugt aus dem gewählten Fach und der
Klassenstufe des gewählten Kindes ein Blatt mit 8/12/20 Aufgaben als HTML-Datei - für
Klausurvorbereitung am Küchentisch, ohne PC. Wer eine Rechnung aufschreibt, statt eine von drei
Optionen anzuklicken, rechnet sie wirklich. Die Aufgaben werden neu gezogen, nicht aus dem
Bildschirm-Pensum kopiert (sonst wäre es Abschreiben). Die Lösungen stehen auf einem eigenen
zweiten Blatt, hinter einem harten Seitenumbruch - stünde die Antwort neben der Aufgabe, wäre
das Blatt wertlos. Antwortoptionen werden gemischt (ungemischt wäre fast immer "A" richtig, weil
die Generatoren die richtige Antwort meist zuerst anlegen) und der Lösungsbuchstabe passt zur
gedruckten Reihenfolge. Offene Aufgaben bekommen zwei Schreiblinien für den Rechenweg. Diktate
erscheinen nicht auf dem Aufgabenblatt - der Satz darf ja nicht dastehen -, dafür auf dem
Lösungsblatt unter "Zum Vorlesen", von wo ein Elternteil sie diktieren kann.ReportExport).ProfileComparison).lerntor.db.LernTor.Core.Logging.AppLog): eine Log-Datei pro Tag unter
%LOCALAPPDATA%\LernTor\logs\lerntor-JJJJ-MM-TT.log (älter als 14 Tage wird automatisch
gelöscht; komplett lokal, keine Telemetrie). Protokolliert wird genau das, was die App dem Kind
gegenüber bewusst verschluckt: übersprungene News-Feeds mit Quelle und Grund, fehlgeschlagene
Modell-/Piper-Downloads je Spiegel-URL, Wetter-Ausfälle, TTS-Rückfälle (fehlende SAPI-Stimme,
Piper-Fehler) sowie unbehandelte Abstürze mit vollem Stacktrace. Absturzverhalten im
Kiosk-Modus: kein Windows-Fehlerdialog auf dem Kinder-Bildschirm - die App protokolliert still
und startet sich automatisch neu, damit ein Absturz die Lernpflicht nicht aushebelt. Ein
Crash-Loop-Guard (CrashRestartGuard, max. 3 Neustarts in 10 Minuten) verhindert
Endlosschleifen; danach greift bewusst das Soft-Lock-Prinzip und der Desktop bleibt erreichbar.
Im Dev-Modus (LERNTOR_SKIP_LOCK=1 oder Debugger) erscheint stattdessen wie bisher eine
MessageBox mit dem vollen Fehler. Der Eltern-Bereich zeigt die letzten Zeilen des heutigen
Protokolls direkt an ("Heute wurden keine Probleme protokolliert 👍", wenn leer) und öffnet den
Log-Ordner per Button im Explorer. Das Protokollieren selbst wirft nie Exceptions - ein Logger,
der die App crasht, wäre schlimmer als keiner.CustomQuestionRepository/CustomQuestionEntity,
Tabelle CustomQuestions), unabhängig von den generierten Aufgaben. Diese Aufgaben werden additiv
zu den generierten Übungsaufgaben (passendes Fach + Klassenstufe) und zum Abschlussquiz
hinzugefügt - sie ersetzen die Generatoren nicht. Löschbar über den "Löschen"-Button je Eintrag.Bewusst keine Zeitlimit-Funktion: Es gibt kein tägliches Zeitlimit für die Lernsession - die Kinder sollen so viel Zeit erhalten, wie sie zum Durcharbeiten von Lesen/Fächern/Abschlussquiz benötigen. Das ist eine bewusste Design-Entscheidung, kein technisches Versäumnis.
Die aktuelle Arbeitsliste steht in docs/NAECHSTE-SCHRITTE.md. Dieser Abschnitt beschreibt dauerhafte Grenzen und Entwurfsentscheidungen.
LocalLlmModelHost (src/LernTor.ContentGen/Llm/LocalLlmModelHost.cs) lädt das GGUF-Modell
über LLamaSharp (llama.cpp-Bindings, Pakete LLamaSharp +
LLamaSharp.Backend.Cpu, reines CPU-Backend ohne CUDA-Abhängigkeit) genau einmal und hält es im
Speicher, statt es bei jedem Aufruf neu zu laden.LocalLlmModelCatalog.cs): Eltern wählen im
Eltern-Bereich per Dropdown eines der kuratierten Modelle; die Datei wird beim ersten Gebrauch
automatisch nach %LOCALAPPDATA%\LernTor\models\ heruntergeladen (einmalig Internet nötig, danach
komplett offline; jedes Modell hat seine eigene Datei, ein Wechsel lädt also nur einmal herunter).
-00001-of-00002-Teildateien, dort existiert die 7B-Einzeldatei-URL nicht),
mit Spiegel-Liste pro Modell - schlägt eine Quelle fehl, wird die nächste probiert. Modell- und
Dateiauswahl im Eltern-Bereich werden sofort gespeichert (nicht erst über den
"Speichern"-Button - das war ein gemeldeter Bug).
Die Hugging-Face-URLs bleiben aus der Entwicklungsumgebung heraus nicht verifizierbar
(huggingface.co dort blockiert); schlägt der Download trotz Spiegel-Liste fehl, zeigt die App eine
klare Fehlermeldung (inkl. Modellname, Größe und technischem Grund) und Eltern können ein anderes
Modell wählen oder manuell eine .gguf-Datei über den Datei-Dialog hinterlegen (eigene Datei hat
Vorrang vor dem Katalog, "✕" entfernt sie wieder).LLamaSharp 0.27.0 wurde real von nuget.org heruntergeladen und die
kompilierte DLL per CLR-Metadaten-Analyse geprüft (nicht nur aus Dokumentation/Training geraten):
ModelParams(string modelPath)-Konstruktor mit settable ContextSize/GpuLayerCount-Properties,
statisches LLamaWeights.LoadFromFile(ModelParams),
StatelessExecutor(LLamaWeights, IContextParams, ILogger?)-Konstruktor (baut sich seinen
Inferenz-Kontext laut Metadaten-Analyse intern selbst auf - ein separat per
LLamaWeights.CreateContext(...) erzeugter Kontext wird gar nicht entgegengenommen) sowie
InferAsync(string, InferenceParams?, CancellationToken), das laut TypeRef-Analyse
IAsyncEnumerable<string> liefert (per await foreach zum vollständigen Antworttext
zusammengesetzt). LLamaWeights implementiert IDisposable.src/LernTor.ContentGen/TeacherImport/): PDF
(PdfPigTextExtractor) bzw. .docx (OpenXmlWordTextExtractor, kein altes binäres .doc) → Fließtext →
LocalLlmQuestionSuggester stellt eine Frage nach strukturiertem JSON mit Quizfragen. Ergebnisse sind
immer nur Vorschläge (ExtractedQuestionDraft, mit SourceExcerpt = Textstelle im Original) - Eltern
müssen im Eltern-Bereich jeden Vorschlag einzeln über "Übernehmen" bestätigen oder "Verwerfen", bevor
er via CustomQuestionRepository.AddAsync gespeichert wird. Keine automatische Übernahme ohne
menschliche Kontrolle. Der manuelle Editor (siehe "Eltern-Features") funktioniert unabhängig davon
weiterhin normal.
src/LernTor.App/Controls/QuestionCard.xaml, "🤖 KI fragen"-Button):
Kinder können zu jeder Aufgabe - in News, Übungen und im Abschlussquiz gleichermaßen, da alle drei
dieselbe QuestionCard verwenden - dem KI-Assistenten Rückfragen stellen, so wie sie einen
Taschenrechner benutzen würden: als Werkzeug, mit dem man sich auseinandersetzt, nicht als reinen
Lösungsautomaten. Der Prompt (HomeworkChatPromptBuilder, src/LernTor.ContentGen/HomeworkChat/)
bekommt bewusst die richtige Antwort und die Erklärung der Aufgabe MIT in den Kontext - ohne sie zu
kennen, könnte die KI nur raten statt wirklich zu helfen. Die Leitplanke ist eine reine
Prompt-Anweisung: die fertige Antwort nicht schon in der ersten Nachricht preiszugeben, sondern zuerst
durch Rückfragen und Denkanstöße zu helfen - erst wenn das Kind es mehrfach probiert hat oder
ausdrücklich danach fragt, soll die KI die Lösung erklären.LernTor.News/NewsFeedSource.cs), inklusive einer
KI-/Technik-Quelle (heise online, IT Boltwise), einer dedizierten Spiele-Quelle (GameStar) sowie
offizieller Bundesregierungs-Quellen (Bundesregierung
kompakt, Bundesregierung Pressemitteilungen, BMBFSFJ für Bildungs-/Familienthemen), dazu einer
Herabstufung (nicht Ausfilterung) von Artikeln mit verstörenden Themen (Krieg, Gewaltverbrechen, ...)
über SensitiveKeywords. RSS-URLs von Nachrichtenseiten ändern sich gelegentlich – nicht erreichbare
Feeds werden übersprungen, sollten aber gelegentlich geprüft werden. Inzwischen auf einem echten
Windows-Rechner getestet und bestätigt funktionsfähig (inkl. der neuen heise.de-Quelle).ITextSimplifier-Interface in LernTor.News als zweite
Implementierung ergänzen, ohne den Rest der App anzufassen..github/workflows/build.yml auf windows-latest), da diese Entwicklungsumgebung selbst kein
Windows bereitstellt.git clone <repo>
cd HeroKid
dotnet restore LernTor.sln
dotnet build LernTor.sln
$env:LERNTOR_SKIP_LOCK = "1" # WICHTIG für die Entwicklung: verhindert die Kiosk-Sperre!
dotnet run --project src/LernTor.App
Vollständige Build-/Installationsanleitung: docs/BUILD.md.
Weitere technische Details:
Eine kindersichere Windows-Kiosk-Lern-App: Nach dem Login startet LernTor im Vollbild und sperrt den PC, bis das Kind Lesen, den Tipptrainer, News, Übungsaufgaben in den freigeschalteten Fächern und das Abschlussquiz durchlaufen hat. Erst dann wird der PC freigegeben. Eltern legen im Eltern-Bereich fest, welche der 15 verfügbaren Fächer für den Tag/das Profil überhaupt aktiv sind (siehe "Bereiche deaktivieren").
Zielgruppe: deutsch-türkische Kinder (ca. 10–15 Jahre) in Berlin, Lehrplan-Themen orientiert am Berliner Rahmenlehrplan, Klasse 6, 7 und 9 vollständig ausgebaut; Klasse 8 und 10 nutzen die Pools ihres Doppeljahrgangs (7/8 bzw. 9/10). Alle 15 Fächer haben einen eigenen Klasse-7-Pool mit eigenen Themen - kein Fach wiederholt für Klasse-7-Profile mehr den Klasse-6-Stoff. Einzige Ausnahme ist der KI-Bereich, der bewusst nur Klasse 6 und 9 hat und für Klasse 7 auf Klasse 6 zurückfällt (siehe docs/CURRICULUM.md).
Seit dem Schuljahr 2026/27 wählt LernTor die Schulfächer des Tages nach dem Stundenplan des Kindes aus: geübt wird, was am nächsten Schultag dran ist, plus Türkisch (siehe „📚 Fächer nach Stundenplan“ unten).
| Dokument | Inhalt |
|---|---|
| docs/DESIGN.md | Designs (seit 3.0): Farbrollen, Kontrastregeln, ein Design hinzufügen, Bildschirmfotos der CI |
| docs/NAECHSTES-LEVEL-3-1.md | Version 3.1 – Funktion (Plan und Stand): jede Frage vorlesen (auch englische und türkische Sätze in der richtigen Stimme), Lernkalender, zwei neue Belohnungs-Designs, Lehrplan-Lücken, Schulkalender 2027/28 |
| docs/NAECHSTES-LEVEL-3.md | Plan vom 30.09.2026 (Version 3.0): wählbare Designs, Schrift und Textgröße, Bildschirmfotos und Kontrasttests in der CI, Entwicklungsumgebung, Fahrplan bis 2028 |
| docs/NAECHSTES-LEVEL.md | Plan vom 29.09.2026: .NET 10, Abzeichen, Meisterschaft je Thema, größere Pools |
| docs/NAECHSTE-SCHRITTE.md | Was als Nächstes zu tun ist, und was am 28.09.2026 erledigt wurde |
| docs/WIEDERHERSTELLUNG.md | Notfall: Sicherung einspielen, App startet nicht, Kiosk lösen |
| docs/STUNDENPLAENE-2026-27.md | Stundenpläne der Kinder zum Einfügen |
| docs/TESTPLAN.md | Testprotokoll nach Rollen |
| docs/PLAN.md | Plan nach Risiko, mit Begründungen |
| docs/BUILD.md | Bauen, Installieren, Datenbankschema |
| docs/CURRICULUM.md, docs/FAECHER-SYSTEM.md | Themen je Fach und Stufe, Verdrahtung neuer Fächer |
| docs/TIPPTRAINER.md, docs/FUEHRERSCHEIN.md | Tipptrainer, Führerschein-Bereich |
| docs/PILOT-CHECKLISTE.md | Installation und Bypass-Härtetest am echten PC |
Mehrere Kinder am selben PC wählen beim Start ihr eigenes Profil aus einem Kachel-Dashboard: jede Kachel zeigt den selbst gewählten Avatar (Emoji, beim Anlegen aus einer Auswahl wählbar - bewusst Emoji statt Bilddateien: keine Assets zu pflegen, rendert nativ), einen Fortschrittsring für die heutige Lernsession (grün + Häkchen, wenn heute schon freigeschaltet wurde) und Name/Alter/Klasse auf sanft rotierenden Pastell-Hintergründen. Darüber steht eine tageszeitabhängige Begrüßung (morgens/nachmittags/abends, DE/TR). Über "Neues Profil ➕" wird ein weiteres Profil mit eigener Klassenstufe (6 oder 9) und Avatar angelegt. Jedes Profil hat seinen eigenen Fortschritt, sein eigenes Abschlussquiz-Ergebnis und sein eigenes Aktivitätsprotokoll (im Eltern-Bereich per Dropdown auswählbar; dort lassen sich Profile samt aller zugehörigen Daten auch löschen - mit Rückfrage, das letzte verbleibende Profil ist geschützt). Beim ersten Start werden automatisch zwei Beispielprofile angelegt. Nach Auswahl/Erstellung wird der Profilname dauerhaft oben rechts im Kiosk-Fenster angezeigt (👤 Name), damit jederzeit erkennbar ist, welches Kind gerade angemeldet ist.
LernTor.Core/Services/ReadingContentProvider.cs; die Tagespaarung kombiniert
je einen literarischen/Allgemeinwissen-Text mit einer Pop-Kultur-Geschichte - zwei ganze Texte statt
künstlich verlängerter Einzeltexte, denn den echten, gemeinfreien Gedichten eine zweite Strophe
anzudichten würde die Werke verfälschen). Beide werden gleichzeitig auf Deutsch, Türkisch und
Englisch nebeneinander angezeigt, damit dasselbe Stück in allen drei Sprachen gelesen werden kann. Über Sprach-Tabs lässt sich alternativ eine einzelne Sprache größer
und mit mehr Zeilenabstand anzeigen; ein Vorlesen-Button liest den Text der gewählten Sprache
vor - komplett offline, zweistufig: Haben die Eltern im Eltern-Bereich einmalig die natürlichen
Piper-Stimmen heruntergeladen (~230 MB: piper.exe + je eine neuronale "medium"-Stimme für
Deutsch/Türkisch/Englisch, auch die türkische Aussprache stimmt), wird satzweise per piper.exe
zu WAV synthetisiert und abgespielt - satzweise, damit die Wiedergabe sofort startet, während der
nächste Satz schon im Hintergrund erzeugt wird (PiperTtsEngine/TextToSpeechService). Ohne
Piper-Stimmen liest als Rückfall die Windows-eigene Sprachausgabe (System.Speech - eine
türkische SAPI-Stimme ist auf Windows oft nicht vorinstalliert; ohne passende Stimme liest die
Standardstimme). Ein LLM wäre hierfür das falsche Werkzeug: Sprachmodelle erzeugen Text, keine
Audiodaten - Piper ist das passende (und viel kleinere) dedizierte TTS-Modell. Soll laut
vorgelesen werden. Ein 5-Minuten-Timer läuft; "Weiter" ist erst danach nutzbar - es gibt bewusst
keine Überspringen-Funktion. Ob tatsächlich (laut) gelesen wurde, kann technisch nicht geprüft
werden – das ist eine bekannte, akzeptierte Grenze dieser Funktion. Der Pool gliedert sich in
zwei Kategorien:
NewsCategoryClassifier) - eine Minecraft-Meldung von tagesschau.de landet trotzdem in 🎮 Spiele.
Der Katalog umfasst 44 Quellen in drei Sprachen (Deutsch, Türkisch, Englisch - Englisch als
nebenbei-Lesetraining für die Fremdsprache ab Klasse 6). Abgerufen werden aber nicht alle:
RssNewsService.SelectFeedsForDay zieht täglich so viele Quellen, wie im Eltern-Bereich als
Nachrichten pro Tag eingestellt sind (Presets 6/10/12/15/20, Standard 12), verteilt die
Plätze über die Sprachen und wandert über die Tage durch den ganzen Katalog. Die Auswahl ist
aus dem Datum abgeleitet und innerhalb eines Tages stabil - beim zweiten Öffnen stehen dieselben
Artikel da. Aus jeder ausgewählten Quelle kommt genau der neueste Artikel.
Jugendschutz (NewsSuitability): hart gesperrt und nie ausgewählt ist, was in einer
Kinder-App nichts zu suchen hat (sexualisierte Gewalt, Suizid, Folter, Missbrauch, Massaker) -
das gilt in jeder Filterstufe. Der Umgang mit heiklen, aber lehrplanrelevanten Themen
(Krieg, Kriminalität, Unfälle) ist dagegen pro Kind im Eltern-Bereich einstellbar
(NewsFilterStrictness): Streng sperrt sie ganz, Normal (Voreinstellung) lässt sie zu,
behandelt sie aber nachrangig - aus einer Quelle gewinnt der unbedenklichste Artikel, erst bei
Gleichstand entscheidet die Aktualität -, Locker wertet nur noch die harte Sperre aus. Unter
zehn Jahren gilt unabhängig von der Einstellung immer Streng: eine Einstellung soll den Schutz
für ein Grundschulkind nicht aushebeln können. Die Stichwortlisten sind nach Sprache getrennt und prüfen ganze Wörter -
sonst hätte das englische "war" jeden deutschen Satz mit "war" getroffen.
Jeder Artikel erhält: Rubrik-Chip mit Emoji, geschätzte Lesedauer, Schwierigkeitsgrad
(🟢/🟡/🔴, Satz-/Wortlängen-Heuristik), sofort erklärte schwierige Wörter (kuratiertes
KidTermGlossary, ~55 Begriffe von Inflation bis Deepfake) und EINE Verständnisfrage, die
echtes Lesen verlangt: ein Lückentext aus der Zusammenfassung mit ausgeblendetem Schlüsselwort
(frühere Fragetypen wurden auf Nutzerwunsch entfernt: die „Nenne ein wichtiges Wort aus der
Überschrift"-Frage war ohne Lesen lösbar, und eine zusätzliche Rubrik-Frage erwies sich als
unnötig und bei Fehlklassifikation sogar unfair; ebenso die Einordnungs-Boxen „Warum ist das
wichtig?"/„Was bedeutet das für dich?" - der Fokus liegt auf der Nachricht selbst). Gibt die
Zusammenfassung keinen Lückentext her, bleibt der Artikel ohne Frage. Diese Verständnisfragen
zählen NICHT ins Abschlussquiz - sie werden ausschließlich hier im News-Bereich gestellt.
Mindest-Lesezeit: wie
bei den Fach-Übungen wird „Weiter" erst frei, wenn die Frage(n) beantwortet sind UND ein
20-Sekunden-Countdown abgelaufen ist - Nachrichten sollen gelesen, nicht weggeklickt werden.
Verstörende Themen (Krieg, Gewalt – auch türkischsprachige Schlüsselwörter) werden im Ranking
stark heruntergestuft. Finanzwissen: weil es zu Finanzthemen kaum kindtaugliche Tagesmeldungen
gibt, wird täglich ein rotierendes, kuratiertes Erklärstück angehängt (Was ist Geld? Inflation,
Sparen, Börse, Taschengeld, Berufswelt – mit handgeschriebenen Verständnisfragen, siehe
FinanceKnowledgeArticles). Wetter-Widget: oben rechts zeigt eine kleine Karte das heutige
Berlin-Wetter (Open-Meteo-API, kostenlos/ohne Schlüssel/ohne Konto) mit Emoji, Temperaturen und
einem kindgerechten Tages-Tipp („Pack einen Schirm ein!"); schlägt der Abruf fehl, bleibt das
Widget einfach ausgeblendet. Bezirks-Chip statt Karte: Artikel mit Berliner Ortsbezug
bekommen einen 📍-Chip mit dem Bezirk (BerlinDistrictDetector: alle 12 Bezirke plus ~45
bekannte Ortsteile/Kieze wie Wedding → Mitte; mehrdeutige Alltagswörter wie „Mitte" allein
werden bewusst nur in eindeutigen Formen wie „Berlin-Mitte" erkannt) - eine Offline-Karte ohne
Cloud-Kartendienst wäre unverhältnismäßig, der Kiez-Bezug ist die eigentliche Information.
Eine Marker-Leiste im Kopf zeigt je Artikel einen Kreis (grün mit ✓ =
Fragen beantwortet, auch aus einer früheren Session desselben Tages nach Absturz/Neustart;
lila = aktueller Artikel; grau = offen). Die Marker sind klickbar (direkt zum Artikel
springen). „Weiter" führt zum nächsten noch offenen Artikel; der Abschluss-Button
erscheint erst, wenn wirklich ALLE Artikel beantwortet sind. Automatischer Altersfilter:
bis einschließlich 9 Jahren (Profil-Alter) werden Artikel mit verstörenden Schlüsselwörtern
komplett ausgefiltert statt nur herabgestuft. Tages-Archiv & Offline-Rückfall (zweistufig):
Stufe 1 pro Feed - jeder erfolgreiche Feed-Abruf wird roh gecacht (FeedCache, komprimiert in
%LOCALAPPDATA%\LernTor\newscache); ist ein einzelner Feed nicht erreichbar, wird stattdessen
sein letzter Stand verwendet, sofern er jünger als 48h ist. Stufe 2 für den Totalausfall - die
aufbereiteten Tagesartikel werden automatisch ~7 Tage archiviert (ArchivedArticleRepository,
inkl. Verständnisfragen); sind morgens alle Feeds (auch per Cache) unerreichbar, liest das Kind
Artikel aus dem Archiv statt vor einem fast leeren News-Teil zu stehen. Der Vorrat reicht
21 Tage (vorher 7 - das deckt einen Router-Ausfall ab, aber keinen Urlaub), und welcher
Archiv-Tag genommen wird, wandert mit der Dauer des Ausfalls: am ersten Tag der jüngste
Stand, am zweiten der davor. Vorher kam immer derselbe, das Kind sah also jeden Morgen
dieselben Nachrichten inklusive derselben Verständnisfragen
(beides im Fehlerprotokoll vermerkt). (Eine frühere Lesezeichen-/Suchfunktion im News-Teil wurde auf
Nutzerwunsch wieder entfernt - im geführten Pflicht-Ablauf brachte sie keinen Mehrwert und
verschob das Layout.)ReviewQuestionRepository/ReviewQuestionEntity;
die neue Tabelle legt der automatische Schema-Abgleich selbst an.
Adaptive Übungsauswahl: die tägliche Aufgabenauswahl gewichtet Themen nach der
Trefferquote der letzten 30 Tage - Themen mit vielen Fehlern werden bis zu 3x so häufig
gezogen (AdaptiveTopicWeighting), sodass automatisch dort geübt wird, wo es hakt. Kein Thema
verschwindet dabei ganz, und Themen mit zu wenig Datenbasis (unter 3 Antworten) bleiben
neutral.
Spaced Repetition für richtig beantwortete Aufgaben: einmal richtig beantwortet (egal ob im
Übungsteil oder im Abschlussquiz), pausiert der exakte Fragetext für dieses Profil - aber nicht
für immer, denn Wissen zerfällt: nach wachsenden Abständen (Stufe 1 = 7 Tage, Stufe 2 = 30 Tage,
ab Stufe 3 alle 90 Tage, vereinfachtes Anki-Prinzip) wird die Aufgabe wieder fällig und kommt
zur Auffrischung erneut dran. Besteht das Kind die Auffrischung, steigt die Stufe; scheitert
sie, verfällt die Meisterung und die Fehler-Kartei übernimmt, bis die Aufgabe neu gemeistert
ist. Nebeneffekt: gemeisterte Aufgaben füllen die endlichen Themen-Pools (20 kuratierte
Beispiele je Thema, siehe docs/CURRICULUM.md) über die Zeit wieder auf.
Ist ein Themen-Pool aktuell komplett ausgeschlossen, greift die Aufgabenauswahl als Rückfall auf
Wiederholungen zurück, statt weniger Aufgaben als angefordert zu liefern. Siehe
MasteredPromptRepository/MasteredPromptEntity/SpacedRepetitionSchedule.
Mindest-Lernzeit pro Aufgabe: „Weiter" wird erst frei, wenn die Frage beantwortet ist UND ein
20-Sekunden-Countdown abgelaufen ist (sichtbar unter dem Button) - gegen das beobachtete wilde
Durchklicken, nur um schnell zum Quiz zu kommen. Erklärung-gelesen-Pflicht bei Fehlern:
nach einer falschen Antwort muss zusätzlich der Button „✔ Erklärung gelesen" gedrückt werden,
bevor „Weiter" freigegeben wird - das Feedback ist der eigentliche Lernmoment und darf nicht
ungelesen weggeklickt werden. Das Abschlussquiz hat bewusst weder Countdown noch
Bestätigungspflicht: dort bestraft sich Raten von selbst (unter der eingestellten Schwelle beim
ersten Versuch gibt es eine Wiederholung, siehe unten).Fortschritt wird laufend in einer lokalen SQLite-Datenbank gespeichert (%LOCALAPPDATA%\LernTor\lerntor.db),
ein Absturz oder Neustart verliert also keinen Fortschritt.
.NET 10 (LTS) + WPF, kein WinUI 3, kein Electron. (Bis 29.09.2026 .NET 8; umgestellt, weil dessen Support am 10.11.2026 endet - .NET 10 wird bis November 2028 unterstützt.) Begründung: Die sicherheitskritischste Anforderung (Kiosk-Sperre: Task-Manager deaktivieren, Windows-Taste/Alt+Tab abfangen) ist mit klassischen Win32-APIs (P/Invoke) am zuverlässigsten umsetzbar, und WPF hat dafür die geringste Reibung bei gleichzeitig moderner, gut stylebarer UI. Details siehe Projekt-Chatverlauf/Architektur-Entscheidung.
src/
LernTor.Core Domänenmodelle, Fortschritts-/Scoring-Logik (plattformunabhängig)
LernTor.ContentGen Regelbasierte Aufgabengeneratoren (Mathe/Deutsch/Türkisch/NaWi) + Quiz-Composer
LernTor.News RSS-Ingestion, Vereinfachung, Verständnisfragen-Generierung
LernTor.Data SQLite-Persistenz (EF Core): Fortschritt, Aktivitätsprotokoll, Einstellungen,
eigene (elternerstellte) Aufgaben
LernTor.Security Kiosk-Lock (Keyboard-Hook), Task-Manager-Policy, Autostart, Admin-Auth
LernTor.App WPF-UI (Kiosk-Shell, alle Bildschirme, DE/TR-Lokalisierung)
LernTor.Installer Inno-Setup-Skript + PowerShell-Autostart-Helfer
tests/
LernTor.Tests xUnit-Tests für Core/ContentGen/News
Umgesetzt ist ein Soft-Lock: Vollbild-Topmost-Fenster ohne Rahmen, globaler Keyboard-Hook
(blockiert Windows-Taste, Alt+Tab, Strg+Esc, Alt+Esc, Alt+F4) und eine Registry-Richtlinie, die den
Task-Manager deaktiviert, solange LernTor läuft. Start erfolgt über einen Windows-Autostart-Task
(Anmeldung-Trigger), kein Shell-Ersatz (explorer.exe bleibt unangetastet).
Bewusste Grenze: Strg+Alt+Entf (Secure Attention Sequence) kann von keiner Windows-Anwendung im User-Modus abgefangen werden – das ist ein OS-Schutzmechanismus. Die Task-Manager-Registry-Sperre greift aber auch dann, wenn ein Kind versucht, darüber den Task-Manager zu öffnen (es erscheint eine "vom Administrator deaktiviert"-Meldung). Ein sehr technisch versiertes Kind mit Admin-Wissen könnte dies dennoch umgehen – für den Einsatzzweck (Motivation/Struktur für 10-15-Jährige) ist das eine angemessene, dokumentierte Grenze. Ein härterer Shell-Ersatz-Modus wäre als spätere Erweiterung möglich, birgt aber das Risiko, den Desktop bei einem App-Absturz komplett unbenutzbar zu machen, und wurde deshalb bewusst nicht umgesetzt.
LearningProgressTracker): auf demselben Bildschirm steht Fach für
Fach, wie sich das Kind entwickelt hat - "Mathematik 20 % → 70 %, ↑ 50 Punkte besser". Verglichen
werden die letzten 14 Tage mit den 14 Tagen davor, aus dem vorhandenen Aktivitätsprotokoll.
Hintergrund: die Kinder tragen die ganze Arbeit, sahen davon aber als Einziges eine Sternezahl -
und die sagt nichts darüber, ob man besser geworden ist, und hängt daran, dass Eltern Belohnungen
eintragen. Kein Vergleich mit dem Geschwisterkind: der ist eine bewusste Eltern-Entscheidung
und steht abschaltbar im Eltern-Bericht; hier geht es ausschließlich um das Kind und sein früheres
Ich. Ein Fach erscheint nur, wenn es in beiden Zeiträumen mindestens 5 Aufgaben gab - eine
Aussage aus drei Aufgaben ist Zufall, kein Fortschritt; ein neu begonnenes Fach zeigt deshalb
nicht "0 % → 80 %". Veränderungen unter 5 Punkten gelten als "gleich geblieben". Rückschritte
werden gezeigt, aber nicht angeprangert: sie zu verschweigen wäre unehrlich, sie rot zu
markieren wäre eine Strafe für etwas, das jedem passiert - hervorgehoben werden nur
Verbesserungen, der Rest steht neutral da.TopicMasteryCalculator): jedes geübte Thema steht auf einer von vier Stufen – 🌱 angefangen
(unter 5 Antworten), 📘 vertraut, ✅ sicher (zuletzt ab 70 % richtig), 🏆 gemeistert (zuletzt ab
90 % und zwei Fragen daraus haben nach Tagen eine Wiederholung bestanden – Behalten, nicht nur
frisch Können). Gezählt werden die letzten 10 Antworten, damit Fortschritt sichtbar wird; Stufen
können auch wieder sinken. Erreichbar über „🏆 Mein Fortschritt“ auf der Startseite, auch aus dem
Planer heraus. Bewusst kein Rot für schwache Themen. Eltern sehen dieselbe Auswertung je Fach im
Bericht.AchievementCatalog): 25 Abzeichen für echte
Leistungen – 100/500/1000 richtige Aufgaben, 10/50/100 Lerntage (gesamt, keine Serie),
korrigierte Fehler aus der Fehler-Kartei, sichere und gemeisterte Themen, „Dreisprachig“,
„Allrounder“, fehlerfreies Abschlussquiz, Tipptrainer, alle Verkehrszeichen. Nichts verfällt:
ein Abzeichen wird einmal gespeichert und nie entzogen. Neue erscheinen nach dem bestandenen
Abschlussquiz als goldene Zeile, alle zusammen in „Mein Fortschritt“ (offene blass mit dem Weg
dorthin; Abzeichen abgeschalteter Bereiche werden ausgeblendet).LearningCalendar): oben in „Mein Fortschritt“ die letzten
zwölf Wochen als Kalender – gelernt (grün mit Häkchen), Schultag, schulfrei (nur Rand; Wochenende,
Feiertage, Ferien) – dazu „42 Lerntage insgesamt · 11 in den letzten vier Wochen“. Keine Serie.SpeechSegmenter): neben jeder Frage in Übung, Nachrichten
und Abschlussquiz. Deutsche Anweisungen liest die deutsche Stimme, englische und türkische Sätze
ihre eigene; nach dem Antworten lässt sich die englische/türkische Lösung anhören. Der Knopf
erscheint nur, wenn es für jede Sprache der Frage eine Stimme gibt (Piper oder Windows).Eigener Lernbereich mit drei Unterbereichen (Verkehrszeichen, Theoriefragen, Theorie-Kurs),
angelehnt an den Aufbau von fahrschule24.de. Details in docs/FUEHRERSCHEIN.md.
src/LernTor.App/Assets/Verkehrszeichen/QUELLEN.md), als
Resource in LernTor.App.csproj eingebettet statt als lose Dateien - sie überstehen damit den
Single-File-Publish unverändert, die App bleibt vollständig offline. TrafficSignVisual
zeichnet die Bilddatei; ein nachgezeichneter Pfad (SignPictograms, Geometriepfade in einem
0..100-Feld) bleibt als Rückfallebene stehen, falls für eine Nummer je keine Bilddatei vorläge.Eigener Bereich zwischen KI-Bereich und Führerschein, pro Kind im Eltern-Bereich abschaltbar.
Auf der Startseite eine Kachel, im Eltern-Bereich die vollständige Liste.
SchoolCalendar). Die App ist ein Kiosk ohne
verlässliche Netzverbindung; ein Kalender, der beim Start hängt oder leer bleibt, wäre schlimmer
als gar keiner. Termine ändern sich einmal im Jahr - das Nachtragen ist ein normaler Code-Review.Unten links führt ein Knopf aus jeder Etappe zurück zu Hausaufgaben und Klausurplan - und von dort mit "Zurück zum Lernen" an genau dieselbe Stelle. Vorher kam man dort nur vor dem ersten Bereich hin; wer schon losgelegt hatte, musste bis zum Abschlussquiz durch, um nachzusehen, was aufhat.
Zwei Dinge daran sind wichtig:
IPausableStage). Liefe
sie weiter, wäre der Planer der bequemste Weg, eine Mindestverweildauer abzusitzen: aufmachen,
warten, zurück. Freigeschaltet oder übersprungen wird durch den Planer nichts.Auch nach dem Abschlussquiz. Auf dem "Geschafft!"-Bildschirm steht derselbe Knopf - dort heißt er nur "Zurück zum Ergebnis" statt "Zurück zum Lernen", weil es nichts mehr zu lernen gibt. Genau in diesem Moment will ein Kind wissen, was morgen ansteht: Stundenplan, Hausaufgaben, Klausurtermine. Ohne den Knopf führte von dort nur noch "PC jetzt benutzen" weiter - und damit beendet sich LernTor, der Plan war weg.
PauseMode in Core (mit Tests) statt zweimal ausgeschrieben. Der Entsperren-
Knopf hängt an genau derselben Bedingung wie der Bildschirm: läuft keine Pause, existiert weder
das eine noch das andere - es gibt keine Abkürzung um die tägliche Lernstrecke herum. Beendet ein
Elternteil die Pause im Eltern-Bereich, verschwindet der Bildschirm samt Knopf sofort, nicht erst
beim nächsten Start.SubjectTimeAnalyzer): wie viel Zeit ein Fach gekostet hat, die
typische Dauer je Aufgabe (Median) und - der eigentliche Punkt - was beides zusammen mit der
Trefferquote bedeutet. Eine niedrige Quote allein unterscheidet nicht zwischen geraten
(schnell und falsch) und nicht verstanden (langsam und falsch); das sind zwei verschiedene
Probleme mit zwei verschiedenen Reaktionen. "Schnell" und "langsam" sind dabei relativ zum
Kind selbst definiert (Vergleich mit dem Median über alle seine Fächer) - ein gründliches Kind
braucht überall länger, das darf nicht jedes Fach als Problem markieren.FeedHealthLog, gespeichert in %LOCALAPPDATA%\LernTor\feedhealth.json) - "✓ heute geladen"
oder "⚠ vor 3 Tagen fehlgeschlagen: …", fehlgeschlagene rot. Der Zeitpunkt steht bewusst dabei:
seit der Tagesrotation wird nicht mehr jede Quelle täglich abgerufen, ein Eintrag kann also Tage
alt sein. Nötig, weil die App tote Feeds geräuschlos überspringt - bei 44 Quellen könnte sonst
die Hälfte kaputt sein, ohne dass es auffällt.TimetableToday, nutzt denselben
SchoolCalendar wie die Ferien-Kachel). Die laufende Stunde ist hervorgehoben.
Das Zeitraster hängt am Profil, nicht an der App: die beiden Kinder gehen auf verschiedene
Schulen mit verschiedenen Anfangs- und Endzeiten, ein fest eingebautes Raster hätte bei einem
von beiden immer danebengelegen. Eingetragen wird im Eltern-Bereich in einem Raster Mo–Fr ×
10 Stunden mit den Uhrzeiten daneben; wer lieber tippt, kann den Plan auch als Text einlesen
(Mo: 1 Deutsch, 2 Mathe, 3 Sport (TH1) - füllt nur das Raster, gespeichert wird erst
ausdrücklich). Das Fach bleibt freier Text, kein Subject-Enum: auf einem echten Plan
stehen NaWi, GeWi, Sport, WPU Spanisch oder Klassenrat, und die kennt LernTor als Lernbereich
nicht - angezeigt wird deshalb genau das, was auf dem Plan der Schule steht; die Zuordnung zu
einem LernTor-Fach entscheidet über das Symbol davor und über die Fächer des Tages (siehe
nächster Punkt).TimetableSubjectPlanner). Die Pläne 2026/27 zum Einfügen stehen in
docs/STUNDENPLAENE-2026-27.md.
Bewusst kein PDF-Importeur: die Pläne der beiden Schulen sehen völlig verschieden aus - der
eine ein eingescannter Untis-Ausdruck, dessen Textebene aus OCR stammt und sichtbare Lesefehler
enthält, der andere eine Word-Tabelle mit umbrochenen Zellen. Ein Importeur müsste bei jedem
neuen Plan neu raten, und ein still falsch übernommener Stundenplan ist schlechter als gar
keiner, weil ihn niemand nachprüft.DeleteAsChildAsync), nicht nur an der
Oberfläche. Die Herkunft steht an jedem Eintrag. Ab sieben Tagen vor dem Termin bekommt das
betroffene Fach automatisch mehr Übungsaufgaben, steigend bis zum Doppelten am Vortag
(ExamEntry.LearningWeight, nach oben auf +8 Aufgaben gedeckelt). Der Lernplan macht das
sichtbar (ExamStudyPlanner): an der Klausur steht, was heute deswegen dran ist - "Heute
dran: Bruchrechnen". Vorher erhöhte die Gewichtung die Aufgabenzahl still; das Kind merkte nur,
dass es plötzlich mehr Mathe gibt, ohne den Zusammenhang zu sehen. Die eingetragenen Themen
werden über die Vorlauftage verteilt und dabei wiederholt durchlaufen - bei zwei Themen und
sieben Tagen kommt jedes mehrfach dran, und genau das ist der Sinn des Vorlaufs. Höchstens zwei
Themen pro Tag (eine lange Liste ist kein Plan), der Tag vor der Klausur ist Wiederholung
über alles - am Vorabend ein neues Thema anzufangen hilft niemandem. Ohne eingetragene Themen
wird nichts erfunden: dann steht dort nur "Deshalb gibt es heute mehr Mathe-Aufgaben", denn
ein ausgedachter Plan wäre schlimmer als keiner - das Kind würde ihm glauben. Bewusst lokal statt Google
Calendar: OAuth bräuchte einen echten Browser, und ein Browserfenster in einer Kiosk-App ist
genau das Loch, das die Kiosk-Sperre verhindern soll. Die Lern-Gewichtung ginge zudem nur online.
Als Brücke gibt es ICS-Import und -Export (IcsCalendar, RFC 5545): eine .ics-Datei ist
reiner Text, den Schulportal, Outlook, Apple und Google alle lesen und schreiben - ohne Konto,
ohne Netz. Beim Import wird das Fach aus dem Titel erraten ("Mathearbeit" → Mathematik); passt
nichts, bleibt es offen, statt still ein falsches Fach zu setzen und damit die Übungsgewichtung
zu verstellen. Vergangene Termine werden gar nicht erst angeboten.=/;/Tabulator/Bindestrich als Trenner). Die Vokabeln laufen in den
bestehenden Fächern Englisch und Türkisch mit und ersetzen dort bis zur Hälfte der Aufgaben,
statt den Tag zu verlängern. Abgefragt wird abwechselnd in beide Richtungen; eine richtig
beantwortete Vokabel pausiert 7/30/90 Tage und kehrt dann zur Auffrischung zurück. Anders als bei
der Fehler-Kartei verschwindet eine Vokabel nie aus dem Bestand - sie gehört zum Wortschatz.VACUUM INTO (konsistenter Snapshot bei laufender App); der Import ersetzt
die aktive Datenbank nach Bestätigung und beendet die App, beim nächsten Start ist der gesicherte
Stand aktiv. Auch eine Sicherung aus einer älteren App-Version funktioniert (der automatische
Schema-Abgleich ergänzt fehlende Tabellen/Spalten beim Start).AutoBackupPolicy / AutoBackupService): die App legt beim Start
selbst Kopien der Datenbank unter %LOCALAPPDATA%\LernTor\sicherungen\ an - einmal täglich
und, viel wichtiger, immer bevor sich am Aufbau der Datenbank etwas ändert. Hintergrund: der
Schema-Abgleich beim Start (siehe unten) kann nur additive Änderungen; bei einer umbenannten
Spalte oder umgedeuteten Werten bliebe sonst nur "lerntor.db löschen" - und damit wären Sterne,
Fortschritte und Fehler-Kartei beider Kinder weg. Erkannt wird das an einem Fingerabdruck des
EF-Modells (SchemaFingerprint, Datei neben der Datenbank), der vor dem Abgleich mit dem zuletzt
gespeicherten verglichen wird - danach gezogen wäre die Sicherung wertlos, weil sie schon den
neuen Stand enthielte. Es bleiben die fünf neuesten liegen, plus dauerhaft die neueste
Sicherung vor einer Schemaänderung: lernt ein Kind danach eine Woche weiter, hätten die
täglichen Kopien genau die eine verdrängt, die den Umbau rückgängig machen könnte. Fehler beim
Sichern (volle Platte, gesperrte Datei) werden protokolliert und geschluckt - ein Kind, das
wegen einer Sicherung nicht lernen kann, wäre der schlechtere Zustand. Das ersetzt die
Sicherung von Hand nicht: diese Kopien liegen auf derselben Platte und überleben deren Defekt
nicht. Der Eltern-Bereich zeigt Anzahl und Datum der neuesten und öffnet den Ordner per Knopf.DictationEvaluator / DictationContentProvider): ein Satz wird
vorgelesen statt angezeigt (Piper bzw. Windows-Sprachausgabe, siehe Lesen), das Kind tippt
ihn, die App vergleicht Wort für Wort. Rechtschreibung ist der eine Bereich des
Deutschunterrichts, den Multiple Choice strukturell nicht abdecken kann: sobald die richtige
Schreibweise als Option dasteht, wird wiedererkannt statt geschrieben. Zwei bewusste
Entscheidungen bei der Bewertung: Satzzeichen entscheiden nicht über richtig/falsch - die
Sprachausgabe spricht kein Komma, und einem Kind vorzuwerfen, es habe etwas nicht geschrieben,
das es nicht hören konnte, wäre unfair; Groß- und Kleinschreibung entscheidet dagegen sehr
wohl - sie ist im Deutschen regelbasiert und damit genau das, worum es bei einem Diktat geht.
Vorlesen ist beliebig oft möglich (eine Lehrkraft liest ein Diktat auch mehrmals). Die
Rückmeldung nennt nicht nur "falsch", sondern welches Wort es war ("belt" → "bellt"); der
richtige Satz erscheint erst nach dem Absenden. 40 Sätze (20 je Stufe), jeder auf eine
Rechtschreibfalle gebaut - das/dass, ss/ß, Dehnungs-h, Groß-/Kleinschreibung,
Doppelkonsonanten -, 6 bis 10 Wörter lang. Läuft als normales Deutsch-Thema mit: Fehler-Kartei
und Spaced Repetition greifen unverändert.ReadingTextImport): roher Extraktionstext hat harte
Zeilenumbrüche mitten im Satz, am Zeilenende getrennte Wörter ("Wan-/derer"), Seitenzahlen und
unsichtbare Sonderzeichen zwischen den Absätzen - einem Kind so etwas vorzusetzen wäre schlimmer,
als es abzutippen. Absätze werden zusammengefasst, Trennungen aufgelöst, Seitenzahlen entfernt
(aber als Absatztrenner behandelt, damit nicht zwei Absätze verkleben), zu lange Texte an einer
Absatz- oder Satzgrenze gekürzt (nie mitten im Wort) und die Kürzung wird gemeldet. Bewusst
regelbasiert ohne LLM - für "Zeilenumbrüche zusammenfassen" ein Mehr-Gigabyte-Modell zu laden
wäre die falsche Größenordnung. Gefüllt wird das Formular, nicht die Datenbank: kein Extraktor
trifft aus einem Schulbuch-PDF auf Anhieb genau den gemeinten Abschnitt, also prüfen und speichern
die Eltern. Bei eingescannten Seiten (Bild statt Text) sagt die App ehrlich, dass nichts zu holen
ist, statt ein leeres Formular stehen zu lassen.WorksheetExport): erzeugt aus dem gewählten Fach und der
Klassenstufe des gewählten Kindes ein Blatt mit 8/12/20 Aufgaben als HTML-Datei - für
Klausurvorbereitung am Küchentisch, ohne PC. Wer eine Rechnung aufschreibt, statt eine von drei
Optionen anzuklicken, rechnet sie wirklich. Die Aufgaben werden neu gezogen, nicht aus dem
Bildschirm-Pensum kopiert (sonst wäre es Abschreiben). Die Lösungen stehen auf einem eigenen
zweiten Blatt, hinter einem harten Seitenumbruch - stünde die Antwort neben der Aufgabe, wäre
das Blatt wertlos. Antwortoptionen werden gemischt (ungemischt wäre fast immer "A" richtig, weil
die Generatoren die richtige Antwort meist zuerst anlegen) und der Lösungsbuchstabe passt zur
gedruckten Reihenfolge. Offene Aufgaben bekommen zwei Schreiblinien für den Rechenweg. Diktate
erscheinen nicht auf dem Aufgabenblatt - der Satz darf ja nicht dastehen -, dafür auf dem
Lösungsblatt unter "Zum Vorlesen", von wo ein Elternteil sie diktieren kann.ReportExport).ProfileComparison).lerntor.db.LernTor.Core.Logging.AppLog): eine Log-Datei pro Tag unter
%LOCALAPPDATA%\LernTor\logs\lerntor-JJJJ-MM-TT.log (älter als 14 Tage wird automatisch
gelöscht; komplett lokal, keine Telemetrie). Protokolliert wird genau das, was die App dem Kind
gegenüber bewusst verschluckt: übersprungene News-Feeds mit Quelle und Grund, fehlgeschlagene
Modell-/Piper-Downloads je Spiegel-URL, Wetter-Ausfälle, TTS-Rückfälle (fehlende SAPI-Stimme,
Piper-Fehler) sowie unbehandelte Abstürze mit vollem Stacktrace. Absturzverhalten im
Kiosk-Modus: kein Windows-Fehlerdialog auf dem Kinder-Bildschirm - die App protokolliert still
und startet sich automatisch neu, damit ein Absturz die Lernpflicht nicht aushebelt. Ein
Crash-Loop-Guard (CrashRestartGuard, max. 3 Neustarts in 10 Minuten) verhindert
Endlosschleifen; danach greift bewusst das Soft-Lock-Prinzip und der Desktop bleibt erreichbar.
Im Dev-Modus (LERNTOR_SKIP_LOCK=1 oder Debugger) erscheint stattdessen wie bisher eine
MessageBox mit dem vollen Fehler. Der Eltern-Bereich zeigt die letzten Zeilen des heutigen
Protokolls direkt an ("Heute wurden keine Probleme protokolliert 👍", wenn leer) und öffnet den
Log-Ordner per Button im Explorer. Das Protokollieren selbst wirft nie Exceptions - ein Logger,
der die App crasht, wäre schlimmer als keiner.CustomQuestionRepository/CustomQuestionEntity,
Tabelle CustomQuestions), unabhängig von den generierten Aufgaben. Diese Aufgaben werden additiv
zu den generierten Übungsaufgaben (passendes Fach + Klassenstufe) und zum Abschlussquiz
hinzugefügt - sie ersetzen die Generatoren nicht. Löschbar über den "Löschen"-Button je Eintrag.Bewusst keine Zeitlimit-Funktion: Es gibt kein tägliches Zeitlimit für die Lernsession - die Kinder sollen so viel Zeit erhalten, wie sie zum Durcharbeiten von Lesen/Fächern/Abschlussquiz benötigen. Das ist eine bewusste Design-Entscheidung, kein technisches Versäumnis.
Die aktuelle Arbeitsliste steht in docs/NAECHSTE-SCHRITTE.md. Dieser Abschnitt beschreibt dauerhafte Grenzen und Entwurfsentscheidungen.
LocalLlmModelHost (src/LernTor.ContentGen/Llm/LocalLlmModelHost.cs) lädt das GGUF-Modell
über LLamaSharp (llama.cpp-Bindings, Pakete LLamaSharp +
LLamaSharp.Backend.Cpu, reines CPU-Backend ohne CUDA-Abhängigkeit) genau einmal und hält es im
Speicher, statt es bei jedem Aufruf neu zu laden.LocalLlmModelCatalog.cs): Eltern wählen im
Eltern-Bereich per Dropdown eines der kuratierten Modelle; die Datei wird beim ersten Gebrauch
automatisch nach %LOCALAPPDATA%\LernTor\models\ heruntergeladen (einmalig Internet nötig, danach
komplett offline; jedes Modell hat seine eigene Datei, ein Wechsel lädt also nur einmal herunter).
-00001-of-00002-Teildateien, dort existiert die 7B-Einzeldatei-URL nicht),
mit Spiegel-Liste pro Modell - schlägt eine Quelle fehl, wird die nächste probiert. Modell- und
Dateiauswahl im Eltern-Bereich werden sofort gespeichert (nicht erst über den
"Speichern"-Button - das war ein gemeldeter Bug).
Die Hugging-Face-URLs bleiben aus der Entwicklungsumgebung heraus nicht verifizierbar
(huggingface.co dort blockiert); schlägt der Download trotz Spiegel-Liste fehl, zeigt die App eine
klare Fehlermeldung (inkl. Modellname, Größe und technischem Grund) und Eltern können ein anderes
Modell wählen oder manuell eine .gguf-Datei über den Datei-Dialog hinterlegen (eigene Datei hat
Vorrang vor dem Katalog, "✕" entfernt sie wieder).LLamaSharp 0.27.0 wurde real von nuget.org heruntergeladen und die
kompilierte DLL per CLR-Metadaten-Analyse geprüft (nicht nur aus Dokumentation/Training geraten):
ModelParams(string modelPath)-Konstruktor mit settable ContextSize/GpuLayerCount-Properties,
statisches LLamaWeights.LoadFromFile(ModelParams),
StatelessExecutor(LLamaWeights, IContextParams, ILogger?)-Konstruktor (baut sich seinen
Inferenz-Kontext laut Metadaten-Analyse intern selbst auf - ein separat per
LLamaWeights.CreateContext(...) erzeugter Kontext wird gar nicht entgegengenommen) sowie
InferAsync(string, InferenceParams?, CancellationToken), das laut TypeRef-Analyse
IAsyncEnumerable<string> liefert (per await foreach zum vollständigen Antworttext
zusammengesetzt). LLamaWeights implementiert IDisposable.src/LernTor.ContentGen/TeacherImport/): PDF
(PdfPigTextExtractor) bzw. .docx (OpenXmlWordTextExtractor, kein altes binäres .doc) → Fließtext →
LocalLlmQuestionSuggester stellt eine Frage nach strukturiertem JSON mit Quizfragen. Ergebnisse sind
immer nur Vorschläge (ExtractedQuestionDraft, mit SourceExcerpt = Textstelle im Original) - Eltern
müssen im Eltern-Bereich jeden Vorschlag einzeln über "Übernehmen" bestätigen oder "Verwerfen", bevor
er via CustomQuestionRepository.AddAsync gespeichert wird. Keine automatische Übernahme ohne
menschliche Kontrolle. Der manuelle Editor (siehe "Eltern-Features") funktioniert unabhängig davon
weiterhin normal.
src/LernTor.App/Controls/QuestionCard.xaml, "🤖 KI fragen"-Button):
Kinder können zu jeder Aufgabe - in News, Übungen und im Abschlussquiz gleichermaßen, da alle drei
dieselbe QuestionCard verwenden - dem KI-Assistenten Rückfragen stellen, so wie sie einen
Taschenrechner benutzen würden: als Werkzeug, mit dem man sich auseinandersetzt, nicht als reinen
Lösungsautomaten. Der Prompt (HomeworkChatPromptBuilder, src/LernTor.ContentGen/HomeworkChat/)
bekommt bewusst die richtige Antwort und die Erklärung der Aufgabe MIT in den Kontext - ohne sie zu
kennen, könnte die KI nur raten statt wirklich zu helfen. Die Leitplanke ist eine reine
Prompt-Anweisung: die fertige Antwort nicht schon in der ersten Nachricht preiszugeben, sondern zuerst
durch Rückfragen und Denkanstöße zu helfen - erst wenn das Kind es mehrfach probiert hat oder
ausdrücklich danach fragt, soll die KI die Lösung erklären.LernTor.News/NewsFeedSource.cs), inklusive einer
KI-/Technik-Quelle (heise online, IT Boltwise), einer dedizierten Spiele-Quelle (GameStar) sowie
offizieller Bundesregierungs-Quellen (Bundesregierung
kompakt, Bundesregierung Pressemitteilungen, BMBFSFJ für Bildungs-/Familienthemen), dazu einer
Herabstufung (nicht Ausfilterung) von Artikeln mit verstörenden Themen (Krieg, Gewaltverbrechen, ...)
über SensitiveKeywords. RSS-URLs von Nachrichtenseiten ändern sich gelegentlich – nicht erreichbare
Feeds werden übersprungen, sollten aber gelegentlich geprüft werden. Inzwischen auf einem echten
Windows-Rechner getestet und bestätigt funktionsfähig (inkl. der neuen heise.de-Quelle).ITextSimplifier-Interface in LernTor.News als zweite
Implementierung ergänzen, ohne den Rest der App anzufassen..github/workflows/build.yml auf windows-latest), da diese Entwicklungsumgebung selbst kein
Windows bereitstellt.git clone <repo>
cd HeroKid
dotnet restore LernTor.sln
dotnet build LernTor.sln
$env:LERNTOR_SKIP_LOCK = "1" # WICHTIG für die Entwicklung: verhindert die Kiosk-Sperre!
dotnet run --project src/LernTor.App
Vollständige Build-/Installationsanleitung: docs/BUILD.md.
Weitere technische Details: