v1.0.3
Stability & Crash Fixes
- Fixed a crash when opening the Push to Talk test panel
- Fixed a CoreAudio listener leak that could cause increasing memory usage over time
- Fixed a thread safety issue in audio device change callbacks that could lead to intermittent crashes
- Removed all force unwraps (try!) in color serialization — the app no longer crashes on corrupted preferences
- Fixed a NotificationCenter observer leak in app state lifecycle
- Fixed a strong reference cycle in the overlay fade-out animation
- Fixed device disconnection during Push to Talk now cleanly disables PTT mode
Reliability
- Device exclusion list now uses persistent device UIDs instead of session-specific IDs — excluded devices stay excluded across reboots and reconnections
- Hotkey conflict detection now offers a revert option instead of silently failing
- Push to Talk test view blink animation now updates correctly
- Overlay notification with zero duration now behaves consistently
Performance
- Menu bar icon redraws are now debounced — multiple rapid state changes produce a single redraw instead of one per change
- Color values are cached after first use, eliminating repeated deserialization on every icon draw
- Sound effects are cached after first playback, avoiding repeated disk lookups
- Replaced deprecated lockFocus/unlockFocus icon drawing with modern NSImage drawing handler
Accessibility
- Device enable/disable toggles now announce the device name to VoiceOver
Code Quality
- Unified logging across all components using os.log — replaces scattered print() statements for better diagnostics in Console.app
- Consistent use of [weak self] in all async callbacks to prevent retain cycles