Kindertraining-Orga (TC Gleuel)

Ersetzt Excel und E-Mail bei der Organisation des Kindertrainings. Seit der Wintersaison 2026/27 im Einsatz, Eltern buchen freie Plätze selbst.

Produktiv seit Saison 2026/27

  • SvelteKit 5
  • TypeScript
  • Node + Effect
  • SQLite
  • Caddy
  • Docker
  • Debian
  • Git
  • Bash
  • CI/CD
  • Spec-Driven Development
  • Spec Kit
  • mattpocock/grill-me
  • Impeccable
  • Ponytail

Ausgangslage

Der Trainer organisierte das Kindertraining (Somer- sowie Wintersaisons) des Tennisclubs bisher mit Excel und E-Mail: Anmeldungen werden aus den E-Mails erfasst und in Excel Tabellen überführt, rund 80 Kinder müssen je Stufe zugeordnet, Alter und Zeitfenster in Gruppen einteilen, Familien informieren. Absagen und Nachholtermine konnten gar nicht erst berücksichtig werden. Painpoint: Wie können rund 80 Kinder auf 7 Plätze fair organisiert werden ohne Kindern abzusagen bzw. zu priorisieren?

Leitprinzip

Die App schlägt vor, der Trainer entscheidet. Das ist kein Marketingsatz, sondern zieht sich durch die Entscheidungen: Warnung statt Sperre, manuelle Wahl statt automatischer Rangfolge, Mails nur nach Prüfung.

Kinderdaten sind tabu, auch für die KI. Die App speichert Namen, Alter und Kontaktdaten von Kindern und Eltern. Datenschutz stand deshalb bei jeder Entscheidung vorne: nur die Daten erheben, die ein Feature braucht, Familien sehen nie die Daten anderer Familien, Daten lassen sich auf Wunsch löschen. Die KI, mit der ich arbeite, sieht keine echten Daten. Entwicklung, Tests und alle Screenshots hier laufen mit erfundenen Daten.

Tempo durch KI

Von der ersten Spec bis zum Einsatz im Verein verging nur kurze Zeit, in der effektiven Arbeitszeit gerechnet. 21 Specs mit Klärungsrunden, Tests und Deployment hätte ich vor KI allein in dieser Geschwindigkeit nicht geschafft. Möglich wurde es, weil jede Spec vorab klärt, was gebaut wird, und die KI dann nur noch umsetzt. Die Entscheidungen bleiben bei mir.

Warum dieser Stack

Der Stack ist so klein, wie die Aufgabe es erlaubt, und jede Wahl folgt aus den Kinderdaten oder aus der Größe eines Vereinsprojekts.

Wie das Projekt entstanden ist

Das Projekt entstand spec-getrieben mit KI-Unterstützung. Jedes Feature beginnt mit einer Spec. In einer Klärungsrunde werden Fragen gestellt und beantwortet, bevor Code entsteht. Die Antworten, und damit die Richtung des Produkts, stammen von mir. Die Entwicklung unten ist aus diesen Klärungsrunden rekonstruiert.

Aufbau

SystemaufbauTrainer und Eltern erreichen Caddy per HTTPS. Caddy leitet an das statische Frontend und an das Backend weiter. Das Backend nutzt SQLite und verschickt Mails über das Vereinspostfach.VPSTrainer:inBrowser, angemeldetElternBrowser, ohne KontoCaddyTLS automatischSecurity-Headerkein Zugriffsprotokollfür Eltern-LinksFrontendSvelteKit 5, statischBackendNode + EffectSitzung für TrainerToken für ElternSQLiteHost-VolumeSicherung nachtsund vor jedem DeployVereinspostfachSTARTTLS, kein DrittanbieterHTTPS/apiMails an Familien
Systemaufbau: zwei Container hinter einer Origin, SQLite auf dem Host, Mails über das Vereinspostfach.
Gruppenbildung vom Entwurf zur FreigabeDer Trainer startet einen Entwurf, arbeitet beliebig oft mit Vorschlag, Verschieben und Fixieren und gibt dann in einer Transaktion frei. Eine Freigabe schickt keine Mail.Entwurf startenAlle Kinder liegenim PoolTrainerarbeitbeliebig oftwiederholbarFreigebeneine Transaktion,Prüfen und SchreibenGruppen stehenKinder ohne Platzbleiben im PoolVorschlagbis zu 5 VariantenÜbernahme nur per Klickveraltet: neu rechnenKind verschiebenWarnung statt Sperre:Stufe, Zeitslot,Gruppe vollGruppe fixierenDer Vorschlag lässtsie unangetastetFreigabe abgelehnt, wenneine Gruppe leer ist,ein Zeitslot überbucht istoder schon freigegeben wurdeKeine Mail bei der Freigabe: Die Zuteilung wartet als Benachrichtigung, der Trainer prüft und sendet.
Gruppenbildung: Der Trainer arbeitet im Entwurf, die Freigabe ist eine Transaktion und verschickt keine Mail.

Entwicklung

  1. Spec 001–002

    MVP und erste Korrekturen

    Gruppenbildung ohne KI. Ein deterministischer Algorithmus reicht, weil es ein Bin-Packing-Problem mit klaren Regeln ist. Unpassende Zuordnungen werden nur gewarnt, nie blockiert, damit der Trainer die Hoheit behält.

  2. Spec 003

    Saison als eigene Entität

    Das Schnuppertraining fällt im Winter aus. Statt es still zu ignorieren, wird die Saison eine echte, verwaltbare Entität mit eigenen Eigenschaften. Eine frühere Antwort wurde dafür bewusst revidiert.

  3. Spec 004–007

    Kapazität verstehen

    Der Trainingsrhythmus (wöchentlich oder 14-täglich) gehört zur einzelnen Gruppe, nicht zur Stufe. Welche Gruppen wechseln, entscheidet der Trainer; die App schlägt es nicht vor. Eine Schwellenwert-Konstante im Code entfällt, weil die Grenze erst nach Anmeldeschluss bekannt ist.

  4. Spec 008

    Der Algorithmus wird wieder entfernt

    Der automatische Gruppenvorschlag ignorierte freie Zeitslots, die ein Mensch sofort sah. Statt ihn zu flicken, wurde er gestrichen. Der Fokus ging auf bessere Warnungen und ein manuelles Werkzeug.

    Gruppenbildung mit Kapazitätsübersicht und Überbuchungswarnung
  5. Spec 009

    Produktivbetrieb auf eigenem VPS

    Eigener VPS statt Free-Tier-Anbieter, Caddy ohne Zugriffsprotokoll für Eltern-Zugangslinks, ein Git-Hook statt CI-Dienst (ein Ein-Personen-Projekt mit etwa einem Deploy pro Woche), eine einzige Origin hinter Caddy, Backup vor jedem Deploy, Elternmails über das Vereinspostfach statt über einen Drittanbieter.

    Ausrollen per git pushEin Push auf den VPS löst eine Sicherung und einen Bau mit Lint, Typprüfung und Tests aus. Sind alle Prüfungen grün, startet das System neu und wird per Health-Check geprüft. Schlägt eine Prüfung fehl, laufen die bisherigen Container unverändert weiter.git pushauf den VPSSicherungDatenbank vorjeder ÄnderungBau im ContainerLint, Typprüfung,alle TestsAlles grünNeustart, dann Health-Checkbis zu 30 Mal alle 2 SekundenEine Prüfung rotAbbruch, die laufendenContainer bleiben unangetastet
    Ausrollen: Bei einer roten Prüfung bleiben die laufenden Container unangetastet.
  6. Spec 010–013

    Stundenplan, Trainerstammdaten, einheitliche Oberfläche

    Der Trainer als Stammdatum ist nicht dasselbe wie ein App-Zugang. Beides wird getrennt modelliert.

    Stundenplan-Raster mit Plätzen, Woche A/B und Pool
  7. Spec 014

    Härtung nach Projektanalyse

    Ein eigenes Spec-Dokument für Korrekturen, die zu keinem Fachfeature gehören. Security-Header, darunter `Referrer-Policy: no-referrer`, damit der Zugangstoken der Eltern nicht über den Referer an Dritte gelangt. Jeder Request-Body wird an der API-Grenze gegen ein Schema geprüft, falsche Eingaben liefern `400` mit Grund und nie `500`. Das Löschen eines Kindes läuft in einer Transaktion, ganz oder gar nicht. Ein nicht erreichbarer Mailserver wird nach Sekunden abgebrochen, damit eine Freigabe nicht ewig hängt.

  8. Spec 015

    Der Algorithmus kommt zurück, aber anders

    Aus dem Fehler von Spec 008 gelernt. Jetzt gibt es Gruppen, die der Trainer fixieren kann, und der Algorithmus verteilt nur den Rest. Der Trainer arbeitet iterativ. Niemand wird vom Algorithmus abgesagt, wer nicht unterkommt, steht mit Grund und Kontaktdaten in einer Liste. Hintergrund war akuter Platzmangel, also möglichst volle Gruppen vor homogenem Alter, begrenzt durch eine harte 4-Jahres-Grenze.

    Gruppenbildung mit Vorschlägen berechnen und Fixierung
  9. Spec 016

    Freie Plätze fair in Wellen anbieten

    Kann ein Kind im 14-Tage-Rhythmus nicht, gibt die Familie den Platz über ihren Link frei. Damit nicht gewinnt, wer am häufigsten nachsieht, wird er in drei Wellen angeboten (Freitag der Vorwoche, Sonntag und Dienstag vor dem Termin, jeweils 20 Uhr). Erst Kinder mit Nachholanspruch, dann die Parallelgruppe derselben Stufe im selben Zeitslot, am Ende alle passenden der Stufe. Jede Welle bekommt zu ihrem Beginn eine Mail, innerhalb der Welle gewinnt, wer zuerst bucht. Wer am selben Tag selbst trainiert, wird nicht eingeladen. Buchungen gelten sofort, der Trainer sieht alles und kann stornieren. Das Feature ist im Einsatz, Familien buchen freie Plätze selbst.

    Terminseite des Trainers für einen Freitagstermin. Zwei Kinder haben ihren Platz freigegeben, ein Nachholkind hat in Welle 1 gebucht, die Mails je Welle sind aufgelistet, ein Platz ist noch frei. Demo-Daten.
  10. Spec 017

    Verbindliche Freigabe, bewusste Mails

    Mails an Familien entstehen nie als Nebeneffekt einer Bearbeitung, sondern als ausstehende Benachrichtigung, die der Trainer prüft und sendet.

    Elternseite auf dem Smartphone
  11. Spec 018

    Sicherheitstest vor dem Start

    Alle Routen geprüft, Zugriffsversuche auf fremde Elternlinks, OWASP-Punkte. Ergebnis sind Härtungen und ein neues Feature, mit dem der Trainer einen weitergegebenen Zugangslink sperren und neu erzeugen kann.

  12. Spec 019–020

    Betrieb im Alltag

    Trainingstage absagen, WhatsApp-Gruppenlink in der Zuteilungsmail. Der Hinweis darauf, dass alle Informationen auch ohne WhatsApp erreichbar bleiben, steht ausdrücklich in der Mail.

  13. Spec 021

    Rundmail an Familien

    Freie Nachricht an alle Familien einer Saison, nur per Mail und nicht zusätzlich auf der Seite.

Heute

Gruppenbildung nach der Freigabe, Stundenplan mit Plätzen, Trainern und Kindern. Alle Daten sind erfunden.
Elternseite auf dem Smartphone, nächstes Training und Plätze freigeben.