# Changelog All notable changes to rebreak-native will be documented in this file. Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Versioning: `version` follows SemVer, `versionCode` is monotonically increasing. --- ## [Unreleased] --- ## [0.3.6] — buildNumber 15 / versionCode 11 — 2026-05-25 ### Changed - **MDM-managed iPhones**: FC-Authorization-Toggle-UI wird bei MDM-verwalteten Geräten ausgeblendet. Der Schutz läuft in diesem Fall vollständig via MDM-managed VPN-Layer — kein manueller Toggle nötig oder sinnvoll. ### Backend - **Layer-2 Country-Curated-Pivot**: Layer 2 ist jetzt ausschliesslich kuratiert (Rebreak-Admin). Custom-Domains laufen nur noch über Layer 1 (VPN). Vollständige Entkopplung der beiden Schichten; Travel-Detection via Cellular-MCC geplant. --- ## [0.3.5] — buildNumber 14 / versionCode 11 — 2026-05-22 ### Fixed - **Android VPN-Blocklist-Self-Heal** (`9a22bcd`) — Nach der ersten Schutz-Aktivierung lud `RebreakVpnService` die Blocklist nicht, wenn sie zur Startzeit noch nicht bereit war (0 Domains aktiv). Neuer Self-Heal-Mechanismus: der Service prüft nach Tunnel-Start, ob die Blocklist leer ist, und lädt sie mit exponentiellem Backoff nach (1 s → 2 s → 4 s, max 3 Versuche). Kein Geräte-Neustart mehr nötig. - **iOS Layer-1 VPN: File-Protection-Fix** — `blocklist.bin` wird jetzt mit `FileProtectionType.completeUntilFirstUserAuthentication` geschrieben statt dem strengeren `.complete`. Damit ist die Datei nach dem ersten Entsperren seit Boot für die PacketTunnel-Extension dauerhaft lesbar — auch wenn der Tunnel startet, während das Gerät gesperrt ist. - **iOS Layer-1 VPN: Self-Heal** — Blocklist-Retry mit Backoff (3 s → 10 s → 30 s → 60 s → 120 s → 300 s, max 20 Versuche). War die Blocklist beim Tunnel-Start leer (Data-Protection-Fenster), lädt sie sich nach dem ersten Entsperren automatisch nach — kein manueller Sync oder VPN-Neustart nötig. ### Added - **VIP-Liste (Geblockte Domains)**: Eigene Domains und Stichwörter zur persönlichen Blocklist hinzufügen. Landabhängige kuratierte Vorschläge (DE, AT, CH, FR, AR). Slot-System: 10 Slots für Pro, 20 Slots für Legend — Web und Mail teilen sich einen gemeinsamen Pool (kein Free-Tier). Kachel-UI mit Slot-Fortschrittsanzeige. - **VIP Slot-Replace mit Cooldown**: Bestehende Slots können ersetzt werden; ein 12-Stunden-Cooldown verhindert schnelles Umgehen der Blocklist. - **Curated-Domain-Vorschläge**: Beim Hinzufügen einer Domain werden bekannte Glücksspiel-Anbieter aus der jeweils passenden Länderliste vorgeschlagen. ### Fixed - **Chat Inverted-FlatList**: Nachrichten rendern jetzt korrekt von unten nach oben (Standard-Chat-Layout). Vorheriges Layout ließ neue Nachrichten oben erscheinen. - **Chat Listen-Hänger**: FlatList blockierte bei langen Nachrichtenlisten nicht mehr den Main-Thread — virtualisierung greift korrekt. --- ## [0.3.0] — versionCode 10 — 2026-05-17 ### Added - **Duo-style Onboarding (9 Slides)**: Vollständiger Onboarding-Flow — Welcome → Privacy → Nickname → DiGA-Choice → DiGA-Code → Plan → Payment → Protection → Done. Lyra-Bubble mit TTS-Audio-Button auf jedem Slide. Pre-Explainer-Screenshots vor iOS-Permission-Dialogen. Confetti-Animation + Top-5-FAQ-Accordion auf Done-Screen. - **DiGA-Redeem-Endpoint + 100 Test-Codes**: Backend-Endpoint für DiGA-Code-Einlösung. 100 vordefinierte Test-Codes (REBREAK-TEST-001 bis REBREAK-TEST-100) für QA und Reviewer. - **Lyra Voice TTS Auto-Play + Voice-Button in Bubble**: TTS startet automatisch beim Slide-Einblenden; Voice-Button in der Lyra-Bubble startet/stoppt Audio on-demand. DiGA-Accessibility-Feature. - **Stripe Web-Checkout-Integration**: Pro 3,99 EUR/Monat, Legend 7,99 EUR/Monat, je 14-Tage-Trial. Checkout-Redirect via `expo-web-browser`, Webhook bestätigt Plan-Aktivierung serverseitig. - **Arabisch (Arabic) + RTL-Support**: Vollständige arabische Lokalisation mit automatischem RTL-Layout-Switching. - **NEFilter Robust Disable**: 2-step Apple-Pattern für zuverlässiges Deaktivieren des URL-Filters. `resetUrlFilter` als Recovery-Pfad bei code-5-Fehlern. `ProtectionOffSheet` ersetzt bisherigen Alert. - **Family Controls always-on**: Kein "Bald"-Placeholder mehr — FamilyControls-Entitlement (Distribution-approved) ist vollständig aktiv. - **Stripe Tier-Rename + Checkout-Refactor**: Pläne heißen jetzt konsistent `pro` / `legend` (statt alter Naming-Varianten). Checkout-Endpoint neu strukturiert. - **protectionDisabledAt (Backend)**: Server-seitige Timestamps verhindern Auto-Reaktivierung nach manuellem Deaktivieren durch den User. - **FaqAccordion-Komponente (shared)**: FAQ-Accordion extrahiert als `components/FaqAccordion` — geteilt zwischen DoneSlide und `help/faq`-Seite. ### Changed - **ProtectionSlide: Platform.OS-Dispatch**: iOS-Pfad aktiviert NEFilter + FamilyControls. Android-Pfad aktiviert VPN-Permission + a11y-TamperLock (VPN-Permission-Dialog → a11y-Pre-Explainer → a11y-Settings-Open → AppState-Auto-Detect-Return → tamperLock armed → finished). - **Blocker Single-Banner-Logik**: `lockedIn` ist nur `true` wenn BEIDE Schutz-Ebenen aktiv sind (iOS: urlFilter && appDeletionLock; Android: VPN && a11y). Kein falsches "Locked In" mehr bei Teilschutz. ### Fixed - **Android Keyboard-Covers-Input (Chat/DM)**: `react-native-keyboard-controller` ersetzt bisherigen KeyboardAvoidingView-Workaround — Input-Feld bleibt beim Tippen korrekt sichtbar. - **Protection Cooldown Auto-Disable Race**: Stale-State nach Cooldown-Ablauf korrigiert — kein falscher "aktiv"-Zustand mehr. - **Nickname Validation + Duplicate-Check**: Echtzeit-Prüfung auf bereits vergebene Nicknames im Onboarding. - **DiGA-Code Auto-Format**: Code-Eingabe formatiert automatisch (Großbuchstaben, Bindestriche). ### i18n - Französisch (fr) — 3. Sprache (war bereits in v0.2.x als Beta eingeführt, jetzt vollständig). - Arabisch (ar) + RTL — neu in v0.3.0. ### Backend - `protectionDisabledAt`-Timestamp auf User-Profil — verhindert Auto-Reactivation nach manuellem Disable. - DiGA-Code-Redemption-Endpoint (`POST /api/diga/redeem`) — 100 Test-Codes, Plan-Hochstufung auf `legend`. - Migration `20260517_add_lyra_post_i18n_key`: `i18n_key TEXT` auf `community_posts` (nullable, non-blocking). **Pending Deploy auf Hetzner** — Feature-Flag `USE_TEMPLATE_CATALOG=false` (default) haelt dieses Feature deaktiviert bis Migration deployed ist. --- ## [0.2.1] — versionCode 9 — 2026-05-16 ### Fixed - **Android-Crash nach AccessibilityService-Aktivierung**: BadgeDrawable in der Tab-Bar craste mit `IllegalArgumentException`, weil das Theme `AppCompat` statt `MaterialComponents` nutzte. Theme-Parent auf `Theme.MaterialComponents.DayNight.NoActionBar.Bridge` geändert via Config-Plugin — idempotent nach jedem prebuild. - **Doppel-Splash auf Android**: Native Android-Splash und JS-Splash sahen unterschiedlich aus (zwei aufeinanderfolgende Splash-Screens). Splash-Image auf `icon.png` umgestellt, matched jetzt exakt den JS-Splash und Landing-Screen. --- ## [0.2.0] — versionCode 8 — 2026-05-16 ### Added - **Mac-DNS-Profil — Vollautomatik**: Die App erkennt per DoH-Handshake, sobald der Mac eine DNS-Anfrage stellt, und springt automatisch auf Schritt 3 im Setup-Flow. Kein manuelles Tippen mehr nötig. - **Device-Account-Binding**: Pro- und Legend-Konten sind gegen Account-Switch-Bypass geschützt. Wer sich auf einem bereits gebundenen Gerät mit einem anderen Konto anmeldet, bekommt eine Sperre (DEVICE_LOCKED) — und der ursprüngliche Account wird per E-Mail benachrichtigt. - **Custom Mail-Filter (Cue Avoidance)**: Eigene E-Mail-Adressen oder Domains von Glücksspiel-Anbietern können direkt in der App eingetragen werden. Auto-Detect schlägt bekannte Muster vor. Free/Pro: je 5 Adressen + 5 Domains. Legend: je 10. Die neue Unified-Filter-Section ersetzt alle bisherigen separaten Blocker-Einträge. - **Like + Kommentar Realtime**: Reaktionen anderer User werden live in der Feed-Karte aktualisiert — kein manuelles Refresh. - **Chat v1.0 (DM-only)**: Direkt-Nachrichten mit Profilbildern, Suche, Unread-Badge in der Tab-Bar. Gruppen-Chats werden für v1.0 nicht unterstützt. - **Avatar-Zuschnitt via iOS-Nativ**: Der Profilbild-Zuschnitt nutzt jetzt Apples eigenes UIImagePickerController-Crop statt eines eigenen Sheets — zuverlässiger, native Look. - **Hilfe-Bereich in Settings**: Neue Seiten für FAQ, Kontakt, Über Rebreak und Krisen-Hotlines. Notifications-Bereich überarbeitet. - **Global-Blocklist-Vorabprüfung**: Beim Hinzufügen einer Custom-Adresse wird vorab gegen die zentrale Blockliste geprüft — kein Slot wird verbraucht, wenn die Domain sowieso schon global gesperrt ist. - **FamilyControls standardmäßig aktiv** in lokalen Dev-Builds (`dev-iphone.sh`, `clean-ios.sh`). ### Changed - **Devices-Seite neu gestaltet**: Zweizeilige Einträge mit animierter Fortschrittsleiste, UIMenu für Mac/Windows-Auswahl, zentrale Button-Komponente durchgehend genutzt. - **Game-Over-Modal überarbeitet**: Höhenbegrenzung, Keyboard-Avoidance, neuer Regenerate-Button. ### Fixed - **Mac in Geräteliste-Bug behoben**: Mac-Geräte wurden unter bestimmten Umständen nicht korrekt in der Liste angezeigt. --- ## [0.1.0] — versionCode 7 — 2026-05-15 ### Added - feat(native): device-info API headers — model, name, osVersion sent on every request via lib/api.ts - feat(native): DeviceLimitSheet visual differentiation — „Dieses Gerät"-Pill distinguishes current device from others in the list ### Changed - refactor(native): profile-page i18n keys — full sweep of 24 leftover Vue-i18n `{var}` patterns replaced with `%{var}` (vue-i18n-style removed, expo-localization pattern applied consistently) - chore(native): Google-OAuth always shows account-picker — `prompt=select_account` added to OAuth request, prevents silent re-auth with wrong account - refactor(native): feed page uses `groupedBg` for card contrast instead of flat background ### Fixed - fix(native): mail-account-edit modal-conflict + double-click bug — modal coordination corrected, prevents overlapping sheet opens - fix(native): sign-out now calls `WebBrowser.coolDownAsync` to clear OAuth cookies — prevents stale Google session on next login - fix(backend): Test-User `charioanouar@gmail.com` correctly identified as MrLonely (device-info schema + merge heuristic + test-user detection, auto-deployed via pipeline) --- ## [0.1.0] — versionCode 6 — 2026-05-15 ### Added - feat(i18n): French as 3rd app language (`fr`) for test customers — full locale file, settings picker, device-locale auto-detect (a981deb-fix) - feat(native): Lyra voice picker for legend tier — 3 ElevenLabs voices (Default / Voice 1 / Voice 2), backed by PATCH /api/profile/me/lyra-voice (d9bb7ef) - feat(native): realtime debug page (DEV-only) — connection-state, reconnect-counter, token-expiry countdown, channel list, rolling event-log (a0d67f3) - feat(backend): Lyra voice TTS-routing — userLyraVoiceId takes priority over default (legend-gated) (76f8595) ### Changed - refactor(mail): removed Groq LLM borderline layer — deterministic Score+Layer2.5 pipeline only. Resolves DSGVO-P0 items (no third-country data transfer). Layer 2.5 (Brand+Random) continues to catch Apple Hide-My-Email pattern (f2e3c00) ### Fixed - fix(native): `protectedDevices.filter is not a function` — Array.isArray guard on API response (a0d67f3) --- ## [0.1.0] — versionCode 5 — 2026-05-14 ### Added - feat(mail): multi-layer email classifier — Brand+Random detection, Relay-Decoder (Apple Hide-My-Email), Score-based routing, Groq borderline-review, ML-Sampling pipeline (b2f0471) ### Fixed - fix(mail): reactive Mail page — stats + connection status refresh on scan/connect (4580a19) - fix(mail): donut card layout rebuilt from scratch — centered, breathing room, no truncation (2ea0cfe) - fix(mail): donut card layout justify-start instead of center (aac6c00) - fix(mail): legend rows justify-between + per-connection bar-chart sparse-data zoom (b47ac24) - fix(mail): legend takes natural width inside card + bar-chart always trims to hit-range (55cba9a) - fix(mail): legend vertically centered against donut center number (778d3b6) - fix(mail): revert marginBottom hack — layout was breaking out of card (1d93ada) - fix(mail): legend bottom-aligned with donut baseline for visual centering (c218287) - fix(mail): DSGVO Art. 17 — manual sample cleanup on account delete (be4e163) --- ## [0.1.0] — versionCode 4 — 2026-05-07 ### Added - feat(mail): Outlook OAuth scan + daemon initial-sweep + page polish v4 (8075c8e) ### Fixed - fix(idle-daemon): sync MS_OAUTH_SCOPES with backend — drop User.Read, add email (fd1cb91) ---