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. |
||
|---|---|---|
| .forgejo/workflows | ||
| docs | ||
| installer | ||
| src | ||
| .editorconfig | ||
| .gitignore | ||
| build-and-test.ps1 | ||
| CHANGELOG.md | ||
| commit-and-push.ps1 | ||
| coverlet.runsettings | ||
| DESIGN.md | ||
| Directory.Build.props | ||
| NEXT_STEPS.md | ||
| PRODUCT.md | ||
| README.md | ||
| TeamsISO.Linux.slnf | ||
| TeamsISO.sln | ||
| TeamsISO.Windows.slnf | ||
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:9755and OSC on UDP127.0.0.1:9000for Bitfocus Companion / Stream Deck / TouchOSC integration. Self-contained HTML control panel at/uifor 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 buildsrc/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
- Control surface API — REST + WebSocket + OSC reference with curl recipes and a Companion config example.
- Releasing — tag-push workflow, MSI signing path.
- Architecture spec — design overview.
- Embedded Teams orchestration spec — Phase E roadmap.
- Redesign brief + design system — token-level spec for the in-flight WinUI 3 redesign.
- WinUI 3 migration plan — nine-phase plan covering scaffold through retiring the WPF host.
- Interactive redesign preview — open in any browser to see and toggle the redesigned MainWindow before the WinUI 3 binary lands.
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.