# Phase 6: Demo-only Engine Resolution **Status:** ⬜ Not Started **Parent plan:** [PLAN.md](./PLAN.md) **Domain:** backend ## Objective Ensure demo engines are the primary/preferred engines in demo mode, and are hidden when not in demo mode. This makes demo mode act as a "virtual platform" where only demo engines resolve. ## Tasks - [ ] Task 1: Modify `EngineRegistry.get_available_engines()` to filter out engines with `ENGINE_TYPE == "demo"` when not in demo mode (they report `is_available()=False` anyway, but belt-and-suspenders) - [ ] Task 2: Modify `AudioEngineRegistry.get_available_engines()` similarly - [ ] Task 3: In demo mode, `get_best_available_engine()` should return the demo engine (already handled by priority=1000, but verify) - [ ] Task 4: Modify the `GET /api/v1/config/displays` endpoint: in demo mode, default to demo engine displays if no engine_type specified - [ ] Task 5: Modify the audio engine listing endpoint similarly - [ ] Task 6: Ensure `DemoDeviceProvider.discover()` only returns devices when in demo mode - [ ] Task 7: End-to-end verification: start server in demo mode, verify only demo engines/devices appear in API responses ## Files to Modify/Create - `server/src/wled_controller/core/capture_engines/factory.py` — Filter demo engines - `server/src/wled_controller/core/audio/factory.py` — Filter demo engines - `server/src/wled_controller/api/routes/system.py` — Display endpoint defaults - `server/src/wled_controller/api/routes/audio_templates.py` — Audio engine listing - `server/src/wled_controller/core/devices/demo_provider.py` — Guard discover() ## Acceptance Criteria - In demo mode: demo engines are primary, real engines may also be listed but demo is default - Not in demo mode: demo engines are completely hidden from all API responses - Display list defaults to demo displays in demo mode - Audio device list defaults to demo devices in demo mode ## Notes - This is the "demo OS identifier" concept — demo mode acts as a virtual platform - Be careful not to break existing behavior when demo=False (default) - The demo engines already have `is_available() = is_demo_mode()`, so the main concern is UI defaults ## Review Checklist - [ ] All tasks completed - [ ] Code follows project conventions - [ ] No unintended side effects - [ ] Build passes - [ ] Tests pass (new + existing) ## Handoff to Next Phase