# Shuffle – Flutter-App Brettspiel-App für iOS, Android und Web (eine Codebasis). Architektur und Konventionen: `../CLAUDE.md`, `../docs/adr/`. ## Struktur ``` lib/ core/ config, logging, error, result, supabase, routing, l10n, theme features/ /{data,domain,presentation} l10n/ app_de.arb, app_en.arb (+ generierte AppLocalizations) test/ Spiegel von lib/ env/ *.example.json (echte Umgebungsdateien sind git-ignoriert) ``` ## Starten ```bash cd app flutter pub get cp env/dev.example.json env/dev.json # Werte anpassen dart run build_runner build --delete-conflicting-outputs flutter run -d chrome --dart-define-from-file=env/dev.json ``` Pflichtwerte: `SUPABASE_URL`, `SUPABASE_ANON_KEY` (der Start bricht ohne sie ab). Optional mit Platzhalter: `SITE_URL` (Default `http://localhost:3000`; für Staging/Prod zwingend setzen, sonst zeigen Mail-Links auf localhost), `LEGAL_PRIVACY_URL`, `LEGAL_TERMS_URL`, `TERMS_VERSION`, `APP_ENV`. ## Platzhalter-Identität (vor dem Store-Release festlegen) | Was | Wo ändern | |---|---| | Bundle-/Application-ID `work.cshomelabs.shuffle` | `android/app/build.gradle.kts` (`namespace`, `applicationId`), Kotlin-Package unter `android/app/src/main/kotlin/`, `ios/Runner.xcodeproj/project.pbxproj` (`PRODUCT_BUNDLE_IDENTIFIER`) | | App-Name „Shuffle“ | `android/app/src/main/AndroidManifest.xml`, `ios/Runner/Info.plist`, `web/index.html`, `web/manifest.json`, l10n-Schlüssel `appTitle` | | Web-Domain, Rechtstexte, Version der Rechtstexte | `env/*.json` (`SITE_URL`, `LEGAL_*`, `TERMS_VERSION`) | Die Bundle-ID lässt sich nach der ersten Store-Veröffentlichung nicht mehr ändern. ## Hinweise - Generierte Dateien (`*.g.dart`, `lib/l10n/app_localizations*.dart`) werden mit eingecheckt; nach Änderungen an `@riverpod`-Code oder ARB-Dateien neu erzeugen (`build_runner`, `flutter gen-l10n`). - Web-URLs ohne `#` (`usePathUrlStrategy`): der Webserver braucht eine SPA-Rewrite-Regel (alle Pfade auf `index.html`).