OrhanHero/HeroKid

C#

4

202 commits

updated Oct 1, 2026

See the code

README

LernTor

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).

Dokumentation

DokumentInhalt
docs/DESIGN.mdDesigns (seit 3.0): Farbrollen, Kontrastregeln, ein Design hinzufügen, Bildschirmfotos der CI
docs/NAECHSTES-LEVEL-3-1.mdVersion 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.mdPlan 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.mdPlan vom 29.09.2026: .NET 10, Abzeichen, Meisterschaft je Thema, größere Pools
docs/NAECHSTE-SCHRITTE.mdWas als Nächstes zu tun ist, und was am 28.09.2026 erledigt wurde
docs/WIEDERHERSTELLUNG.mdNotfall: Sicherung einspielen, App startet nicht, Kiosk lösen
docs/STUNDENPLAENE-2026-27.mdStundenpläne der Kinder zum Einfügen
docs/TESTPLAN.mdTestprotokoll nach Rollen
docs/PLAN.mdPlan nach Risiko, mit Begründungen
docs/BUILD.mdBauen, Installieren, Datenbankschema
docs/CURRICULUM.md, docs/FAECHER-SYSTEM.mdThemen je Fach und Stufe, Verdrahtung neuer Fächer
docs/TIPPTRAINER.md, docs/FUEHRERSCHEIN.mdTipptrainer, Führerschein-Bereich
docs/PILOT-CHECKLISTE.mdInstallation und Bypass-Härtetest am echten PC

Profile

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.

Ablauf für das Kind

  1. Profil wählen
  2. Lesen (Pflicht, nicht überspringbar) – täglich zwei wechselnde Stücke aus einem festen Pool von 63 Texten (siehe 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:
    • 33 literarische/Allgemeinwissen-Stücke: gemeinfreie Gedichte/Texte (Goethe, Heine, Yunus Emre, Schiller, Rilke, Fontane, Robert Frost, William Blake, Lewis Carroll, u.a.) sowie kurze "kurz erklärt"-Sachtexte (Berlin, Sonnensystem, Menschenrechte, EU, ...). Fremdsprachige Originale werden mit eigenen, freien Übertragungen (keine fremden Übersetzungen) begleitet.
    • 30 Pop-Kultur-Kurzgeschichten: eigens verfasste, kindgerechte Abenteuergeschichten rund um Minecraft, Minecraft Legends, Super Mario, AntonCraft, Geometry Dash, Rock'n'Roll, Pac-Man, Kirby, Batman, One Punch Man, Dragon Ball, One Piece und Backrooms. Diese Texte referenzieren die Marken/Figuren nur namentlich als Thema; Handlung, Dialoge und Wortlaut sind komplett neu und zitieren kein geschütztes Spiel-/Comic-/Anime-Material. (Eine Anbindung an lyrikline.org wurde bewusst nicht umgesetzt: aus dieser Entwicklungsumgebung war der Zugriff auf die Seite nicht möglich, und ihre zeitgenössischen Gedichte/Übersetzungen sind urheberrechtlich geschützt und dürften ohne Erlaubnis nicht in die App übernommen werden.)
  3. Tipptrainer – der 10-Finger-Trainer mit mehreren aufeinander aufbauenden Lektionen, virtueller Tastatur, Live-Feedback zu Eingaben, Genauigkeit und Geschwindigkeit. Nur deutsche Sprache und QWERTZ-Tastaturlayout (keine türkischen/englischen Wörter mehr). Nach jeder abgeschlossenen Lektion erscheint der gewohnte Weiter-/Wiederholen-Dialog; ist wirklich alles erledigt, zeigt das Dashboard unten ein Glückwunsch-Panel mit einem Button weiter zu den News. Profil-spezifische Abschluss-Lektion: Emirhan (Klasse 6) tippt einen persönlichen Steckbrief-Text (Name, Geburtsdatum, Adresse, Telefon, Eltern, Schule 6c, Lieblingsessen, Hobbys), Batuhan (Klasse 9) seinen eigenen Steckbrief (Geburtsdatum, Adresse, Telefon, Eltern, Gymnasium 9a, Lieblingsessen, Hobbys). Der Tipptrainer ist eine eigene feste Stage und gehört nicht zum Fachcurriculum.
  4. News für Kinder (Pflicht) – kuratierte RSS-Artikel, verständlich, neutral und ohne Angstmache aufbereitet (sprachliches Vorbild: logo!/Checker-Sendungen). Rubriken: 🐻 Berlin (wichtigste regionale Rubrik, garantierte Plätze), 🇩🇪 Deutschland, 🌍 Welt, 🇹🇷 Türkei (täglich garantierte Plätze; seriöse Quellen: Anadolu Ajansı, TRT Haber, DW Türkçe – bewusst keine Boulevardquellen), 🤖 KI & Technik, 🎮 Spiele, 🔬 Wissen, ⚽ Sport, ⛅ Wetter. Themen-Rubriken werden zusätzlich per Schlüsselwort-Klassifikation quer über alle Quellen erkannt (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.)
  5. Fachbereiche (alle nicht von den Eltern deaktivierten, Klassenstufe des Profils): Mathematik, Deutsch, Türkisch, Englisch, Biologie, Chemie, Physik, Gesellschaftswissenschaften (Gewi), Politik, Geografie, Ethik, Medienbildung (ITG) – siehe docs/CURRICULUM.md für die genauen Themen je Fach. Bei offenen Mathematik-Aufgaben steht ein Taschenrechner zur Verfügung; Aufgaben mit hinterlegtem Tipp zeigen einen abrufbaren Formel-/Vorgehens-Hinweis (verrät nicht die Lösung). Fehler-Kartei (vereinfachtes Spaced-Repetition): im Übungsteil falsch beantwortete Aufgaben werden als Schnappschuss gespeichert (generierte Aufgaben wären am Folgetag nicht reproduzierbar) und erscheinen an FOLGETAGEN im selben Fach zuerst wieder (mit 🔁 markiert, am häufigsten falsch beantwortete zuerst, nie am selben Tag erneut) - bis sie zweimal in Folge richtig beantwortet wurden, dann gelten sie als gelernt und verschwinden. News-Fragen sind ausgenommen (deren Tagesartikel gibt es später nicht mehr). Siehe 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).
  6. Abschlussquiz – gemischte Fragen aus allen aktiven Fächern (Anzahl je Fach passt sich automatisch an, wie viele Fächer aktiv sind), Nachrichten-Verständnisfragen zählen NICHT mit (die werden nur im News-Bereich selbst gestellt). Erster Versuch am Tag: exakt 20 Fragen, Bestehens-Schwelle ist im Eltern-Bereich pro Profil einstellbar (Presets 50/75/85%, Standard 50%) → ab dieser Trefferquote wird der PC freigeschaltet. Bei Nichtbestehen ein kürzeres Wiederholungsquiz mit exakt 15 Fragen: schwache Fächer bekommen konzentriert Fragen (mind. 2 je Fach), der Rest füllt ein allgemeines Mini-Quiz über alle aktiven Fächer auf - für diesen zweiten Anlauf gilt eine eigene, niedrigere Bestehens-Schwelle (Presets 25/50%, Standard 25%, ebenfalls pro Profil einstellbar); wird auch diese nicht erreicht, gibt es einen weiteren Wiederholungsanlauf. Antwortoptionen bei Multiple-Choice-Fragen werden bei jeder Anzeige neu gemischt, damit die richtige Antwort nicht immer an derselben Stelle steht.

Fortschritt wird laufend in einer lokalen SQLite-Datenbank gespeichert (%LOCALAPPDATA%\LernTor\lerntor.db), ein Absturz oder Neustart verliert also keinen Fortschritt.

Architektur & Technologie-Entscheidung

.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

Kiosk-Sperre: was sie tut und was sie NICHT tut

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.

Motivation & Gamification

  • Belohnungs-Sterne: +2 fürs Lesen, +2 für News, +1 je abgeschlossenem Fach, +5 fürs bestandene Abschlussquiz - nur echte Abschlüsse zählen, von Eltern deaktivierte (übersprungene) Fächer geben keine Sterne. Heute verdiente Sterne und der Gesamtstand erscheinen auf dem Abschluss-Bildschirm; der über alle Tage gesammelte Gesamtstand (⭐) steht auf der Profil-Kachel.
  • Etappen-Leiste: oben im Kiosk-Fenster zeigen fünf Chips (Lesen → Tippen → News → Fächer x/y → Quiz) jederzeit, wo das Kind in der heutigen Session steht - erledigt = grün mit Häkchen, aktuell = lila.
  • Konfettiregen: beim bestandenen Abschlussquiz fällt einmalig Konfetti in den App-Farben über den Ergebnis-Bildschirm (einmalige Animation, keine Dauerschleife - keine bleibende CPU-Last im Kiosk-Betrieb).
  • Tages-Zusammenfassung: der Freigeschaltet-Bildschirm zeigt, was das Kind heute geschafft hat - 📚 beantwortete Aufgaben, ✅ Trefferquote und (falls eingeschaltet) die 🔥-Lernserie. Der Moment der Freischaltung ist der emotionale Höhepunkt des Ablaufs; hier soll sichtbar werden, WAS erreicht wurde, nicht nur DASS der PC frei ist.
  • 📈 Eigene Entwicklung (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.
  • 🎁 Belohnungsliste: Eltern legen im Eltern-Bereich Belohnungen mit Sterne-Kosten an (z.B. „30 Minuten extra Spielzeit" für 20 ⭐). Nach dem bestandenen Abschlussquiz sieht das Kind die Liste mit Fortschritt („12 / 20 ⭐") und kann erreichbare Belohnungen einlösen (mit Rückfrage; Abbuchung + Protokolleintrag passieren in einem Schritt). Eingelöste Belohnungen erscheinen je Profil im Eltern-Bereich - eingelöst wird in der echten Welt von den Eltern. Die Historie bleibt als Schnappschuss erhalten, auch wenn die Belohnung später gelöscht wird.
  • 🏆 Mein Fortschritt – Meisterschaft je Thema (seit 2.0, Vorbild Khan Academy, 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.
  • 🏅 Abzeichen (seit 2.0, Vorbild ANTON/Duolingo, 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).
  • 📅 Deine Lerntage (seit 3.1, 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.
  • 🔊 Jede Frage vorlesen (seit 3.1, 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).
  • Bewusst KEINE Tages-Streaks: ein verpasster Tag soll kein schlechtes Gewissen erzeugen - Sterne können nur wachsen, nie verfallen (einlösen ja, verfallen nein). Dasselbe gilt für die Abzeichen.

🚗 Führerschein Klasse B

Eigener Lernbereich mit drei Unterbereichen (Verkehrszeichen, Theoriefragen, Theorie-Kurs), angelehnt an den Aufbau von fahrschule24.de. Details in docs/FUEHRERSCHEIN.md.

  • 77 Verkehrszeichen in den fünf Gruppen der StVO (Gefahr-, Vorschrift-, Richtzeichen, Verkehrseinrichtungen, Zusatzzeichen), mit Karteikarten und Quiz. Jedes Zeichen hat eine Bedeutung und einen Merksatz, der erst NACH der Antwort erscheint.
  • Tägliche Challenge: fünf Zeichen, etwa eine Minute - der einzige Pflichtteil des Bereichs. Die Auswahl wird aus Profil-Kennung und Datum abgeleitet, nicht gewürfelt: nach einem Neustart sind es dieselben Zeichen (sonst startet ein Kind so lange neu, bis leichte kommen), und beide Kinder bekommen am selben Tag verschiedene (Abschreiben bringt nichts).
  • Alle 77 Zeichen als echte Bilddatei (PNG, aus Wikimedia Commons, gemeinfrei als amtliches Werk - Quelle und Lizenz je Nummer in 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.
  • Rechtlich sauber: Verkehrszeichen stehen in StVO Anlage 1-3 und sind als amtliches Werk gemeinfrei (§ 5 UrhG). Der amtliche Fragenkatalog dagegen ist es nicht - er gehört der TÜV|DEKRA arge tp 21. Die Theoriefragen hier sind deshalb selbst geschrieben und decken dieselben 14 amtlichen Sachgebiete ab, sind aber nicht die Originalfragen.
  • Gekonnt = zweimal hintereinander richtig, ein Fehler setzt auf null zurück. Dieselbe Regel wie in der Fehler-Kartei. Die Karteikarten zählen bewusst NICHT mit: "wusste ich" drückt sich jeder gern, und beim Blick auf die Rückseite meint man ohnehin, es gewusst zu haben.
  • 65 Theoriefragen zu den 14 amtlichen Sachgebieten - und zwar so gebaut, wie die Prüfung wirklich läuft: bei 10 Fragen sind mehrere Antworten richtig (Teilpunkte gibt es nicht), und jede Frage wiegt 2 bis 5 Fehlerpunkte. Wer mit Ein-aus-vier-Quizzen übt, lernt genau das Falsche.
  • Prüfungssimulation: 30 Fragen über alle Sachgebiete gestreut, zwischendurch ohne Auflösung. Bestanden mit höchstens 10 Fehlerpunkten und weniger als zwei falschen 5-Punkte-Fragen - man kann also 28 von 30 richtig haben und trotzdem durchfallen. Deshalb zeigt der Ergebnisbildschirm Fehlerpunkte statt Prozent, danach jede falsche Frage einzeln mit der eigenen Antwort, der richtigen und der Begründung.
  • Schwachstellen-Trainer: zieht bevorzugt aus Sachgebieten unter 70 % - aber erst ab vier beantworteten Fragen darin, denn zwei falsche Antworten machen noch keine Schwachstelle. Gemessen wird, was gerade sitzt, nicht der Durchschnitt der ganzen Historie.
  • Die richtige Antwort steht im Katalog immer vorn (so ist eine Frage beim Nachlesen sofort zu erfassen) und wird vor der Anzeige an genau einer Stelle gemischt. Ohne das hätte "immer die erste ankreuzen" volle Punktzahl gegeben.
  • Theorie-Kurs mit 14 Lektionen, eine je Sachgebiet, mit Erklärtexten, den passenden Zeichen daneben und drei Merksätzen am Ende. Der Kurs bringt keine eigenen Fragen mit: die Lernstandskontrolle nimmt Fragen aus demselben Katalog wie die Prüfungssimulation, und ihre Antworten zählen auch in den Theorie-Lernstand - sonst gälte eine im Kurs gemeisterte Frage im Schwachstellen-Trainer weiter als ungekonnt. Gelesen und geschafft werden getrennt gezählt, die Kontrolle ist freiwillig, und die Reihenfolge ist eine Empfehlung statt einer Sperre.
  • 🚲 Gilt schon fürs Fahrrad: Zeichen, die für die Kinder heute relevant sind, sind gekennzeichnet - der Bereich ist nicht nur Vorbereitung auf übermorgen.

🩺 Erste Hilfe und Notfallwissen

Eigener Bereich zwischen KI-Bereich und Führerschein, pro Kind im Eltern-Bereich abschaltbar.

  • Ein Fragenpool für alle Klassenstufen - anders als bei den Schulfächern. Erste-Hilfe-Wissen hat keine Klasse-6-Fassung: die fünf W-Fragen sind mit elf dieselben wie mit fünfzehn, und die Drucktiefe bei der Herzdruckmassage ändert sich nicht mit dem Alter dessen, der sie anwendet. "Prüfen - Rufen - Drücken" wird an deutschen Schulen ab Klasse 7 mit denselben Zahlen wie bei Erwachsenen unterrichtet.
  • 80 Fragen in acht Themen: Notruf 112 und Eigenschutz, Bewusstsein und Atmung prüfen, stabile Seitenlage, Wunden und starke Blutungen, Verbrennungen, Herzdruckmassage, Defibrillator (AED), Verschlucken/Vergiftung/Schock. Acht getrennte Themen statt eines Blocks, damit die adaptive Übungsauswahl und die Themen-Heatmap im Eltern-Bericht ihre Auflösung behalten.
  • Auch die Grenzen stehen drin. "Beine immer hoch" ist bei Kopf-, Brust- und Atemproblemen falsch - halbgelerntes Erste-Hilfe-Wissen ist genau dort gefährlich, wo es sich vollständig anfühlt. Ebenso: nichts zu tun ist der einzige echte Fehler, und ein Notruf allein ist schon Erste Hilfe.

🗓️ Ferien und Feiertage (Berlin)

Auf der Startseite eine Kachel, im Eltern-Bereich die vollständige Liste.

  • Fest einkompiliert, nicht aus dem Netz geholt (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.
  • Für das Kind eine Zahl: läuft gerade etwas, steht da "Sommerferien - noch 17 Tage"; sonst der Termin, der als Nächstes eintritt. Bewusst nicht "die nächsten Ferien": wenn vorher ein Feiertag liegt, ist der die Antwort auf die Frage, die ein Kind hat.
  • Ferien schlagen den Feiertag darin. Am 25.12. ist "Weihnachtsferien" die nützlichere Auskunft als "1. Weihnachtsfeiertag" - der steht ohnehin mittendrin.
  • Feiertage am Wochenende stehen als solche dran. Der 03.10.2026 ist ein Samstag und bringt keinen freien Tag; das gehört dazugesagt, statt einen Tag anzukündigen, an dem ohnehin niemand Schule hat.
  • Der Kalender sagt, wie weit er reicht. Der Eltern-Bereich zeigt das Enddatum von Ferien und Feiertagen an, und hinter dem letzten Termin verschwindet die Kind-Kachel, statt leer dazustehen. Ein leerer Kalender, der wie ein voller aussieht, wäre die schlechtere Antwort.

📋 Planer aus jedem Bereich erreichbar

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:

  • Kein Fortschrittsverlust. Zurück kommt dieselbe ViewModel-Instanz, nicht eine neue - die halb beantwortete Aufgabe, der angefangene Text und die Position im Zeichen-Quiz stehen noch da.
  • Kein Schlupfloch. Die Mindestzeit-Uhr der Etappe wird angehalten (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.

Eltern-Features

  • Zahnrad-Symbol (unten rechts, dezent) öffnet den passwortgeschützten Eltern-Bereich.
  • Erststart: Admin-Passwort selbst festlegen (PBKDF2-SHA256 mit 600.000 Durchläufen, kein Klartext gespeichert; ältere Passwörter werden beim nächsten Anmelden still auf diese Stärke umgestellt).
  • ℹ️ Systeminfo (seit 2.0): App-Version samt Git-Stand, .NET, Windows, Datenbankgröße, letzte automatische Sicherung – mit Kopieren-Knopf, für jede Rückfrage bei einem Problem.
  • Fachbereiche einzeln deaktivieren, Klassenstufe (6/7/8/9/10) einstellen.
  • 🏖️ Ferien-/Pausenmodus (global, ein Datum): bis einschließlich dieses Tages startet LernTor ohne Kiosk-Sperre und ohne Lernpflicht. Das Kind sieht statt der Lernstrecke einen Ferien-Bildschirm mit dem Enddatum, den verbleibenden Tagen und einem großen "PC entsperren"- Knopf, der LernTor beendet; darunter, bewusst kleiner, "Trotzdem üben" für den freiwilligen Weg in die normale Profilauswahl. Nach dem Enddatum kommen Sperre und Lernstrecke von selbst zurück - Eltern müssen an nichts denken. Realer Fehler, den das behebt: der Modus übersprang anfangs nur die technische Sperre. Die Oberfläche wusste nichts davon, das Kind landete im Vollbild auf dem Begrüßungsbildschirm und musste bis zum Abschlussquiz durch, um an den PC zu kommen - von außen war der grün leuchtende Ferienmodus damit schlicht wirkungslos. Die Regel steht deshalb jetzt einmal als 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.
  • Schwierigkeitsstufen pro Profil (Presets statt Freitext, kein neuer Build nötig): Tipptrainer- Mindestgenauigkeit (25/50/75/85%, Standard 25%), Abschlussquiz-Bestehensschwelle für den 1. Versuch (50/75/85%, Standard 50%) und für den 2. Versuch/die Wiederholung (25/50%, Standard 25%).
  • 🎯 Wochenziel pro Profil (optional, Standard aus): 3 bis 7 Lerntage pro Woche. Wie die Lernserie reine Anzeige ohne Druckmechanik - ein verfehltes Ziel kostet keine Sterne und erzeugt keine Mahnung. Anders als eine Serie zerbricht es aber nicht an einem einzigen verpassten Tag: wer Montag und Dienstag nicht kann, schafft die vier Tage immer noch. Die Woche beginnt am Montag, damit "diese Woche" zum Stundenplan passt. Ist das Ziel rechnerisch nicht mehr erreichbar, wird bewusst nichts Mahnendes angezeigt.
  • ⏱ Antworttempo im Wochenbericht: zeigt, wie viele Antworten unter 3 Sekunden kamen, plus eine Warnzeile, wenn das ab 10 Messwerten ein Drittel oder mehr sind. Im reinen Richtig/Falsch-Bericht ist Raten unsichtbar - bei drei Optionen liegt Raten in einem Drittel der Fälle richtig. Bewusst nur ein Hinweis für die Eltern, keine zusätzliche Sperre für das Kind: wer das Antworten selbst blockiert, bestraft auch das Kind, das die Antwort einfach sofort weiß.
  • ⏱ Lernzeit je Fach (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.
  • 🩺 Feed-Gesundheit: an jeder Quelle steht, wie der letzte tatsächliche Abruf ausging (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.
  • Aufteilung des Startbildschirms: Stundenplan und Hausaufgaben stehen links, Klausuren und die Ferien-Kachel rechts, in der Mitte Begrüßung und der "Los geht's"-Knopf. Vorher stand alles untereinander in einer mittigen Spalte - bei neun Hausaufgaben und acht Klausuren wuchs sie über die Bildschirmhöhe hinaus und schob den Start-Knopf hinaus, das Kind kam schlicht nicht weiter. Die Spalten allein reichen dafür nicht (zwanzig Einträge würden auch eine schmale Spalte überlaufen lassen), deshalb sitzt jede Spalte in einem ScrollViewer: lange Listen scrollen innerhalb ihrer Spalte, statt die Seite wachsen zu lassen. Der Start-Knopf kann damit unabhängig von der Anzahl der Einträge nie mehr verschwinden.
  • 🕘 Stundenplan: der Plan des Kindes steht links, über den Hausaufgaben - also zwischen der Datum/Uhrzeit-Anzeige oben links im Fenster und dem Hausaufgabenplan, genau die Reihenfolge, in der ein Kind morgens danach schaut. Gezeigt wird immer der Tag, der wirklich als Nächstes dran ist: nach der letzten Stunde, am Wochenende, an Feiertagen und in den Ferien springt die Kachel automatisch auf den nächsten Unterrichtstag (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).
  • 📚 Fächer nach Stundenplan (seit 2026/27, pro Kind abschaltbar im Eltern-Bereich): geübt werden nur die Schulfächer, die am nächsten Schultag auf dem Plan stehen – Vorbereitung statt Nachbereitung; freitags und am Wochenende die vom Montag, in den Ferien die vom ersten Schultag danach. Türkisch ist immer dabei, auch ohne Türkischstunde. NaWi wechselt reihum zwischen Biologie, Chemie und Physik (gezählt über die NaWi-Tage des Wochenplans, also nie zweimal hintereinander dasselbe). Klausurfächer sind in der Woche vor dem Termin immer dabei. Das Abschlussquiz fragt nur die geübten Fächer ab. Lesen, Tippen, News, KI-Bereich, Führerschein und Erste Hilfe bleiben unberührt. Unter dem Stundenplan steht für das Kind, warum: „Heute übst du für Dienstag: Mathematik · Musik · Türkisch". Ohne eingetragenen Plan bleibt alles wie vorher (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.
  • 📒 Hausaufgaben: Fach, Stichtag und Text - von Eltern UND Kindern eintragbar (Knopf auf dem Startbildschirm, linke Spalte). Dieselbe Asymmetrie wie beim Klausurkalender: eigene Einträge darf das Kind löschen, Eltern-Einträge nur abhaken - das ist ja der Sinn der Sache; nur das Wegräumen einer Aufgabe, die es nicht erledigt hat, wäre ein Schlupfloch. Anders als bei Klausuren ist ein Stichtag in der Vergangenheit hier erlaubt: eine vergessene Hausaufgabe nachzutragen ist normal.
  • 📅 Klausurkalender: Termine pro Kind mit Fach, Titel, Themen und Datum. Die Kinder dürfen selbst eintragen (Button auf dem Startbildschirm, rechte Spalte) - mit einer Asymmetrie: eigene Einträge dürfen sie ändern und löschen, Eltern-Einträge nur ansehen, sonst wäre "Klausur weg, also nicht lernen" ein bequemer Ausweg. Die Prüfung sitzt im Repository (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.
  • 📰 Nachrichtenquellen wählbar: alle 44 kuratierten Quellen einzeln an- und abschaltbar, nach Sprache gruppiert (Deutsch, Türkisch, Englisch) mit Region als Einordnung, dazu "alle an/aus". Wie viele Nachrichten daraus täglich werden, steuert News: Nachrichten pro Tag (pro Profil). Der Hinweis darunter rechnet mit: sind mehr Quellen aktiv als Nachrichten eingestellt, steht dort, über wie viele Tage jede Quelle einmal vorbeikommt. Sind alle abgeschaltet, greifen bewusst wieder alle: ein leerer News-Bereich wäre schlimmer als eine ignorierte Einstellung.
  • 📚 Alle Lesetexte verwalten: eine Liste über die eingebauten und die eigenen Texte, mit Suche und Filter "nur eigene". Haken weg blendet einen Text dauerhaft aus. 📌 Anheften stellt einen Text jeden Tag an die erste Stelle, bis er wieder gelöst wird - gedacht zum sofortigen Prüfen eines neu eingetragenen Textes und um ein Gedicht vor der Abfrage täglich üben zu lassen. Eigene Texte sind auch nachträglich bearbeitbar.
  • 📖 Eigene Lesetexte pro Profil: ein Gedicht, das gerade in der Schule dran ist, oder ein türkischer Text aus der Familie. Ein eigener Text belegt einen der beiden Vorlese-Plätze des Tages (mehrere wechseln sich täglich ab), damit er auch wirklich drankommt statt sich unter den 63 eingebauten Texten zu verlieren. Es reicht eine Sprache; leere Sprachfassungen zeigen dem Kind einen kurzen Hinweis statt einer leeren Spalte.
  • Eigene Aufgaben kommen garantiert dran: was Eltern eintragen oder aus einem Dokument übernehmen, wird bei der nächsten Lernrunde im gewählten Fach vollständig abgefragt - noch vor den automatisch erzeugten Aufgaben. Zu beachten: die Klassenstufe der Aufgabe muss zur Stufe des Profils passen, sonst sieht das Kind sie nie. Der Eltern-Bereich zeigt deshalb an, welches Profil welche Stufe hat.
  • 🗂 Vokabeltrainer (Englisch/Türkisch): eigene Wortlisten je Profil, eingefügt als ganze Liste (eine Zeile je Vokabel, =/;/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.
  • ⌨️ Eigene Tipp-Texte: die Zieltexte der beiden letzten Tipptrainer-Lektionen (Sätze und Abschluss) lassen sich selbst schreiben, max. 200 Zeichen mit Live-Zähler. Die Aufbaulektionen bleiben bewusst fest - sie üben gezielt einzelne Tastenbereiche.
  • 🔥 Lernserie (optional, Standard aus): zeigt dem Kind auf dem Willkommensbildschirm die aufeinanderfolgenden Lerntage an (ab 2 Tagen). Bewusst reine Anzeige-Motivation ohne Druckmechanik - keine Strafen oder Erinnerungen bei verpassten Tagen (anders als z.B. Duolingo-Streaks), und ein heute noch nicht gelernter Tag bricht die Serie nicht. Eltern schalten die Anzeige explizit ein.
  • Sicherung (Backup): die komplette Datenbank (Profile, Fortschritte, Sterne, Einstellungen) als eine Datei exportieren - z.B. auf einen USB-Stick - und bei Bedarf wiederherstellen. Der Export nutzt SQLites 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).
  • Automatische Sicherung (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.
  • Aktivitätsprotokoll: alle beantworteten Aufgaben + Quiz-Ergebnisse einsehbar.
  • Bericht "Stärken & Schwächen" (pro Profil, umschaltbar 7/30 Tage): Richtig-Quote je Fach als Ampel-Balken (grün ≥75 %, gelb, rot <50 %), schwächste Fächer zuerst; dazu die Themen-Heatmap „Schwächste Themen" - die bis zu 10 schwächsten Einzel-Themen (ab 3 Antworten Datenbasis), damit sichtbar wird, dass z.B. genau „Brüche" hakt und nicht pauschal „Mathe"; außerdem Lerntage im Zeitraum und der Abschlussquiz-Verlauf. Rechnet komplett aus dem vorhandenen Aktivitätsprotokoll - keine neuen Tabellen.
  • ✏️ Diktat (Deutsch, 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.
  • 📄 Lesetext aus PDF/Word einlesen: füllt das Formular für eigene Lesetexte aus einer Datei, statt sie abtippen zu lassen. Die Textextraktoren des Lehrer-Imports (PdfPig/OpenXml) waren dafür schon da - was fehlte, ist die Aufbereitung (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.
  • 🖨 Übungsblatt zum Ausdrucken (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.
  • 📄 Bericht als Datei speichern: schreibt genau den angezeigten Bericht (Fächer, Themen-Heatmap, Lernzeit je Fach, Lerntage, Quiz-Verlauf, Tempo und - falls eingeschaltet - die Vergleichstabelle) als eine eigenständige HTML-Datei zum Aufheben, Ausdrucken oder Mitnehmen zum Elterngespräch. Bewusst HTML und keine PDF-Bibliothek: eine einzelne HTML-Datei öffnet jeder Rechner ohne Zusatzsoftware, und über "Drucken → Als PDF speichern" entsteht das PDF genau dann, wenn es gebraucht wird - eine PDF-Bibliothek wäre eine weitere Abhängigkeit im self-contained Build für ein Ergebnis, das der Browser ohnehin liefert. Die Datei ist vollständig eigenständig (Stil inline, keine Bilder, kein Nachladen aus dem Netz) und sieht auch auf einem Rechner ohne Internet vollständig aus (ReportExport).
  • 👨‍👩‍👧‍👦 Kinder nebeneinander (optional, Standard AUS): stellt alle angelegten Profile in einer kompakten Tabelle nebeneinander - Lerntage, Trefferquote, Lernzeit und Sterne, im selben 7/30-Tage-Zeitraum wie der übrige Bericht. Das Abschalten ist hier keine Bequemlichkeit, sondern der Kern der Sache: Geschwister zu vergleichen kann anspornen, kann aber genauso gut das Kind entmutigen, das immer hinten liegt - ob das in einer Familie hilft oder schadet, können nur die Eltern beurteilen, also ist es eine bewusste Entscheidung und keine Voreinstellung. Aus demselben Grund sortiert die Tabelle nach Namen, nicht nach Leistung: eine nach Trefferquote sortierte Liste wäre ein Siegertreppchen, auf dem ein Kind dauerhaft unten steht. Ein Kind, das im Zeitraum gar nichts bearbeitet hat, bleibt mit dem Hinweis "in diesem Zeitraum keine Aufgaben bearbeitet" stehen statt zu verschwinden - genau das ist ja die interessante Zeile. Bei nur einem Profil bleibt die Tabelle mit entsprechendem Hinweis leer (ProfileComparison).
  • "Sofort freischalten": Notfall-Override, überspringt den restlichen Ablauf.
  • "Alle Daten zurücksetzen…" (Gefahrenzone): löscht alle Profile/Fortschritte/Einstellungen aus der App heraus, mit Ja/Nein-Bestätigung. Vorher ging das nur manuell über das Löschen von lerntor.db.
  • Fehlerprotokoll (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.
  • Eigene Aufgaben ("Eigene Aufgaben (z.B. von der Lehrkraft)"): Formular zum manuellen Anlegen eigener Fragen (Fach, Klassenstufe, Fragetyp, Frage, Antwortoptionen, richtige Antwort(en), Erklärung, optionaler Tipp) - z.B. für aktuelle Hausaufgaben oder Themen, die die Lehrkraft gerade durchnimmt. Gespeichert in der lokalen DB (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.

Bekannte Grenzen / nächste Schritte

Die aktuelle Arbeitsliste steht in docs/NAECHSTE-SCHRITTE.md. Dieser Abschnitt beschreibt dauerhafte Grenzen und Entwurfsentscheidungen.

  • KI-Funktionen: komplett lokal, keine Cloud-Anbindung. LernTor nutzt an keiner Stelle einen Cloud-KI-Dienst - das lokal geladene Sprachmodell ist die einzige KI-Anbindung, für zwei Features: automatisches Einlesen von Lehrer-Unterlagen (PDF/Word → Fragenvorschläge) und den KI-Lernchat für Kinder (siehe "Eltern-Features" bzw. weiter unten). Beide teilen sich dieselbe Infrastruktur:
    • 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.
    • Modell-Katalog + automatischer Download (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).
      • Standard: Qwen2.5-7B-Instruct (Q4_K_M, ~4,7 GB, Apache-2.0): als einzige Familie im permissiv lizenzierten, CPU-tauglichen 7B-Bereich offiziell stark in Deutsch UND Türkisch (29+ Sprachen), deutlich besseres Reasoning und Erklärqualität als das 3B - und dieselbe Modellfamilie, gegen die Prompt-Format und AntiPrompts-Stoppwörter in dieser Codebasis bereits erprobt sind. Verworfen: Mistral-7B (Türkisch schwach), Llama-3.1-8B (Lizenz + Türkisch mittelmäßig), Gemma-2-9B (Lizenz), Qwen2.5-14B (~9 GB Q4 → auf Familien-CPUs nur 2-4 Token/s, zu langsam für den Kinder-Chat).
      • Alternative: Qwen2.5-3B-Instruct (Q4_K_M, ~2 GB) als "Leicht & schnell"-Option für ältere PCs, auf denen das 7B zu langsam antwortet.
      • Download-Robustheit (nach real fehlgeschlagenem Erst-Download beim Nutzer korrigiert): der Download nutzt einen eigenen HttpClient ohne Timeout - der geteilte App-Client hätte mit seinem 100-Sekunden-Standard-Timeout jeden GB-Download über Heim-Internet mitten im Stream abgebrochen (das war die eigentliche Fehlerursache). Als Quellen dienen die bartowski/-GGUF-Repos (verlässlich Einzeldateien; die offiziellen Qwen/-GGUF-Repos teilen größere Modelle in -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).
    • API-Verifizierung: 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.
  • Automatisches Einlesen von Lehrer-Unterlagen (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.
    • Inline-Editing: alle Felder eines Vorschlags (Thema, Frage, Optionen, richtige Antworten, Erklärung, Tipp) sind direkt in der Vorschlagskarte korrigierbar, bevor übernommen wird - "Übernehmen" validiert (Frage/Antwort vorhanden, bei Auswahlfragen mindestens 2 Optionen und die richtige Antwort wörtlich darunter) und zeigt Fehler direkt an der Karte. Die Belegstelle aus dem Dokument bleibt bewusst nicht editierbar - sie ist die Prüf-Referenz, kein Inhalt.
  • KI-Lernchat für Kinder (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.
  • News-Quellen: kuratierte RSS-Feeds (siehe 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).
  • Vereinfachung der Artikeltexte ist aktuell regelbasiert (kein LLM). Ein lokales LLM (Phi-3, Gemma 2, Llama 3.1 über Ollama) ließe sich über das ITextSimplifier-Interface in LernTor.News als zweite Implementierung ergänzen, ohne den Rest der App anzufassen.
  • Wird inzwischen auch auf einem echten Windows-Rechner getestet (nicht nur über den CI-Workflow .github/workflows/build.yml auf windows-latest), da diese Entwicklungsumgebung selbst kein Windows bereitstellt.

Schnellstart (Entwicklung)

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:

OrhanHero/HeroKid

C#

4

202 commits

updated Oct 1, 2026

See the code

README

LernTor

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).

Dokumentation

DokumentInhalt
docs/DESIGN.mdDesigns (seit 3.0): Farbrollen, Kontrastregeln, ein Design hinzufügen, Bildschirmfotos der CI
docs/NAECHSTES-LEVEL-3-1.mdVersion 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.mdPlan 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.mdPlan vom 29.09.2026: .NET 10, Abzeichen, Meisterschaft je Thema, größere Pools
docs/NAECHSTE-SCHRITTE.mdWas als Nächstes zu tun ist, und was am 28.09.2026 erledigt wurde
docs/WIEDERHERSTELLUNG.mdNotfall: Sicherung einspielen, App startet nicht, Kiosk lösen
docs/STUNDENPLAENE-2026-27.mdStundenpläne der Kinder zum Einfügen
docs/TESTPLAN.mdTestprotokoll nach Rollen
docs/PLAN.mdPlan nach Risiko, mit Begründungen
docs/BUILD.mdBauen, Installieren, Datenbankschema
docs/CURRICULUM.md, docs/FAECHER-SYSTEM.mdThemen je Fach und Stufe, Verdrahtung neuer Fächer
docs/TIPPTRAINER.md, docs/FUEHRERSCHEIN.mdTipptrainer, Führerschein-Bereich
docs/PILOT-CHECKLISTE.mdInstallation und Bypass-Härtetest am echten PC

Profile

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.

Ablauf für das Kind

  1. Profil wählen
  2. Lesen (Pflicht, nicht überspringbar) – täglich zwei wechselnde Stücke aus einem festen Pool von 63 Texten (siehe 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:
    • 33 literarische/Allgemeinwissen-Stücke: gemeinfreie Gedichte/Texte (Goethe, Heine, Yunus Emre, Schiller, Rilke, Fontane, Robert Frost, William Blake, Lewis Carroll, u.a.) sowie kurze "kurz erklärt"-Sachtexte (Berlin, Sonnensystem, Menschenrechte, EU, ...). Fremdsprachige Originale werden mit eigenen, freien Übertragungen (keine fremden Übersetzungen) begleitet.
    • 30 Pop-Kultur-Kurzgeschichten: eigens verfasste, kindgerechte Abenteuergeschichten rund um Minecraft, Minecraft Legends, Super Mario, AntonCraft, Geometry Dash, Rock'n'Roll, Pac-Man, Kirby, Batman, One Punch Man, Dragon Ball, One Piece und Backrooms. Diese Texte referenzieren die Marken/Figuren nur namentlich als Thema; Handlung, Dialoge und Wortlaut sind komplett neu und zitieren kein geschütztes Spiel-/Comic-/Anime-Material. (Eine Anbindung an lyrikline.org wurde bewusst nicht umgesetzt: aus dieser Entwicklungsumgebung war der Zugriff auf die Seite nicht möglich, und ihre zeitgenössischen Gedichte/Übersetzungen sind urheberrechtlich geschützt und dürften ohne Erlaubnis nicht in die App übernommen werden.)
  3. Tipptrainer – der 10-Finger-Trainer mit mehreren aufeinander aufbauenden Lektionen, virtueller Tastatur, Live-Feedback zu Eingaben, Genauigkeit und Geschwindigkeit. Nur deutsche Sprache und QWERTZ-Tastaturlayout (keine türkischen/englischen Wörter mehr). Nach jeder abgeschlossenen Lektion erscheint der gewohnte Weiter-/Wiederholen-Dialog; ist wirklich alles erledigt, zeigt das Dashboard unten ein Glückwunsch-Panel mit einem Button weiter zu den News. Profil-spezifische Abschluss-Lektion: Emirhan (Klasse 6) tippt einen persönlichen Steckbrief-Text (Name, Geburtsdatum, Adresse, Telefon, Eltern, Schule 6c, Lieblingsessen, Hobbys), Batuhan (Klasse 9) seinen eigenen Steckbrief (Geburtsdatum, Adresse, Telefon, Eltern, Gymnasium 9a, Lieblingsessen, Hobbys). Der Tipptrainer ist eine eigene feste Stage und gehört nicht zum Fachcurriculum.
  4. News für Kinder (Pflicht) – kuratierte RSS-Artikel, verständlich, neutral und ohne Angstmache aufbereitet (sprachliches Vorbild: logo!/Checker-Sendungen). Rubriken: 🐻 Berlin (wichtigste regionale Rubrik, garantierte Plätze), 🇩🇪 Deutschland, 🌍 Welt, 🇹🇷 Türkei (täglich garantierte Plätze; seriöse Quellen: Anadolu Ajansı, TRT Haber, DW Türkçe – bewusst keine Boulevardquellen), 🤖 KI & Technik, 🎮 Spiele, 🔬 Wissen, ⚽ Sport, ⛅ Wetter. Themen-Rubriken werden zusätzlich per Schlüsselwort-Klassifikation quer über alle Quellen erkannt (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.)
  5. Fachbereiche (alle nicht von den Eltern deaktivierten, Klassenstufe des Profils): Mathematik, Deutsch, Türkisch, Englisch, Biologie, Chemie, Physik, Gesellschaftswissenschaften (Gewi), Politik, Geografie, Ethik, Medienbildung (ITG) – siehe docs/CURRICULUM.md für die genauen Themen je Fach. Bei offenen Mathematik-Aufgaben steht ein Taschenrechner zur Verfügung; Aufgaben mit hinterlegtem Tipp zeigen einen abrufbaren Formel-/Vorgehens-Hinweis (verrät nicht die Lösung). Fehler-Kartei (vereinfachtes Spaced-Repetition): im Übungsteil falsch beantwortete Aufgaben werden als Schnappschuss gespeichert (generierte Aufgaben wären am Folgetag nicht reproduzierbar) und erscheinen an FOLGETAGEN im selben Fach zuerst wieder (mit 🔁 markiert, am häufigsten falsch beantwortete zuerst, nie am selben Tag erneut) - bis sie zweimal in Folge richtig beantwortet wurden, dann gelten sie als gelernt und verschwinden. News-Fragen sind ausgenommen (deren Tagesartikel gibt es später nicht mehr). Siehe 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).
  6. Abschlussquiz – gemischte Fragen aus allen aktiven Fächern (Anzahl je Fach passt sich automatisch an, wie viele Fächer aktiv sind), Nachrichten-Verständnisfragen zählen NICHT mit (die werden nur im News-Bereich selbst gestellt). Erster Versuch am Tag: exakt 20 Fragen, Bestehens-Schwelle ist im Eltern-Bereich pro Profil einstellbar (Presets 50/75/85%, Standard 50%) → ab dieser Trefferquote wird der PC freigeschaltet. Bei Nichtbestehen ein kürzeres Wiederholungsquiz mit exakt 15 Fragen: schwache Fächer bekommen konzentriert Fragen (mind. 2 je Fach), der Rest füllt ein allgemeines Mini-Quiz über alle aktiven Fächer auf - für diesen zweiten Anlauf gilt eine eigene, niedrigere Bestehens-Schwelle (Presets 25/50%, Standard 25%, ebenfalls pro Profil einstellbar); wird auch diese nicht erreicht, gibt es einen weiteren Wiederholungsanlauf. Antwortoptionen bei Multiple-Choice-Fragen werden bei jeder Anzeige neu gemischt, damit die richtige Antwort nicht immer an derselben Stelle steht.

Fortschritt wird laufend in einer lokalen SQLite-Datenbank gespeichert (%LOCALAPPDATA%\LernTor\lerntor.db), ein Absturz oder Neustart verliert also keinen Fortschritt.

Architektur & Technologie-Entscheidung

.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

Kiosk-Sperre: was sie tut und was sie NICHT tut

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.

Motivation & Gamification

  • Belohnungs-Sterne: +2 fürs Lesen, +2 für News, +1 je abgeschlossenem Fach, +5 fürs bestandene Abschlussquiz - nur echte Abschlüsse zählen, von Eltern deaktivierte (übersprungene) Fächer geben keine Sterne. Heute verdiente Sterne und der Gesamtstand erscheinen auf dem Abschluss-Bildschirm; der über alle Tage gesammelte Gesamtstand (⭐) steht auf der Profil-Kachel.
  • Etappen-Leiste: oben im Kiosk-Fenster zeigen fünf Chips (Lesen → Tippen → News → Fächer x/y → Quiz) jederzeit, wo das Kind in der heutigen Session steht - erledigt = grün mit Häkchen, aktuell = lila.
  • Konfettiregen: beim bestandenen Abschlussquiz fällt einmalig Konfetti in den App-Farben über den Ergebnis-Bildschirm (einmalige Animation, keine Dauerschleife - keine bleibende CPU-Last im Kiosk-Betrieb).
  • Tages-Zusammenfassung: der Freigeschaltet-Bildschirm zeigt, was das Kind heute geschafft hat - 📚 beantwortete Aufgaben, ✅ Trefferquote und (falls eingeschaltet) die 🔥-Lernserie. Der Moment der Freischaltung ist der emotionale Höhepunkt des Ablaufs; hier soll sichtbar werden, WAS erreicht wurde, nicht nur DASS der PC frei ist.
  • 📈 Eigene Entwicklung (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.
  • 🎁 Belohnungsliste: Eltern legen im Eltern-Bereich Belohnungen mit Sterne-Kosten an (z.B. „30 Minuten extra Spielzeit" für 20 ⭐). Nach dem bestandenen Abschlussquiz sieht das Kind die Liste mit Fortschritt („12 / 20 ⭐") und kann erreichbare Belohnungen einlösen (mit Rückfrage; Abbuchung + Protokolleintrag passieren in einem Schritt). Eingelöste Belohnungen erscheinen je Profil im Eltern-Bereich - eingelöst wird in der echten Welt von den Eltern. Die Historie bleibt als Schnappschuss erhalten, auch wenn die Belohnung später gelöscht wird.
  • 🏆 Mein Fortschritt – Meisterschaft je Thema (seit 2.0, Vorbild Khan Academy, 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.
  • 🏅 Abzeichen (seit 2.0, Vorbild ANTON/Duolingo, 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).
  • 📅 Deine Lerntage (seit 3.1, 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.
  • 🔊 Jede Frage vorlesen (seit 3.1, 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).
  • Bewusst KEINE Tages-Streaks: ein verpasster Tag soll kein schlechtes Gewissen erzeugen - Sterne können nur wachsen, nie verfallen (einlösen ja, verfallen nein). Dasselbe gilt für die Abzeichen.

🚗 Führerschein Klasse B

Eigener Lernbereich mit drei Unterbereichen (Verkehrszeichen, Theoriefragen, Theorie-Kurs), angelehnt an den Aufbau von fahrschule24.de. Details in docs/FUEHRERSCHEIN.md.

  • 77 Verkehrszeichen in den fünf Gruppen der StVO (Gefahr-, Vorschrift-, Richtzeichen, Verkehrseinrichtungen, Zusatzzeichen), mit Karteikarten und Quiz. Jedes Zeichen hat eine Bedeutung und einen Merksatz, der erst NACH der Antwort erscheint.
  • Tägliche Challenge: fünf Zeichen, etwa eine Minute - der einzige Pflichtteil des Bereichs. Die Auswahl wird aus Profil-Kennung und Datum abgeleitet, nicht gewürfelt: nach einem Neustart sind es dieselben Zeichen (sonst startet ein Kind so lange neu, bis leichte kommen), und beide Kinder bekommen am selben Tag verschiedene (Abschreiben bringt nichts).
  • Alle 77 Zeichen als echte Bilddatei (PNG, aus Wikimedia Commons, gemeinfrei als amtliches Werk - Quelle und Lizenz je Nummer in 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.
  • Rechtlich sauber: Verkehrszeichen stehen in StVO Anlage 1-3 und sind als amtliches Werk gemeinfrei (§ 5 UrhG). Der amtliche Fragenkatalog dagegen ist es nicht - er gehört der TÜV|DEKRA arge tp 21. Die Theoriefragen hier sind deshalb selbst geschrieben und decken dieselben 14 amtlichen Sachgebiete ab, sind aber nicht die Originalfragen.
  • Gekonnt = zweimal hintereinander richtig, ein Fehler setzt auf null zurück. Dieselbe Regel wie in der Fehler-Kartei. Die Karteikarten zählen bewusst NICHT mit: "wusste ich" drückt sich jeder gern, und beim Blick auf die Rückseite meint man ohnehin, es gewusst zu haben.
  • 65 Theoriefragen zu den 14 amtlichen Sachgebieten - und zwar so gebaut, wie die Prüfung wirklich läuft: bei 10 Fragen sind mehrere Antworten richtig (Teilpunkte gibt es nicht), und jede Frage wiegt 2 bis 5 Fehlerpunkte. Wer mit Ein-aus-vier-Quizzen übt, lernt genau das Falsche.
  • Prüfungssimulation: 30 Fragen über alle Sachgebiete gestreut, zwischendurch ohne Auflösung. Bestanden mit höchstens 10 Fehlerpunkten und weniger als zwei falschen 5-Punkte-Fragen - man kann also 28 von 30 richtig haben und trotzdem durchfallen. Deshalb zeigt der Ergebnisbildschirm Fehlerpunkte statt Prozent, danach jede falsche Frage einzeln mit der eigenen Antwort, der richtigen und der Begründung.
  • Schwachstellen-Trainer: zieht bevorzugt aus Sachgebieten unter 70 % - aber erst ab vier beantworteten Fragen darin, denn zwei falsche Antworten machen noch keine Schwachstelle. Gemessen wird, was gerade sitzt, nicht der Durchschnitt der ganzen Historie.
  • Die richtige Antwort steht im Katalog immer vorn (so ist eine Frage beim Nachlesen sofort zu erfassen) und wird vor der Anzeige an genau einer Stelle gemischt. Ohne das hätte "immer die erste ankreuzen" volle Punktzahl gegeben.
  • Theorie-Kurs mit 14 Lektionen, eine je Sachgebiet, mit Erklärtexten, den passenden Zeichen daneben und drei Merksätzen am Ende. Der Kurs bringt keine eigenen Fragen mit: die Lernstandskontrolle nimmt Fragen aus demselben Katalog wie die Prüfungssimulation, und ihre Antworten zählen auch in den Theorie-Lernstand - sonst gälte eine im Kurs gemeisterte Frage im Schwachstellen-Trainer weiter als ungekonnt. Gelesen und geschafft werden getrennt gezählt, die Kontrolle ist freiwillig, und die Reihenfolge ist eine Empfehlung statt einer Sperre.
  • 🚲 Gilt schon fürs Fahrrad: Zeichen, die für die Kinder heute relevant sind, sind gekennzeichnet - der Bereich ist nicht nur Vorbereitung auf übermorgen.

🩺 Erste Hilfe und Notfallwissen

Eigener Bereich zwischen KI-Bereich und Führerschein, pro Kind im Eltern-Bereich abschaltbar.

  • Ein Fragenpool für alle Klassenstufen - anders als bei den Schulfächern. Erste-Hilfe-Wissen hat keine Klasse-6-Fassung: die fünf W-Fragen sind mit elf dieselben wie mit fünfzehn, und die Drucktiefe bei der Herzdruckmassage ändert sich nicht mit dem Alter dessen, der sie anwendet. "Prüfen - Rufen - Drücken" wird an deutschen Schulen ab Klasse 7 mit denselben Zahlen wie bei Erwachsenen unterrichtet.
  • 80 Fragen in acht Themen: Notruf 112 und Eigenschutz, Bewusstsein und Atmung prüfen, stabile Seitenlage, Wunden und starke Blutungen, Verbrennungen, Herzdruckmassage, Defibrillator (AED), Verschlucken/Vergiftung/Schock. Acht getrennte Themen statt eines Blocks, damit die adaptive Übungsauswahl und die Themen-Heatmap im Eltern-Bericht ihre Auflösung behalten.
  • Auch die Grenzen stehen drin. "Beine immer hoch" ist bei Kopf-, Brust- und Atemproblemen falsch - halbgelerntes Erste-Hilfe-Wissen ist genau dort gefährlich, wo es sich vollständig anfühlt. Ebenso: nichts zu tun ist der einzige echte Fehler, und ein Notruf allein ist schon Erste Hilfe.

🗓️ Ferien und Feiertage (Berlin)

Auf der Startseite eine Kachel, im Eltern-Bereich die vollständige Liste.

  • Fest einkompiliert, nicht aus dem Netz geholt (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.
  • Für das Kind eine Zahl: läuft gerade etwas, steht da "Sommerferien - noch 17 Tage"; sonst der Termin, der als Nächstes eintritt. Bewusst nicht "die nächsten Ferien": wenn vorher ein Feiertag liegt, ist der die Antwort auf die Frage, die ein Kind hat.
  • Ferien schlagen den Feiertag darin. Am 25.12. ist "Weihnachtsferien" die nützlichere Auskunft als "1. Weihnachtsfeiertag" - der steht ohnehin mittendrin.
  • Feiertage am Wochenende stehen als solche dran. Der 03.10.2026 ist ein Samstag und bringt keinen freien Tag; das gehört dazugesagt, statt einen Tag anzukündigen, an dem ohnehin niemand Schule hat.
  • Der Kalender sagt, wie weit er reicht. Der Eltern-Bereich zeigt das Enddatum von Ferien und Feiertagen an, und hinter dem letzten Termin verschwindet die Kind-Kachel, statt leer dazustehen. Ein leerer Kalender, der wie ein voller aussieht, wäre die schlechtere Antwort.

📋 Planer aus jedem Bereich erreichbar

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:

  • Kein Fortschrittsverlust. Zurück kommt dieselbe ViewModel-Instanz, nicht eine neue - die halb beantwortete Aufgabe, der angefangene Text und die Position im Zeichen-Quiz stehen noch da.
  • Kein Schlupfloch. Die Mindestzeit-Uhr der Etappe wird angehalten (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.

Eltern-Features

  • Zahnrad-Symbol (unten rechts, dezent) öffnet den passwortgeschützten Eltern-Bereich.
  • Erststart: Admin-Passwort selbst festlegen (PBKDF2-SHA256 mit 600.000 Durchläufen, kein Klartext gespeichert; ältere Passwörter werden beim nächsten Anmelden still auf diese Stärke umgestellt).
  • ℹ️ Systeminfo (seit 2.0): App-Version samt Git-Stand, .NET, Windows, Datenbankgröße, letzte automatische Sicherung – mit Kopieren-Knopf, für jede Rückfrage bei einem Problem.
  • Fachbereiche einzeln deaktivieren, Klassenstufe (6/7/8/9/10) einstellen.
  • 🏖️ Ferien-/Pausenmodus (global, ein Datum): bis einschließlich dieses Tages startet LernTor ohne Kiosk-Sperre und ohne Lernpflicht. Das Kind sieht statt der Lernstrecke einen Ferien-Bildschirm mit dem Enddatum, den verbleibenden Tagen und einem großen "PC entsperren"- Knopf, der LernTor beendet; darunter, bewusst kleiner, "Trotzdem üben" für den freiwilligen Weg in die normale Profilauswahl. Nach dem Enddatum kommen Sperre und Lernstrecke von selbst zurück - Eltern müssen an nichts denken. Realer Fehler, den das behebt: der Modus übersprang anfangs nur die technische Sperre. Die Oberfläche wusste nichts davon, das Kind landete im Vollbild auf dem Begrüßungsbildschirm und musste bis zum Abschlussquiz durch, um an den PC zu kommen - von außen war der grün leuchtende Ferienmodus damit schlicht wirkungslos. Die Regel steht deshalb jetzt einmal als 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.
  • Schwierigkeitsstufen pro Profil (Presets statt Freitext, kein neuer Build nötig): Tipptrainer- Mindestgenauigkeit (25/50/75/85%, Standard 25%), Abschlussquiz-Bestehensschwelle für den 1. Versuch (50/75/85%, Standard 50%) und für den 2. Versuch/die Wiederholung (25/50%, Standard 25%).
  • 🎯 Wochenziel pro Profil (optional, Standard aus): 3 bis 7 Lerntage pro Woche. Wie die Lernserie reine Anzeige ohne Druckmechanik - ein verfehltes Ziel kostet keine Sterne und erzeugt keine Mahnung. Anders als eine Serie zerbricht es aber nicht an einem einzigen verpassten Tag: wer Montag und Dienstag nicht kann, schafft die vier Tage immer noch. Die Woche beginnt am Montag, damit "diese Woche" zum Stundenplan passt. Ist das Ziel rechnerisch nicht mehr erreichbar, wird bewusst nichts Mahnendes angezeigt.
  • ⏱ Antworttempo im Wochenbericht: zeigt, wie viele Antworten unter 3 Sekunden kamen, plus eine Warnzeile, wenn das ab 10 Messwerten ein Drittel oder mehr sind. Im reinen Richtig/Falsch-Bericht ist Raten unsichtbar - bei drei Optionen liegt Raten in einem Drittel der Fälle richtig. Bewusst nur ein Hinweis für die Eltern, keine zusätzliche Sperre für das Kind: wer das Antworten selbst blockiert, bestraft auch das Kind, das die Antwort einfach sofort weiß.
  • ⏱ Lernzeit je Fach (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.
  • 🩺 Feed-Gesundheit: an jeder Quelle steht, wie der letzte tatsächliche Abruf ausging (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.
  • Aufteilung des Startbildschirms: Stundenplan und Hausaufgaben stehen links, Klausuren und die Ferien-Kachel rechts, in der Mitte Begrüßung und der "Los geht's"-Knopf. Vorher stand alles untereinander in einer mittigen Spalte - bei neun Hausaufgaben und acht Klausuren wuchs sie über die Bildschirmhöhe hinaus und schob den Start-Knopf hinaus, das Kind kam schlicht nicht weiter. Die Spalten allein reichen dafür nicht (zwanzig Einträge würden auch eine schmale Spalte überlaufen lassen), deshalb sitzt jede Spalte in einem ScrollViewer: lange Listen scrollen innerhalb ihrer Spalte, statt die Seite wachsen zu lassen. Der Start-Knopf kann damit unabhängig von der Anzahl der Einträge nie mehr verschwinden.
  • 🕘 Stundenplan: der Plan des Kindes steht links, über den Hausaufgaben - also zwischen der Datum/Uhrzeit-Anzeige oben links im Fenster und dem Hausaufgabenplan, genau die Reihenfolge, in der ein Kind morgens danach schaut. Gezeigt wird immer der Tag, der wirklich als Nächstes dran ist: nach der letzten Stunde, am Wochenende, an Feiertagen und in den Ferien springt die Kachel automatisch auf den nächsten Unterrichtstag (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).
  • 📚 Fächer nach Stundenplan (seit 2026/27, pro Kind abschaltbar im Eltern-Bereich): geübt werden nur die Schulfächer, die am nächsten Schultag auf dem Plan stehen – Vorbereitung statt Nachbereitung; freitags und am Wochenende die vom Montag, in den Ferien die vom ersten Schultag danach. Türkisch ist immer dabei, auch ohne Türkischstunde. NaWi wechselt reihum zwischen Biologie, Chemie und Physik (gezählt über die NaWi-Tage des Wochenplans, also nie zweimal hintereinander dasselbe). Klausurfächer sind in der Woche vor dem Termin immer dabei. Das Abschlussquiz fragt nur die geübten Fächer ab. Lesen, Tippen, News, KI-Bereich, Führerschein und Erste Hilfe bleiben unberührt. Unter dem Stundenplan steht für das Kind, warum: „Heute übst du für Dienstag: Mathematik · Musik · Türkisch". Ohne eingetragenen Plan bleibt alles wie vorher (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.
  • 📒 Hausaufgaben: Fach, Stichtag und Text - von Eltern UND Kindern eintragbar (Knopf auf dem Startbildschirm, linke Spalte). Dieselbe Asymmetrie wie beim Klausurkalender: eigene Einträge darf das Kind löschen, Eltern-Einträge nur abhaken - das ist ja der Sinn der Sache; nur das Wegräumen einer Aufgabe, die es nicht erledigt hat, wäre ein Schlupfloch. Anders als bei Klausuren ist ein Stichtag in der Vergangenheit hier erlaubt: eine vergessene Hausaufgabe nachzutragen ist normal.
  • 📅 Klausurkalender: Termine pro Kind mit Fach, Titel, Themen und Datum. Die Kinder dürfen selbst eintragen (Button auf dem Startbildschirm, rechte Spalte) - mit einer Asymmetrie: eigene Einträge dürfen sie ändern und löschen, Eltern-Einträge nur ansehen, sonst wäre "Klausur weg, also nicht lernen" ein bequemer Ausweg. Die Prüfung sitzt im Repository (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.
  • 📰 Nachrichtenquellen wählbar: alle 44 kuratierten Quellen einzeln an- und abschaltbar, nach Sprache gruppiert (Deutsch, Türkisch, Englisch) mit Region als Einordnung, dazu "alle an/aus". Wie viele Nachrichten daraus täglich werden, steuert News: Nachrichten pro Tag (pro Profil). Der Hinweis darunter rechnet mit: sind mehr Quellen aktiv als Nachrichten eingestellt, steht dort, über wie viele Tage jede Quelle einmal vorbeikommt. Sind alle abgeschaltet, greifen bewusst wieder alle: ein leerer News-Bereich wäre schlimmer als eine ignorierte Einstellung.
  • 📚 Alle Lesetexte verwalten: eine Liste über die eingebauten und die eigenen Texte, mit Suche und Filter "nur eigene". Haken weg blendet einen Text dauerhaft aus. 📌 Anheften stellt einen Text jeden Tag an die erste Stelle, bis er wieder gelöst wird - gedacht zum sofortigen Prüfen eines neu eingetragenen Textes und um ein Gedicht vor der Abfrage täglich üben zu lassen. Eigene Texte sind auch nachträglich bearbeitbar.
  • 📖 Eigene Lesetexte pro Profil: ein Gedicht, das gerade in der Schule dran ist, oder ein türkischer Text aus der Familie. Ein eigener Text belegt einen der beiden Vorlese-Plätze des Tages (mehrere wechseln sich täglich ab), damit er auch wirklich drankommt statt sich unter den 63 eingebauten Texten zu verlieren. Es reicht eine Sprache; leere Sprachfassungen zeigen dem Kind einen kurzen Hinweis statt einer leeren Spalte.
  • Eigene Aufgaben kommen garantiert dran: was Eltern eintragen oder aus einem Dokument übernehmen, wird bei der nächsten Lernrunde im gewählten Fach vollständig abgefragt - noch vor den automatisch erzeugten Aufgaben. Zu beachten: die Klassenstufe der Aufgabe muss zur Stufe des Profils passen, sonst sieht das Kind sie nie. Der Eltern-Bereich zeigt deshalb an, welches Profil welche Stufe hat.
  • 🗂 Vokabeltrainer (Englisch/Türkisch): eigene Wortlisten je Profil, eingefügt als ganze Liste (eine Zeile je Vokabel, =/;/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.
  • ⌨️ Eigene Tipp-Texte: die Zieltexte der beiden letzten Tipptrainer-Lektionen (Sätze und Abschluss) lassen sich selbst schreiben, max. 200 Zeichen mit Live-Zähler. Die Aufbaulektionen bleiben bewusst fest - sie üben gezielt einzelne Tastenbereiche.
  • 🔥 Lernserie (optional, Standard aus): zeigt dem Kind auf dem Willkommensbildschirm die aufeinanderfolgenden Lerntage an (ab 2 Tagen). Bewusst reine Anzeige-Motivation ohne Druckmechanik - keine Strafen oder Erinnerungen bei verpassten Tagen (anders als z.B. Duolingo-Streaks), und ein heute noch nicht gelernter Tag bricht die Serie nicht. Eltern schalten die Anzeige explizit ein.
  • Sicherung (Backup): die komplette Datenbank (Profile, Fortschritte, Sterne, Einstellungen) als eine Datei exportieren - z.B. auf einen USB-Stick - und bei Bedarf wiederherstellen. Der Export nutzt SQLites 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).
  • Automatische Sicherung (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.
  • Aktivitätsprotokoll: alle beantworteten Aufgaben + Quiz-Ergebnisse einsehbar.
  • Bericht "Stärken & Schwächen" (pro Profil, umschaltbar 7/30 Tage): Richtig-Quote je Fach als Ampel-Balken (grün ≥75 %, gelb, rot <50 %), schwächste Fächer zuerst; dazu die Themen-Heatmap „Schwächste Themen" - die bis zu 10 schwächsten Einzel-Themen (ab 3 Antworten Datenbasis), damit sichtbar wird, dass z.B. genau „Brüche" hakt und nicht pauschal „Mathe"; außerdem Lerntage im Zeitraum und der Abschlussquiz-Verlauf. Rechnet komplett aus dem vorhandenen Aktivitätsprotokoll - keine neuen Tabellen.
  • ✏️ Diktat (Deutsch, 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.
  • 📄 Lesetext aus PDF/Word einlesen: füllt das Formular für eigene Lesetexte aus einer Datei, statt sie abtippen zu lassen. Die Textextraktoren des Lehrer-Imports (PdfPig/OpenXml) waren dafür schon da - was fehlte, ist die Aufbereitung (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.
  • 🖨 Übungsblatt zum Ausdrucken (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.
  • 📄 Bericht als Datei speichern: schreibt genau den angezeigten Bericht (Fächer, Themen-Heatmap, Lernzeit je Fach, Lerntage, Quiz-Verlauf, Tempo und - falls eingeschaltet - die Vergleichstabelle) als eine eigenständige HTML-Datei zum Aufheben, Ausdrucken oder Mitnehmen zum Elterngespräch. Bewusst HTML und keine PDF-Bibliothek: eine einzelne HTML-Datei öffnet jeder Rechner ohne Zusatzsoftware, und über "Drucken → Als PDF speichern" entsteht das PDF genau dann, wenn es gebraucht wird - eine PDF-Bibliothek wäre eine weitere Abhängigkeit im self-contained Build für ein Ergebnis, das der Browser ohnehin liefert. Die Datei ist vollständig eigenständig (Stil inline, keine Bilder, kein Nachladen aus dem Netz) und sieht auch auf einem Rechner ohne Internet vollständig aus (ReportExport).
  • 👨‍👩‍👧‍👦 Kinder nebeneinander (optional, Standard AUS): stellt alle angelegten Profile in einer kompakten Tabelle nebeneinander - Lerntage, Trefferquote, Lernzeit und Sterne, im selben 7/30-Tage-Zeitraum wie der übrige Bericht. Das Abschalten ist hier keine Bequemlichkeit, sondern der Kern der Sache: Geschwister zu vergleichen kann anspornen, kann aber genauso gut das Kind entmutigen, das immer hinten liegt - ob das in einer Familie hilft oder schadet, können nur die Eltern beurteilen, also ist es eine bewusste Entscheidung und keine Voreinstellung. Aus demselben Grund sortiert die Tabelle nach Namen, nicht nach Leistung: eine nach Trefferquote sortierte Liste wäre ein Siegertreppchen, auf dem ein Kind dauerhaft unten steht. Ein Kind, das im Zeitraum gar nichts bearbeitet hat, bleibt mit dem Hinweis "in diesem Zeitraum keine Aufgaben bearbeitet" stehen statt zu verschwinden - genau das ist ja die interessante Zeile. Bei nur einem Profil bleibt die Tabelle mit entsprechendem Hinweis leer (ProfileComparison).
  • "Sofort freischalten": Notfall-Override, überspringt den restlichen Ablauf.
  • "Alle Daten zurücksetzen…" (Gefahrenzone): löscht alle Profile/Fortschritte/Einstellungen aus der App heraus, mit Ja/Nein-Bestätigung. Vorher ging das nur manuell über das Löschen von lerntor.db.
  • Fehlerprotokoll (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.
  • Eigene Aufgaben ("Eigene Aufgaben (z.B. von der Lehrkraft)"): Formular zum manuellen Anlegen eigener Fragen (Fach, Klassenstufe, Fragetyp, Frage, Antwortoptionen, richtige Antwort(en), Erklärung, optionaler Tipp) - z.B. für aktuelle Hausaufgaben oder Themen, die die Lehrkraft gerade durchnimmt. Gespeichert in der lokalen DB (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.

Bekannte Grenzen / nächste Schritte

Die aktuelle Arbeitsliste steht in docs/NAECHSTE-SCHRITTE.md. Dieser Abschnitt beschreibt dauerhafte Grenzen und Entwurfsentscheidungen.

  • KI-Funktionen: komplett lokal, keine Cloud-Anbindung. LernTor nutzt an keiner Stelle einen Cloud-KI-Dienst - das lokal geladene Sprachmodell ist die einzige KI-Anbindung, für zwei Features: automatisches Einlesen von Lehrer-Unterlagen (PDF/Word → Fragenvorschläge) und den KI-Lernchat für Kinder (siehe "Eltern-Features" bzw. weiter unten). Beide teilen sich dieselbe Infrastruktur:
    • 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.
    • Modell-Katalog + automatischer Download (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).
      • Standard: Qwen2.5-7B-Instruct (Q4_K_M, ~4,7 GB, Apache-2.0): als einzige Familie im permissiv lizenzierten, CPU-tauglichen 7B-Bereich offiziell stark in Deutsch UND Türkisch (29+ Sprachen), deutlich besseres Reasoning und Erklärqualität als das 3B - und dieselbe Modellfamilie, gegen die Prompt-Format und AntiPrompts-Stoppwörter in dieser Codebasis bereits erprobt sind. Verworfen: Mistral-7B (Türkisch schwach), Llama-3.1-8B (Lizenz + Türkisch mittelmäßig), Gemma-2-9B (Lizenz), Qwen2.5-14B (~9 GB Q4 → auf Familien-CPUs nur 2-4 Token/s, zu langsam für den Kinder-Chat).
      • Alternative: Qwen2.5-3B-Instruct (Q4_K_M, ~2 GB) als "Leicht & schnell"-Option für ältere PCs, auf denen das 7B zu langsam antwortet.
      • Download-Robustheit (nach real fehlgeschlagenem Erst-Download beim Nutzer korrigiert): der Download nutzt einen eigenen HttpClient ohne Timeout - der geteilte App-Client hätte mit seinem 100-Sekunden-Standard-Timeout jeden GB-Download über Heim-Internet mitten im Stream abgebrochen (das war die eigentliche Fehlerursache). Als Quellen dienen die bartowski/-GGUF-Repos (verlässlich Einzeldateien; die offiziellen Qwen/-GGUF-Repos teilen größere Modelle in -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).
    • API-Verifizierung: 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.
  • Automatisches Einlesen von Lehrer-Unterlagen (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.
    • Inline-Editing: alle Felder eines Vorschlags (Thema, Frage, Optionen, richtige Antworten, Erklärung, Tipp) sind direkt in der Vorschlagskarte korrigierbar, bevor übernommen wird - "Übernehmen" validiert (Frage/Antwort vorhanden, bei Auswahlfragen mindestens 2 Optionen und die richtige Antwort wörtlich darunter) und zeigt Fehler direkt an der Karte. Die Belegstelle aus dem Dokument bleibt bewusst nicht editierbar - sie ist die Prüf-Referenz, kein Inhalt.
  • KI-Lernchat für Kinder (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.
  • News-Quellen: kuratierte RSS-Feeds (siehe 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).
  • Vereinfachung der Artikeltexte ist aktuell regelbasiert (kein LLM). Ein lokales LLM (Phi-3, Gemma 2, Llama 3.1 über Ollama) ließe sich über das ITextSimplifier-Interface in LernTor.News als zweite Implementierung ergänzen, ohne den Rest der App anzufassen.
  • Wird inzwischen auch auf einem echten Windows-Rechner getestet (nicht nur über den CI-Workflow .github/workflows/build.yml auf windows-latest), da diese Entwicklungsumgebung selbst kein Windows bereitstellt.

Schnellstart (Entwicklung)

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: