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 29f7e56eb9 gear icon: swap Path glyph for U+2699 + bump column to 56px
The custom Path gear with Stroke=Wd.Text.Secondary + StrokeThickness=1.4
rendered as a near-invisible thin grey shape against the dark row
background — users couldn't tell the column was clickable.

Replace with TextBlock rendering U+2699 GEAR from Segoe UI Symbol
at 16px and Wd.Text.Primary foreground. Universally recognized as
'settings', renders crisply at any DPI, and stands out against the
row. Header bumped from empty to 'CFG' so the affordance is
discoverable, column widened from 32px to 56px so 'CFG' fits cleanly.
2026-05-15 16:11:53 -04:00
.forgejo/workflows ci: optional MSI + exe code-signing in release.yml 2026-05-10 09:41:28 -04:00
docs feat(wpf): v2 'Studio Terminal' shell - theme system, header, transport strip, drawer 2026-05-14 12:46:24 -04:00
installer feat: app icon, FPS, drops counter, --version, About dialog, Stop Teams toggle 2026-05-08 13:50:19 -04:00
src gear icon: swap Path glyph for U+2699 + bump column to 56px 2026-05-15 16:11:53 -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 + README cover the in-flight WinUI 3 redesign 2026-05-13 00:28:37 -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 feat(wpf): v2 'Studio Terminal' shell - theme system, header, transport strip, drawer 2026-05-14 12:46:24 -04:00
Directory.Build.props chore: scaffold repo conventions and global build props 2026-05-07 15:07:53 +00:00
NEXT_STEPS.md feat(wpf): v2 'Studio Terminal' shell - theme system, header, transport strip, drawer 2026-05-14 12:46:24 -04:00
PRODUCT.md feat(wpf): v2 'Studio Terminal' shell - theme system, header, transport strip, drawer 2026-05-14 12:46:24 -04:00
README.md docs: CHANGELOG + README cover the in-flight WinUI 3 redesign 2026-05-13 00:28:37 -04:00
TeamsISO.Linux.slnf feat(console): add TeamsISO.Console headless smoke runner 2026-05-07 15:37:44 +00:00
TeamsISO.sln feat(wpf): rollback to WPF host, axe recording, fix settings pane 2026-05-14 06:02:40 -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.

A ground-up GUI redesign is in flight on main (see docs/superpowers/plans/2026-05-12-winui3-migration.md). The WPF host (src/TeamsISO.App/) remains the shipping build; a parallel WinUI 3 host (src/TeamsISO.App.WinUI/) is scaffolded with the redesigned MainWindow, theme system (dark + light), and secondary surfaces. Activation of the unpackaged WinUI 3 .exe is the current blocker — diagnostics in the migration plan's Phase 3.

Build

Requires .NET 8 SDK on Windows. The repo has two hosts:

  • src/TeamsISO.App — WPF, net8.0-windows, current shipping build
  • src/TeamsISO.App.WinUI — WinUI 3, net8.0-windows10.0.19041.0, in-flight

Both build together from the solution filter:

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.