- Included comprehensive documentation addressing the architecture, roadmap, and MVP goals for Neumarkt 2026. - Added domain-specific definitions, glossary references, and functional breakdowns for both the public Web-App and Desktop-App. - Clarified MVP deliverables, including Web-App Nennformular, Desktop-App offline-first setup, ZNS data sync, and LAN integration. - Documented step-by-step onboarding workflow and open decisions for device pairing and security. - Updated roadmap with sprint goals and technical steps for implementation. Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
36 KiB
đïž [Lead Architect] Guten Morgen! Datum: 27. MĂ€rz 2026
In den letzten Tagen haben wir am Frontend gebastelt. Jetzt habe ich Angst, dass wir unseren Fokus verlieren.
Das Frontend und dessen EntwĂŒrfe sollten uns helfen die einzelnen Workflows praxisnah abzugrenzen. Daraus ergibt sich eine DomĂ€ne/Boundet-Context und dieses Wollen wir als eigenstĂ€ndigen Service entwickeln. Das Ping-Service sollte fĂŒr uns quasi als Vorlage dienen, also komplett von der echten fachlichen Implementierung isoliert. Mittlerweile vermischen wir alles miteinander und das gefĂ€llt mir nicht.
Ich will fĂŒr die ganzen technischen Implementierungen mit dessen Monitorings und Metriken ein eigenes isoliertes Frontend in dem dann auch das Ping-Service enthalten sein soll.
Aber, dadurch dass wir nicht mehr viel Zeit haben bis zum ersten Einsatz in Neumarkt, will ich die wichtigsten Grundlegende Funktionen bereits einsatzbereit haben, ohne dabei durch schlampiges husch pfusch eine saubere Weiterentwicklung verbauen.
Verstehst du meine bedenken?
Ich will mit dir jetzt einen Fahrplan durchdiskutieren, was wir jetzt wie genau entwickeln wollen. Bist du damit einverstanden?
đïž [Lead Architect]
Kurzantwort
Ja, ich verstehe deine Bedenken. Wir trennen konsequent die fachlichen Kontexte vom technischen Monitoring, kapseln das
Ping-Service als reine technische Schablone, und liefern bis Neumarkt ein minimal tragfÀhiges Set an Kernfunktionen
ohne kĂŒnftige Weiterentwicklung zu verbauen. Unten ist ein konkreter, umsetzbarer Fahrplan mit klaren Leitplanken,
Architektur-Skizze, Modulschnitt und Sprint-Plan.
Leitplanken (nicht verhandelbar)
- Bounded Contexts pro DomÀne: kein Mischen von fachlichen Flows mit technischen Utilities.
- Zwei getrennte UIs:
- Fach-UI: produktive Workflows (Meldungen etc.).
- TechOps-UI: Betrieb, Metriken, Logs,
Ping-Service(Referenz/Schablone), Admin-Tools.
Ping-Servicebleibt fachlich neutral: keine DomĂ€nen-Referenzen, dient nur als Vorlage fĂŒr technische Patterns ( Transport, Observability, Resilience, CI/CD).- Offline-First bleibt Prinzip: Sync-Schicht ist eigenstĂ€ndig, nicht in Screens verwoben.
- âSaubere Weiterentwicklungâ absichern durch: stabile Contracts (
api-Module), Consumer-Driven-Contracts, Telemetrie-Standards, Migrationspfade.
Zielbild: Kontext-/Service-Architektur
- Fachliche Kontexte (Beispiele â bitte bei Bedarf prĂ€zisieren):
Meldung-Erfassung(Form, Validierung, Lokalspeicher, Drafts)Meldung-Verwaltung(Liste, Details, Statuswechsel)Sync(Offline-Queue, Konfliktlösung, Retry)Auth/Identity(Rollen/Permissions, lokale Session)
- Technischer Kontext:
TechOps(Monitoring-UI, Admin-Funktionen)Ping-Service(Health, Latenz, Transportwege, Resilience-Demo)
- Context Map: klare Schnittstellen zwischen
FachâSyncâBackend-APIssowieTechOpsisoliert daneben.
Frontend-Aufteilung (KMP/Compose, Beispiele passend zum Repo)
frontend/shells/meldestelle-desktopâ Fach-UI Shellfrontend/shells/techops-desktopâ NEU: TechOps-UI Shell (enthĂ€ltPing-Feature, Metriken/Logs)frontend/features/*â Feature-Module pro Kontext:features/meldung-erfassungfeatures/meldung-verwaltungfeatures/authfeatures/syncfeatures/ping-feature(nur intechops-desktopeingebunden)
frontend/core/*â Querschnitt (Design-System, Navigation, State, Telemetrie-SDK, Storage-Abstraktion)- Strikte Regel:
features/ping-featuredarf kein fachliches Modul importieren. Fach-Features dĂŒrfenpingnicht importieren.
Backend-Aufteilung (Kotlin/Spring Boot als Annahme)
services/pingâ reine Technik (Health, echo, stream), OpenAPI, OTel, RateLimit, Chaos toggelbar.services/meldungâ DomĂ€ne (Erfassung, Verwaltung, Validierung), eigene DB-Schemata.services/authâ Rollen/Claims, Tokens.platform/observabilityâ Zentral: OTel Collector, Metrics, Tracing, Log-Pipeline.
MVP fĂŒr Neumarkt (einsatzbereit, aber erweiterbar)
- Fach-UI
Meldung erfassen: Basisformular, Pflichtfelder, lokale Drafts, Validierung.Meldung verwalten: Liste, Detailansicht, einfacher Statuswechsel.Sync: Hintergrund-Sync mit Retry, Konflikt-Hinweis-UI (einfacher Merge/Last-Write-Wins als Start, spÀter verfeinern).Auth: Lokale Anmeldung (konfigurierbar), Rollen-Gating auf kritische Aktionen.
- TechOps-UI
Ping-Dashboard: Latenz/VerfĂŒgbarkeit, einfache Last- und Retry-Demos.Metrics: Service-Health, Build-Infos, Versionen, simple Logs-View.
- Nicht-Ziele fĂŒr MVP: komplexe Berichte, granularer Rechtemanager, komplexe Konfliktlösung.
Roadmap bis Neumarkt (Beispiel: 3 Sprints Ă 2 Wochen)
- Sprint 1: Struktur & Leitplanken
- Module anlegen/aufrÀumen:
techops-desktopShell,features/*Trennung, Contracts. Ping-Serviceals Referenz: OpenAPI, Health, OTel, Retry/Timeout/CB in Client.- Design-System-HĂ€rtung: Inputs, Layout, Navigations-Rahmen.
- CI: Build-Matrix, Tracing/Metrics-Export in Dev.
- Module anlegen/aufrÀumen:
- Sprint 2: Fach-MVP
meldung-erfassung: Pflichtfelder, Drafts, Validierungen, Lokalspeicher-API.meldung-verwaltung: Liste/Detail, Statuswechsel.sync: Queue, einfache Konfliktregel, visuelle Indikatoren.auth: Minimal-Login, Rollen-Gates in UI.
- Sprint 3: Hardening & TechOps
- TechOps-UI: Ping-Dashboard, Metrik-Widgets, einfache Logs.
- E2E-Flows offline/online, Lasttests auf
meldung. - Observability-Standards finalisieren, Feature Flags, Release Candidate.
QualitĂ€ts-Schranken (DoD fĂŒr jedes Inkrement)
- API-Contracts versioniert, Mock/CDC-Tests vorhanden.
- Observability: Traces, Key-Metrics, korrelierbare Request-IDs.
- Offline-First: Jeder Netzwerkpfad hat Queue/Retry, UI-States fĂŒr Offline.
- Security: Minimal: Auth-Gates, kein Secret im Client, TLS everywhere.
- UX: Leerlauf-States, Fehler-States, Tastatur-Navigation in Kern-Screens.
Risiken & GegenmaĂnahmen
- Kontext-Vermischung â Modul-AbhĂ€ngigkeitsregeln, Lints, Reviews gegen Cross-Refs.
- Zeitdruck â MVP klar begrenzen, Feature-Flags, hartes âCut scope, keep qualityâ.
- Offline-KomplexitĂ€t â Start mit einfacher Konfliktstrategie, Telemetrie sammelt reale Konfliktmuster.
- TechOps-Overhead â Widgets minimal halten, spĂ€ter ausbauen.
Entscheidungsbedarfe (kurz klÀren)
- Verbindliche Liste der Pflichtfelder fĂŒr
Meldung erfassen. - Rollenmodell fĂŒr MVP (z. B.
User,Supervisor). - Zielplattformen fĂŒr ersten Einsatz (nur Desktop?).
- Metrik-Set fĂŒr TechOps-MVP (3â5 Kernmetriken).
NĂ€chste Schritte
- Ich schreibe eine prÀgnante
MASTER_ROADMAP-Aktualisierung mit obigen Leitplanken und Sprint-Zielen. - Aufteilung der Tickets nach Modulen (Fach vs. TechOps) inkl. âno-cross-importâ-Regeln.
- Kickoff-Review der Modulstruktur und Shell-Trennung (30â45 Min).
Bist du mit diesem Fahrplan einverstanden, oder sollen wir einzelne Punkte (z. B. MVP-Umfang oder Modulzuschnitt) noch anpassen?
Entscheidungsbedarfe (kurz klÀren)
- Verbindliche Liste der Pflichtfelder fĂŒr
Meldung erfassen. - Rollenmodell fĂŒr MVP (z. B.
User,Supervisor). - Zielplattformen fĂŒr ersten Einsatz (nur Desktop?).
- Metrik-Set fĂŒr TechOps-MVP (3â5 Kernmetriken).
Du bzw. Ihr seid jetzt meine Experten in eurem Fachgebiet. Ich bin jetzt mit unserem đ [ĂTO/FEI Rulebook Expert] der mir ĂŒber die Schulter schaut, der Fach-Experte.
Ganz wichtige Mindest-Zielvorgabe bis nĂ€chste Woche Dienstag 7. April 2026 ist, dass sich Turnierteilnehmer ĂŒber ein Web-Formular Nennen können.
- Nennformular pro Turnier welches sich generiert beim erstellen des Turnieres
Okay, wir brauchen fĂŒr die ersten Turniere Neumarkt
- Turnier-Nr.: 26128
- Turnier-Nr.: 26129 Eine
- Web-App
- Desktop-App
Nur zur zur KlĂ€rung: Du hast glaube ich schon verstanden was bei uns eine Veranstaltung ist, was ein Veranstalter ist, was ein Turnier, PrĂŒfung/Bewerb/Abteilung ist? Das ist jetzt ganz wichtig, damit Ihr alle versteht wovon ich jetzt reden werde. Und stellt auf gar keinen Fall Vermutungen oder Annahmen, wenn Ihr was nicht wisst, oder irgendwas nicht ganz klar ist, sofort Fragen! Haben wir uns dabei verstanden?
Was soll die Web-App können und wofĂŒr brauchen wir diese?
Sie muss nicht viel können, nur eine öffentlich erreichbare Internet-Seite "www.mo-code.at"
- Willkommensseite mit einer Liste unserer Veranstaltungen in Form einer Card, in unserem Fall ist es nur unser Neumarkt. In dieser Card sind weitere Cards der Reitsportlichen-Veranstaltungen dieser Veranstaltung platziert, in unserem Fall die 2 Turniere aus Neumarkt.
In jeder dieser Card sind folgende Buttons und Hinweis-Text:
Buttons:
- "Ausschreibung" -> beim klick auf diesem Button bekommt man die Ausschreibung des jeweiligen Turniers als PDF
- "Nennen" -> dieser Button fĂŒhrt zu unserem Nenn-Formular welches sich beim einrichten des Turniers selber generieren soll. Ob dieser Button angezeigt wird oder nicht will ich ĂŒber meine Desktop-App ein/ausschalten können.
- "Start-Ergebnisse" -> damit komme ich zu einer Ăbersicht aller Bewerbe des Turniers "PrĂŒfungs-Ăbersicht", auch dieser Button wird ĂŒber die Desktop-App gesteuert, wie werden wir klĂ€ren wenn wir bei der Desktop-App sind.
Hinweis-Text: Dieser Hinweis-Text soll alle darĂŒber Informieren:
-
"Pferdepass-Kontrolle in Bewerb/PrĂŒfung"
-
"Achtung Nennstop" etc. ich bin mir sicher, dass unser ĂTO-Experte noch weitere Einsatzmöglichkeiten finden wird worĂŒber wir als Meldestelle die Teilnehmer im laufe des Turniers Benachrichtigen mĂŒssten.
-
"PrĂŒfungs-Ăbersicht" Auf dieser Seite sollen alle an diesem Turnier stattfindenten Bewerbe/PrĂŒfungen Ordentlich Aufgelistet sein, vorsortiert nach Datum und Uhrzeit, weiter nach Austragungsplatz. In unserem Fall haben wir pro Turnier nur einen Tag und nur einen Austragungs-Platz. Trotzdem wĂ€hre eine Filter und Suchfunktion nicht schlecht. Suchfunktion fĂŒr Reiter und Pferd, nur die Reiter und Pferde welche auf diesem Turnier auf einer Startliste oder Ergenissliste stehen, also nur Turnier-Teilnehmer. Die Suchfunktion ist fĂŒr unsere Turniere Nice-To-Have und nicht Pflicht.
Jeder Tag/Platz hat die Bewerbe Aufgelistet ebenfalls als Cards Bewerb-Card -> Bezeichnung usw. In dieser Bewerb-Card fals vorhanen die Abteilungen ebenfalls mit den zusĂ€tzlichen Bezeichnungen etc. "Startliste"-Button zeigt die aktuelle Startliste ist der Bewerb abgeschlossen entfernt sich dieser Button und ein neuer Button. "Ergebnisliste" erscheint, dieser fĂŒhrt zu der Ergebnisliste. Ist der Bewerb gerade "aktive" soll es einen Button "Live-Ergebnisse" geben.
"Live-Ergebnisse" -> Nice-To-Have keine Pflicht fĂŒr Neumarkt.
So, jetzt habe ich einen Roman geschrieben. Könnt Ihr euch das Vorstellen was ich als Web-App haben will?
Ich werde dann noch einen Roman schreiben fĂŒr die Desktop-App, aber was sagt Ihr einmal dazu?
đïž [Lead Architect]
Zielbild und Sofortfokus (bis Di, 7. April 2026)
- Ăffentlich erreichbare Web-App unter
www.mo-code.atmit:- Willkommensseite â Liste
Veranstaltungen(fĂŒr jetzt: âNeumarktâ) - In jeder
Turnier-Card: ButtonsAusschreibung (PDF),Nennen,Start-Ergebnisse+ konfigurierbarer Hinweis-Text PrĂŒfungs-Ăbersichtje Turnier: Liste allerBewerbe/PrĂŒfungen(optional:Abteilungen), sortiert nach Datum/Uhrzeit/Platz; Such-/Filter (Nice-to-have)
- Willkommensseite â Liste
- Desktop-App steuert Sichtbarkeit der Buttons und Hinweis-Texte je Turnier.
- Zwei Turniere fĂŒr Neumarkt:
26128,26129.
Ich bestÀtige: Wir liefern ein funktionsfÀhiges Nennformular je Turnier (auto-generiert beim Anlegen des Turniers) bis zur genannten Deadline.
BegriffsklÀrung (bitte kurz bestÀtigen oder korrigieren)
Veranstalter: Rechtliche/organisatorische Einheit, die Veranstaltungen ausrichtet.Veranstaltung: Ăbergeordneter Rahmen an einem Ort/Zeitraum, umfasst eine oder mehrerereitsportliche Veranstaltungen(= unsereTurniere).Turnier: Fachliche Einheit mit eigenem Zeitplan, Start-/Ergebnislisten, Ausschreibung, Nennungen. EnthĂ€ltBewerbe/PrĂŒfungen.PrĂŒfung/Bewerb: Einzelbewerb/Klasse innerhalb des Turniers; optional inAbteilungen(Heats) unterteilt.Abteilung: Unterteilung eines Bewerbs mit eigener Start-/Ergebnisliste.
Wenn etwas davon abweicht, bitte sofort korrigieren â wir treffen keine stillen Annahmen.
Entscheidungen v1 (Vorschlag zur Abnahme)
- Pflichtfelder fĂŒr
Meldung erfassen(Nennung), MVP-konform und ĂTO/FEI-kompatibel (bitte mit đRulebook ExpertgegenprĂŒfen):
- Reiter
Vorname,NachnameGeburtsjahroderGeburtsdatum(mindestens Jahr)NationalitĂ€t(LĂ€ndercode)Verein/Club(Freitext oder Auswahl)Kontakt-E-Mail(BestĂ€tigung/Ănderungsinfo)
- Lizenz/Startberechtigung
Reiter-Lizenznummer(falls fĂŒr Bewerb nötig) â Feld sichtbar/erforderlich abhĂ€ngig vom Bewerb
- Pferd
PferdenameLebensnummer/UELN(falls verfĂŒgbar; mindestens einer vonUELNoderPassnummer)Geschlecht(Stute/Wallach/Hengst) â optional im MVP, falls nicht zwingendJahrgang(Geburtsjahr)Besitzer(Name) â optional, falls Regelwerk nicht verlangt
- Bewerbsauswahl
- Auswahl
Bewerb(und ggf.Abteilung, wenn offen) - Optional:
Wunschuhrzeit/Kommentar an Meldestelle (Freitext, nicht verpflichtend)
- Auswahl
- EinverstÀndnisse
Datenschutz/Teilnahmebedingungen(Checkbox, Pflicht)Tiergesundheit/Impfstatus bestĂ€tigt(Checkbox, Pflicht, genaue Formulierung durch đ Expert)
Hinweis: Felder werden pro Bewerb regelbasiert ein-/ausgeblendet (z. B. Lizenzpflicht). FĂŒr Neumarkt legen wir die
Regeln turnierspezifisch in der Desktop-App fest.
- Rollenmodell MVP
Owner/Admin(intern): Vollzugriff, Turniere anlegen/konfigurieren, Buttons und Hinweise steuern.Meldestelle(intern): Einsicht/Moderation von Nennungen, Startlistenpflege.Public(extern): Nur lesen +NennenfĂŒr freigeschaltete Turniere.
- Zielplattformen erster Einsatz
Web-App(öffentlich): Pflicht.Desktop-App(intern, Compose Desktop): Pflicht fĂŒr Konfiguration und Freischaltungen.- Mobile optimiert: Nice-to-have (mindestens responsives Layout fĂŒr Nennformular auf Smartphone).
- TechOps-MVP: 5 Kernmetriken
public_http_availabilityder Endpunkteveranstaltungen,turniere,bewerbe,nennungen(Uptime-Check)nennungen_submit_latency_p95(End-to-End vom Klick bis Server-ACK)nennungen_submit_error_rate(validierungs-/serverseitig)nennungen_created_countpro Turnier (insb.26128,26129)pdf_delivery_success_ratefĂŒrAusschreibung
Funktionsschnitt (MVP Umfang Web-App)
- Landing
www.mo-code.at- Liste
Veranstaltungenâ Card âNeumarktâ - In der Veranstaltung-Card: je
Turnier (26128/26129)eine Card mit:- Button
Ausschreibung(liefertapplication/pdfaus Turnier-Metadaten) - Button
Nennen(sichtbar, wennturnier.config.nennenEnabled = true) - Button
Start-Ergebnisse(sichtbar, wennturnier.config.resultsEnabled = true) - Hinweis-Textblock (Markdown/Plaintext aus
turnier.notice), Beispiele:Pferdepass-Kontrolle in Bewerb/PrĂŒfung,Achtung Nennstopp, etc.
- Button
- Liste
PrĂŒfungs-Ăbersichtje Turnier- Liste aller
Bewerbe(ggf.Abteilungenverschachtelt) â sortiert:datum ASC,uhrzeit ASC, dannplatz - Buttons je Card:
Startliste(wenn Status =Geplant/Laufend)Ergebnisliste(wenn Status =Abgeschlossen)Live-Ergebnisse(Nice-to-have, ausblendbar)
- Suche/Filter: Nice-to-have (Reiter/Pferd, nur Teilnehmer in diesem Turnier)
- Liste aller
Nennformular- Generiert aus Turnier-/Bewerbs-Definition
- Validierung clientseitig + serverseitig
- BestĂ€tigungsseite + E-Mail-BestĂ€tigung (falls Mailserver verfĂŒgbar; sonst On-Screen-Referenznummer)
Generierungslogik Nennformular (ohne Vermischung der Kontexte)
- Backend
services/turnierstelltGET /turniere/{id}/bewerbeinkl. Konfig der pflichtigen Felder/Regeln bereit. - Web-App rendert daraus dynamisch die
Reiter-,Pferd- undBewerb-Sektionen. - Desktop-App pflegt je
Bewerb:erfordertReiterLizenz: booleanerfordertPferdePassnummer: booleanmaxTeilnehmer,nennStopp-Status- Sichtbarkeit
Nennen,Start-Ergebnisse, Hinweis-Text
Datenmodell (MVP, fachliches Skelett)
Veranstaltung { id, name, ort, zeitraum, turniere[] }Turnier { id, name, datum, platz, ausschreibungPdfUrl, config { nennenEnabled, resultsEnabled }, notice }Bewerb { id, name, datumZeit, platz, hatAbteilungen, abteilungen[]?, regeln { lizenzPflicht, passPflicht } }Abteilung { id, name, startzeit }
Nennung { id, turnierId, bewerbId, reiter { vorname, nachname, geburtsjahr, lizenzNr?, verein, email }, pferd { name, ueln?, passNr?, jahrgang }, einverstaendnisse { dsgvo, impfstatus }, status }
APIs (Vorschlag, minimal)
- Public (read):
GET /api/veranstaltungenGET /api/turniere/{turnierId}(inkl. Buttons/Notice-Config)GET /api/turniere/{turnierId}/bewerbeGET /api/turniere/{turnierId}/ausschreibung(PDF)GET /api/bewerbe/{bewerbId}/startliste|.../ergebnisliste
- Public (write):
POST /api/turniere/{turnierId}/nennungenâ 201 +nennungsId
- Internal (Desktop gesteuert):
PATCH /api/turniere/{turnierId}/config(toggle Buttons, Notice, Nennstopp)PATCH /api/bewerbe/{bewerbId}/regeln(Pflichtfelder-Flags)
UX-Skizze (kompakt)
- Cards mit klaren PrimÀr-CTAs, sekundÀre Aktionen als Links.
- Deutlicher
Nennstopp-Banner, wenn aktiv (unterdrĂŒckt CTANennen). - Formular in 3 Abschnitte:
Reiter,Pferd,Bewerb+EinverstĂ€ndnisseâ eine Seite, progressiv validiert. - BestĂ€tigung zeigt
Turnier,Bewerb,Reiter,PferdsowieNennungs-ID.
QualitÀt und Compliance (MVP)
- Validierung serverseitig verbindlich (Client kann offline/fehlerhaft sein).
- Pflicht-Checkbox-Texte durch đ
Rulebook Expertfreigegeben. - DSGVO: nur notwendige Daten, klare Datenschutzhinweise auf Formular.
- Telemetrie: Nur aggregierte Metriken, keine PII in Logs.
Offene Punkte / Bitte um kurze Antworten
- BestÀtigst du die Definitionen von
Veranstalter,Veranstaltung,Turnier,Bewerb/PrĂŒfung,Abteilung? Falls abweichend: bitte korrigieren. - Sind die vorgeschlagenen Pflichtfelder fĂŒr die Nennung ausreichend fĂŒr Neumarkt, oder mĂŒssen wir (laut ĂTO/FEI)
weitere Felder als Pflicht aufnehmen (z. B.
Pferderasse,Kategorie,Leistungsklasse)? - DĂŒrfen wir E-Mail-BestĂ€tigungen verschicken, oder zunĂ€chst nur On-Screen-BestĂ€tigung (abhĂ€ngig von Mailserver)?
- Werden
26128und26129jeweils den gleichen Bewerbssatz/Regeln nutzen, oder pro Turnier unterschiedlich? - Darf
Live-Ergebnisseim MVP komplett entfallen (Button verborgen), oder möchtest du die Platzhalter-Navigation jetzt schon sehen?
NĂ€chste Schritte (konkret, sofort startbar)
- Finalisierung der Pflichtfelder- und Rollenliste mit dir/đ Expert (heute).
- Desktop-App: Masken fĂŒr Turnier-Config (Toggles
Nennen,Start-Ergebnisse,Notice,Nennstopp) â minimale Persistenz. - Public Web: Landing + Turnier-Cards + Nennformular-Flow fĂŒr
26128,26129. - Backend: schlanke Endpunkte laut oben; PDF-Auslieferung; Persistenz der
Nennungen. - TechOps: Metrik-Export und einfache Health-Checks.
Wenn du die obigen Punkte bestÀtigst, planen wir danach die Detailumsetzung und Verprobung mit realen Testnennungen am Montag vor dem Go-Live.
Jetzt will ich noch nichts finalisieren, hör mir einmal zu was ich will. Wir wollen dann Schritt fĂŒr Schritt eins nach dem anderen gezielt besprechen. Ich will jetzt keinen Husch Pfusch, okay?
BezĂŒglich BegriffsklĂ€rung: docs/03_Domain/00_Glossary.md docs/03_Domain/01_Glossary/Ubiquitous_Language.md
Informationen ĂŒber die bevorstehenden Turniere in Neumarlt docs/Neumarkt2026
"Desktop-App" Das ist die eigentliche "Meldestelle" vor Ort. Diese muss offline fĂ€hig sein. Wie wird es in Neumarkt sein? Ich sitze in einem kleinen netten HĂ€uschen mit meinem Computer, Drucker und dem Internet-Router. Unsere Desktop-App ist auf meinem Meldestellen-Computer installiert und via LAN-Kabel an dem Router verbunden auf dem auch der Drucker angeschlossen ist. Dann habe ich noch einen Laptop, auf dem ebenfalls unsere Desktop-App installiert ist, dieser wird am Richterturm fĂŒr die Ergebnis-Erfassung eingesetzt werden. Beider PC's sind ĂŒber ein lokales Netzwerk miteinander Verbunden.
In meiner Desktop-App will ich unten sehen können, ob
- eine Internet-Verbindung haben
- eine Verbindung zum nÀchsten Rechner haben
Auf ein echtes Login via Benutzername und Passwort will ich jetzt einmal verzichten.
Das heiĂt ich will eine Desktop-Seite haben auf der ich alle GerĂ€te auf dieser Veranstaltung einrichten könnte. FĂŒr Neumarkt Pflicht
- Drucker
- Verbindung zu einer zweiten Desktop-App "Richter-Turm" (in unserem Fall ein und die selbe Desktop-App "Meldestelle" nur auf zwei Laptops)
Nice-To-Have eine kleine einfache Chat-Funktion zwischen den GerÀten "Meldestelle" - "Richter-Turm"
Vielleicht können wir der Desktop-App welche auf einen Laptop installiert ist einen Namen geben welchen ich als Benutzer geben kann?
Schaffen wir das technische umzusetzten? -> kurze Antwort
đïž [Lead Architect]
Kurzantwort
Ja, das schaffen wir. FĂŒr Neumarkt können wir eine offline-fĂ€hige Desktop-App bereitstellen, die ĂŒber das lokale Netzwerk zwischen âMeldestelleâ und âRichter-Turmâ synchronisiert, den Online-/Peer-Status unten anzeigt, Drucker nutzt und optional einen einfachen LAN-Chat bietet â alles ohne Benutzer-Login.
Technischer Mini-Fahrplan (ohne Husch-Pfusch)
- Offline-First Speicher: lokale DB pro GerÀt (z. B. SQLite) + Sync-Queue.
- LAN-Kopplung: mDNS/Bonjour zur Peer-Findung; verschlĂŒsselte WebSocket-/TCP-Verbindung fĂŒr Sync + Heartbeats.
- Status-Anzeige: zwei Indikatoren unten â âInternet erreichbarâ und âPeer verbundenâ (Heartbeat-basiert).
- GerÀte-Name: frei vergebbar in den App-Einstellungen, in Sync/Chat sichtbar.
- Drucker: Nutzung des OS-Druckdialogs/Spoolers; Auswahl und Persistenz pro GerÀt.
- Optionaler Chat: leichter Text-Chat ĂŒber denselben LAN-Kanal (Store-and-forward, wenn Peer kurz offline).
- Sicherheit: LAN-trusted fĂŒr MVP, mit gemeinsamem VeranstaltungsschlĂŒssel/Pairing; keine Passwörter nötig.
Rahmenbedingungen/Risiken (beherrschbar)
- Beide GerÀte im selben Subnetz; mDNS/Multicast darf nicht blockiert sein (Firewall-Regel als Checkliste).
- Fallback, falls mDNS gesperrt: manuelles Eingeben der Peer-IP/QR-Pairing.
- Netzwerkausfall: App arbeitet weiter offline; Sync setzt fort, sobald Peer/Internet wieder da ist.
Wenn du zustimmst, gehen wir die Punkte Schritt fĂŒr Schritt konkretisieren (UI der Statusleiste, GerĂ€te-Setup-Seite, Peer-Pairing, Drucker-Setup, Chat als Nice-to-have).
Sehr gut!
Das heiĂt, wenn ich das jetzt richtig verstanden habe funktioniert es jetzt so:
- Ich installiere die Desktop-App auf dem Laptop "Meldestelle"
- Beim ersten öffnen dieser App komme ich in die App-Einstellungen und muss zuerst einen
- Namen vergeben und
- einen jetzt einmal frei wĂ€hlbaren SicherheitsschlĂŒssel vergeben (z.B.: "Neumarkt") dieser dient zur VerschlĂŒsselung fĂŒr die Verbindung zum zweit-GerĂ€t "Richter-Turm" (auf beiden GerĂ€ten muss der selbe SicherheitsschlĂŒssel eingetragen sein) Beispiel: PC-1: Name: "Meldestelle" SicherheitsschlĂŒssel: "Neumarkt2026" PC-2: Name: "Richter-Turm" SicherheitsschlĂŒssel: "Neumarkt2026"
erst dann wird die App freigeschalten -> ist das so korrekt?
Okay, ich habe die App installiert und sie ist freigeschaltet.
- Internet-Verbindung ist da oder eine LAN-Verbindung zu einer "Meldestelle" besteht -> ZNS-Daten werden automatisch synchronisiert und in die Loakle Datenbank geschrieben.
- Keine Internet-Verbindung und keine LAN-Verbindung -> Ich muss eine aktuelle ZNS.zip via USB-Stick ĂŒbermitteln fĂŒr die Lokale Datenbank.
ist das soweit korrekt.
Okay, Name: "Meldestelle" SicherheitsschlĂŒssel: "Neumarkt2026" ZNS-Daten: geladen
Jetzt ist die App bereit.
"Zu den Veranstaltern"-Button wird freigeschaltet ->
Bevor ich ein Turnier erstellen kann, brauche ich einen Veranstalter.
Was sagt Ihr dazu?
đïž [Lead Architect]
KurzbestÀtigung
Ja, deine Beschreibung ist im Kern korrekt. Mit GerĂ€te-Name und gemeinsamem SicherheitsschlĂŒssel wird die Desktop-App
freigeschaltet, ZNS-Daten werden online/LAN automatisch synchronisiert oder offline via ZNS.zip importiert.
AnschlieĂend ist der Navigationspunkt Zu den Veranstaltern verfĂŒgbar. Bevor ein Turnier angelegt wird, legen wir einen
Veranstalter an. Das passt.
Kleine PrÀzisierungen (sauber, ohne Husch-Pfusch)
- Erster Start (Onboarding):
Namedes GerĂ€ts setzen (z. B.Meldestelle,Richter-Turm).SicherheitsschlĂŒsselsetzen (z. B.Neumarkt2026).- App wird freigeschaltet, Statusleiste zeigt zwei Indikatoren:
InternetundPeer(LAN-Partner).
- SicherheitsschlĂŒssel:
- Dient der verschlĂŒsselten LAN-Kopplung und dem Pairing. Beide GerĂ€te mĂŒssen exakt denselben SchlĂŒssel eingeben.
- FĂŒr Neumarkt reicht ein frei wĂ€hlbarer SchlĂŒssel. SpĂ€ter können wir auf GerĂ€te-Pairing/QR ergĂ€nzen.
- ZNS-Daten:
- Online oder LAN erreichbar â automatische Synchronisierung in die lokale DB.
- Kein Netz â manueller Import ĂŒber
ZNS.zip(USB). UI fĂŒhrt durch den Import, prĂŒft IntegritĂ€t/Version.
Edge-Cases, die wir abfangen
- Unterschiedliche SchlĂŒssel auf den GerĂ€ten â klare Fehlermeldung und Hinweis, den SchlĂŒssel abzugleichen.
- TemporĂ€r kein Peer/kein Internet â App bleibt voll bedienbar, Status zeigt
offline, Sync-Queue puffert. - Veraltete
ZNS.zipâ Warnung und Option, trotzdem zu importieren oder spĂ€ter zu aktualisieren.
Reihenfolge im Datenmodell (Navigation)
Veranstalteranlegen (erforderlich).Veranstaltunganlegen/auswÀhlen (falls benötigt, je nach Glossar-Definition).Turnierinnerhalb der Veranstaltung anlegen (z. B. 26128, 26129), inkl. Konfiguration (Nennen-Toggle,Start-Ergebnisse-Toggle,Notice).
Was ich vorschlage (konkret fĂŒr Neumarkt)
- Onboarding-Checkliste auf der Startseite, bis alle Pflichtschritte erledigt sind:
GerĂ€tename gesetztSicherheitsschlĂŒssel gesetztZNS-Daten vorhanden(Sync OK oderZNS.zipimportiert)Veranstalter angelegt
- Danach wird die volle Navigation freigeschaltet, u. a.
Zu den Veranstaltern.
Offene Mini-Entscheidung (kurz bestÀtigen)
- Reicht dir fĂŒr Neumarkt ein einheitlicher SicherheitsschlĂŒssel fĂŒr beide GerĂ€te, oder möchtest du optional ein manuelles Peer-Pairing per IP/QR als Fallback anzeigen?
Wenn du das so bestĂ€tigst, definieren wir als NĂ€chstes die Eingabemaske fĂŒr Veranstalter (Minimalfelder) und den
Import-Dialog fĂŒr ZNS.zip.
" Reihenfolge im Datenmodell (Navigation) Veranstalter anlegen (erforderlich). Veranstaltung anlegen/auswĂ€hlen (falls benötigt, je nach Glossar-Definition). Turnier innerhalb der Veranstaltung anlegen (z. B. 26128, 26129), inkl. Konfiguration (Nennen-Toggle, Start-Ergebnisse-Toggle, Notice). " - Hier zu muss ich noch etwas prĂ€zisieren Nachdem ich den GerĂ€tenamen, SicherheitsschlĂŒssel vergeben habe und die ZNS-Daten geladen sind wird der Button "Zu den Veranstaltern" freigeschaltet. -> Auf der Seite/Screen "Veranstalter - Ăbersicht" habe ich dann
- wenn via Online/LAN geladen eine Auswahlliste unserer schon Registrierten Veranstalter (in unserem Fall den Verein Neumarkt)
- und/oder die Möglichkeit einen Veranstalter neu anzulegen.
Okay, die Zeit lĂ€uft mir schon wieder davon. Ich muss diese Session fĂŒr jetzt unterbrechen. Bitte Schreibe eine umfassbare Dokumentation ĂŒber unsere Arbeit, so detailreich, dass ich heute Abend auf mit euch in einem neuem Chat-Verlauf lĂŒckenlos weiterarbeiten kann.
đ§č [Curator]
Sitzungsprotokoll â Neumarkt 2026: Public Web + Desktop (Meldestelle)
Kontext & Ziel (Stand: 27.03.2026)
- Ziel bis Di, 07.04.2026: Ăffentlich erreichbare Web-App mit Nennformular pro Turnier (26128, 26129) + Desktop-App ( offline-fĂ€hig) zur internen Steuerung (Toggles, Hinweise, Datenpflege). Keine Vermutungen ohne RĂŒckfrage; Glossar als Quelle der Wahrheit.
- Architekturprinzip: Strikte Trennung fachlicher Kontexte (Fach-UI, Turnierlogik) von technischen Themen (TechOps-UI, Ping-Service, Observability). Offline-First.
Begriffe & Quellen
- Glossar/UL:
docs/03_Domain/00_Glossary.mdunddocs/03_Domain/01_Glossary/Ubiquitous_Language.md(verbindlich). - Neumarkt-Referenzen:
docs/Neumarkt2026/*(Turnierkarten, Dashboard-Skizzen).
Begriffe (Kurzfassung, zur BestĂ€tigung durch Owner/đ Expert):
- Veranstalter: Organisation (z. B. Verein Neumarkt), unter der Veranstaltungen/Turniere laufen.
- Veranstaltung: Rahmen an Ort/Zeitraum, fasst reitsportliche Veranstaltungen (Turniere).
- Turnier: Einheit mit Bewerben/PrĂŒfungen, Ausschreibung, Nennungen, Start-/Ergebnislisten.
- Bewerb/PrĂŒfung: Klasse innerhalb Turniers; optional in Abteilungen unterteilt.
- Abteilung: Unterteilung eines Bewerbs, mit eigener Start-/Ergebnisliste.
Web-App â MVP Funktionsumfang
- Landing www.mo-code.at
- Card-Liste der Veranstaltungen (fĂŒr jetzt: Neumarkt). In jeder Card: Turnier-Cards (26128, 26129).
- Je Turnier-Card Buttons:
- Ausschreibung (PDF)
- Nennen (sichtbar, wenn
turnier.config.nennenEnabled) - Start-Ergebnisse (sichtbar, wenn
turnier.config.resultsEnabled)
- Hinweis-Textblock je Turnier (
turnier.notice), z. B. âPferdepass-Kontrolleâ, âAchtung Nennstoppâ.
- PrĂŒfungs-Ăbersicht je Turnier
- Sortierte Liste aller Bewerbe (Datum, Uhrzeit, Platz). Optional: Abteilungen verschachtelt.
- Buttons je Card:
- Startliste (Status: geplant/laufend)
- Ergebnisliste (Status: abgeschlossen)
- Live-Ergebnisse (nice-to-have, standardmĂ€Ăig verborgen)
- Suche/Filter (Reiter/Pferd) nice-to-have; nur Turnierteilnehmer.
- Nennformular (pro Turnier automatisch generiert)
- Abschnitte: Reiter, Pferd, Bewerb, EinverstÀndnisse.
- Client- und Server-Validierung; BestÀtigungsseite. Optional E-Mail-BestÀtigung (abhÀngig von Mailserver), sonst On-Screen-Referenz.
Pflichtfelder (Vorschlag, von đ Expert zu finalisieren):
- Reiter: Vorname, Nachname, Geburtsjahr/âdatum, NationalitĂ€t, Verein/Club, E-Mail.
- Lizenz (bewerbsabhÀngig): Reiter-Lizenznummer (pflichtig, falls Regel es verlangt).
- Pferd: Name, Jahrgang, mind. eines von UELN/Passnummer; Besitzer optional.
- Bewerbsauswahl (+ Abteilung, falls offen), optional Kommentar.
- EinverstÀndnisse: DSGVO/Teilnahmebedingungen, Tiergesundheit/Impfstatus (Checkboxen).
APIs (öffentlich, minimal):
- GET /api/veranstaltungen
- GET /api/turniere/{turnierId}
- GET /api/turniere/{turnierId}/bewerbe
- GET /api/turniere/{turnierId}/ausschreibung (PDF)
- POST /api/turniere/{turnierId}/nennungen
Desktop-App (Meldestelle) â MVP Funktionsumfang
- Offline-First: Lokale DB (z. B. SQLite) + Sync-Queue. Zwei GerĂ€te: âMeldestelleâ und âRichter-Turmâ im selben LAN.
- Statusleiste: Internet erreichbar? Peer verbunden? (Heartbeat-basiert)
- Erster Start (Onboarding, Freischalten der App):
- GerĂ€tename vergeben (z. B. âMeldestelleâ, âRichter-Turmâ)
- SicherheitsschlĂŒssel setzen (gemeinsam, z. B. âNeumarkt2026â). Dient zur verschlĂŒsselten LAN-Kopplung. Beide GerĂ€te mĂŒssen ĂŒbereinstimmen.
- ZNS-Daten laden: automatisch via Internet/LAN; bei Offline-Only Import
ZNS.zipper USB ( IntegritĂ€ts-/VersionsprĂŒfung, Warnung bei veraltetem Stand).
- Nach Freischalten: Navigationseintrag âZu den Veranstalternâ wird sichtbar.
- GerÀte-Setup: Druckerauswahl (OS-Dialog), Speicherung pro GerÀt.
- LAN-Kopplung: mDNS/Bonjour Discovery; Fallback manuelle IP/QR möglich (Option fĂŒr Neumarkt bei Bedarf).
- Optional: Einfacher LAN-Chat zwischen GerÀten (Store-and-forward bei kurzzeitigem Offline).
Veranstalter-Ăbersicht (PrĂ€zisierung aus dieser Session)
- Nach Freischalten (Name + SchlĂŒssel + ZNS vorhanden): Button âZu den Veranstalternâ aktiv.
- Screen âVeranstalter â Ăbersichtâ enthĂ€lt:
- Auswahlliste registrierter Veranstalter (online/LAN geladen). FĂŒr Neumarkt: âVerein Neumarktâ sollte erscheinen, wenn bereits vorhanden.
- Aktion âNeuen Veranstalter anlegenâ, falls nicht vorhanden oder Neuanlage gewĂŒnscht.
- NĂ€chste Schritte im Fluss:
- Veranstalter auswÀhlen/neu anlegen
- Veranstaltung anlegen/auswĂ€hlen (gemÀà Glossar; falls der Rahmen explizit gefĂŒhrt wird)
- Turnier innerhalb der Veranstaltung anlegen (26128, 26129) und konfigurieren:
- Toggles:
Nennen,Start-Ergebnisse - Hinweis-Text (
Notice) - Regelsatz pro Bewerb (z. B. Lizenzpflicht, Passpflicht), Nennstopp-Status
TechOps-UI (separat, technisch)
- EigenstĂ€ndige Shell fĂŒr Monitoring/Metriken/Logs und Ping-Service-Demo. Keine fachliche Vermischung.
- Kernmetriken (MVP): public endpoint availability, nennungen_submit_latency_p95, nennungen_submit_error_rate, nennungen_created_count pro Turnier, pdf_delivery_success_rate.
QualitÀtsleitplanken (DoD, MVP)
- Strikte Modultrennung: Fach-Features getrennt von TechOps/Ping. Keine Cross-Imports.
- Offline-First: Jeder Netzwerkpfad mit Queue/Retry; UI-States fĂŒr Offline/Sync.
- Observability: Traces, Key-Metrics, korrelierbare Request-IDs. Keine PII in Logs.
- Security (MVP): Gemeinsamer LAN-SchlĂŒssel reicht; spĂ€ter erweiterbar um Pairing/QR.
- DSGVO: Minimaldatensatz, EinverstĂ€ndnisse klar formuliert (đ Expert prĂŒft Texte).
Offene Punkte fĂŒr die nĂ€chste Session
- BestÀtigung/Korrektur der Glossar-Definitionen (Veranstalter/Veranstaltung/Turnier/Bewerb/Abteilung).
- Finalisierung Pflichtfelder Nennformular mit đ Expert (inkl. bewerbsabhĂ€ngiger Regeln).
- Entscheidung: E-Mail-BestĂ€tigung sofort vs. On-Screen-Only fĂŒr Neumarkt.
- Gleichheit/Unterschied der Regeln zwischen 26128 und 26129.
- Fallback-Mechanismus fĂŒr LAN-Pairing (reicht einheitlicher SchlĂŒssel oder zusĂ€tzlich manuelle IP/QR aktivieren?).
- UI-Details âVeranstalter â Ăbersichtâ: Such-/Filterverhalten bei vielen EintrĂ€gen; Minimalfelder fĂŒr Neuanlage.
Konkrete NĂ€chste Schritte (umsetzungsorientiert)
- Desktop
- Onboarding-Checklist-Komponente: GerĂ€tename, SchlĂŒssel, ZNS-Status.
- Screen âVeranstalter â Ăbersichtâ: Liste (remote/LAN), Button âNeuen Veranstalter anlegenâ.
- Form âVeranstalter neuâ: Minimalfelder gemÀà Glossar; Persistenz in lokaler DB + Sync.
- Backend
- Endpunkte fĂŒr Veranstalter-Query (public/internal je nach Sichtbarkeit), PDF-Auslieferung, Nennungs-Persistenz.
- Turnier-Config-API (Toggles, Notice), Bewerbs-Regeln (Pflichtfelder-Flags).
- Web-App
- Landing + Turnier-Cards (26128, 26129) mit Toggles/Notice.
- Nennformular-Renderer aus Turnier-/Bewerbs-Definition; POST Nennung.
Checkliste fĂŒr Neumarkt (Go/No-Go)
- Desktop: Onboarding abgeschlossen (Name, SchlĂŒssel, ZNS geladen)
- Desktop: Veranstalter sichtbar/neu anlegbar
- Backend: Turnierdaten 26128/26129 vorhanden, PDF-Links funktionieren
- Web: Landing online; Turnier-Cards mit korrekt gesteuerten Buttons/Notices
- Web: Nennformular fĂŒr 26128/26129, Validierung und Persistenz OK
- Observability: Basis-Metriken aktiv
Anhang â Referenzen im Repo
- Agents/Protokoll:
AGENTS.md(Badges, Workflow, Docs-as-Code) - Domain-Dokumente:
docs/03_Domain/* - Neumarkt-Assets:
docs/Neumarkt2026/*
Bitte gib kurz Bescheid, ob noch Aspekte aus deiner Sicht fehlen, die wir heute Abend ergÀnzen sollen. Ich halte das Protokoll dann fortlaufend aktuell.
docs/04_Agents/Sessions/2026-03-27_Neumarkt_Public_Web_und_Desktop_Curator_Log.md