Per-Participant NDI ISO Controller for Microsoft Teams. Receives Teams NDI streams, normalizes framerate/resolution, and re-emits clean ISO outputs for live production switchers (vMix, OBS, Ross). Wild Dragon LLC.
Find a file
Zac Gaetano 2e6d2a1e5e docs: WinUI 3 migration plan + overnight 2026-05-12 work log
Two new docs to land alongside the in-flight WinUI 3 work:

* docs/superpowers/plans/2026-05-12-winui3-migration.md
  Full nine-phase migration plan. Locks the architectural decisions
  (WindowsAppSDK 1.6 LTS, unpackaged, win-x64 RID, custom Main with
  explicit Bootstrap, CommunityToolkit DataGrid 7.1.2, AppWindow
  title-bar API). Tracks what's done (Phase 1 + 2: scaffold and
  MainWindow shell), what's blocked (Phase 3: activation failure),
  and what's next (Phase 4-9). Risk register flags fallback paths.

* docs/superpowers/work-log-2026-05-12.md
  Operator-readable summary of overnight progress. Leads with the
  pull-and-push reminder (forgejo credentials expired so commits are
  local-only until Zac authenticates and pushes manually), names the
  activation blocker with the diagnostic evidence captured, and
  suggests the first session tomorrow morning. Documents what was
  deliberately NOT touched (WPF host, Teams orchestration, view-model
  wiring) so the running build is unambiguously safe.
2026-05-13 00:09:51 -04:00
.forgejo/workflows ci: optional MSI + exe code-signing in release.yml 2026-05-10 09:41:28 -04:00
docs docs: WinUI 3 migration plan + overnight 2026-05-12 work log 2026-05-13 00:09:51 -04:00
installer feat: app icon, FPS, drops counter, --version, About dialog, Stop Teams toggle 2026-05-08 13:50:19 -04:00
src build(winui3): pin RID + flatten native DLLs into output dir 2026-05-13 00:07:05 -04:00
.editorconfig chore: scaffold repo conventions and global build props 2026-05-07 15:07:53 +00:00
.gitignore chore: scaffold repo conventions and global build props 2026-05-07 15:07:53 +00:00
build-and-test.ps1 chore: sweep orphaned files (UpdateChecker, UpdateBanner, TeamsControlBridge, helper scripts) 2026-05-10 09:42:29 -04:00
CHANGELOG.md docs: CHANGELOG covers MUTED pills / free space / loudest sort / snapshot-all / numpad / active-speaker highlight 2026-05-10 21:28:36 -04:00
commit-and-push.ps1 chore: sweep orphaned files (UpdateChecker, UpdateBanner, TeamsControlBridge, helper scripts) 2026-05-10 09:42:29 -04:00
coverlet.runsettings ci: enforce 80% line coverage gate on TeamsISO.Engine 2026-05-07 15:16:11 +00:00
DESIGN.md docs: PRODUCT.md + DESIGN.md (ground-up GUI redesign brief) 2026-05-12 23:45:04 -04:00
Directory.Build.props chore: scaffold repo conventions and global build props 2026-05-07 15:07:53 +00:00
PRODUCT.md docs: PRODUCT.md + DESIGN.md (ground-up GUI redesign brief) 2026-05-12 23:45:04 -04:00
README.md feat(ui): notes viewer + Stop-All confirm + folder shortcuts + README 2026-05-10 09:41:32 -04:00
TeamsISO.Linux.slnf feat(console): add TeamsISO.Console headless smoke runner 2026-05-07 15:37:44 +00:00
TeamsISO.sln feat(winui3): scaffold TeamsISO.App.WinUI alongside the WPF host 2026-05-12 23:52:35 -04:00
TeamsISO.Windows.slnf feat(winui3): scaffold TeamsISO.App.WinUI alongside the WPF host 2026-05-12 23:52:35 -04:00

TeamsISO

Per-Participant NDI ISO Controller for Microsoft Teams.

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, and re-emits clean, individually-addressable NDI sources for ingestion into a switcher (vMix, OBS, Ross, hardware capture).

What it does

  • Discovers participants as Teams broadcasts each one over NDI, surfacing the operator-friendly display name (handles current "MS Teams - Name" format and the legacy "(Teams) Name" format).
  • 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 output-name template (TEAMSISO_{name}, {guid}, {machine}, {timestamp} tokens).
  • Records each ISO to disk simultaneously — raw BGRA + sidecar manifest.json
    • ffmpeg convert.cmd — so post-production gets a clean per-guest archive.
  • Embeds Teams orchestration: launch and stop Teams from the rail, hide Teams' UI windows during a show, drive in-call controls (mute, camera, share, leave, raise hand) via UIAutomation.
  • Operator presets save the current per-participant ISO assignment and custom output names, applicable on next launch automatically.
  • Live preview thumbnails per participant in the participants table, plus pop-out floating preview windows (right-click → Open preview…) 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 integration. Self-contained HTML control panel at /ui for phone-as-controller.
  • Crash diagnostics wired to a rolling daily Serilog file sink under %LOCALAPPDATA%\TeamsISO\Logs\.
  • Update check against forge.wilddragon.net's release API — manual or silent on launch (throttled to 24h).
  • Diagnostic bundle export zips logs + config + presets for bug reports.

Status

Pre-1.0. The May 2026 batch is feature-complete; v1.0 cut is gated on code-signing the MSI and a smoke pass against a real Teams meeting. See CHANGELOG.md for the [Unreleased] entry.

Build

Requires .NET 8 SDK on Windows (the TeamsISO.App host is net8.0-windows WPF).

dotnet restore TeamsISO.Windows.slnf
dotnet build TeamsISO.Windows.slnf -c Release
dotnet test TeamsISO.Windows.slnf --filter "Category!=ndi&requires!=ndi"

The shipped helper scripts in the repo root automate this:

pwsh -File .\build-and-test.ps1
pwsh -File .\commit-and-push.ps1

Documentation

Keyboard shortcuts

Key Action
F1 Open help / cheat sheet
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)

File locations

Path Contents
%APPDATA%\TeamsISO\config.json Engine settings (framerate, NDI groups, etc.)
%LOCALAPPDATA%\TeamsISO\presets.json Saved operator presets + auto-apply preference
%LOCALAPPDATA%\TeamsISO\Logs\ Rolling daily diagnostic logs
%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

License

Proprietary, © Wild Dragon LLC 2026.