# CLAUDE.md – Musubi Du arbeitest an **Musubi**, einer nativen macOS-App von Zielke Studio für kleine Live-Übertragungen. Lies vor jeder Aufgabe die relevanten Dateien in `docs/`. Der Fahrplan in `docs/04-fahrplan.md` ist verbindlich: Ein Meilenstein gilt erst als fertig, wenn sein Abnahmetest bestanden ist. ## Kontext in drei Sätzen Ein ATEM steht im OP, die Regie sitzt im Saal, dazwischen liegt eine einzige Netzwerkleitung. Zwei ZowieBoxen schicken Multiview und PGM als NDI|HX3 ins Netz. Musubi läuft auf dem MacBook (Regie) und dem Mac mini (Bühne), zeigt die NDI-Bilder auf Bildschirmen, legt Ton auf Kanäle des MOTU M2 und stellt später ein Intercom fürs Handy bereit. ## Technische Leitplanken - **Plattform:** macOS, Deployment Target **macOS 14**, **Universal Build** (arm64 + x86_64). Der Mac mini 2018 (Intel, macOS 15 Sequoia) ist Zielgerät und muss jede Version flüssig ausführen. - **Sprache:** Swift 6, SwiftUI für die Oberfläche, AppKit wo nötig (Vollbildfenster auf bestimmten `NSScreen`, Anzeigemodi). - **Abhängigkeiten:** Keine Drittanbieter-Pakete ohne Rückfrage. Erlaubt ohne Rückfrage: Apple-Frameworks, das NDI SDK (C-Bibliothek, via Modulemap/Bridging), später das Blackmagic ATEM SDK. - **NDI SDK:** liegt lokal in `Vendor/NDI/` und wird nie eingecheckt. Fehlt es, brich nicht ab, sondern erkläre, was zu tun ist (`Vendor/README.md`). - **Module** (lokale Swift Packages oder Gruppen, siehe `docs/02-architektur.md`): - `MusubiCore` – Modelle, Szenen, Einstellungen (reine Logik, testbar) - `NDIKit` – dünner Swift-Wrapper ums NDI SDK (Finder, Receiver, Audio-only) - `VideoOutput` – Darstellung per Metal bzw. `AVSampleBufferDisplayLayer`, Vollbild je Bildschirm, 50 Hz - `AudioMatrix` – Core Audio / `AVAudioEngine`, Quelle → Ausgangskanal - `Remote` – Regie steuert Knoten per Bonjour (ab Meilenstein 3) - `Intercom` – HTTPS + WebRTC, nur an die Klinik-Schnittstelle gebunden (ab Meilenstein 4) - `Tally` – ATEM-Status (ab Meilenstein 6) - **Echtzeit:** Nie Video- oder Audioarbeit auf dem Main Thread. Keine Allokationen im Audio-Render-Callback. - **Betriebssicherheit:** Ruhezustand per `IOPMAssertion` verhindern, solange eine Szene läuft. Bei Verbindungsabbruch automatisch neu verbinden. Beim Start letzte Szene laden. - **Netze trennen:** Technik-Netz und Klinik-Netz werden nie verbunden. Dienste binden explizit an eine Schnittstelle. Keine Internetfreigabe. ## Design Halte dich an `docs/03-design.md` und `design/Theme.swift`. Kurz: dunkle Regie-Oberfläche, Indigo als einzige Markenfarbe, Rot/Grün ausschließlich für Tally (PGM/Vorschau), SF Pro in der App, SF Mono für Zahlen. Texte auf Deutsch, in Du-Form, kurz, im Stil von apps.zielke.studio („NDI rein. Bild, Ton und Stimme raus.“). ## Arbeitsweise 1. Vor Code: kurzer Plan in 3–6 Punkten, dann umsetzen. 2. Kleine Schritte, nach jedem lauffähigen Stand committen (Conventional Commits auf Englisch). 3. Reine Logik (Szenen, Kanalzuordnung, Parser) bekommt Unit-Tests mit Swift Testing. 4. Was sich nur mit Hardware prüfen lässt, beschreibst du als Schritt in `docs/05-testplan-hardware.md`, statt es zu behaupten. 5. Nach jedem Meilenstein: Checkbox in `docs/04-fahrplan.md` abhaken, kurze Notiz unter „Erkenntnisse“ ergänzen. 6. Code und Kommentare auf Englisch, UI-Texte auf Deutsch über einen String Catalog. 7. Wenn etwas unklar ist (Lizenz, Netz der Klinik, Hardware-Verhalten): fragen, nicht raten. ## Testen ohne Hardware - **NDI-Quellen:** NDI Tools (Test Patterns, Screen Capture) auf einem zweiten Mac oder OBS mit DistroAV als NDI-Ausgang. - **Audio:** MOTU M2 ist vorhanden; ohne M2 das eingebaute Ausgabegerät mit zwei Kanälen nutzen. - **ATEM:** vorhanden, für Tally ab Meilenstein 6. - **Hardware im Zulauf:** 2× ZowieBox, 2× TP-Link TL-SG2008P, MT-VIKI Dante-Adapter, Soundcraft Ui12. ## Nicht tun - Kein Senden/Encoding von NDI, keine Aufnahme, keine Bildmischung (macht der ATEM). - Keine Cloud-Dienste. Ein Relay (TURN) ist nur Plan B und läuft auf dem eigenen Server. - Keine Funktionen eines späteren Meilensteins vorziehen.