# Dragon-ISO

**Per-participant NDI ISO controller for Microsoft Teams.**

Dragon-ISO sits between Microsoft Teams' raw NDI broadcast output and a
live-production environment. It receives each participant's NDI stream,
normalizes framerate / resolution / aspect / audio per a configured target,
and re-emits clean, individually-addressable NDI sources for ingestion by a
switcher — vMix, OBS, Ross, hardware capture.

> **Status:** **v1.0.0** — first general release. Windows only. Requires
> Microsoft Teams (with NDI broadcast enabled) and the NDI 6 runtime.

---

## What it does

- **Discovers participants** as Teams broadcasts each one over NDI. Cleans
  the Teams-prefixed source name down to a readable display name.
- **Normalizes feeds** to a consistent framerate, resolution, aspect mode,
  and audio routing — so the downstream switcher gets predictable inputs
  regardless of what each participant's webcam is doing.
- **Routes per-participant** as separate NDI sources with a configurable
  per-row output name. Default is the speaker's display name; override
  inline in the participants table.
- **Records each ISO to disk** simultaneously — raw BGRA + `manifest.json`
  + FFmpeg `convert.cmd` — so post-production gets a clean per-guest archive.
- **Embeds Teams orchestration**: launch / stop Teams, hide its UI windows
  during a show, drive in-call controls (mute, camera, share, leave,
  raise hand) without leaving the operator console.
- **Operator presets** save the current per-participant ISO assignment and
  custom output names, applicable on next launch automatically.
- **Live preview thumbnails** in the participants table, plus pop-out
  floating preview windows for multi-monitor monitoring.
- **External control surface** — REST + WebSocket on `127.0.0.1:9755` and
  OSC on UDP `127.0.0.1:9000` for Bitfocus Companion / Stream Deck /
  TouchOSC. Self-contained HTML panel at `/ui` for phone-as-controller.
- **Theme-aware** — dark and light palettes, system-following or pinned.
  The Wild Dragon mark and watermark flip to match.

## Install

Grab the latest MSI from the
[Releases page](https://forge.wilddragon.net/WildDragonLLC/dragon-iso/releases),
double-click, and accept the install prompts. Per-machine install under
`C:\Program Files\Wild Dragon\Dragon-ISO`.

**Prerequisites:**
- Windows 10 / 11, 64-bit
- [.NET 8 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet/8.0)
- [NDI 6 Runtime](https://www.ndi.video/tools/) (the installer warns if
  missing but does not block — operators can stage the app before NDI is
  rolled out)
- Microsoft Teams (NDI broadcast enabled in admin policy)

## Configure

First-run defaults work for most setups. If your downstream switcher needs
a particular framerate / resolution / NDI group routing, open the **gear
icon** in the header to access the settings drawer:

- **Output** — framerate, resolution, aspect mode, audio routing
- **Network** — NDI discovery and output group names
- **App** — recording paths, startup behavior, theme

Per-participant overrides — click the **CFG** column gear on any row to
override framerate / resolution / aspect / audio for just that participant.

## Keyboard shortcuts

| Key | Action |
| --- | --- |
| `F1` | Open help / cheat sheet |
| `Ctrl + K` (or `Ctrl + P`) | Open the command palette |
| `Ctrl + T` | Toggle theme (dark ↔ light) |
| `Ctrl + M` | Drop a timestamped marker into every active recording |
| `Ctrl + Shift + S` | Stop every running ISO (emergency) |
| `Ctrl + R` | Refresh NDI discovery (rebuild finder) |
| `1`–`9` / `NumPad 1`–`9` | Toggle the Nth visible participant's ISO |

## File locations

| Path | Contents |
| --- | --- |
| `%APPDATA%\Dragon-ISO\config.json` | Engine settings (framerate, NDI groups, etc.) |
| `%LOCALAPPDATA%\Dragon-ISO\presets.json` | Saved operator presets + auto-apply preference |
| `%LOCALAPPDATA%\Dragon-ISO\logs\` | Rolling daily diagnostic logs |
| `%LOCALAPPDATA%\Dragon-ISO\Notes\` | Per-day show-notes markdown files |
| `%USERPROFILE%\Videos\Dragon-ISO\<date>\` | Default recording output |
| `%APPDATA%\NDI\ndi-config.v1.json` | NDI Access Manager group routing |

## Documentation

- [Control surface API](docs/CONTROL-SURFACE.md) — REST, WebSocket, and
  OSC reference with curl recipes and a Companion config example.
- [Real-time recording](docs/REAL-TIME-RECORDING.md) — recorder format,
  manifest schema, and the FFmpeg conversion path.
- [Releasing](docs/RELEASING.md) — tag-push workflow and MSI signing.

## Build from source

Requires the .NET 8 SDK on Windows. WPF is the only host.

```powershell
dotnet restore Dragon-ISO.Windows.slnf
dotnet build   Dragon-ISO.Windows.slnf -c Release
dotnet test    Dragon-ISO.Windows.slnf --filter "Category!=ndi&requires!=ndi"
```

Or use the included helper:

```powershell
pwsh -File .\build-and-test.ps1
```

To produce a fresh MSI:

```powershell
dotnet publish src\Dragon-ISO.App\Dragon-ISO.App.csproj `
    -c Release -r win-x64 --self-contained false `
    -o publish\Dragon-ISO
dotnet build installer\Dragon-ISO.Installer.wixproj -c Release
# Output: installer\bin\x64\Release\Dragon-ISO-Setup-<version>.msi
```

## License

Proprietary, © Wild Dragon LLC 2026. All rights reserved.
