All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Fixed device status flickering to offline during app startup - now only updates when state actually changes
- Fixed device status not updating after auto-connect - now properly notifies frontend on successful connection
- Fixed device status becoming offline on page refresh - frontend now preserves last known state
- Fixed tracker add/remove events sending incomplete device data - now includes proper name, type, and status fields
- Fixed auto-connect not working for previously connected devices - now connects devices with isConnected=true
- Device state synchronization: only notifies frontend when there's an actual state change (no intermediate states)
- Auto-connect now targets previously connected devices (isConnected=true) instead of just autoConnect=true
- Improved startup sequence: ADB server starts first, then tracker initializes, then auto-connect runs
- Added notifiedDevices set to prevent duplicate notifications to frontend
- Fixed race condition in device loading when rapidly refreshing device list
- Added concurrency control to prevent state overwrite from simultaneous loadDevice calls
- Fixed IPC listener cleanup using removeAllListeners which could accidentally remove other component listeners
- Improved listener management with listenerMap for precise cleanup
- Fixed WiFi device auto-reconnect timing issue - now waits 10 seconds after disconnect before attempting reconnect
- Added 2-second delay before WiFi reconnect to prevent triggering during network instability
- Fixed TypeScript type error in preload.ts listener callback type
- Device auto-reconnect now only triggers on manual refresh, not immediately after disconnect
- WiFi devices must be previously connected before attempting reconnect
- Fixed device connection status not updating when device disconnects (WiFi/USB)
- Fixed stale "connected" status persisting after device disconnection
- Device status now updates immediately when device tracker detects disconnect event
- Fixed device status not updating on visibility change (tab switch)
- Fixed ADB daemon failure not clearing connected devices state
- Optimized startup: device status restored from history immediately, no initial ADB poll
- Device connection state now determined by ADB only when status actually changes
- WiFi devices now mark as offline after 5 seconds of disconnection timeout
- Postinstall script changed from
electron-vite postinstalltoelectron-vite build
- Fixed custom settings (FPS, Bitrate, Resolution) not synchronizing immediately when switching to "Custom" mode in Display settings
- Improved "Custom" option visibility in dropdown menus by adding explicit labels
- Completed "Custom" label translations across all supported languages (ES, FR, JA, KO, TR)
- Fixed scrcpy launch parameters missing
--video-encoderand--audio-encoder, ensuring selected hardware encoders are actually used - Fixed video encoder list not showing in Encoding settings when no device is initially detected (added persistent dropdown with lazy loading)
- Fixed several empty catch blocks across Electron main process for better error traceability
- Fixed Set serialization issues in device storage affecting state persistence
- Fixed TypeError in DeviceCard/DevicePage by migrating from Set.has() to Array.includes()
- Fixed GitHub Actions build failure on macOS by disabling mandatory code signing requirements
- Improved error handling by replacing
anytypes withunknownand adding proper type checks
- Converted synchronous file writes to asynchronous debounced writes to prevent blocking the main process
- Optimized device polling interval (increased from 5s to 10s) to reduce CPU and network usage
- Extracted hardcoded configuration values (polling intervals, log retention) into maintainable constants
- Optimized React rendering in DevicePage using useMemo for derived device lists
- Wrapped event handlers in useCallback to prevent unnecessary child component re-renders
- Cached scrcpy command preview calculation using useMemo
- Fixed toast notifications showing previous language after switching app language
- Fixed ADB processes not being killed on app quit (cleanup was skipped due to race condition)
- Removed redundant isCleaningUp flag setting in quit-app handler
- Fixed duplicate toast notifications when stopping mirroring (toast appeared twice in different languages)
- Toast now properly prevents overlapping when triggered rapidly
- Unified toast implementation across DevicePage and DeviceCard components
- Added shared toast utility with type support (success, error, warning, info)
- Toast styles now support different visual types with proper theme colors
- Added hardware encoder selection support for improved WiFi streaming performance
- Users can now select from available device encoders via dropdown menu
- Recommended hardware encoders (c2.qti., OMX.qcom.) are marked with ★ indicator
- Encoder info display shows current selected encoder name
- Click-to-load approach (encoders load on dropdown click for better UX)
- Added multi-language translations for encoder UI (7 languages)
- Fixed saved encoder value not displaying after page reload
- Fixed encoder parsing issue when loading saved settings
- Removed debug console.log statements from EncodingPage component
- Updated videoEncoder description text to guide users to hardware encoder selection
- Improved encoder loading UX with toast notification when encoders are loaded
- Encoder selection now uses "codec & encoder" format internally for better compatibility
- Fixed custom resolution/frameRate/bitrate not persisting after restart (state management bug)
- Fixed custom resolution label showing "Max Resolution" instead of "Custom Resolution"
- Fixed installer file deletion failing on Windows due to file locking
- Changed default video buffer to 0 (disabled for real-time mirroring)
- Fixed resolution custom option not showing input box
- Removed auto-generation of version.json during release workflow (manual update required)
- Optimized event listener binding in DevicePage (bind once instead of re-binding on state changes)
- Optimized startup process: parallel ADB start and device tracker initialization
- Reduced auto-connect delay from 500ms to 300ms
- Fixed scrcpy startup failure due to incorrect buffer parameter (changed from --buffer to --video-buffer)
- Fixed settings saving outputting duplicate log entries (optimized to single file write)
- Added Video Buffer setting for smoother playback on high-resolution or unstable networks
- Added multi-language support for Video Buffer UI (7 languages)
- Added improved command preview showing all active scrcpy parameters
- Changed default Video Buffer to 0 for real-time mirroring (no additional latency)
- Optimized settings save to use batch operation for display and encoding settings
- Improved label and icon spacing in form groups for better visual appearance
- Updated all comments to English for codebase consistency
- Added React.memo to DeviceCard component to prevent unnecessary re-renders during polling
- DeviceCard now only re-renders when device props or connection status actually changes
- Fixed app startup failure in production environment
- Fixed ADB daemon not starting properly causing "cannot connect to daemon" error
- Fixed missing IPC handlers (quit-app, onQuitAnimation) causing renderer errors
- Fixed device tracker initialization failing when ADB not ready
- Changed ADB server startup to use exec() instead of spawn() with unref() for reliable startup
- Changed startup sequence: show window → start ADB → init tracker → auto-connect
- Simplified ADB server ready logic by removing caching mechanism
- Added startAdbServer() function that properly waits for ADB to start
- Fixed device status flicker on startup (devices now show persisted state immediately)
- Fixed log level not being respected in production environment
- Fixed ADB server ready polling issue (prevented repeated
adb start-servercalls) - Fixed device tracker initialization timing issue
- Fixed quit animation not displaying when closing app
- Optimized startup speed - window now displays immediately while ADB starts in background
- Device tracker now initializes after ADB is ready to prevent connection errors
- Device status merge logic improved - current device status takes priority over historical data
- Persisted storage now only saves device metadata (id, name, type), not status
- Loading indicator now displays immediately on startup
- Auto-reconnect WiFi devices only on manual refresh, not on every startup
- Added quit termination animation with spinner
- Added multi-language support for termination messages (7 languages)
- Added device detection loading indicator with translations
- Added device removed toast message with translations
- Refactored
ensureAdbServerReady()to use spawn() and prevent concurrent launches - Added retry mechanism for device loading with exponential backoff
- Fixed device status flicker on startup (devices now show persisted state immediately)
- Fixed log level not being respected in production environment
- Device tracker now initializes after window is shown to prevent status flicker
- Log level filtering now properly respects user settings in production mode
- Added command injection protection for file operations (delete, create folder)
- Added path traversal protection for file downloads
- Restricted test mode to non-production environments only
- Added input validation for device IDs and file paths
- Fixed potential command injection vulnerabilities in file manager operations
- Fixed path traversal vulnerability in download functionality
- Fixed resource leak issue with unchecked intervals
- Update downloads now save to desktop for easy manual cleanup
- Improved process termination logic with graceful fallback
- All timeout values are now configurable constants
- Unified process termination function to reduce code duplication
- Added interval tracking system to prevent resource leaks
- Added security utility functions (sanitizeDevicePath, validateSavePath, isValidDeviceId)
- Fixed tray right-click exit not responding
- Fixed tray icon residue after exit
- Fixed context menu not displaying on second right-click
- Fixed 4 iscrcpy processes remaining after exit
- Optimized exit flow to use app.exit(0) for direct exit
- WiFi device connection state is now persisted (maintains connection status after app restart)
- Renamed "build" folder to "icons" for clearer resource organization
- Unified exit flow across all exit scenarios (tray quit, window close, X button)
- Simplified mainWindow.on("closed") handler
- Simplified will-quit handler to prevent duplicate cleanup
- Removed duplicate process cleanup logic
- Fixed app not exiting properly after clicking "Install Update" in packaged mode
- Fixed infinite loop when quitting app (will-quit event triggered multiple times)
- Removed 1-hour time limit for installer cleanup (now deletes unconditionally)
- Optimized update installation flow: destroy window → delay → exit
- Improved process cleanup to prevent duplicate cleanup calls
- Simplified installer deletion logic for more reliable cleanup
- Fixed file download encoding issues on Windows (Chinese system)
- Fixed false offline status when device tracker reports "offline" before ADB confirms
- File download and upload now use spawn instead of exec to avoid shell encoding problems
- Device status is now verified with adb devices before marking as offline
- Added real-time device tracking using adbkit's trackDevices() for instant status updates
- Device status now updates immediately when devices connect or disconnect
- WiFi devices now show actual device name (e.g., "PJD110") instead of IP address after connection
- Device offline detection now requires ADB confirmation to prevent false status updates
- Fixed app not closing during update installation in development mode
- Application now properly quits before installer starts
- Added automatic cleanup of all subprocesses before update installation (scrcpy, ADB, camera)
- Added automatic deletion of installer files after successful installation
- Installer files are automatically removed on next app launch (after 1 hour)
- Fixed WiFi device status not updating after app restart
- WiFi devices now auto-reconnect when app restarts and ADB server resets
- USB devices are now immediately marked as offline when disconnected
- WiFi devices maintain their status when temporarily undetected by ADB
- Device status logic: always update from ADB response
- Device list rendering: merge knownDevices with current devices for accurate status
- Tray menu logging now uses debug level to match software log level settings
- Redesigned README header with logo and platform badges
- Updated project structure documentation to match actual codebase
- Added interface screenshot above features section
- Added device removal feature - users can now remove devices from the list
- USB devices will automatically reappear when USB is connected after removal
- WiFi devices remain removed until manually reconnected via IP input or "Enable Wifi" button
- Tray menu and tooltip now support multi-language translations (7 languages)
- Development mode logging always shows info level and above
- Fixed display resolution max-size values for scrcpy to use correct dimensions
- Fixed device removal logic to properly handle both USB and WiFi devices
- Fixed tray menu translations not updating in development mode
- Development mode: tray translations always log info level and above regardless of user settings
- Fixed update dialog crash when displaying multilingual release notes
- Update dialog now properly handles releaseNotes as object with multiple languages
- Added automatic language detection based on user's current locale
- Switched update checking from GitHub API to GitHub Pages to avoid rate limit errors
- Update check now uses static version.json file for better reliability
- Added automatic version.json deployment to gh-pages during release
- Fixed update check 403 error caused by GitHub API rate limiting
- Fixed update download functionality with progress display
- Fixed visit release page to open correct URL
- Added common translations for all languages
- Added GitHub token support for API rate limit
- Improved download progress communication between main and renderer processes
- Fixed update download speed issue by using electron-dl library
- Improved GitHub Actions release workflow changelog extraction
- File manager for Android devices (list, download, upload, delete, create folder)
- APK installation support for connected devices
- Auto-update checking from GitHub releases
- Custom update dialog with download and install functionality
- System tray icon with context menu
- Close confirmation dialog with minimize-to-tray option
- Rename SettingsPage to LogsPage for accuracy
- Improved file size display in file manager
- Multiple UI improvements and bug fixes
- Various bug fixes and stability improvements
- Initial release
- Multi-language support (7 languages)
- USB and WiFi device connection
- Display settings (resolution, bitrate, frame rate)
- Recording functionality with time limit
- Camera mirroring support
- Window options (borderless, screensaver disable)
- Encoding settings
- Server configuration
- Modern dark theme UI
- Real-time device monitoring
- Custom window controls
- Improved device detection
- Optimized recording performance
- Various bug fixes
- English (en-US)
- Simplified Chinese (zh-CN)
- Japanese (ja-JP)
- Korean (ko-KR)
- Spanish (es-ES)
- French (fr-FR)
- Turkish (tr-TR)