Sheets via neuer KeyboardAwareSheet-Composable (in Modal pattern, auto-grow mit Tastatur, paddingBottom-Lift): EditMail, AddDomain, CreateRoom, ConnectMail. GameOverScreen behält Spring-Slide-In, nutzt RN Keyboard.addListener für Lift. - KeyboardAwareSheet.tsx — universal modal with sheet-grow + keyboard-padding - react-native-keyboard-controller installiert + KeyboardProvider in Root - Snake: time + ScoreProgressBar + useSnakeSounds (haptic, audio TODO) - Tetris: title weg, Buttons zentriert, kein Pressable mit style-fn - DPad-Buttons 60→48, more bg, no scale - useMe: pub-sub listener pattern für app-weite avatar/nickname-Updates - dm.tsx: resolveAvatar wrap (iron.png-Warning) - Mail-error-humanizer + locales Recovery-Doc-Update in docs/internal/RECOVERY_LOG_2026-05-10.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
117 lines
5.0 KiB
Markdown
117 lines
5.0 KiB
Markdown
# MDM-Productization Roadmap
|
|
|
|
**Stand:** 2026-05-10 (nach Phase F: persönliches Self-Binding für Chahine erfolgreich)
|
|
|
|
## Vision
|
|
|
|
ReBreak bietet als optionales Add-On (3€/mo on top auf Pro/Legend) ein vollständiges MDM-Lock-Setup für motivierte Recovery-User. Voraussetzung: Mac + USB + Bereitschaft zum factory-reset.
|
|
|
|
## Ziel-Audience
|
|
|
|
Schmaler aber motivierter Markt:
|
|
- Recovery-Community-Members nach 100000 Verzweiflungen
|
|
- DiGA-Patienten in aktiver Relapse-Prevention mit Therapie-Begleitung
|
|
- Users die "alles andere probiert haben" und maximalen Lock wollen
|
|
|
|
User-Insight (Chahine, 2026-05-10): "wenn keine nachfrage da ist haben wir nicht viel verloren — server steht eh."
|
|
|
|
## Was schon steht (Phase F done)
|
|
|
|
- NanoMDM-Server auf rebreak-mdm (178.105.101.137)
|
|
- Apple-Push-Cert via mdmcert.download
|
|
- AdGuard Home DoH @ dns.rebreak.org mit ReBreak-Blocklist
|
|
- DNS-MDM-Profile non-removable (supervised-only)
|
|
- Backend-Endpoint `/api/url-filter/blocklist.txt` als single source of truth
|
|
|
|
## Productization-Phase G (~1-2 Wochen dev)
|
|
|
|
### G.1 Enrollment-Profile-Generator
|
|
|
|
Backend-Endpoint `POST /api/mdm/enroll-profile` (Pro/Legend gated):
|
|
- Generiert per-user device-identity-cert (signed by NanoMDM CA)
|
|
- Wrapped als PKCS12
|
|
- Build .mobileconfig mit MDM-payload pointing zu `https://mdm.rebreak.org/mdm`
|
|
- DNS-payload pointing zu `https://dns.rebreak.org/dns-query`
|
|
- Returns als download
|
|
|
|
Heute manuell gemacht in `/opt/nanomdm/enrollment/` — automatisieren.
|
|
|
|
### G.2 User-Device-Link in DB
|
|
|
|
NanoMDM speichert devices in eigener DB (table `devices`). Brauchen mapping zu rebreak users:
|
|
- Neue table `rebreak.mdm_enrollments(user_id, device_id, enrolled_at, status)`
|
|
- Backend-API: `GET /api/mdm/my-status` returns enrollment-status für UI
|
|
|
|
### G.3 Lyra-Onboarding-Flow
|
|
|
|
In-App "Stärkster Schutz" Button (Pro/Legend):
|
|
1. Lyra-conversation: "Bist du sicher? Bedeutet factory-reset deines iPhones..."
|
|
2. Risiko-Aufklärung: Apps + lokale Daten (außer iCloud-Backup) verloren
|
|
3. **7-Tage-Cooldown** wie andere Schutze — User muss 7 Tage drüber schlafen
|
|
4. Nach Cooldown: Step-by-step Anleitung
|
|
5. Web-link öffnet `mdm.rebreak.org/onboarding/<user-token>`
|
|
6. Apple Configurator Wizard (Markdown-formatted instructions + screenshots)
|
|
7. Profile-Download
|
|
8. Wenn enrolled: NanoMDM pushed DNS-Profile + Restriction-Profile automatisch
|
|
|
|
### G.4 Onboarding-Web-Page
|
|
|
|
Static page (Nuxt marketing app) `mdm.rebreak.org/onboarding/<token>`:
|
|
- Step-1: Mac-requirement check
|
|
- Step-2: Apple Configurator install (App Store link)
|
|
- Step-3: factory-reset Anleitung (Settings-Pfad screenshot)
|
|
- Step-4: USB-connect + Configurator-Prepare-wizard (mit Screenshots)
|
|
- Step-5: .mobileconfig download + install via Apple Configurator
|
|
- Step-6: Bestätigung dass enrollment erfolgreich (backend-callback)
|
|
|
|
### G.5 Stripe-Add-On-Tier
|
|
|
|
- Pro: 3.99€ → mit MDM 6.99€
|
|
- Legend: 7.99€ → mit MDM 10.99€
|
|
- Stripe-Subscription-Modification API
|
|
|
|
### G.6 Per-User-Blocklist (later)
|
|
|
|
Aktuell: AdGuard pulled GLOBAL `getActiveBlocklistDomains()`.
|
|
Phase G.6: extend zu user-specific (custom-domains pro User).
|
|
Optionen:
|
|
- AdGuard-multi-DNS-server (1 pro User) — overkill
|
|
- Custom DoH-server der per-Token user-spezifische blocklist serviert
|
|
- Nicht-Priority — global blocklist ist 99% der Use-Cases
|
|
|
|
## Out-of-Scope (Apple-Hard-Limits)
|
|
|
|
- **Windows-User-Support**: Apple Configurator nur auf macOS. Windows-Pfad bräuchte custom Apple-Configurator-clone = monate dev. Skip.
|
|
- **DEP/ABM-Enrollment**: Wäre "ohne factory-reset enrollable", aber braucht DUNS + Apple-Business-Manager-Approval + nur Neu-Geräte via Reseller. Out of scope für consumer.
|
|
- **Per-App-Family-Controls-Toggle-Lock**: Apple-Platform-Limit (siehe Research Mai 2026). DNS-Layer kompensiert.
|
|
|
|
## Marginal Cost pro neuem User
|
|
|
|
- 1 row in nanomdm.devices: ~1KB
|
|
- APNS-connection: shared-pool, kosten gegen 0
|
|
- DoH-queries: paar 100 pro Tag pro User → AdGuard handhabt easy
|
|
- Storage/Bandwidth: vernachlässigbar
|
|
- **Effektiv: ~0€/mo pro MDM-User**
|
|
|
|
Bei 3€/mo Add-On = ~95% Marge.
|
|
|
|
## Risk-Assessment
|
|
|
|
- Apple könnte mdmcert.download-shared-key revoken (wenn auffällig viele Personal-MDM-Users) → fallback DNS funktioniert weiter, MDM-Push-commands brechen. Mitigation: eigener mdmcert-Account-Apply (kostenlos)
|
|
- Support-burden: jeder MDM-User wird ggf. Hilfe beim Setup brauchen. Initial-Beta: max 10-20 User, manueller Support, Lyra-led
|
|
- Liability: User locked sich aus → Recovery-Pfad via Lyra + Chahine-Manual-Override (admin-API). Cooldown verhindert impulsive enrollment.
|
|
|
|
## Decision-Points (User entscheidet)
|
|
|
|
- [ ] Phase G bauen oder warten bis 5+ User explizit nachfragen?
|
|
- [ ] Beta-Launch: stille Mail an existierende Legend-Users oder offen?
|
|
- [ ] Preisbestätigung: 3€ Add-On bestätigt oder 5-9€ wie Strategist eher empfehlen würde?
|
|
|
|
Strategist hat Pricing-Analysis pending (Task #58) — abwarten bevor finale Preis-Entscheidung.
|
|
|
|
## Source-of-Truth-Files
|
|
|
|
- Personal-Setup-Doku: `ops/mdm/PHASES.md` (Phase A-F)
|
|
- Architektur: `ops/mdm/ARCHITECTURE.md`
|
|
- Pricing-Strategy (pending): output von Strategist Task #58
|