- hms_app/projects.py: ProjectStore mit atomarem Speichern (.hms.json in projects/), Format-Kennung, Namens-Sanitize (Pfad-Traversal-Schutz, Leerzeichen erlaubt), Liste/Loeschen - engine.py: export_state() (Layer mit Alpha/Pos/Groesse/Z/FX + Intensitaeten + Master) und load_state() (ersetzt alle Layer, fehlende Medien werden uebersprungen und gemeldet, Werte geclamped, ungueltige FX-IDs verworfen) - server.py: /api/projects (GET Liste + Autostart), POST projects/save|load|delete|autostart; Loeschen des Autostart-Projekts raeumt config.json automatisch auf - config.py: engine.autostart_project (validiert, optional) - run.py: laedt Autostart-Projekt beim Programmstart - ui.py: neuer Reiter 'Projekte': Name eingeben + Speichern, Tabelle mit Laden/Autostart/Loeschen, Autostart-Badge E2E-BEWEIS (25/25 PASS, mit ECHTEM Server-Neustart): 1 Server startet · 2 Upload · 3 Layer · 4 FX/Alpha/Pos gesetzt · 5 Projekt 'Show A' gespeichert · 6 Traversal-Name sanitizet zu 'evil' · 7 Liste · 8 Layerzahl · 9 Zustand geleert (master=0.1) · 10 Projekt geladen · 11 Layer wiederhergestellt · 12 Alpha 0.7 wiederhergestellt · 13 FX1 blur 0.8 wiederhergestellt · 14 Position x=50 y=20 wiederhergestellt · 15 Master 0.9 · 16 Engine rendert · 17 Autostart gesetzt · 18 Server NEU GESTARTET · 19 Autostart: Layer+FX automatisch geladen · 20 Autostart: Engine rendert (60 Frames) · 21 config.json Autostart · 22 fehlendes Projekt 404 · 23 geloescht · 24 Autostart automatisch geleert · 25 config.json geleert Regressionen: App-E2E 14/14 (app=0) + FX-E2E 16/16 (fx=0) unveraendert gruen
HMS MediaEngine
Arbeitstitel – der Produktname kann später ohne technische Auswirkung geändert werden.
Modularer Medienserver, VJ-System und generativer Licht-/Pixeleffekt-Server.
- Primärplattform: Windows 11 x64, portabel ohne Installation
- Weitere Zielplattformen: Linux x64, Raspberry Pi 5 / Linux ARM64
- Steuerung: lokale Webanwendung (Browser), Art-Net/DMX, spätere Timeline/Audio/KI
Leitsatz
Python steuert. Native Bibliotheken decodieren. Die GPU rendert. Der Browser bedient.
Projektstatus
Das Projekt befindet sich in Phase 0 – technischer Spike und Go/No-Go.
Aktueller Stand, Gates und nächste Aufgaben: STATUS.md
Fehlerverfolgung: ERRORS.md
Messergebnisse: TEST_REPORT.md
Bauplan (normativ): PLAN.md
Repository-Struktur (Eigentumsgrenzen)
/
├─ apps/ launcher, control_server, renderer, web
├─ native/ render_bridge (Rust oder C++, Entscheidung per ADR)
├─ packages/ domain, protocol, parameter_engine, render_backend,
│ capabilities, adaptive_quality, plugin_sdk, artnet,
│ cluster, content_sync, timeline, audio_analysis,
│ persistence
├─ plugins/ builtin (generators, filters, transitions, outputs), examples
├─ schemas/ project, plugin, ipc, cluster, api
├─ fixture_profiles/ master32, layer64
├─ tests/ unit, integration, rendering, cluster, visual,
│ performance, portability, e2e
├─ tools/ media_probe, shader_validate, artnet_emulator,
│ capability_probe, cluster_test_node, fixture_generator
├─ build/ windows, linux, raspberry_pi
└─ docs/ architecture, adr, plugin-sdk, api, fixture,
performance, operator
Code darf nicht beliebig zwischen Paketen quer importiert werden.
Entwicklung
# Python-Umgebung
uv sync
# Tests
uv run pytest
# Lint + Typprüfung
uv run ruff check .
Frontend (ab Phase 5): pnpm mit Lockfile, Vite-Build, siehe apps/web.
Phasenmodell
Die Entwicklung folgt strikt dem Phasenmodell aus PLAN.md Abschnitt 31.
Jede Phase endet mit einem Gate; keine neue Phase ohne grünes Gate.
| Phase | Inhalt | Gate |
|---|---|---|
| 0 | Technischer Spike, Machbarkeitsnachweis, ADRs | Gate 0: D3D11-HW-Decode, GPU-Compositing, Adaptive Quality, Art-Net-Latenz, portable Auslieferung reproduzierbar grün |
| 1 | Fundament: Supervisor, Control Core, Renderer, IPC, Node-Identität, Discovery, Paarung | Gate 1 |
| 2 | Medien-, Layer-, Basissync-Engine | Gate 2 |
| 3 | Plugin-SDK, Starterpaket Generatoren + Filter | Gate 3 |
| 4 | Art-Net-Fixtures Master32/Layer64 | Gate 4 |
| 5 | Vollständige Browser-Liveoberfläche | Gate 5 / V1.0-Kernrelease |
| 6+ | Cue/Timeline, Audio, Mapping, Pixel-Ausgabe, KI, Pi 5, Härtung | eigene Gates |
Verbindliche Regeln (Auszug)
- Keine Pixelverarbeitung in Python-Schleifen.
- Kein CPU-Readback im normalen HDMI-Renderpfad (Windows: D3D11Memory durchgängig).
- Kein Mock als fertige Funktion gemeldet; Hardwaretests nur auf echter Hardware.
- Jede Architekturabweichung braucht ein ADR und Freigabe.
- Projektschema versioniert, Migrationen getestet.
Dokumentation
- Architektur:
docs/architecture/ - ADRs:
docs/adr/(Vorlage:docs/adr/_template.md) - Plugin-SDK:
docs/plugin-sdk/(ab Phase 3) - Fixture-Handbücher:
docs/fixture/(ab Phase 4)
Lizenz
TBD – wird mit dem ersten Release entschieden (SBOM und Lizenzverzeichnis sind Teil der Release-Anforderungen, PLAN.md Abschnitt 30).