# 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`](../rebreak/docs/react-native-migration.md) ## Status **Phase 1 — Foundation Skeleton** (2026-05-02) - [x] Verzeichnisstruktur - [x] `package.json` mit Expo SDK 53 + RN 0.76 (New Architecture) - [x] `app.config.ts` (Expo, Bundle-ID `org.rebreak.app`) - [x] Expo Router Skeleton - [x] NativeWind Setup (Tailwind für RN) - [x] Metro Config (pnpm Monorepo aware) - [x] Supabase Client + API Wrapper - [ ] `pnpm install` — vom User auszuführen - [ ] `expo prebuild` — generiert `ios/` + `android/` Bare-Projekte - [ ] Native Module Imports (NEFilter, VpnService, A11y) — Phase 5+ ## Setup ```bash # 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-Filter - `DnsFilter` + `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`](../rebreak/docs/react-native-migration.md)