stammtisch-hersbruck/frontend/README.md
Daniel Michelberger 279796111c wip: Der abgebrochene Kurbeler-Umbau, wie er hier liegengeblieben ist
Kein fertiger Stand, sondern ein Zwischenstand: Hier wurde im September 2026
angefangen, die App auf „Kurbeler" umzubenennen — Wortmarke, Icons, brand.ts,
Benachrichtigungen, das Benutzerverzeichnis. Weitergegangen ist es dann im
eigenen Repo `~/Dokumente/Projekte/kurbeler`, das die vollständige Historie
dieses Repos mitgenommen hat.

Committet wird das hier nicht, weil es gebraucht würde, sondern damit es nicht
als Haufen unversionierter Dateien im Arbeitsverzeichnis verrottet. Wer in
zwei Jahren nachsieht, findet so eine Geschichte statt eines Rätsels — und das
Stammtisch-Wappen, das nur hier je existiert hat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LTw6xVYgjMy9AQtfs1Gdyu
2026-09-11 15:42:33 +02:00

84 lines
3 KiB
Markdown

# Kurbeler — Frontend
SvelteKit-5-Anwendung (Svelte 5 Runes, Tailwind 4) für Zeitnahme und Verwaltung.
## Einrichten
`.env` aus der Vorlage anlegen und ausfüllen — `.env.example` beschreibt jede
Variable:
cp .env.example .env
npm ci
npm run dev
Die App läuft dann auf http://stammtisch-hersbruck.de.localhost:31337
## Befehle
| Befehl | Zweck |
|---|---|
| `npm run dev` | Development-Server (Port 31337, strict) |
| `npm run build` | Produktions-Build |
| `npm run preview` | Produktions-Build lokal ansehen |
| `npm run check` | Typprüfung (svelte-check) |
| `npm run check:watch` | Typprüfung im Watch-Modus |
| `npm run generate-pocketbase-types` | `src/lib/types.d.ts` aus dem PocketBase-Schema erzeugen |
## Welche PocketBase-Instanz?
`PUBLIC_PB_URL` in `.env` entscheidet, wohin das Frontend spricht:
| Wert | Instanz |
|---|---|
| `https://api.stammtisch-hersbruck.de` | produktiv (Default) |
| `http://127.0.0.1:8090` | lokales Backend aus `../backend` |
Die Variable wird von SvelteKit zur **Buildzeit** eingesetzt
(`$env/static/public`). Ein Wechsel der Instanz erfordert deshalb einen
Neustart des Dev-Servers bzw. einen neuen Build — ein bloßer Neustart des
Containers genügt nicht.
Es ist die einzige Variable in `.env`; ein Token wird nicht mehr gebraucht.
## Deployment
Gebaut wird mit **`adapter-node`**; der Startbefehl ist `node build`.
`adapter-auto` funktioniert hier nicht — es erkennt Coolify nicht, meldet
„Could not detect a supported production environment" und erzeugt gar kein
`build/`, woraufhin `node build` sofort scheitert.
Zwei Dinge müssen in der Deployment-Umgebung stimmen:
**`PUBLIC_PB_URL` muss als Environment-Variable gesetzt sein.** Sie wird zur
Buildzeit eingesetzt; fehlt sie, bricht schon der Build ab:
"PUBLIC_PB_URL" is not exported by "virtual:env/static/public"
Die `.env` aus dem Arbeitsverzeichnis steht auf dem Build-Server nicht zur
Verfügung — sie ist gitignored.
**Node ≥ 22.12.** Das `engines`-Feld in `package.json` schreibt die Anforderung
von `vite` und `@sveltejs/vite-plugin-svelte` fest. Zusammen mit
`engine-strict=true` aus der `.npmrc` bricht `npm ci` bei einer älteren
Version ab (`EBADENGINE`) — was bei Node 22.11 aus einem
`NIXPACKS_NODE_VERSION=22` bereits passiert ist.
## Typen
Das maßgebliche Schema liegt als Migration in `../backend/pb_migrations/`.
Daraus entstehen auch die TypeScript-Typen:
npm run generate-pocketbase-types
Das Script liest das Collections-Array aus der Migration
(`scripts/schema-to-json.mjs`) und erzeugt daraus `src/lib/types.d.ts`. Es
braucht **keine laufende Instanz, keinen Token und keinen Netzwerkzugriff**
Schema und Typen kommen aus derselben versionierten Quelle und können deshalb
nicht auseinanderlaufen.
Nach jeder Schema-Änderung in `../backend/pb_migrations/` einmal ausführen und
die aktualisierte `types.d.ts` mitcommitten.
> Die System-Collections (`_superusers`, `_mfas`, …) stehen bewusst nicht in
> der Migration und fehlen deshalb in den Typen. Die Anwendung verwendet sie
> nicht.