2026-05-07 11:07:53 -04:00
|
|
|
# TeamsISO
|
2026-05-07 10:22:03 -04:00
|
|
|
|
2026-05-10 09:41:32 -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,
|
|
|
|
|
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`](docs/CONTROL-SURFACE.md) 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.
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
|
|
|
## Status
|
|
|
|
|
|
2026-05-10 09:41:32 -04:00
|
|
|
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.
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
|
|
|
## Build
|
|
|
|
|
|
2026-05-10 09:41:32 -04:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
- [Control surface API](docs/CONTROL-SURFACE.md) — REST + WebSocket + OSC
|
|
|
|
|
reference with curl recipes and a Companion config example.
|
|
|
|
|
- [Releasing](docs/RELEASING.md) — tag-push workflow, MSI signing path.
|
|
|
|
|
- [Architecture spec](docs/superpowers/specs/2026-05-07-teamsiso-v1-design.md)
|
|
|
|
|
— design overview.
|
|
|
|
|
- [Embedded Teams orchestration spec](docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md)
|
|
|
|
|
— Phase E roadmap.
|
|
|
|
|
|
|
|
|
|
## 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
|
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 |
|
|
|
|
|
| `%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 |
|
2026-05-07 11:07:53 -04:00
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
Proprietary, © Wild Dragon LLC 2026.
|