> ## Content Index
> Fetch the complete content index at: https://schmidbauer.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# SchulSchach AG: Schach lernen in der AG, ohne Daten zu sammeln
- URL: https://schmidbauer.io/schulschach-ag/
- Published: 2026-10-26T23:57:11.000Z
- Updated: 2026-10-26T23:57:11.000Z
- Description: SchulSchach AG ist eine selbst gehostete Lernplattform für Schach-AGs mit Aufgaben, Hausaufgaben, Live-Partien und Turnieren. Wir zeigen alle Bereiche, die Datensparsamkeit und wie man sie ausprobiert.
- Author: Tobias Schmidbauer
- Tags: Selfhosting und KI

Für eine Schach-AG braucht man Aufgaben, Partien und ab und zu ein Turnier. SchulSchach AG bündelt das in einer Lernplattform, die auf dem eigenen Server läuft. Das Ziel steht auf der Projektseite: eine Plattform, die „möglichst wenig über die Kinder weiß“. Am Ende kennen wir alle Bereiche der App, wissen, welche Daten sie speichert und welche nicht, und haben sie bei Bedarf lokal gestartet.

Projektseite mit Überblick: [tjrschmidbauer.github.io/schulschachag](https://tjrschmidbauer.github.io/schulschachag/)  
Quellcode und Anleitungen: [github.com/TJRSchmidbauer/schulschachag](https://github.com/TJRSchmidbauer/schulschachag)

## Zwei Bereiche: Schüler und Trainer

Die App hat genau zwei Rollen. Schülerinnen und Schüler lösen Aufgaben, spielen gegeneinander und sammeln Medaillen. Der Trainer oder die Trainerin legt Schüler an, vergibt Hausaufgaben, setzt Partien an und leitet Turniere. Mehr gibt es nicht: keinen Chat, keine Profile, keine Freundeslisten.

## Anmeldung mit Code statt Passwort

Jedes Kind bekommt einen zehnstelligen Code, zum Beispiel `3F9A7C21E8`. Damit meldet es sich an. Es gibt kein Passwort, keine E-Mail-Adresse und keinen Klarnamen. Im System steht nur ein Alias wie „Bauer-Mia“ oder „Turm-Leo“.

Der Trainer legt die Aliasse an und sieht die Codes in seiner Übersicht. Vergisst ein Kind seinen Code, zeigt er ihn noch einmal an oder stellt einen neuen aus. Für eine ganze Gruppe gibt es einen CSV-Import, auf Wunsch mit erzeugten Spitznamen.

![Trainerbereich von SchulSchach AG: Schülerliste mit Alias, Fortschritt und Code-Verwaltung](https://schmidbauer.io/content/images/2026/10/schulschach-schueler.png)

Die Schülerverwaltung: Alias anlegen, Fortschritt sehen, Code anzeigen oder neu ausstellen.

Der Trainer meldet sich unter `/trainer` mit einem eigenen, langen Trainer-Code an. Den Klartext speichert die App nirgends, nur einen Hash.

## Lernpfade, Aufgaben und Hausaufgaben

Die Aufgaben stammen aus der Lichess Open Database. Diese Datenbank steht unter CC0 und ist damit frei nutzbar. Beim Import wird nur eine gefilterte Auswahl lokal gespeichert, die App fragt Lichess danach nicht mehr ab.

Aus den Aufgaben entstehen Lernpfade mit Modulen, zum Beispiel „Startklar“, „Matt-Muster“, „Taktik-Werkzeugkasten“, „Endspiel-Grundlagen“ sowie „Verteidigung und Geduld“. Auch mehrzügige Aufgaben funktionieren: Nach einem richtigen Zug antwortet der Gegner automatisch.

Hängt ein Kind fest, hilft die App in drei Stufen:

1. **Hinweis:** ein Tipp, worauf man achten sollte.
2. **Zielfeld:** das Feld, auf das der richtige Zug führt.
3. **Lösung:** der Zug selbst.

Das Titelbild zeigt die zweite Stufe an einem Grundreihenmatt: Das Zielfeld a8 ist markiert, der Turm zieht von a1 dorthin, Ta8 ist matt.

![Übungsbereich von SchulSchach AG: Aufgabenfilter, Formular für Hausaufgaben und Aufgabenliste mit Brettvorschau](https://schmidbauer.io/content/images/2026/10/schulschach-uebungen.png)

Übungen: Aufgaben nach Thema und Rating filtern, im Brett ansehen und als Hausaufgabe freischalten.

Im Trainerbereich filtert man die Aufgaben nach Thema, Rating und Suchbegriff. Das Rating ist die Schwierigkeitszahl aus Lichess, eine kleine Zahl bedeutet eine leichtere Aufgabe. Ausgewählte Aufgaben werden zur Hausaufgabe, für alle oder nur für bestimmte Kinder und auf Wunsch mit Fälligkeitsdatum.

Die Statistik zeigt je Schüler und je Thema, wie oft eine Aufgabe selbstständig, mit Tipp oder mit angesehener Lösung gelöst wurde. So sieht man, wo die ganze Gruppe noch Übung braucht.

## Live-Partien mit Schachuhr

Die Kinder fordern sich in einer Spiel-Lobby gegenseitig heraus und spielen mit Schachuhr. Einen Chat gibt es auch hier nicht. Der Trainer kann Paarungen selbst ansetzen und dabei die Bedenkzeit wählen.

Partien müssen nicht aus der Grundstellung beginnen. Über eine FEN, eine Textzeile, die eine Stellung beschreibt, startet eine Partie mitten in einem Endspiel oder in einer Eröffnung, die gerade Thema war.

![Live-Bereich von SchulSchach AG: Partie mit Bedenkzeit und eigener Startstellung ansetzen](https://schmidbauer.io/content/images/2026/10/schulschach-live-partien.png)

Live-Partien: Paarung, Bedenkzeit und Startstellung festlegen.

Laufende Partien kann der Trainer live verfolgen, mit einer Bewertung der Engine Stockfish. Nach der Partie markiert die Analyse die Patzer. Die Engine rechnet im Browser und schickt keine Stellungen an fremde Server.

## Turniere im Schweizer System

Für echte Brettpartien im Raum gibt es Turniere mit bis zu 100 Teilnehmern. Beim Schweizer System scheidet niemand aus. In jeder Runde spielen Teilnehmer mit ähnlicher Punktzahl gegeneinander, und niemand trifft zweimal auf denselben Gegner. Die Auslosung folgt dem FIDE-Holländischen System (C.04.3). Bei ungerader Teilnehmerzahl bekommt jemand ein Freilos und damit einen Punkt ohne Partie.

![Turnierbereich von SchulSchach AG: neues Turnier im Schweizer System anlegen, Teilnehmer und Gast-Aliasse wählen](https://schmidbauer.io/content/images/2026/10/schulschach-turniere.png)

Turniere: Teilnehmer aus der AG wählen, Gäste ergänzen, Runden auslosen.

Bei Punktgleichheit entscheidet die Feinwertung. Die App sortiert nach Punkten, dann nach Buchholz mit einem Streichergebnis, Feinbuchholz, Sonneborn-Berger und der Zahl der Siege. Die Buchholz-Wertung $B$ ist die Summe der Punkte $P\_j$ aller bisherigen Gegner $j$:

$$B = \\sum\_{j} P\_j$$

Ein Beispiel: Eine Spielerin hatte vier Gegner mit 3, 2, 1,5 und 1 Punkt. Ihr Buchholz beträgt $B = 3 + 2 + 1{,}5 + 1 = 7{,}5$. Mit einem Streichergebnis fällt der schwächste Gegner weg, es bleiben $7{,}5 - 1 = 6{,}5$. Wer gegen starke Gegner gespielt hat, steht also weiter oben.

Die Partien finden am echten Brett statt, der Trainer trägt die Ergebnisse ein. Erst wenn alle Ergebnisse einer Runde vorliegen, lässt sich die nächste auslosen. Für den Raum gibt es eine Beamer-Ansicht im Vollbild: Sie aktualisiert sich alle 5 Sekunden und wechselt auf Wunsch zwischen Paarungen und Rangliste. Wer früher gehen muss, wird für die folgenden Runden abgemeldet.

## Medaillen und Urkunden

Medaillen belohnen Fleiß: für eine bestimmte Zahl gelöster Aufgaben, für Aufgaben ohne Tipp, für mehrere Tage in Folge und für das Meistern eines Themas. Wie schwer sie zu erreichen sind, stellt der Trainer ein.

Urkunden entstehen als SVG zum Drucken. Der echte Name wird dafür nur im Browser des Trainers eingetragen und nie an den Server geschickt. Die Kinder sehen ihre Medaillen, die Urkunden sieht nur der Trainer.

## Datenschutz als Grundlage

Die Projektseite sagt es so: Datenschutz ist hier kein Feature, sondern das Design. Konkret heißt das:

- Im System gibt es nur Alias und Code. Klarnamen kommen nicht vor.
- Keine Tracker, kein Chat, keine externen Schriften und keine CDNs. Zur Laufzeit ruft die App keine fremden Dienste auf.
- Codes und Trainer-Code werden mit scrypt gehasht. Schülercodes liegen zusätzlich mit AES-256-GCM verschlüsselt vor, damit der Trainer sie anzeigen kann.
- Sitzungen enden nach 2 Stunden. Nach fünf falschen Trainer-Codes ist die Anmeldung 15 Minuten gesperrt.
- Beendete Partien und Turniere werden nach einer einstellbaren Frist gelöscht, standardmäßig nach 90 Tagen.
- Jede Nacht entsteht eine Datensicherung. Aufbewahrt werden 7 Tages-, 4 Wochen- und 3 Monatsstände.

Gespeichert werden Alias, Anmeldezeitpunkt, Lösungsversuche, Live-Partien, Turniere und optional die Gruppe. Das README benennt auch einen Kompromiss offen: Datensparsamer wäre es, Codes nur einmal beim Anlegen zu zeigen. Die Verschlüsselung erlaubt dafür, dass der Trainer einen vergessenen Code wieder anzeigen kann.

Alle Maßnahmen sind in einem [Sicherheitsaudit](https://github.com/TJRSchmidbauer/schulschachag/blob/main/docs/sicherheitsaudit.md) dokumentiert, gegliedert nach OWASP, BSI-IT-Grundschutz und DSGVO. Es enthält auch die Restrisiken und eine Liste der Punkte, die nur der Betreiber erledigen kann, etwa Einwilligungen und das Verzeichnis der Verarbeitungstätigkeiten.

## Ausprobieren

Zum Testen genügt ein Rechner mit Docker. Ein Reverse-Proxy ist dafür nicht nötig:

```bash
git clone https://github.com/TJRSchmidbauer/schulschachag
cd schulschachag
cp .env.example .env   # Werte eintragen, APP_URL=http://localhost:3000
docker compose -f compose.local.yml up -d --build
```

Danach läuft die App unter `http://localhost:3000`. Die Codes der Test-Schüler stehen einmalig im Log des Containers:

```bash
docker logs schulschach_app
```

Für den Trainer-Code erzeugen wir vorher einen Hash. Der Code muss mindestens 20 Zeichen lang sein:

```bash
npm install
npm run hash:trainer -- "EIN_LANGER_TRAINER_CODE"
```

Die ausgegebene Zeile `TRAINER_CODE_HASH=scrypt:…` kommt in die `.env`. Für den echten Betrieb beschreibt das README einen Stack mit Portainer und Traefik, inklusive HTTPS, Ressourcenlimits und automatischer Datensicherung.

## Grenzen

- **Ohne Server geht nichts.** Die App braucht Docker und eine PostgreSQL-Datenbank. Nur Schachbrett, Engine und Urkunden-Editor rechnen im Browser.
- **Nur eine Instanz.** Die Live-Partien laufen über einen Nachrichtenverteiler im Arbeitsspeicher. Mehrere parallele Instanzen der App funktionieren deshalb nicht.
- **Keine offizielle Turniersoftware.** Die Auslosung kommt aus der Bibliothek `@echecs/swiss`. Sie ist nicht von der FIDE anerkannt, und die Feinwertungen decken nicht jeden Randfall ab. Für offizielle Turniere gilt die jeweilige Ausschreibung.
- **Mit KI-Unterstützung entwickelt.** Der Code wurde nicht von einer unabhängigen Fachperson geprüft. Wer die App betreibt, ist selbst verantwortlich für Konfiguration, Updates, Backups und Datenschutz.

## Für die AG und den Unterricht

- Vor der nächsten AG-Stunde ein Modul wie „Matt-Muster“ als Hausaufgabe freischalten und in der Stunde die schwierigsten Aufgaben gemeinsam besprechen.
- Die Statistik zeigt, welches Thema der Gruppe schwerfällt. Daraus ergibt sich das Thema der nächsten Stunde.
- Eine Endspielstellung per FEN an alle Paare verteilen und ausspielen lassen.
- Zum Halbjahresende ein Turnier im Schweizer System spielen, mit Rangliste am Beamer und Urkunden für alle.
- Für Mathe: Buchholz und Sonneborn-Berger sind Summen mit Bedingungen. Eine Rangliste von Hand nachzurechnen, ist eine gute Übung zum Summenzeichen.

## Fazit

SchulSchach AG deckt ab, was eine Schach-AG im Alltag braucht: Aufgaben mit gestufter Hilfe, Hausaufgaben mit Statistik, Live-Partien mit Analyse und Turniere im Schweizer System. Dabei speichert die App nur Aliasse und Lernstände. Der Preis dafür ist ein eigener Server, den man betreiben und pflegen muss. Der Quellcode steht unter MIT-Lizenz und lässt sich für die eigene Gruppe anpassen.

## Quellen und weiterführende Links

- [SchulSchach AG: Projektseite](https://tjrschmidbauer.github.io/schulschachag/)
- [SchulSchach AG: Quellcode, README und Anleitungen auf GitHub](https://github.com/TJRSchmidbauer/schulschachag)
- [Sicherheitsaudit](https://github.com/TJRSchmidbauer/schulschachag/blob/main/docs/sicherheitsaudit.md) und [Regeln und Grenzen der Turniere](https://github.com/TJRSchmidbauer/schulschachag/blob/main/docs/turniere.md)
- [Lichess Open Database: Puzzle-Datenbank (CC0)](https://database.lichess.org/#puzzles)
- [FIDE Handbook: C.04.3 FIDE (Dutch) System](https://handbook.fide.com/chapter/C0403202602)
- [Stockfish.js](https://github.com/nmrugg/stockfish.js) und [@echecs/swiss](https://github.com/echecsjs/swiss)