Release Notes
Changelog
All notable changes to Modern Meeter are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.8.1] - 2026-08-04
Added
- Documentation site — Jekyll-based GitHub Pages site (
site/) deployed via.github/workflows/pages.yml - Documentation pages in
docs/(installation, usage, architecture, Command Palette extension)
Changed
- README trimmed to a landing page; detailed content moved to
docs/
Fixed
- Background-thread exceptions are now caught and logged. Previously any managed exception on a non-UI thread crashed the app silently, since
Application.UnhandledExceptiononly fires for the UI thread. AddedAppDomain.UnhandledExceptionlogging andTaskScheduler.UnobservedTaskExceptionhandling (withSetObserved), which also prevents faulted unawaited tasks from escalating to a crash.
Known Issues
- Rare fail-fast crash (
RPC_E_WRONG_THREAD→0xc000027b) insideMicrosoft.UI.Xaml.dll(CXamlIslandRoot::GetScreenOffset), triggered when a UI Automation client (assistive technology such as Narrator/Voice Access, or automation tooling) queries an element’s screen bounds while the window is being resized or moved. On-device debugging captured the full native stack — it is entirely withinuiautomationcore.dll/Microsoft.UI.Xaml.dllwith no app frames, and reproduces on the latest Windows App SDK 1.8.x servicing build, so it is a framework defect rather than app code. The global exception handlers above cannot intercept it (a native fail-fast bypasses managed handlers). Mitigated in practice by the app not driving this path itself; a fix requires the Windows App SDK.
[0.8.0] - 2026-05-13
Added
- PowerToys Command Palette extension — control VoiceMeeter from CmdPal
- View all strips and buses with current gain and mute state
- Toggle mute on any channel directly from the palette
- Auto-discovery via
windows.appExtensionin appxmanifest - Real-time parameter updates via polling
Changed
- Split single project into three: ModernMeeter.Core (reusable API), ModernMeeter.CmdPal (extension), ModernMeeter (app)
- Test project now references Core via ProjectReference instead of shared source compilation
- Added VS Spell Checker configuration with domain-specific ignored words (meeter, voicemeeter, vban, cmdpal, etc.)
Fixed
- SetDllImportResolver race condition: two VoiceMeeterClient instances calling Login() concurrently could register the resolver twice
- CmdPal MixerPage timer and VoiceMeeter connection leaked on extension shutdown (Dispose never called)
[0.7.0] - 2026-03-29
Added
- Mixer toolbar with Save Settings, Restart Engine, and Touch Mode toggle buttons
- Touch-friendly mode: stacks channel buttons vertically with larger sizes, tightens level bar gaps, increases nav item height
- Help page with icon legend for all mixer controls and toolbar actions
-
Vertical level meters flanking the gain slider (L slider R layout) - Segoe Fluent Icons for mixer buttons: mute (E74F), solo (E7F6), mono (E71B)
- Centralized icon glyph resources in App.xaml for single-source updates
Changed
- Level meters moved from horizontal ProgressBars below slider to vertical bars alongside slider
- Deploy.ps1 skips uninstall unless registration fails (faster redeployments)
- Channel labels use
TextAlignment="Center"withHorizontalAlignment="Stretch" - Bus horizontal template uses invisible spacer to align with strip button row
Fixed
- Touch mode buttons always vertical in horizontal layout
- Touch mode navigation disappearing (keeps LeftCompact, just increases item height)
- Bus horizontal template slider alignment with strip template
- XAML indentation for FontIcon children in ToggleButtons
- Invisible spacer size matches actual ToggleButton rendered size (44×44, not 36×36)
[0.6.0] - 2026-03-25
Added
- Single-instance enforcement via
AppInstance.FindOrRegisterForKey— second launch redirects to existing instance and brings window to foreground - Custom
Program.csentry point (DISABLE_XAML_GENERATED_MAIN)
Changed
- Level meter bindings use computed ViewModel properties (
LevelLeftPercent/LevelRightPercent) instead ofIValueConverter— eliminates ~1,940 boxing allocations/sec - Services compile links in test project: 6 individual files →
*.cswildcard - MSTest.Sdk version moved from csproj to
global.jsonmsbuild-sdks NoWarninDirectory.Build.propsuses append pattern
Fixed
- Autostart toggle:
_suppressToggleEventsnow wraps the startup task state read, preventing the toggle handler from re-triggering on page load - StartupTask manifest: removed unresolved
$targetnametoken$Executable token fromuap5:Extension(inherits from Application element) LocalSettingsStore.OnChangeoverwrites previous listener — now supports multiple listeners with disposableChangeToken
[0.5.0] - 2026-03-22
Added
- CHANGELOG.md following Keep a Changelog format
- Persistent file logging via
Microsoft.Extensions.LoggingwithFileLoggerProvider Directory.Build.propscentralizing 10 shared MSBuild propertiesDirectory.Packages.propsfor NuGet Central Package Management- 3 new tests for SaveHiddenChannels and re-entrancy guard (672 total)
Changed
- Refactored static
SettingsServicetoMicrosoft.Extensions.Options(IWritableOptions<AppSettings>+LocalSettingsStore) - Switched from custom
LogServicetoMicrosoft.Extensions.Loggingwith DI-injectedILogger<T> - Test logging uses
TestContextLoggerProviderrouting to MSTest’sTestContext.WriteLine - Build commands: solution builds without
-p:Platform(slnx handles platform mapping) - Removed orphaned
LevelMetercontrol (superseded by ProgressBar approach) - Removed unused MacroButton P/Invoke declarations
Fixed
- MixerViewModel.Connect race condition — added re-entrancy guard
- MixerViewModel.OnParamTick missing null layout guard
- MidiViewModel: per-tick buffer allocation (reuse field-level buffer)
- MidiViewModel: O(n²) RemoveAt(0) collection trim (batch removal)
- VoiceMeeterClient: per-call buffer allocation in GetParameterString
- VoiceMeeterClient: ExtractAnsiString edge case when buffer has no null terminator
- LocalSettingsStore: thread safety for concurrent reads/writes
- MidiBindingsPage: 4 bool→Visibility bindings missing BoolToVisibilityConverter
- MixerPage horizontal template: 5 buttons missing ToolTip
- SettingsPage: silent catch blocks now log exception messages
- Deploy.ps1: TFM lookup for Directory.Build.props, DNS logging, subnet validation, WinRM pre-check
- MidiMessageItem.Parse: pre-size list capacity to avoid resizing
- Redundant RegexOptions.Compiled on [GeneratedRegex]
- Dead _ManifestPath MSBuild property removed
- Incremental build support for RemoveWinAppRuntimeDependency target
[0.4.0] - 2026-03-19
Added
- Self-contained deployment — builds bundle .NET runtime, no framework install required
- VoiceMeeter install detection with download links when DLL not found
- Navigation items hidden when disconnected (only Mixer and Settings visible)
- Auto-navigate back to Mixer when disconnected from a hidden page
Changed
- Project restructured: app source in
src/, tests intests/ - Deploy.ps1 updated for new layout, PS 5.1 compatibility, and self-contained builds
Fixed
- Release build crash caused by PublishAot trimming reflection metadata
- Settings toggles broken in Release (DataContext propagation in SettingsCard)
- Combined/horizontal layout modes not activating from Settings
- Remote deployment: proper package full name for uninstall, auto-uninstall before redeploy
- Deploy.ps1 handling of RID subdirectory for self-contained output
[0.3.0] - 2026-03-15
Added
- MIDI Bindings page — read VoiceMeeter’s MIDI mapping configuration (270 slots, 13 categories)
- Audio level meters (L/R ProgressBars) on all channel cards in all layouts
- Launch at startup (MSIX StartupTask)
- Window position and size persistence between sessions
- Adaptive horizontal layout — buttons stack vertically when cards are tall
- Version info in Settings (app version, .NET runtime, Windows App SDK)
- GitHub repository link in Settings
- Third-party library credits with license info
- 217 new tests (459 → 676 total)
Changed
- Switched from CommunityToolkit Ioc.Default to standard .NET IServiceProvider
- MIDI page split: Live Monitor stays on MIDI page, Bindings moved to dedicated page
Fixed
- Horizontal mode button overflow — reduced button sizes and increased minimum card width
- Settings page not showing connection state on navigation
- WMC1510 XAML trim warnings suppressed at project level
[0.2.0] - 2026-03-15
Added
- VBAN page — view and toggle all 8 inbound/outbound VBAN streams
- MIDI monitor — live MIDI message display at 30fps
- Horizontal layout mode with full-height cards
- Combined view — all channels in a single grid
- Audio engine restart command
- Save VoiceMeeter settings on close option
- App icon with unplated target-size assets
- Back button in custom title bar
- Remote deployment via WinRM and WinAppDeployCmd (PIN pairing)
- Device discovery for remote deployment
Changed
- Migrated to .NET dependency injection (IServiceProvider)
- Settings refactored into SettingsService + SettingsViewModel
[0.1.0] - 2026-03-15
Added
- Mixer page with vertical gain faders, mute/solo/mono toggles
- Adaptive grid layout that wraps cards based on window width
- Channel visibility — show/hide individual strips and buses
- Bus routing support per strip
- Custom title bar with Mica backdrop
- Left NavigationView with Settings page
- Auto-connect on startup
- Theme selection (system/light/dark) with persistence
- 309 unit tests with FakeVoiceMeeterClient
- Deploy.ps1 for local MSIX loose-file registration
- Native AOT compatible P/Invoke via LibraryImport
- Registry-based DLL resolver for VoiceMeeter installation