Single shared affordance for adding either a website-domain or a mail-
sender-domain. The per-section add buttons (one inside "Eigene Domains"
and one inside "Eigene Mails") are gone — replaced by a CustomFilter-
Overview card above both sections with:
- title "Eigene Filter" and a "X von 20" counter (free/pro: 10, legend:
20 — sum of the two per-type buckets)
- a 2-colour progress pill: brandOrange for the web slice, success-green
for the mail slice on top of the surface-elevated rest
- a 48×48 rounded-full TouchableOpacity on the right (brandOrange,
ionicons add 24px, white) that opens the AddDomainSheet directly
AddDomainSheet was rewritten one more time: the Seite / E-Mail type
picker is gone. The user types one thing — domain or full address —
and a live preview shows which one we detected (Domain-Filter for a
bare host, Mail-Filter for input that contains "@", stripping to the
domain after the last @). The shape is also what we send: the body is
{ pattern } with no kind field. The backend (commit a2680f6) does the
authoritative auto-detect and sends back the resolved type with the
created row, so the frontend never has to guess in two places.
useCustomDomains.addDomain now treats kind as optional. When omitted,
the request body just carries pattern — when present it's still sent
through verbatim so any caller that wants to force a category still can.
DomainSection no longer renders a per-section add button when its onAdd
prop is undefined — domains and mails sections in blocker.tsx both
omit onAdd now. The mails section stays default-collapsed.
i18n: new keys custom_filter_overview_title / count + preview_web /
preview_mail / preview_invalid; tabs_web / tabs_mail removed since the
TypePicker is gone. type_web / type_mail kept in the locales as
inactive entries in case the type-picker comes back in a future
direct-add flow.
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