- Crash on launch caused by ThemeManager accessing NSApp before it was initialized
- Auto-restore now re-looks up device by stable UID before every restore attempt (AudioDeviceID can change after Bluetooth reconnection)
- NotificationCenter wake observer properly stored and removed (was silently leaking)
- AudioDevice Hashable conformance now uses only the stable UID (transient audioDeviceID and isDefault no longer affect hashing)
- Single device query failure no longer kills entire device list (graceful per-device error handling)
- Build configuration versions synchronized across Info.plist and Xcode project
- Removed AppNavigation wrapper (quit calls NSApplication.terminate directly)
- Removed dead
deviceID(forUID:)method from CoreAudioController - Cleaned up redundant imports across codebase
- Settings window now opens reliably from menu bar (replaced broken
NSApp.sendActionhack with native@Environment(\.openSettings)) - Preferred (pinned) input source no longer overridden by Bluetooth device connections (auto-restore now survives rapid CoreAudio callbacks and retries up to 3 times)
ThemeManagerextracted from misnamedSettingsWindowManager.swiftinto its own fileThemeManagerno longer uses unnecessary@StateObjectwrapper inInputControlApp- Deployment target raised to macOS 14 (was 13 in Info.plist, already 14 in Package.swift)
- Preferred input device now persists correctly across reboots (previously stored a transient numeric ID that changed on restart)
- CoreAudio listener callback no longer has a data race when reading the change handler
- Auto-restore no longer fires after being cancelled (Task cancellation was silently ignored)
- Multiple rapid CoreAudio notifications no longer bypass intentional device selection (added 100ms debounce and time-based flag clearing)
- Fallback launch agent now actually launches at login (
RunAtLoadwas incorrectly set tofalse) - Preferred input is restored after macOS wake (2s delay for Bluetooth devices to re-enumerate)
- CoreAudio CFString properties read with correct memory handling pattern
- Error messages now show human-readable descriptions instead of opaque numeric codes
- Settings window replaced with native SwiftUI
Settingsscene (Cmd+, now works) - Removed ~95 lines of custom NSWindow/NSHostingController/AnyView management
- Deprecated
NSApp.activate(ignoringOtherApps:)replaced with availability-gated modern API - Removed redundant
.fontDesign(.monospaced)applications
- Menu bar app for keeping your preferred microphone active
- One-click switching between available input devices
- Auto-restore preferred input when other devices connect
- Theme selection (light, dark, system)
- Launch at login support
- Device name display in menu bar (optional)