teamsiso/README.md
Zac Gaetano 37390026b3 chore(docs): reconcile to WPF-only after WinUI 3 was abandoned
- Fix TeamsISO.Windows.slnf — drop the dangling
  src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj entry whose project
  doesn't exist in the .sln (broke the build on main).
- Archive the abandoned WinUI 3 artifacts under docs/archive/:
  * 2026-05-12-winui3-migration.md (the nine-phase migration plan)
  * TeamsISO.App.WinUI.Probe/ (the bootstrap diagnostic console)
  * work-log-2026-05-12-winui3.md (the overnight session log)
- README — drop the "in-flight WinUI 3 replatform" status block;
  state that the v2 redesign landed in WPF and link the shape brief.
  Keyboard shortcuts table picks up Ctrl+K, Ctrl+T, and the digit
  hotkeys that already shipped.
- CHANGELOG — replace the WinUI-3-flavoured "Ground-up GUI redesign"
  block with a v2 Studio Terminal entry that names Task 39 + Task 40
  as landed. De-dupe the May 2026 batch: the second "Quick-join Teams
  meeting from URL", "IN-CALL bar surfaces Teams meeting state", and
  "Auto-launch Teams + auto-hide windows" bullets were verbatim repeats
  of earlier entries; kept the first occurrence.
- NEXT_STEPS.md — rewrite to reflect that Task 39 (participants table
  v2) and Task 40 (Ctrl+K palette) both shipped; v1.0 cut is now
  gated only on MSI signing + real-meeting smoke pass.
- DESIGN.md — small WPF-isms: WinUI 3 composition layer →
  WPF's; Segoe Fluent Icons phrased without the "WinUI 3's
  bundled" qualifier; migration boundary rephrased to "rewrites
  MainWindow.xaml + Themes/*" instead of "everything in Views/".
- .gitignore — ignore the .claude/ session metadata dir so it doesn't
  show up as untracked on every dev checkout.

Build + tests verified before commit: 0 errors, 0 warnings; 160 tests
pass (56 App + 104 Engine, filter Category!=ndi&requires!=ndi).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 19:16:20 -04:00

5 KiB
Raw Permalink Blame History

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.

The May 2026 ground-up redesign — the v2 "Studio Terminal" shell — has landed on the WPF host (src/TeamsISO.App/). A WinUI 3 replatform was explored in early May 2026 and abandoned (activation blockers + redundant work given the redesign is purely XAML / view-layer); the brief lives at docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md, and the abandoned migration plan + bootstrap probe are archived under docs/archive/.

Build

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

  • src/TeamsISO.App — WPF, net8.0-windows, the shipping build

Build 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 + K Open the command palette (also Ctrl + P)
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)
19 / NumPad 19 Toggle the Nth visible participant's ISO

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.