Profile (3 Iterationen):
- app/profile/index.tsx + components/profile/* (Header, StatsBar, Approved,
Streak, UrgeStats, Demographics, DigaMissionBanner)
- echte Live-Daten via useMe-Hook (Avatar/Nickname/Plan/Email/Provider-Pill)
- Demographics mit echten Inputs (TextInput + Bottom-Sheet-Selects),
debounced auto-save, Pro-Trial-Reward-Banner, Mikro-Why-Texte
- Approved Domains als plain integer (KEIN Plan-Slot/Cap)
- Friendly Hint-Text statt Progress-Bar (alignSelf:'stretch' Pattern)
- StatsBar zentriert mit 3 prominenten Cards (vertikale Dividers)
- Cooldown-Timeline als Liste mit 1px-Rail
- ApprovedDomainsList: Collapse-Chevron rechts in Title-Row (Pattern-Fix)
- Eigene vs fremde Profile-Ansicht streng getrennt (DSGVO/Anonymität)
Header-Dropdown (kein 3-Punkte-Icon):
- Avatar als Trigger im AppHeader (User-Wunsch)
- Custom-Modal beide Plattformen, Card-Style
- SOS prominent oben (nur Wort 'SOS' rot, Tagline 'wir sind für dich da' klein darunter)
- Profile/Settings/Games/Debug(__DEV__)/Logout
- Logout neutral (nicht rot — Recovery-tonal)
- AppHeader: neue showBack + title Props für Sub-Routes
Routes (Stub bis Phase C):
- app/profile/[userId].tsx — anonym (nur public-Stats)
- app/settings.tsx — Coming-Soon-Skeleton
- app/games.tsx — Standalone Games-Page mit GameCard-Grid
- app/debug.tsx — __DEV__-only
Game-Picker (Migration aus Nuxt):
- components/games/{GameCard, StarRating, GameRatingStars}
- 2x2 Grid, 56pt SVG-Icons (inline aus components/urge/gameSvgs.ts)
- Live-Backend /api/games/ratings (silent-fail)
- Re-use UrgeGames.tsx ohne TTS/Cooldown-Loop
UI-Pattern-Fixes (alle aus screenshot-User-Feedback 2026-05-07):
- Snake-Bug (food-pellet React-18-StrictMode-Reducer-double-call) gefixt
- Snake-Buttons platform-native (iOS-blue / Android-ripple)
- Tetris-Margins (16px paddingHorizontal)
- PostCard-Buttons Apple-44pt-Hit-Area (Image-Select, Image-Remove,
Cancel, Share-Pill — via hitSlop)
- ProfileHeader Demographics-Hint: alignSelf:'stretch' Pattern
- ApprovedDomainsList Collapse: Title flex:1 + Chevron rechts
- ProtectionDetailsSheet FAQ-Items: alignSelf:'stretch' defensive
- AppHeader Back-Button: neue showBack-Prop + chevron-back
Memory + Plan-Docs:
- 17 Memory-Files dokumentieren System-Wissen + Patterns
- ops/{CUTOVER, UI_MIGRATION, PROFILE_PAGE, WEBHOOK, GAMES_1V1,
RELEASE_READINESS, TESTING_STATE, MAESTRO_HOSTING}_*.md
Backend bleibt unverändert (Tier-LLM + Nickname + sort:latency
sind seit gestern deployed).
Rebreak Native (React Native + Expo)
Mobile App für iOS + Android. Migration von Nuxt+Capacitor → React Native+Expo. Migration-Plan:
apps/rebreak/docs/react-native-migration.md
Status
Phase 1 — Foundation Skeleton (2026-05-02)
- Verzeichnisstruktur
package.jsonmit Expo SDK 53 + RN 0.76 (New Architecture)app.config.ts(Expo, Bundle-IDorg.rebreak.app)- Expo Router Skeleton
- NativeWind Setup (Tailwind für RN)
- Metro Config (pnpm Monorepo aware)
- Supabase Client + API Wrapper
pnpm install— vom User auszuführenexpo prebuild— generiertios/+android/Bare-Projekte- Native Module Imports (NEFilter, VpnService, A11y) — Phase 5+
Setup
# vom Monorepo-Root:
pnpm install
# Native-Projekte generieren (lokal, nicht committed)
cd apps/rebreak-native
pnpm prebuild
# Run
pnpm ios # iOS Simulator
pnpm android # Android Emulator
Stack
| Bereich | Lib |
|---|---|
| Framework | React Native 0.76 (New Architecture) + Expo SDK 53 |
| Routing | Expo Router (file-based) |
| State | Zustand |
| Server State | TanStack Query (React Query) |
| Styling | NativeWind 4 (Tailwind) |
| Forms | React Hook Form + Valibot |
| i18n | react-i18next |
| Auth | @supabase/supabase-js + AsyncStorage |
| Animation | react-native-reanimated, lottie-react-native |
| Storage | react-native-mmkv (fast key-value) |
Verzeichnisstruktur
apps/rebreak-native/
├── app/ # Expo Router (file-based routes)
│ ├── _layout.tsx # Root Stack
│ ├── index.tsx # Landing (auth oder app entscheiden)
│ ├── (auth)/ # Auth-Flow (signin, signup, forgot-password)
│ └── (app)/ # Authenticated App (tabs)
├── components/ # Reusable UI Components
├── hooks/ # Custom React Hooks
├── stores/ # Zustand Stores
├── lib/ # Supabase Client, API Wrapper, Utils
│ ├── supabase.ts
│ └── api.ts
├── locales/ # de.json, en.json
├── modules/ # Custom Expo Native Modules
│ ├── rebreak-ios-filter/ # NEFilter + Tunnel (Phase 5)
│ ├── rebreak-android-blocker/ # VpnService + DnsFilter (Phase 6)
│ └── rebreak-android-a11y/ # AccessibilityService (Phase 6)
├── plugins/ # Expo Config Plugins
└── assets/ # Icons, Splashscreens, Fonts
Wichtige Konfiguration
| Datei | Zweck |
|---|---|
app.config.ts |
Expo App-Config (Bundle-ID, Permissions, Plugins) |
metro.config.js |
Monorepo-aware Metro (Symlinks, Workspace-Folders) |
babel.config.js |
NativeWind Preset + Reanimated Plugin |
tailwind.config.js |
Tailwind Config — Brand-Colors aus apps/rebreak/ syncen |
global.css |
NativeWind Tailwind-Imports |
Native Module Strategie
Bestehender Native-Code aus apps/rebreak/ios/ + apps/rebreak/android/ wird in Expo Native Modules gewrappt — ohne neu zu schreiben.
iOS — modules/rebreak-ios-filter/
Wrapped:
RebreakURLFilter(NEFilterDataProvider) → blockt bet365 etc.RebreakTunnel(NEPacketTunnelProvider) → DNS-Filter
Android — modules/rebreak-android-blocker/
Wrapped:
RebreakVpnService(Kotlin) → VpnService DNS-FilterDnsFilter+HashList+DomainHasher
Android — modules/rebreak-android-a11y/
Wrapped:
RebreakAccessibilityService→ Detection von Gambling-Apps
⚠️ Wichtige Hinweise
- Schutz-Stack bleibt 1:1 erhalten — Swift- und Kotlin-Code wandert unverändert in
modules/. - Backend bleibt in
apps/rebreak/server/— RN ruft die gleichen Endpoints. - Alte Capacitor-App bleibt deployed bis RN-App im Store ist.
- Kein Auto-Commit — User entscheidet wann committet wird.
Phasen-Tracker
Siehe Migration-Plan für Details: apps/rebreak/docs/react-native-migration.md