No description
Find a file
Daniel Michelberger 9f075f0f6c feat: Uhrenabgleich und Ausgang fuer Zeiten ohne Netz
Eine Stage laesst sich nicht wiederholen. Zwei Dinge durften deshalb
nicht so bleiben, wie sie waren.

Erstens die Uhr. Zeiten entstehen auf den Geraeten an der Strecke — nur
so laesst sich im Funkloch ueberhaupt stoppen. Damit steckte aber der
Versatz zweier Telefonuhren in jeder Dauer, bei der einer am Start und
ein anderer im Ziel drueckt. Jedes Geraet gleicht sich jetzt gegen den
Server ab (Cristian: t0 merken, Serverzeit holen, t1 merken, Versatz =
T + RTT/2 - t1), sieben Proben, Median ueber die schnellste Haelfte. Der
Versatz liegt im localStorage und wird auf jeden Zeitstempel gerechnet.

Dafuer eine eigene Route /api/clock in den Hooks: Der Date-Header jeder
gewoehnlichen Antwort hat nach RFC 9110 Sekundenaufloesung, allein
daraus folgte ein Fehler von bis zu einer halben Sekunde — auf einer
Stage der Unterschied zwischen Platz eins und Platz drei.

Zweitens das Netz. Scheitert die Uebertragung eines Starts oder Stopps
an einem Funkloch, wandert er in einen Ausgang im localStorage statt in
einen Fehler und geht raus, sobald wieder Empfang da ist. Die
massgebliche Zeit ist die des Druckens, nicht die der Uebertragung. Ein
Stopp kann dabei auf einen Start warten, der selbst noch aussteht.

Unterschieden wird streng zwischen Funkloch und Absage: Eine abgelehnte
Anfrage — fehlende Rechte, ungueltige Daten — wird gemeldet und nicht
aufgefangen, sonst sammelte der Ausgang stumm Eintraege, die auch beim
naechsten Versuch scheitern.

Die Leiste der laufenden Zeiten zeigt nicht uebertragene Zeiten ganz
oben und erscheint dafuer auch dann, wenn gerade nichts laeuft.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P32KoesVtABd6xWsqMKzhr
2026-09-07 23:00:40 +02:00
backend feat: Uhrenabgleich und Ausgang fuer Zeiten ohne Netz 2026-09-07 23:00:40 +02:00
docs/superpowers docs: Plan-Korrekturen aus der Umsetzung nachziehen 2026-08-06 19:30:44 +02:00
frontend feat: Uhrenabgleich und Ausgang fuer Zeiten ohne Netz 2026-09-07 23:00:40 +02:00
.gitignore docs: Plan-Korrekturen aus der Umsetzung nachziehen 2026-08-06 19:30:44 +02:00
CLAUDE.md refactor: Aus Runs werden Stages, bis in die Datenbank 2026-09-07 22:16:22 +02:00
NAMING.md refactor: Team und Kader an einem Ort 2026-09-07 22:11:13 +02:00
README.md chore: Repo-Struktur mit frontend/ und backend/ aufsetzen 2026-08-06 13:16:43 +02:00
TODO.md refactor: Team und Kader an einem Ort 2026-09-07 22:11:13 +02:00
UML_basic.png chore: Repo-Struktur mit frontend/ und backend/ aufsetzen 2026-08-06 13:16:43 +02:00

stammtisch-hersbruck.de

Zeitmessung und Verwaltung für Läufe des Stammtisch Hersbruck.

Das Repository enthält beide Teile der Anwendung:

Verzeichnis Inhalt
frontend/ SvelteKit-5-Anwendung (Svelte 5 Runes, Tailwind 4)
backend/ PocketBase-Instanz — Dockerfile, Schema-Migrationen

Schnellstart

Frontend gegen die produktive Instanz:

cd frontend
cp .env.example .env      # Werte eintragen
npm ci
npm run dev

Die App läuft dann auf http://stammtisch-hersbruck.de.localhost:31337

Backend lokal (optional — der Default zeigt auf die produktive Instanz):

cd backend
cp .env.example .env      # Werte eintragen
docker compose up -d --build

Danach in frontend/.env PUBLIC_PB_URL=http://127.0.0.1:8090 setzen.

Details stehen in backend/README.md.

PocketBase

Produktiv: https://api.stammtisch-hersbruck.de

Welche Instanz das Frontend anspricht, entscheidet PUBLIC_PB_URL in frontend/.env. Das Schema ist als Migration in backend/pb_migrations/ versioniert.