Adds a small auto-dismissing pill notification at the bottom-center of the participants area: 'Settings saved' on Apply Changes, 'Transcoder topology applied — restart Teams to take effect' after the one-click NDI groups setup. ToastViewModel owns its own DispatcherTimer and resets the dismissal countdown on successive calls, so the most recent message is always the one visible. Hooked into MainViewModel and threaded into GlobalSettingsViewModel via constructor injection. _NEXT.md rewritten to reflect the May 2026 hardening pass: separates engine / UI / networking / Phase E.1 / diagnostics / CI / tests sections, lists every shipped item, and re-prioritizes the remaining work (Phase E.2-E.3 embedded Teams, code-signing the MSI, refresh-discovery affordance, output thumbnail previews, settings panel UX, auto-disable on departure, operator presets).
7 KiB
Plan Backlog
Completed phases
- Phase A — Engine Foundation (tag:
phase-a-complete) — domain model, parsers, participant tracker, frame processor, config, fakes, CI gate. - Phase B-1 — Pipeline Orchestration (tag:
phase-b-1-complete) — NdiReceiver, NdiSender, ExponentialBackoff, NdiRuntimeProbe, IsoPipeline supervisor, IsoController. - Phase B-2 — Real NDI Interop (tag:
phase-b-2-complete) —NdiInteropPInvokeagainst NDI 6 SDK, managed BGRA scaler,TeamsISO.Consoleheadless smoke runner,NdiVersionconstants. - Phase C — WPF UI (tag:
phase-c-complete) — MVVM helpers, ParticipantViewModel, GlobalSettingsViewModel, AlertBannerViewModel, MainViewModel, MainWindow XAML with participants DataGrid + settings sidebar + alert banner, App.xaml DI bootstrap. - Hardening + brand pass — May 2026 — see "Done since the May 2026 hand-off" below.
- Phase D — WiX Installer & Forgejo release — WiX v5 MSI scaffold, ARP icon wired, tag-push release workflow that builds + uploads MSI as a release asset.
Done since the May 2026 hand-off
Engine
- Forward-slash project paths in
TeamsISO.slnso.slnffilters work on Windows MSBuild. NdiNativeLibraryResolverresolvesProcessing.NDI.Lib.x64.dllviaNDI_RUNTIME_DIR_V6(with V5 / V4 fallbacks), so the engine starts on installs where the NDI dir isn't on PATH.NdiVersion.ExpectedRuntimeVersionPrefixupdated to match the shipping NDI 6 banner format (NDI SDK WIN64 …).NdiSourceParseraccepts current Teams desktop'sMS Teams - <name>brand format (plus legacyTeamsand defensiveMicrosoft Teams); reserved suffixes (Active Speaker,Audio,Audio Mix,Screen Share) are recognized in both legacy and dash-prefixed forms.- NDI groups end-to-end (discovery + output):
INdiInterop.CreateFinder(string?)andCreateSender(string, string?)populatep_groups;IsoControllerthreads them through fromEngineConfig.NdiGroups. ParticipantTrackersurfacesNdiSourceKind.ActiveSpeakeras a synthetic routable row named "Active Speaker" with a deterministic v5-GUID Id derived fromauto-mix:<machine>.IsoHealthStatswired end-to-end: live receiver/sender/processor refs published from the inner pipeline, frame counters / source resolution / running FPS (30-frame moving window) / drops + duplicates / pipeline state surfaced viaIsoController.GetStats.- Rolling daily file logging at
%LOCALAPPDATA%\TeamsISO\Logs\via Serilog.Sinks.File.
UI
- WPF rebuilt around Wild Dragon brand × Microsoft Teams flush layout — left rail with real dragon-mark logo (clickable → About dialog), chromeless title bar with custom min/max/close caption controls, cyan accent.
- Inter Variable + JetBrains Mono Variable bundled as
<Resource>so typography matches wilddragon.net regardless of system fonts. - App icon
teamsiso.ico(7 sizes) on taskbar / window / About / WiX MSI ARP. - Single-instance enforcement via per-user named Mutex with broadcast bring-to-front.
- Empty-state placeholder when no Teams sources are visible (faded dragon + checklist).
- Live frame counters in the Source / Live columns (in/out/drops, source resolution, running FPS).
- Per-pipeline state surfaced in the ISO toggle:
● LIVE(cyan),● ERROR(coral),● NO SIGNAL(amber),…(processing). - "Stop all ISOs" emergency button at the participants header.
- Hide-(Local) toggle so the user's own self-preview is filtered from the participants list.
- Window position / size / state persisted to
%LOCALAPPDATA%\TeamsISO\window.json, multi-monitor safe. - Tooltips on every interactive control in the settings panel + per-row textbox + ISO toggle.
Networking automation
- One-click transcoder topology button in Settings: writes
%APPDATA%\NDI\ndi-config.v1.jsonso all local senders broadcast onteamsiso-inputand local receivers see bothpublic+teamsiso-input. Engine settings auto-flip to receive-fromteamsiso-inputand emit-onpublic. Atomic write with timestamped backup of the prior config.
Phase E.1 starter (embedded Teams)
- Spec at
docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md(three-phase rollout: launcher → window orchestration → in-app meeting controls). - Rail "Launch / Stop Teams" toggle: launches via
ms-teams:URI /ms-teams.exe/ classicUpdate.exe --processStart, asks to confirmWM_CLOSEof all running Teams windows when toggled while Teams is up.
Diagnostics
TeamsISO.Console --list-sourcesenumerates raw NDI source names visible to the local finder for ~5 seconds; debugging tool for setup issues.TeamsISO.Console --versionprints engine version + build SHA + .NET + OS + NDI runtime banner + exit-code legend, for support tickets.- About dialog inside the WPF host with the same info.
CI / Release / Docs
- Forgejo CI is green:
actions/upload-artifact@v3(Forgejo doesn't support v4 yet). .forgejo/workflows/release.yml: tag-push (v*.*.*) builds + tests + publishes + builds the MSI on a Windows runner and attaches it to the auto-created Forgejo release via the REST API.docs/RELEASING.mdwalks through cutting a release and flags the code-signing TODO.
Tests
- 78 unit tests passing; 9 NDI integration tests gated behind
--filter requires=ndi(runtime probe, finder + sender lifecycle on default and custom groups, loopback discovery, full pipeline frame round-trip asserting 1080p normalization).
Next
-
Phase E — Embedded Teams orchestration (continued). E.2 (window orchestration: hide Teams' main window once launched, forward keyboard shortcuts via SendInput) and E.3 (Microsoft Graph or UIAutomation in-call controls) per the spec at
docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md. -
Code-signing the MSI.
installer/TeamsISO.Installer.wixprojhas aSignOutputproperty hook but no cert; for v1.0 wire asigntoolinvocation from a CI secret. SmartScreen will warn on first launch until that lands. -
Toast / inline feedback for "Apply Changes" and other settings actions (currently silent unless an error occurs).
-
Rail "Refresh sources" affordance — force a discovery rescan, useful right after applying a new transcoder topology when the operator wants Teams to reconnect.
-
Output thumbnail previews in the participant DataGrid — small live-frame previews of each ISO output. Complex (needs WPF WriteableBitmap from the Pipeline's last ProcessedFrame); deferred until v1.5.
-
Settings panel UX tightening. It's getting long; consider an Accordion or tabs for OUTPUT FORMAT / NDI NETWORK / DISPLAY rather than one scrolling stack.
-
Auto-disable on participant departure (configurable). Today an ISO stays "enabled" if its participant leaves; the source goes null. Optional toggle: tear down the pipeline automatically when a participant has been gone past the rename window.
-
Operator presets. "Save current ISO assignments to a named preset" + "Load preset on next launch" so an operator with a recurring show doesn't have to re-toggle every meeting.