Skip to content
CAI
Software that uses CAICheck a score

viarotel-org/escrcpy

47.2

Weak · 2 October 2026

28.1k

lines of production code

JavaScript

with TypeScript

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Escrcpy is an Electron-based desktop application that provides Android device mirroring, control, and file management. It enables users to view and interact with connected devices through features like screen mirroring, remote terminal access, and a file explorer with drag-and-drop support. The system manages device connections via ADB, supporting wireless pairing, secondary user profiles, and customizable control interfaces for input and display settings.

Features

Add auto-launch configuration support for desktop app

The application now supports automatically launching at system startup. On Linux, it uses the auto-launch library to enable or disable the 'Escrcpy' service based on user settings. On other platforms, it configures the Electron app to open at login as a hidden, minimized window. This functionality is exposed via a 'common.autoLaunch' setting in the application store.

desktop/electron/services/launch · high confidence

Add system tray support with minimize-to-tray behavior

The application now supports a system tray icon. When the user closes the main window, the app minimizes to the tray by default instead of quitting, allowing users to restore the window by clicking the tray icon or selecting 'Open' from the context menu. The tray menu also provides options to restart or quit the application. This behavior respects the user's previous preference for how the app should close (quit vs. minimize).

desktop/electron/services/tray · high confidence

Add terminal session management and window integration

This change introduces the core backend infrastructure for the new terminal feature. The service module registers IPC handlers to create, write to, resize, and destroy terminal sessions, while the window module sets up the terminal UI page and ensures that sessions are properly cleaned up when the window is closed.

desktop/electron/modules/terminal · high confidence

Added macOS build entitlements and expanded automation script localization

The macOS build now includes an entitlements file granting Just-In-Time (JIT) compilation, unsigned executable memory, and dyld environment variable access, which may be required for the automation script engine and image-matching features to function correctly on modern macOS versions. Additionally, the application's localization resources have been expanded with comprehensive translations for the new automation script editor, covering Arabic, English, Japanese, Russian, Simplified Chinese, and Traditional Chinese, including support for batch execution, variable injection, and image-matching step configurations.

desktop/electron/resources · high confidence

Automated synchronization of locale files with consistent formatting

A new \scripts/lang-sync.js\ utility has been added to automatically synchronize translation files located in \desktop/electron/resources/extra/common/locales/\*.json\. The script uses \i18next-json-sync\ to keep translations in sync, treating \zh-CN\ as the primary language source. It is configured to exclude \node\_modules\, enforce LF line endings, use 2-space indentation, and ensure a final newline in the output files, helping maintain consistent formatting across locale resources.

scripts · high confidence

Expose platform detection capabilities to the application window and global context

A new platform plugin has been introduced that registers a $platform object on both the window and Vue app global properties. This object exposes an isPlatform utility function, allowing application code to programmatically detect the current platform environment directly from the global scope or component context.

desktop/src/plugins/platform · high confidence

Introduce @escrcpy/electron-ipcx for function-aware IPC communication

The new \@escrcpy/electron-ipcx\ package provides a function-friendly IPC layer for Electron that allows callbacks to cross the renderer-main boundary via proxy channels. It offers \ipcxRenderer.invoke\ and \ipcxRenderer.invokeRetained\ to automatically serialize function arguments into descriptors, while \ipcxMain.handle\ reconstructs these as callable proxies on the main process side. This simplifies cross-process communication by enabling natural callback patterns (such as streaming data or progress updates) without manual channel management, with automatic listener disposal in default mode or manual control via \invokeRetained\.

packages/electron-ipcx · high confidence

Introduce @escrcpy/electron-setup modular framework and @escrcpy/unocss-preset-shades theme preset

This release introduces two new packages. The \@escrcpy/electron-setup\ package provides a modular runtime framework for Electron applications, featuring a plugin system with priority-based loading, contextual dependency injection, and a window manager that supports persistent window bounds and lifecycle hooks. It also includes built-in plugins for clipboard management (with cross-platform file and text support), sandbox configuration, theming, and window IPC. Additionally, the \@escrcpy/unocss-preset-shades\ package is added, which automatically generates a full range of color shades from a base color, injecting CSS variables and UnoCSS theme configurations to support dynamic runtime theming.

packages/electron-setup · high confidence

Introduce @escrcpy/shared package with platform-neutral utilities

A new shared library package has been added to provide platform-neutral utilities for the desktop and workspace components. This includes helpers for parsing ADB device identifiers and battery status dumps, mathematical precision functions, network IP validation, and object cloning. Crucially, it introduces a security module that validates shell commands against dangerous patterns (such as reboot or su) and enforces path restrictions to safe device directories like /sdcard/ and /storage/, while also providing shell escape utilities.

packages/shared · high confidence

Introduce Escrcpy Explorer file manager with drag-and-drop upload

A new file management interface is now available in the desktop application, allowing users to browse, select, and manage files on connected devices. The explorer supports drag-and-drop file uploads alongside traditional upload methods via a dropdown menu, and includes standard file operations such as copy, cut, paste, download, and delete. Navigation is handled through a breadcrumb trail and back/forward controls, with a dedicated header bar for the new page.

desktop/pages/explorer · high confidence

Introduce centralized theme color configuration

A new configuration file at desktop/src/configs/index.js has been added to centralize theme settings. It exports a primary color value (\#0F8C79) and generates a corresponding set of color shades using the @escrcpy/unocss-preset-shades library, enabling consistent theming across the desktop application.

desktop/src/configs · high confidence

Introduce dedicated Control page for device management

A new Control page has been added to the desktop application, providing a dedicated interface for managing connected devices. This page features a control bar with a device switcher, allowing users to toggle between multiple devices via a system menu, and includes a close button to dismiss the window. The layout is styled with a transparent background and specific height configurations to integrate seamlessly with the desktop environment.

desktop/pages/control · high confidence

Introduce structured terminal provider architecture with local and device support

The terminal module now uses a provider-based architecture to manage shell sessions, introducing a \BaseTerminalProvider\ abstract class and a \ProviderRegistry\ for extensibility. Two concrete providers are added: \LocalTerminalProvider\, which spawns local shells (prioritizing PowerShell on Windows) using \node-pty\ with optimized resize handling and standardized environment variables, and \DeviceTerminalProvider\, which manages ADB shell sessions for connected devices. This change replaces the previous ad-hoc shell spawning logic with a unified, maintainable interface for terminal interactions.

desktop/electron/modules/terminal/helpers/providers · high confidence

Introduces centralized terminal session management

The application now uses a new \TerminalSessionManager\ to handle the lifecycle of terminal sessions. This manager tracks active sessions, prevents duplicate creation via locking, and provides methods to write data, resize terminals, and destroy sessions (individually, by type, or all at once). It acts as a central registry for terminal providers, ensuring consistent session handling across the desktop environment.

desktop/electron/modules/terminal/helpers · high confidence

Introduction of screenshot capture UI and Vue-based routing infrastructure

The application now includes a new Screenshot component in the control bar that allows users to capture the screen via a provided trigger, supporting device context and floating mode options. Additionally, the app integrates the vue-screen plugin for Tailwind CSS integration and establishes a Vue Router setup using hash-based history, which redirects the root path to the device view and supports hot module updates for route changes during development.

desktop/src/components/control-bar/screenshot, desktop/src/plugins/vue-screen, desktop/src/router · high confidence

Introduction of the Quick Bar component with dynamic action items

A new Quick Bar component has been added to the desktop interface, providing a horizontal row of action buttons for device arrangement, terminal access, log viewing, application restart, and search. The bar dynamically renders these items using font icons and supports a conditional 'Update' button that appears when a new version is available. Additionally, the component automatically checks for application updates on mount if the user has auto-check enabled in their preferences.

desktop/src/components/quick-bar · high confidence

New Element Plus UI component utilities

This update introduces a set of new UI components within the Element Plus plugin system to enhance form layout, tag display, and user feedback. Users will now have access to ExFormRow and ExFormItemCol for more flexible form structuring, ExTagCollapse and ExTagDict for improved tag management and dictionary-based labeling, and ExTooltipButton for buttons with integrated tooltips. Additionally, ExIconLoading and ExMessageLoading provide standardized loading indicators and message-style loading dialogs, streamlining the development of consistent interface elements.

desktop/src/plugins/element-plus/expands · high confidence

New File Icon and Drag-and-Drop UI plugins

This change introduces two new UI plugins to the desktop application. The File Icon plugin provides a \FileIcon\ component and utility functions to render context-aware icons and colors for various file types (such as images, documents, and code) using the Material Design Icons set. The Vue Swapy plugin wraps the \swapy\ library to enable drag-and-drop reordering capabilities, exposing \Swapy\ and \SwapyItem\ components that support configuration, event handling, and dynamic enable/disable states.

desktop/src/plugins/file-icon · high confidence

New IPC service handlers for file operations, window management, and global shortcuts

The application introduces new service modules in the Electron main process to centralize and standardize IPC communication. The handles service adds handlers for file dialogs (open/save with specific preset behaviors like replacing files), system path operations (opening paths, showing items in folder, retrieving temp directories), and window management (navigating routes, showing/hiding the main window, opening logs). Additionally, a new shortcuts service enables registration, unregistration, and querying of global keyboard shortcuts, including a dedicated recording mode that temporarily disables shortcuts to capture input.

desktop/electron/services/handles · high confidence

New Quick Bar Search Component with Keyboard Shortcuts

A new search component has been added to the quick bar that opens a search modal via the preload API when triggered by the Ctrl+F or Meta+F keyboard shortcuts. The component also automatically closes the search modal if the application theme changes, ensuring the UI remains consistent.

desktop/src/components/quick-bar/components/search · high confidence

New Quick Bar components for opening logs and restarting the app

The Quick Bar now includes two new interactive components: one that allows users to open the application log directory and another that triggers a full application restart. These are implemented as new Vue components (\log/index.vue\ and \restart/index.vue\) that expose a \trigger\ slot, enabling them to be integrated into the Quick Bar UI. The log component invokes the \open-log-path\ IPC channel, while the restart component sends the \restart-app\ message via the preload namespace.

desktop/src/components/quick-bar/components/log, desktop/src/components/quick-bar/components/restart · high confidence

New control bar component with customizable button layout

A new control bar component has been introduced in the desktop application, providing a horizontal bar for device control actions. It features a scrollable list of buttons that can be reordered by the user via drag-and-drop (Swapy), with navigation arrows for scrolling. The bar supports various control types including navigation keys (home, back, switch), screen rotation, screenshot, volume, terminal access, and app launching. Button appearance and behavior are configurable, supporting both SVG and font icons, and the component respects a global height configuration while adapting to floating or fixed states.

desktop/src/components/control-bar · high confidence

New control-bar components for Gnirehtet and Screen Rotation

Added new Vue components to the control bar for managing device tethering and display orientation. The Gnirehtet component provides a dropdown menu to start or stop the reverse-tethering service, including loading states and success/error notifications. The Rotation component allows users to switch the device screen between vertical, horizontal, auto, and disabled modes by executing ADB shell commands, with appropriate UI disabling for unauthorized or offline devices.

desktop/src/components/control-bar/gnirehtet · high confidence

New custom window control bar added to desktop app

A new Vue component has been introduced at desktop/src/components/app-controls that renders a fixed, top-right bar containing minimize, maximize/restore, and close buttons. This component replaces the previous default window chrome with a custom UI, allowing the application to manage window state via IPC calls while providing a consistent visual style across the desktop interface.

desktop/src/components/app-controls · high confidence

New desktop hooks for app updates, device control, and ADB file management

The desktop application now includes a comprehensive set of new Vue composables in the \desktop/src/hooks\ directory. Users can now check for and install application updates via a new dialog interface (\use-app-update\). Device interaction is enhanced with hooks for camera mirroring (\use-camera-action\), volume and rotation control (\use-device-volume\, \use-device-rotation\), and shortcut-based command execution (\use-control-action\). Additionally, a full-featured ADB file manager is introduced (\use-explorer\), allowing users to browse, upload, download, and manage files on connected devices, complete with clipboard support, file previewing, and sorting capabilities. Supporting utilities include auto-scrolling for streaming content (\use-auto-scroll\), configuration import/export (\use-config-file\), and a generic dialog manager (\use-dialog\).

desktop/src/hooks, packages/adbx · high confidence

New device helper utilities for managing connected devices

A new helper module has been introduced at desktop/src/store/device/helpers/index.js to manage device state and retrieval. This module provides functions to fetch currently connected devices via ADB, retrieve historical device data from the preload store, and merge these lists with current devices taking precedence. It also includes utilities for sorting devices by status, extracting device names, and saving cleaned device information back to the store, effectively centralizing the logic for device list management and persistence.

desktop/src/store/device/helpers · high confidence

New device status labels and text file extension list added to dictionary system

The application now includes a new dictionary structure for device statuses, defining labels and UI tag types (success, danger, info, warning) for states such as connected, unauthorized, offline, and authorizing. Additionally, a comprehensive list of supported text file extensions (e.g., .txt, .md, .json, .py, .java) has been added to the main dictionary index, and a helper utility is provided to resolve dictionary labels by value.

desktop/src/dicts · high confidence

New file explorer component for device management

A new Vue component has been added to the control bar to provide a file explorer interface for connected devices. When triggered, this component opens a new window displaying the 'pages/explorer' view, passing the specific device object and its instance ID to allow users to browse and manage files on that remote device.

desktop/src/components/control-bar/explorer · high confidence

New file management components for the desktop explorer

The file explorer now includes dedicated UI components for creating new items (add), editing file names and text content (edit), moving or copying files to a target directory (move), accessing favorites and recent files (quick), and uploading files via drag-and-drop (upload). These components provide the user interface for these specific file operations within the explorer.

desktop/pages/explorer/components · high confidence

New lifecycle helper utilities for argument parsing, window restoration, and single-instance management

This change introduces a new set of helper modules in the lifecycle service to standardize core application behaviors. It adds argument parsing logic that converts command-line inputs into prefixed environment variables, a window restoration utility that ensures the main window is visible and focused while emitting a tray destroy event, and a robust single-instance manager that handles locking, second-instance callbacks, and sandbox mode bypasses.

desktop/electron/services/lifecycle/helpers · high confidence

New preference form input components

The preference form now uses a new set of reusable UI components for user inputs, including color pickers, text and number inputs, path selectors with file dialogs, various dropdowns (for displays, audio/video codecs, camera FPS, keyboard injection), a camera zoom slider, and switches. These components are registered in a central index and handle device-specific data fetching (e.g., codec options, camera lists) and preference data binding.

desktop/src/components/preference-form/components · high confidence

New shared utility helpers for window loading and theme management

A new helper module at desktop/electron/helpers/index.js introduces shared utilities for the desktop application. It adds a safe deep-clone function to prevent stack overflows from circular references, a proxy creator for forwarding methods, and window management helpers including isWindowDestroyed and loadPage (which now supports a rendererDir option for loading local files). It also provides getAppBackgroundColor to return theme-aware colors based on the native system theme, streamToBase64 for converting streams, and environment checks for portable and packaged modes.

desktop/electron/helpers · high confidence

New structured preference models for scrcpy settings

The application now uses a new set of structured preference models in desktop/src/models/preference to define and organize user settings for the scrcpy tool. This change introduces dedicated configuration modules for audio, camera, common, device, input, launch, record, video, and window settings, allowing users to customize options such as audio sources, camera facing, input methods (mouse, keyboard, gamepad), display resolutions, recording formats, and window behaviors through a more granular and organized interface.

desktop/src/models · high confidence

New theme and window IPC plugins for electron-setup

The electron-setup package now includes two new plugins: a theme plugin that manages system light/dark mode via IPC and optional persistence, and a window IPC plugin that exposes handlers for window management (minimize, maximize, close, open, and state tracking) from the renderer process.

packages/electron-setup/plugins/theme, packages/electron-setup/plugins/window-ipc · high confidence

New utility modules for device management, configuration, and UI interactions

The application introduces a suite of new utility modules in the desktop source code to enhance device handling and user interface capabilities. A new device migrator automatically transfers scrcpy configuration settings when device IDs change, ensuring user preferences persist across hardware reconnections. Device selection logic has been refined to intelligently deduplicate and prioritize USB devices over emulators with identical serial numbers. Users can now generate styled QR codes for wireless ADB pairing, and file transfers to devices include improved error reporting and loading feedback. Additionally, new helpers for command-line string formatting, portable configuration file generation, and dynamic functional component mounting provide a more robust and flexible desktop experience.

desktop/src/utils · high confidence

New visual cron expression selector component

A new \cron-selector\ component has been added to the desktop application, providing a graphical interface for configuring scheduled tasks. Users can now select from preset frequencies (hourly, daily, weekly, monthly) or define custom cron expressions using visual controls for minutes, hours, and other fields, replacing or supplementing manual text entry.

desktop/src/components/cron-selector · high confidence

New volume control component for device selection

A new volume control component has been added to the control bar, providing a dropdown menu for selecting audio output devices. This component integrates with the existing device volume logic to display available options and handle user selection, supporting both standard and floating UI modes.

desktop/src/components/control-bar/volume · high confidence

New widget arrangement dialog for manual window positioning

A new 'Arrange' dialog has been added to the desktop interface, allowing users to manually position and resize application widgets on a canvas. This feature introduces a full-screen layout editor where widgets can be dragged and resized using the VueDraggableResizable library. Users can add widgets from available devices or global settings, utilize an auto-arrange grid system, and save their custom layouts. The dialog also includes a detailed popover for each widget, enabling precise manual entry of X, Y, width, and height coordinates, along with options to reset or clear the entire layout.

desktop/src/components/arrange-dialog · high confidence

Quick-bar terminal launcher opens a new local terminal window

The quick-bar now includes a terminal component that, when triggered, opens a new local terminal window via the preload API. This new window is configured with the title 'device.terminal.name', a type of 'local', and a unique instance ID generated using nanoid, providing a distinct entry point for users to access the terminal functionality from the quick-bar interface.

desktop/src/components/quick-bar/components/terminal · high confidence

Redesigned device management and wireless connection interface

The device view has been rebuilt with a new component architecture, introducing a device popover that displays live screencaps and battery status, and a wireless group component that supports address auto-completion, QR code pairing, and network discovery. Device actions are now organized into a batch-actions toolbar and a more-dropdown menu, enabling batch operations like mirroring, file pushing, and app installation, as well as individual actions like custom scrcpy configuration and OTG mode. The preferences view now includes a scope selector to apply settings globally or per-device, along with import, export, and reset capabilities. Additionally, the about page features a new sponsor dialog for donations, and device removal now includes a configuration migration dialog to transfer settings to other devices.

desktop/src/views · high confidence

The app selector component now supports launching apps from secondary Android user profiles when the \withSecondary\ prop is enabled. It fetches and displays apps installed for other users via ADB, grouping them under their respective user labels. Additionally, the component now includes a search bar that filters the app list using pinyin matching for improved usability.

desktop/src/components/app-selector · high confidence

Support for secondary-user app launching and per-app landscape startup

The control-bar launch component now allows users to launch applications for secondary users and configure landscape orientation on a per-app basis. A new toggle switch in the app actions menu enables landscape mode for individual apps, and the app selector includes support for secondary user contexts. Additionally, users can create desktop shortcuts that preserve these specific launch settings, including the landscape flag and user ID.

desktop/src/components/control-bar/launch · high confidence

Architecture

Rebuilt Electron main process with modular plugin architecture

The desktop application's main process has been restructured to use a new \@escrcpy/electron-setup\ framework, replacing the previous initialization logic. This change introduces a modular architecture where core functionalities—such as theming, window IPC, clipboard handling, tray management, and auto-launch—are now registered as explicit plugins and services within the main app lifecycle. Users benefit from a more organized and maintainable codebase, which supports features like immersive title bars and optimized window layouts, while the preload script now utilizes a middleware pattern for renderer communication.

desktop/electron · high confidence

Behavioural changes

Arrangement dialog logic refactored into composable hooks

The Arrange dialog's internal logic has been restructured into a set of dedicated Vue composables (hooks) to improve maintainability and separation of concerns. This change introduces specific hooks for managing the layout lifecycle (\useLayoutManagement\), handling device data (\useDeviceManagement\), and orchestrating the dialog's open/close sequence (\useDialogManagement\). It also extracts the auto-arrange grid algorithm into \useAutoArrange\, widget event handling (drag/resize) into \useWidgetEvents\, and widget state management (add/remove/clear) into \useWidgetManagement\. Additionally, \useSaveLayout\ now explicitly handles persisting widget configurations to the preload store and cleaning up removed widgets, ensuring that layout changes are correctly saved and restored.

desktop/src/components/arrange-dialog/hooks · high confidence

Bootstrap initializes app with global properties from window.$preload namespace

The desktop application bootstrap process now registers several global properties on the Vue app instance, including $path, $electronStore, $electron, $adb, $scrcpy, $gnirehtet, and $desktop. These properties are sourced from the window.$preload object, indicating a shift in how preloaded data and Electron APIs are exposed to the frontend. Additionally, the bootstrap logic now adds a platform-specific class (macos, windows, or linux) to the root HTML element based on the detected operating system, enabling platform-specific styling or behavior.

desktop/src/bootstrap · high confidence

Centralized Element Plus integration with custom UI styling and dark mode support

The desktop application now uses a dedicated plugin at desktop/src/plugins/element-plus to manage Element Plus. This change introduces a unified installation routine that registers all Element Plus icons, core UI components (Message, MessageBox, Loading), and several custom extension components (ExFormRow, ExFormItemCol, ExTooltipButton, ExTagDict, ExTagCollapse). It also bundles specific locale files for Arabic, English, Japanese, Russian, and Chinese variants. To align the UI with the application's design system, a new restyle.css file overrides default Element Plus styles, implementing custom primary color variables, refined dialog layouts (including headless and beautified variants), styled tables, cards, and switches, while ensuring proper support for dark mode and custom title bars.

desktop/src/plugins/element-plus · high confidence

Centralized IPC listeners for app restart and window control

A new service module has been introduced to centralize the handling of specific IPC events. This change consolidates the logic for restarting the application (via the 'restart-app' event) and controlling the active window's visibility (via 'close-active-window' and 'hide-active-window' events) into a single, standardized service structure.

desktop/electron/services/listeners · high confidence

Centralized configuration for application resources and external tool paths

The application now uses a centralized configuration module to manage resource paths and external tool locations. This change introduces specific paths for platform-specific tray icons, application logos, and essential Android development tools (scrcpy, adb, gnirehtet). For these tools, the system prioritizes user-configured directories over built-in platform defaults, falling back to the system PATH if necessary, ensuring that custom tool installations are respected while maintaining default functionality.

desktop/electron/configs · high confidence

Centralized i18n initialization with dynamic language switching

The i18n helper module has been refactored to centralize internationalization setup using i18next with the fs backend. It now automatically detects the user's preferred language by checking the application store first, falling back to the OS locale, and finally to English. The module exposes a translation function and utilities to change the language, listen for language changes, and retrieve the current language, enabling dynamic language switching within the desktop application.

desktop/electron/helpers/i18n · high confidence

Customized right-click context menu behavior in the desktop app

The desktop application now applies a specific configuration to the browser's right-click context menu. Image copying and the 'Select All' text option are hidden, while saving images remains enabled. The 'Inspect Element' developer tool is only accessible when the application is running in development mode, ensuring a cleaner interface for end-users in production builds.

desktop/electron/services/context-menu · high confidence

Desktop application scaffolding and configuration for Escrcpy v3.2.0

The desktop entry point has been restructured with a new base configuration for version 3.2.0, introducing a Vite-based build system with Electron integration. This update adds environment variables for the Gitee API, configures auto-imports for Vue and Element Plus components, and establishes a new routing structure with typed definitions for the About, Device, and Preference views. The build process now supports multiple entry points for Control, Explorer, and Terminal pages, while the UI layer is standardized using UnoCSS and Element Plus components, including new features like a grid picker for device arrangement and a scrollable container component.

desktop · high confidence

Desktop build system restructured and new UI components added

The desktop build configuration has been reorganized into platform-specific modules (Linux, macOS, Windows) with new scripts to handle Electron download mirrors and Linux after-install logic, ensuring proper native module packaging and SUID sandbox fixes. Additionally, a new contenteditable component has been introduced to support inline text editing with various configuration options, and a quick-bar update component has been added to display download progress for application updates.

desktop/build, desktop/src/components/contenteditable, desktop/src/components/quick-bar/components/update · high confidence

Edger service now initializes only when edge hiding is enabled

The Edger service has been refactored into a modular service that checks the 'common.edgeHidden' setting before initializing. Previously, the Edger might have been instantiated regardless of user preference; now, it explicitly returns early if edge hiding is disabled, ensuring the window management logic (snapping, auto-hide animations) only runs when the user has actually enabled the feature.

desktop/electron/services/edger · high confidence

Escrcpy v3.2.0 release with embedded mirroring improvements and license change

This entry covers the v3.2.0 release of Escrcpy, an Electron-based Android mirroring and control application. The release introduces top switching and full-screen display capabilities for embedded mirrors, alongside a comprehensive refactor of the wscrcpy architecture to improve manipulation performance and reduce lag. Several bug fixes address window behavior regressions on Windows and macOS, audio forwarding issues on Windows, and key/mouse mapping conflicts. The project also migrates its license from MIT to Apache 2.0 and updates its release configuration to manage the monorepo structure.

(repo-wide) · high confidence

Explorer module restructured into modular components

The explorer module has been refactored to use a modular architecture, splitting functionality into separate window and service components. The window component now utilizes the shared \createWindowManager\ from the \@escrcpy/electron-setup\ package to handle window creation for the 'pages/explorer' route, while the service component provides a placeholder for future service logic. This change standardizes how the explorer integrates with the main application via the module system.

desktop/electron/modules/explorer · high confidence

Introduces a new store helper with proxy-based access and array-path support

The application now uses a new store implementation in \desktop/electron/helpers/store\ that wraps \electron-store\ with a proxy. This change adds support for accessing nested values using array paths (e.g., \store.get(\['a', 'b'\])\) and provides new utility methods like \getPath\, \getAll\, and \setAll\ for direct store manipulation, while maintaining standard key-based access.

desktop/electron/helpers/store · high confidence

Introduces event listener limits to prevent memory leaks in development

The application now automatically installs an event listener limiter on the global EventEmitter when running in development mode. This change patches standard Node.js EventEmitter methods to warn developers if the number of listeners for a specific event exceeds a default threshold of 10, helping to identify potential memory leaks early in the development cycle without affecting production behavior.

desktop/electron/helpers/emitter · high confidence

Introduction of a new AppHeader component with platform-specific window controls

A new AppHeader component has been added to the desktop application, replacing the previous window controls implementation. This component provides a unified header area that displays the application title and an optional device name tag, while conditionally rendering platform-specific window controls (minimize, maximize, close) on Windows and Linux systems. The layout adjusts padding based on the operating system to ensure proper alignment with native window decorations on macOS.

desktop/src/components/app-header · high confidence

Main window initialization now uses the new electron-setup plugin system

The main application entry point has been refactored to initialize the primary browser window through the new 'electron-setup' module. Instead of direct instantiation, the app now registers a plugin that calls \createWindowManager\ with specific configuration for the main window, including enabling singleton behavior, marking it as the main window, and enabling persistence for window bounds.

desktop/electron/modules/main · high confidence

Manual update control via IPC service

The desktop application now exposes a dedicated updater service that manages software updates through inter-process communication (IPC). This service disables automatic downloads by default, requiring users to explicitly trigger update checks, downloads, and installations via renderer commands. It provides real-time feedback on the update lifecycle—including checking, availability, download progress, and completion—by sending events to the main window, while also handling network errors gracefully to prevent unhandled rejections.

desktop/electron/services/updater · high confidence

New IPC main-process handler with function proxy support

The main-process entry point for the electron-ipcx package has been replaced with a new IpcxMain class that wraps Electron's IPC mechanisms. This implementation adds support for reconstructing function proxies within IPC payloads, allowing callbacks to be passed from renderer to main process. It also includes safe error handling, payload normalization, and debug logging for IPC events.

packages/electron-ipcx/main · high confidence

New centralized theme store with system-aware dark mode

A new Pinia-based theme store has been introduced to manage application appearance, replacing previous ad-hoc handling. The store initializes the theme (defaulting to 'system') and dark mode state by reading from the preload store, then synchronizes the HTML element's CSS classes (e.g., adding/removing 'dark' and background colors) accordingly. It also sets up watchers to automatically update the UI when the 'common.theme' or 'common.isDark' settings change externally, ensuring the visual theme stays consistent with user preferences.

desktop/src/store/theme · high confidence

New default layout with segmented navigation and app header

The desktop application now uses a new default layout structure. The main layout component dynamically selects the active layout based on route metadata, defaulting to the 'default' layout. This default layout features an AppHeader containing a segmented control for switching between Device, Preference, and About sections, alongside a QuickBar. The main content area displays the routed component within a keep-alive wrapper, and an AppUpdateDialog is included at the bottom.

desktop/src/layouts · high confidence

New desktop CSS architecture with Tailwind-based styling

The desktop application now uses a new CSS structure under \desktop/src/styles/css\ that leverages Tailwind CSS utilities (\@apply\) for styling. This includes a new \compatible.css\ for consistent border colors across light and dark modes, \desktop.css\ which sets the base font size to 14px, defines drag/no-drag regions for the window frame, and customizes scrollbar appearance (width, track, thumb colors) for both light and dark themes. Helper classes like \.borderless\ are also introduced, and platform-specific hooks (\.macos-platform\, \.windows-platform\, \.linux-platform\) are added to \platform.css\ for potential future platform-specific adjustments.

desktop/src/styles · high confidence

New preference form dialog with tabbed navigation and scroll synchronization

A new preference form dialog (dialog.vue) has been introduced, wrapping the preference form component (index.vue) in a fullscreen interface. The form now features a tabbed navigation bar at the bottom, allowing users to switch between preference categories. When a tab is selected, the view automatically scrolls to the corresponding section, utilizing an intersection observer to track scroll position and synchronize the active tab state as the user navigates through the form content.

desktop/src/components/preference-form · high confidence

New shared IPCX utilities for serialization, validation, and channel management

The \packages/electron-ipcx/shared\ directory now includes a comprehensive set of core utilities that underpin the library's communication layer. This adds a \ChannelPool\ and \HybridChannelProvider\ to optimize channel generation for high-frequency calls, a robust \serializeArgs\ function that extracts functions into descriptors to handle IPC transport, and strict \InvokeEnvelope\ validation logic. It also introduces a configurable \DebugLogger\ for environment-controlled logging, a \clonePayload\ utility for deep cloning, and a unified \IpcxError\ system with specific error codes for serialization and payload issues.

packages/electron-ipcx/shared · high confidence

New unified shell execution helper with improved process management

The desktop shell helper has been refactored to use a new \sheller\ function that centralizes command execution, environment setup, and process termination. This change introduces \shell-quote\ for robust argument parsing (fixing space-handling issues), integrates \@magda/tree-kill\ with explicit SIGTERM signals for reliable process killing (addressing Windows binary execution problems), and ensures PATH is correctly configured via \setupEnvPath\. The helper now provides a promise-like interface for streaming stdout/stderr and handling errors, replacing the previous fragmented approach.

desktop/electron/helpers/shell · high confidence

Preference store logic migrated to use window.$preload namespace

The preference and control stores have been refactored to read from and write to the \window.$preload\ namespace instead of the previous storage mechanism. This change updates how user settings are persisted and retrieved, ensuring that preference data (such as bar layout and application configuration) is correctly synchronized with the preload environment. Users will experience consistent behavior when saving or resetting preferences, as the store now properly seeds defaults and merges configurations using the new preload-backed storage.

desktop/src/store/preference · high confidence

Reconstructed control module with dedicated window and service handlers

The control module has been restructured into a modular architecture consisting of separate window and service components. The window handler now explicitly configures the control bar's dimensions using a centralized \controlBarHeight\ setting, enforces a fixed height, and manages window lifecycle events to send device change and focus/blur notifications via IPC. This change isolates the control window's behavior and state management from the broader application context, ensuring consistent sizing and event handling for the control interface.

desktop/electron/modules/control · high confidence

Redesigned application shell and device management

The desktop application now features a new main entry point (App.vue) that integrates Element Plus theming and handles core lifecycle events like app closure and route navigation. A new device store has been introduced to manage connected devices, including logic for merging current and historical device lists, persisting device remarks, and generating standardized labels for screenshots and other operations.

desktop/src · high confidence

Refactored app lifecycle management and window initialization

The desktop application's lifecycle service has been rewritten to use an explicit modular architecture (importing from @escrcpy/electron-setup) and now defers main window resolution until the app is ready. This change improves how the app handles single-instance locking, tray interactions when minimized, and the initialization of the remote module, ensuring a more stable startup sequence and cleaner cleanup on quit.

desktop/electron/services/lifecycle · high confidence

Replaced legacy ADB helpers with structured middleware classes and unified shell execution

The ADB middleware has been restructured to use dedicated helper classes for file operations and device discovery. The new \ADBDownloader\ and \ADBUploader\ classes now handle recursive directory transfers with throttled progress callbacks, cancellation support, and retry logic. Device scanning has been moved to a dedicated \DeviceScanner\ class that uses mDNS and port probing to discover ADB devices. File size and directory listing operations now use a more reliable \stat\ command via the new \getFileSize\ helper. All shell commands (ADB, scrcpy, gnirehtet) are now executed through a centralized \sheller\ helper that manages process lifecycles via a \ProcessManager\.

desktop/electron/middleware · high confidence

Restructure process initialization and environment setup

The application's main process initialization has been reorganized into dedicated modules (helper, index, manager, portable, resources) to improve modularity and reliability. Environment path configuration is now centralized, correctly handling portable mode on Windows and ensuring tool paths (ADB, scrcpy, gnirehtet) are resolved accurately for the current platform and architecture. Process termination logic has been standardized to use tree-kill with SIGTERM, and the system now clears legacy tool directories on version upgrades to prevent configuration conflicts.

desktop/electron/process · high confidence

Standardized service module exports

The desktop application now exposes a unified entry point for its core background services. Users benefit from a cleaner internal architecture where services such as context menu handling, tray management, lifecycle control, and updates are explicitly exported from a single index, ensuring consistent initialization and access patterns across the application.

desktop/electron/services · high confidence

Structured logging and debug console access in the desktop app

The desktop application now uses electron-log to manage logging, with log files explicitly saved to the system's standard logs directory (e.g., main.log). In production mode, users can enable verbose debugging via the 'common.debug' store setting, which exposes the full logging functions to the browser console for easier troubleshooting. Helper functions are also provided to retrieve and open the log file location directly from the application.

desktop/electron/helpers/debugger · high confidence

Terminal control bar now opens a dedicated device terminal page

The terminal component in the control bar has been refactored to act as a trigger that opens a new window or tab for the terminal interface. When activated, it passes the current device context (including device ID and type) to the 'pages/terminal' route, ensuring the terminal session is correctly scoped to the selected device rather than relying on inline or floating window logic previously implied by the component's props.

desktop/src/components/control-bar/terminal · high confidence

Terminal page now uses xterm.js with custom styling and theme support

The terminal interface has been rebuilt to use the xterm.js library, replacing the previous implementation. This change introduces a more controllable user experience with features like dynamic theme switching (light/dark modes using GitHub-style color palettes), custom scrollbar styling, and improved resize stability. The new terminal supports both local and device-based sessions, handles platform-specific line endings (e.g., Windows CRLF), and integrates with the application's header for device name and refresh controls.

desktop/pages/terminal · high confidence

Fixes

Fixes Unix permission issues for extra resources during pre-commit

The pre-commit hook now explicitly ensures that files in the desktop/electron/resources/extra directory retain executable permissions. This change addresses Unix permission issues where executable bits might be lost during the commit process, ensuring that scripts or binaries in this directory remain executable after being committed.

.husky · high confidence

Test coverage

Added tests for IPC invoke and retained channel behavior

Added test coverage for the electron-ipcx package's invoke and invokeRetained APIs, verifying that function arguments are proxied correctly, callbacks are executed, and resources are automatically or manually disposed as expected.

packages/electron-ipcx/test · high confidence

Dependencies

Initial dependency manifest for escrcpy v3.2.0 workspace

This change introduces the dependency manifests for the escrcpy v3.2.0 release, establishing a pnpm workspace structure. The root package.json configures the workspace with build tooling including Turbo, ESLint v10, and VitePress for documentation. The desktop application manifest defines the core Electron v42 stack, Vue 3 ecosystem, and UI libraries like Element Plus and UnoCSS, alongside specific dependencies for device management (adbkit), terminal emulation (@xterm/xterm), and localization (i18next). Internal workspace packages (@escrcpy/adbx, electron-ipcx, electron-setup, shared, and unocss-preset-shades) are also defined, introducing dependencies such as es-toolkit and nanoid to support the modular architecture.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 48 → 47 (-0.4)
  • Rubric changed (rubric-2026.09.12 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 45 → 45 (+0.0)
  • Architecture 98 → 96 (-2.1)
  • Maturity 69 → 70 (+0.1)
  • Readiness 45 → 46 (+1.1)
  • Security 54 → 53 (-1.0)
  • Accessibility 44 → 44 (+0.0)
  • Performance 60 (new)

Resolved (4)

  • Hotspot: desktop/src/hooks/use-explorer/index.js (desktop/src/hooks/use-explorer/index.js)
  • Hotspot: desktop/src/hooks/use-explorer/modules/use-downloader.js (desktop/src/hooks/use-explorer/modules/use-downloader.js)
  • Hotspot: desktop/vite.config.js (desktop/vite.config.js)
  • Hotspot: packages/adbx/src/index.ts (packages/adbx/src/index.ts)

New (7)

  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Off the main sequence: @escrcpy/electron-ipcx
  • Off the main sequence: @escrcpy/shared
  • Split desktop

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

viarotel-org/escrcpy was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 2 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 1e87397da0535b825d5e2e87a53e08fa3896f4a9 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.