diff --git a/README.md b/README.md index 8cb7164..360b5d4 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,92 @@ # TeamsISO -Per-Participant NDI ISO Controller for Microsoft Teams. +**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 and resolution per a configured target, and re-emits clean, individually-addressable NDI sources for ingestion into a switcher (vMix, OBS, Ross, hardware capture). +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. ## Status -Pre-1.0. See `docs/superpowers/specs/` for the active spec and `docs/superpowers/plans/` for in-flight implementation plans. +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. +Requires .NET 8 SDK on Windows (the `TeamsISO.App` host is `net8.0-windows` +WPF). - dotnet build - dotnet test + 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 + +| 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\\` | Default recording output | +| `%APPDATA%\NDI\ndi-config.v1.json` | NDI Access Manager group routing | ## License diff --git a/src/TeamsISO.App/NotesWindow.xaml b/src/TeamsISO.App/NotesWindow.xaml new file mode 100644 index 0000000..50ce127 --- /dev/null +++ b/src/TeamsISO.App/NotesWindow.xaml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +