2026-05-07 11:07:53 -04:00
|
|
|
|
# TeamsISO
|
2026-05-07 10:22:03 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
**Per-participant NDI ISO controller for Microsoft Teams.**
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
2026-05-10 09:41:32 -04:00
|
|
|
|
TeamsISO 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,
|
2026-05-17 19:03:33 -04:00
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
|
|
|
|
|
## What it does
|
|
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
- **Discovers participants** as Teams broadcasts each one over NDI. Cleans
|
|
|
|
|
|
the Teams-prefixed source name down to a readable display name.
|
2026-05-10 09:41:32 -04:00
|
|
|
|
- **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
|
2026-05-17 19:03:33 -04:00
|
|
|
|
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.
|
2026-05-10 09:41:32 -04:00
|
|
|
|
- **Operator presets** save the current per-participant ISO assignment and
|
|
|
|
|
|
custom output names, applicable on next launch automatically.
|
2026-05-17 19:03:33 -04:00
|
|
|
|
- **Live preview thumbnails** in the participants table, plus pop-out
|
|
|
|
|
|
floating preview windows for multi-monitor monitoring.
|
2026-05-10 09:41:32 -04:00
|
|
|
|
- **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 /
|
2026-05-17 19:03:33 -04:00
|
|
|
|
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.
|
docs: CHANGELOG + README cover the in-flight WinUI 3 redesign
CHANGELOG.md gains an Added section at the top of [Unreleased] that
walks the redesign decisions: PRODUCT/DESIGN docs, WinUI 3 scaffold,
MainWindow IA, ThemeManager, Settings drawer, Help/About/Onboarding,
HTML preview, migration plan. Calls out the WPF host as the still-
shipping build until WinUI 3 reaches feature parity.
README.md picks up:
- A Status section paragraph naming the in-flight redesign and the
current activation blocker, with a pointer to Phase 3 of the
migration plan
- A Build section that names both hosts so a fresh checkout doesn't
surprise contributors with the new csproj
- Documentation section now links PRODUCT.md, DESIGN.md, the migration
plan, and the interactive HTML preview
Both docs land BEFORE Phase 4 (view-model wiring) so onlookers
understand what's already done and what's queued.
2026-05-13 00:28:37 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
## Install
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
Grab the latest MSI from the
|
|
|
|
|
|
[Releases page](https://forge.wilddragon.net/zgaetano/teamsiso/releases),
|
|
|
|
|
|
double-click, and accept the install prompts. Per-machine install under
|
|
|
|
|
|
`C:\Program Files\Wild Dragon\TeamsISO`.
|
docs: CHANGELOG + README cover the in-flight WinUI 3 redesign
CHANGELOG.md gains an Added section at the top of [Unreleased] that
walks the redesign decisions: PRODUCT/DESIGN docs, WinUI 3 scaffold,
MainWindow IA, ThemeManager, Settings drawer, Help/About/Onboarding,
HTML preview, migration plan. Calls out the WPF host as the still-
shipping build until WinUI 3 reaches feature parity.
README.md picks up:
- A Status section paragraph naming the in-flight redesign and the
current activation blocker, with a pointer to Phase 3 of the
migration plan
- A Build section that names both hosts so a fresh checkout doesn't
surprise contributors with the new csproj
- Documentation section now links PRODUCT.md, DESIGN.md, the migration
plan, and the interactive HTML preview
Both docs land BEFORE Phase 4 (view-model wiring) so onlookers
understand what's already done and what's queued.
2026-05-13 00:28:37 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
**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)
|
docs: CHANGELOG + README cover the in-flight WinUI 3 redesign
CHANGELOG.md gains an Added section at the top of [Unreleased] that
walks the redesign decisions: PRODUCT/DESIGN docs, WinUI 3 scaffold,
MainWindow IA, ThemeManager, Settings drawer, Help/About/Onboarding,
HTML preview, migration plan. Calls out the WPF host as the still-
shipping build until WinUI 3 reaches feature parity.
README.md picks up:
- A Status section paragraph naming the in-flight redesign and the
current activation blocker, with a pointer to Phase 3 of the
migration plan
- A Build section that names both hosts so a fresh checkout doesn't
surprise contributors with the new csproj
- Documentation section now links PRODUCT.md, DESIGN.md, the migration
plan, and the interactive HTML preview
Both docs land BEFORE Phase 4 (view-model wiring) so onlookers
understand what's already done and what's queued.
2026-05-13 00:28:37 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
## Configure
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
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:
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
- **Output** — framerate, resolution, aspect mode, audio routing
|
|
|
|
|
|
- **Network** — NDI discovery and output group names
|
|
|
|
|
|
- **App** — recording paths, startup behavior, theme
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
Per-participant overrides — click the **CFG** column gear on any row to
|
|
|
|
|
|
override framerate / resolution / aspect / audio for just that participant.
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
|
|
|
|
|
## Keyboard shortcuts
|
|
|
|
|
|
|
|
|
|
|
|
| Key | Action |
|
|
|
|
|
|
| --- | --- |
|
|
|
|
|
|
| `F1` | Open help / cheat sheet |
|
2026-05-17 19:03:33 -04:00
|
|
|
|
| `Ctrl + K` (or `Ctrl + P`) | Open the command palette |
|
2026-05-15 19:16:20 -04:00
|
|
|
|
| `Ctrl + T` | Toggle theme (dark ↔ light) |
|
2026-05-10 09:41:32 -04:00
|
|
|
|
| `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) |
|
2026-05-15 19:16:20 -04:00
|
|
|
|
| `1`–`9` / `NumPad 1`–`9` | Toggle the Nth visible participant's ISO |
|
2026-05-10 09:41:32 -04:00
|
|
|
|
|
|
|
|
|
|
## File locations
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
2026-05-10 09:41:32 -04:00
|
|
|
|
| Path | Contents |
|
|
|
|
|
|
| --- | --- |
|
|
|
|
|
|
| `%APPDATA%\TeamsISO\config.json` | Engine settings (framerate, NDI groups, etc.) |
|
|
|
|
|
|
| `%LOCALAPPDATA%\TeamsISO\presets.json` | Saved operator presets + auto-apply preference |
|
2026-05-17 19:03:33 -04:00
|
|
|
|
| `%LOCALAPPDATA%\TeamsISO\logs\` | Rolling daily diagnostic logs |
|
2026-05-10 09:41:32 -04:00
|
|
|
|
| `%LOCALAPPDATA%\TeamsISO\Notes\` | Per-day show-notes markdown files |
|
|
|
|
|
|
| `%USERPROFILE%\Videos\TeamsISO\<date>\` | Default recording output |
|
|
|
|
|
|
| `%APPDATA%\NDI\ndi-config.v1.json` | NDI Access Manager group routing |
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
## 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 TeamsISO.Windows.slnf
|
|
|
|
|
|
dotnet build TeamsISO.Windows.slnf -c Release
|
|
|
|
|
|
dotnet test TeamsISO.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\TeamsISO.App\TeamsISO.App.csproj `
|
|
|
|
|
|
-c Release -r win-x64 --self-contained false `
|
|
|
|
|
|
-o publish\TeamsISO
|
|
|
|
|
|
dotnet build installer\TeamsISO.Installer.wixproj -c Release
|
|
|
|
|
|
# Output: installer\bin\x64\Release\TeamsISO-Setup-<version>.msi
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-07 11:07:53 -04:00
|
|
|
|
## License
|
|
|
|
|
|
|
2026-05-17 19:03:33 -04:00
|
|
|
|
Proprietary, © Wild Dragon LLC 2026. All rights reserved.
|