From bef0b0be06e652a34cd1fbbd5e28117ce5bbf456 Mon Sep 17 00:00:00 2001
From: Mohammad Faiz
Date: Thu, 11 Jun 2026 19:35:29 +0530
Subject: [PATCH 1/5] fix: stale closure bug in connectDevice, race condition
on mount, remove dead code
- Add orce param to refreshDevices to bypass stale closure guard
in connectDevice where setIsRefreshing(false) + refreshDevices()
could be silently blocked due to React closure capturing old value
- Remove duplicate checkScrcpy/refreshDevices mount effects (one in
useScrcpy init, one in App.tsx) racing with different scrcpyPath
values; consolidate into single post-init effect
- Remove dead Rust commands: greet, get_mdns_devices, adb_shell
- Remove dead localStorage key scrcpy_record_path (never read)
- Sync flake.nix version to 4.0.1
---
flake.nix | 2 +-
src-tauri/src/commands.rs | 69 ------------------------------
src-tauri/src/lib.rs | 3 --
src/App.tsx | 6 ---
src/components/SessionBehavior.tsx | 3 --
src/hooks/useScrcpy.ts | 19 ++++----
6 files changed, 11 insertions(+), 91 deletions(-)
diff --git a/flake.nix b/flake.nix
index 2479cea..330b574 100644
--- a/flake.nix
+++ b/flake.nix
@@ -18,7 +18,7 @@
pkgs = nixpkgs.legacyPackages.${system};
pname = "scrcpy-gui";
- version = "4.0.0";
+ version = "4.0.1";
# Fetch the source code from GitHub
src = pkgs.fetchFromGitHub {
diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs
index 36fc42c..1edfe02 100644
--- a/src-tauri/src/commands.rs
+++ b/src-tauri/src/commands.rs
@@ -32,11 +32,6 @@ fn is_audio_codec_error(text: &str) -> bool {
mentions_codec && mentions_failure
}
-#[tauri::command]
-pub fn greet(name: &str) -> String {
- format!("Hello, {}! You've been greeted from Rust!", name)
-}
-
fn get_binary_path(binary_name: &str, custom_folder: Option) -> String {
let exe_ext = std::env::consts::EXE_EXTENSION;
let binary_filename = if exe_ext.is_empty() {
@@ -199,50 +194,6 @@ pub async fn get_devices(custom_path: Option) -> serde_json::Value {
}
}
-#[tauri::command]
-pub async fn get_mdns_devices(custom_path: Option) -> serde_json::Value {
- let adb_path = get_binary_path("adb", custom_path);
-
- let output = create_command(&adb_path)
- .arg("mdns")
- .arg("services")
- .output()
- .await;
-
- match output {
- Ok(o) => {
- if o.status.success() {
- let out_str = String::from_utf8_lossy(&o.stdout);
- let mut services = Vec::new();
- let mut seen = std::collections::HashSet::new();
- for line in out_str.lines().skip(1) {
- let parts: Vec<&str> = line.split('\t').collect();
- if parts.len() >= 3 {
- let name = parts[0].trim();
- let service = parts[1].trim();
- let address = parts[2].trim();
- let key = format!("{}|{}|{}", name, service, address);
- if !seen.contains(&key) {
- services.push(json!({
- "name": name,
- "service": service,
- "address": address
- }));
- seen.insert(key);
- }
- }
- }
- json!({ "error": false, "services": services })
- } else {
- json!({ "error": true, "message": "ADB mdns returned error" })
- }
- },
- Err(e) => {
- json!({ "error": true, "message": e.to_string() })
- }
- }
-}
-
#[tauri::command]
pub async fn adb_connect(window: Window, ip: String, custom_path: Option) -> Result {
let adb_path = get_binary_path("adb", custom_path);
@@ -303,26 +254,6 @@ pub async fn adb_pair(window: Window, ip: String, code: String, custom_path: Opt
Ok(json!({ "success": success, "message": if out_text.is_empty() { err_text } else { out_text } }))
}
-#[tauri::command]
-pub async fn adb_shell(device: String, command: String, custom_path: Option) -> serde_json::Value {
- let adb_path = get_binary_path("adb", custom_path);
-
- let output = create_command(&adb_path)
- .arg("-s")
- .arg(&device)
- .arg("shell")
- .arg(&command)
- .output()
- .await;
-
- match output {
- Ok(o) => {
- json!({ "success": o.status.success(), "output": String::from_utf8_lossy(&o.stdout).to_string() })
- },
- Err(e) => json!({ "success": false, "message": e.to_string() })
- }
-}
-
#[tauri::command]
pub async fn run_terminal_command(device: Option, cmd: String, custom_path: Option) -> serde_json::Value {
let mut parts = split_args(&cmd).unwrap_or_else(|_| cmd.split_whitespace().map(|s| s.to_string()).collect());
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
index 2ad505d..e851ed7 100644
--- a/src-tauri/src/lib.rs
+++ b/src-tauri/src/lib.rs
@@ -71,13 +71,10 @@ pub fn run() {
Ok(())
})
.invoke_handler(tauri::generate_handler![
- commands::greet,
commands::check_scrcpy,
commands::get_devices,
commands::adb_connect,
- commands::get_mdns_devices,
commands::adb_pair,
- commands::adb_shell,
commands::push_file,
commands::install_apk,
commands::kill_adb,
diff --git a/src/App.tsx b/src/App.tsx
index 4105b89..0ac35fb 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -120,12 +120,6 @@ function App() {
return () => clearTimeout(timer);
}, []);
- useEffect(() => {
- // Initial check (once on mount) - Silent to avoid log clatter
- checkScrcpy(config.scrcpyPath);
- refreshDevices(config.scrcpyPath, true);
- }, []);
-
useEffect(() => {
if (scrcpyStatus.found && (!hasCheckedUpdate || config.scrcpyPath !== lastCheckedPath) && !isDownloading) {
setHasCheckedUpdate(true);
diff --git a/src/components/SessionBehavior.tsx b/src/components/SessionBehavior.tsx
index f237263..ebdbc0a 100644
--- a/src/components/SessionBehavior.tsx
+++ b/src/components/SessionBehavior.tsx
@@ -19,9 +19,6 @@ export default function SessionBehavior({ config, setConfig }: SessionBehaviorPr
const handleChange = (field: keyof ScrcpyConfig, value: any) => {
const newConfig = { ...config, [field]: value };
setConfig(newConfig);
- if (field === 'recordPath') {
- localStorage.setItem('scrcpy_record_path', value);
- }
};
const handlePickFolder = async () => {
diff --git a/src/hooks/useScrcpy.ts b/src/hooks/useScrcpy.ts
index 8f84e4b..c3baf9f 100644
--- a/src/hooks/useScrcpy.ts
+++ b/src/hooks/useScrcpy.ts
@@ -73,7 +73,6 @@ export function useScrcpy() {
});
const [isRefreshing, setIsRefreshing] = useState(false);
const [isOnboardingOpen, setIsOnboardingOpen] = useState(false);
- // Removed mdnsDevices state
const [theme, setTheme] = useState("ultraviolet");
const [colorMode, setColorModeState] = useState<'light' | 'dark' | 'system'>(() => {
try {
@@ -126,10 +125,6 @@ export function useScrcpy() {
try {
const parsed = JSON.parse(savedConfig);
setConfig(prev => ({ ...prev, ...parsed }));
- // Initial check with saved path if it exists
- if (parsed.scrcpyPath) {
- checkScrcpy(parsed.scrcpyPath);
- }
} catch (e) {
console.error("Failed to parse saved config", e);
}
@@ -163,6 +158,13 @@ export function useScrcpy() {
initStart();
}, []);
+ // Initial check/refresh after config is loaded
+ useEffect(() => {
+ if (!isInitialized) return;
+ checkScrcpy(config.scrcpyPath);
+ refreshDevices(config.scrcpyPath, true);
+ }, [isInitialized]);
+
// Persist changes
useEffect(() => {
if (!isInitialized) return;
@@ -270,8 +272,8 @@ export function useScrcpy() {
localStorage.removeItem('scrcpy_history');
};
- const refreshDevices = async (customPath?: string, silent: boolean = false) => {
- if (isRefreshing) return;
+ const refreshDevices = async (customPath?: string, silent: boolean = false, force: boolean = false) => {
+ if (!force && isRefreshing) return;
setIsRefreshing(true);
try {
const res: any = await invoke('get_devices', { customPath: customPath || config.scrcpyPath });
@@ -429,8 +431,7 @@ export function useScrcpy() {
// Allow ADB to settle and state to update
await new Promise(r => setTimeout(r, 1000));
- setIsRefreshing(false); // Enable refreshDevices to run
- await refreshDevices(customPath || config.scrcpyPath, true);
+ await refreshDevices(customPath || config.scrcpyPath, true, true);
} else {
setLogs(prev => {
const msgs = [t('logs.connectionFailed', { message: String(res.message) })];
From 9a39c067a0906fa7f6edac728f9c9ee7213e3963 Mon Sep 17 00:00:00 2001
From: Mohammad Faiz
Date: Thu, 11 Jun 2026 19:36:12 +0530
Subject: [PATCH 2/5] docs: update GUIDE.md and README.md
---
GUIDE.md | 173 +++++++++++++++++++-----------------------------------
README.md | 113 ++++++++++++-----------------------
2 files changed, 99 insertions(+), 187 deletions(-)
diff --git a/GUIDE.md b/GUIDE.md
index 8a3cdd4..6119e58 100644
--- a/GUIDE.md
+++ b/GUIDE.md
@@ -1,144 +1,91 @@
-# 📖 ScrcpyGUI v4 - User Guide
-
-This guide provides everything you need to know to get started with ScrcpyGUI, from initial setup to advanced feature usage.
+# ScrcpyGUI - User Guide
---
-## 📋 Table of Contents
-1. [Prerequisites](#-prerequisites)
-2. [Installation Guide](#-installation-guide)
-3. [Android Device Setup](#-android-device-setup)
-4. [Connecting Your Device](#-connecting-your-device)
-5. [Feature Guide](#-feature-guide)
-6. [Troubleshooting](#-troubleshooting)
+## Prerequisites
+
+Android 5.0 or higher for screen mirroring. Android 11+ for wireless debugging and desktop mode. Android 12+ for camera mode. A data USB cable, not a charge-only one. The scrcpy binary, which the app can download for you on first launch.
---
-## 🛠 Prerequisites
+## Installation
-Before using ScrcpyGUI, ensure you have the following:
+### Windows
-- **Android Device**: Running Android 5.0 or higher (Android 12+ required for Camera Mode, Android 11+ for Desktop Mode).
-- **USB Cable**: A high-quality data cable (avoid charging-only cables).
-- **PC**: Windows, macOS, or Linux.
-- **Scrcpy Binaries**: The app can download these for you automatically, but you can also provide your own.
+Download the latest `.exe` or `.msi` from the [Releases](https://github.com/kil0bit-kb/scrcpy-gui/releases) page and run it. On first launch the app checks if scrcpy is present and offers a one-click download if it is not. It also checks your installed scrcpy version against the latest Genymobile release and prompts you to update if you are behind.
----
+### macOS
+
+Download the `.dmg` matching your chip (Intel or Apple Silicon). Drag ScrcpyGUI into Applications. Because the app is not notarized you will likely need to go to System Settings, Privacy and Security, and click Open Anyway the first time.
+
+### Linux
+
+Download the `.AppImage` or `.deb`. For the AppImage right-click it, go to Properties, Permissions, and allow it to run as a program. If you hit missing library errors:
-## 🚀 Installation Guide
-
-### 🪟 Windows
-1. Download the latest `.exe` or `.msi` from the [Releases](https://github.com/kil0bit-kb/scrcpy-gui/releases) page.
-2. Run the installer or standalone executable.
-3. **Smart Setup**: On the first launch, ScrcpyGUI will detect if you have `scrcpy` installed. If not, it will offer a one-click download.
-4. **Automated Updates**: When launched, ScrcpyGUI v4 will automatically check your installed version against Genymobile's latest official release and prompt you with a beautiful one-click update modal if a new version is available.
-
-### 🍎 macOS
-1. Download the `.dmg` file matching your architecture (**Intel** or **Apple Silicon/M1/M2**).
-2. Drag the **ScrcpyGUI** icon into your **Applications** folder.
-3. **Security Note**: Since the app is not signed by Apple, you may need to:
- - Go to **System Settings > Privacy & Security**.
- - Scroll down to "Security" and click **Open Anyway**.
-
-### 🐧 Linux
-1. Download the `.AppImage` or `.deb` package.
-2. **AppImage**: Right-click -> Properties -> Permissions -> **Allow executing file as program**. Double-click to run.
-3. **Dependencies**: Ensure you have the following installed if you encounter issues:
- ```bash
- sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev
- ```
+```bash
+sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev
+```
---
-## 📱 Android Device Setup
+## Android setup
-You must enable **Developer Options** and **USB Debugging** on your phone for ScrcpyGUI to communicate with it.
+### Enable Developer Options
-### 1. Enable Developer Options
-1. Open **Settings** on your Android device.
-2. Go to **About Phone** (usually at the bottom).
-3. Find the **Build Number** and tap it **7 times** rapidly.
-4. You will see a toast message: "You are now a developer!"
+Go to Settings, then About Phone, find Build Number and tap it seven times. You will get a toast saying you are now a developer.
-### 2. Enable USB Debugging
-1. Go back to the main **Settings** menu.
-2. Go to **System > Developer Options** (or search for it).
-3. Toggle ON **USB Debugging**.
-4. **Important for Mice/Keyboards**: If you see options like **Install via USB** or **USB Debugging (Security Settings)**, enable them too.
+### Enable USB Debugging
+
+Go to Settings, System, Developer Options. Toggle on USB Debugging. If you see Install via USB or USB Debugging (Security Settings), enable those too as they are needed for HID keyboard and mouse to work.
---
-## 🌐 Connecting Your Device
+## Connecting a device
+
+### USB
+
+Plug the phone in. A prompt will appear on the phone asking to allow USB debugging from your computer. Tick Always allow and tap Allow. The device should show up in the sidebar automatically. If it does not, hit Refresh.
-### USB Connection (Recommended)
-1. Plug your phone into your PC via USB.
-2. A prompt will appear on your phone: "Allow USB Debugging?".
-3. Check **Always allow from this computer** and tap **Allow**.
-4. In ScrcpyGUI, click the **Refresh** button in the header if the device doesn't appear automatically.
+### Wireless (Android 11+)
-### Wireless Connection (Android 11+)
-1. Ensure both your Phone and PC are on the **same Wi-Fi network**.
-2. In **Developer Options**, toggle ON **Wireless Debugging**.
-3. Tap on the **Wireless Debugging** text to enter its settings.
-4. In ScrcpyGUI, click the **🌐 Wireless Connect** button in the sidebar.
-5. Tap **Pair device with pairing code** on your phone.
-6. Enter the **IP Address**, **Port**, and **Pairing Code** shown on your phone into ScrcpyGUI.
-7. Once paired, ScrcpyGUI will remember your device for future one-click connections!
+Both the phone and PC need to be on the same Wi-Fi network. In Developer Options, enable Wireless Debugging, then tap into its settings. In ScrcpyGUI click the Wireless Connect button in the sidebar. On the phone tap Pair device with pairing code. Enter the IP, port, and pairing code shown on the phone into ScrcpyGUI. After pairing succeeds the device is saved so future connections are one click from the Recent Devices list.
---
-## 🎮 Feature Guide
-
-### ⌨️ HID Keyboard & Mouse (OTG Mode)
-ScrcpyGUI v4 features advanced hardware simulation (HID) for a lag-free experience.
-- **HID Keyboard**: Simulates a real USB keyboard. This is the **only way** to fix issues with Polish accents, special characters, and international layouts.
-- **HID Mouse**: Provides a high-precision, native cursor feel. Eliminates the "double cursor" or lag found in standard mirroring.
-- **Pure HID (No Mirror)**: Perfect for when you only want to use your PC as a "controller" for your phone (e.g., typing long messages or playing games while looking at the phone screen).
-
-### 📹 Pro Camera Mode (Webcam)
-Turn your phone into a professional, hardware-controlled webcam.
-1. Change **Capture Source** to **Camera**.
-2. **Scan Lenses**: Click the **Refresh Lenses** button. ScrcpyGUI will instantly scan your phone and populate a spacious dropdown with all physical camera lenses, native resolutions, and zoom capabilities.
-3. **Select Camera**: Select your desired lens (e.g., Ultra-Wide, Front, or Main Back) from the list.
-4. **Advanced Controls**:
- - **Camera Torch**: Toggle your device's physical flashlight on or off directly from the GUI.
- - **Camera Zoom**: Adjust the dynamic zoom level slider (1.0x to 5.0x) to frame your feed perfectly.
- - **Failsafe Resolution**: Standard high-megapixel phone lenses can crash scrcpy if launched at their native 4:3 photo resolution (e.g., `4080x3060`) due to hardware video encoder limits. ScrcpyGUI automatically maps your selected resolution and defaults to a safe 1080p standard size (`1920x1080`), ensuring a crash-free experience.
- - **FPS**: Set to **Auto** (recommended) to let your device run at its native capture frame rate, or select **30 FPS**.
-5. **OBS Integration**: Open **OBS Studio**, add a "Window Capture" source, and select the ScrcpyGUI window. Use OBS's **Virtual Camera** to use your phone in Zoom, Teams, or Discord.
-
-### 🖥️ Desktop Mode (Virtual Display)
-Turn your Android device into a secondary workspace or virtual monitor.
-1. Change **Capture Source** to **Desktop**.
-2. **Flex Display**: Toggle ON **Flex Display**. Dragging and resizing the scrcpy client window borders on your computer will dynamically scale the resolution and aspect ratio of your phone's virtual display on the fly to fit your window perfectly with no black bars.
-3. **Background Color**: Customize the window borders or letterbox border colors by typing in a hex value (e.g., `#2b2d42`) with a live preview swatch.
-4. **Keep Active**: Enable **Keep Active** to simulate activity and prevent the virtual display from turning off or sleeping during mirroring sessions.
-
-### 🖥 Graphics Renderer (Render API)
-You can choose which graphics renderer scrcpy should request for video display.
-
-- **Auto**: Recommended default. Lets scrcpy choose the best renderer.
-- **Manual Selection**: Options like Direct3D, OpenGL, OpenGL ES, Metal, or Software may appear.
-
-Renderer choices are **capability-aware**:
-
-- ScrcpyGUI reads what your installed scrcpy build advertises.
-- ScrcpyGUI filters options by your host OS.
-- Unsupported options are hidden automatically (e.g. Metal is only shown on macOS).
-
-### 📂 File Transfers & APKs
-- **Install Apps**: Just drag an `.apk` file from your PC and drop it anywhere into the ScrcpyGUI window.
-- **Transfer Files**: Drag any file into the window to automatically push it to your device's `/sdcard/Download/` folder.
+## Features
+
+### HID keyboard and mouse
+
+HID mode simulates real USB hardware rather than sending touch events over ADB. The keyboard option fixes international layouts and special characters that do not work in standard mirroring. The mouse option gives you a native cursor without the double-cursor issue. Pure HID mode hides the video stream entirely if you just want to use your PC as a keyboard and mouse while watching the phone directly.
+
+### Camera mode
+
+Switch Capture Source to Camera. Click Refresh Lenses to scan the device and populate the dropdown with all available physical lenses, their resolutions, and frame rate ranges. Select the lens you want. You can toggle the flashlight on or off and set zoom anywhere from 1x to 5x. Resolution is automatically limited to a safe 1080p size to prevent high-megapixel sensors from crashing the hardware encoder. For OBS, add a Window Capture source pointing at the scrcpy window and start OBS Virtual Camera to use the phone in Zoom, Teams, or Discord.
+
+### Desktop mode
+
+Switch Capture Source to Desktop. Flex Display makes the phone's virtual display follow the scrcpy window size as you drag and resize it, no black bars. Background Color lets you set a hex value for the window letterbox area. Keep Active simulates periodic input so the virtual display does not go to sleep mid-session.
+
+### Graphics renderer
+
+The renderer dropdown shows only what your installed scrcpy build and OS actually support. Auto is the right choice for most people. If you are having display issues on a specific machine you can try forcing Direct3D, OpenGL, OpenGL ES, or Software. Metal only appears on macOS.
+
+### File transfer
+
+Drag an APK onto the ScrcpyGUI window to install it. Drag any other file to push it to the device at `/sdcard/Download/`. You can also use the file browser button in the sidebar.
---
-## 🔧 Troubleshooting
+## Troubleshooting
+
+Device not showing up: try a different cable or USB port and confirm USB Debugging is still on.
+
+Laggy or blurry video: lower the bitrate slider (8 to 12 Mbps covers most cases) or drop the resolution.
+
+ADB stuck or commands failing: click Kill ADB in the sidebar. It restarts the ADB server without closing the app.
-- **Device not found?**: Try a different USB port or cable. Ensure "USB Debugging" is still active.
-- **Laggy video?**: Lower the **Bitrate** (8M-12M is usually perfect) or the **Resolution**.
-- **ADB Error?**: If commands are failing, click the **Kill ADB** button in the sidebar. This resets the connection bridge without closing the app.
-- **Binary Error?**: If the app says it cannot find scrcpy, use the **Downloader** in the top right corner.
+scrcpy binary not found: use the download button in the top right corner of the header to fetch the latest release automatically.
---
-*Found a bug or have a suggestion? Open an issue on [GitHub](https://github.com/kil0bit-kb/scrcpy-gui/issues)!*
+Found a bug or have a suggestion? Open an issue on [GitHub](https://github.com/kil0bit-kb/scrcpy-gui/issues).
diff --git a/README.md b/README.md
index 9888955..f130172 100644
--- a/README.md
+++ b/README.md
@@ -1,111 +1,76 @@
-
-
ScrcpyGUI v4
- A premium, high-performance Android control experience.
+ScrcpyGUI
+A desktop GUI for scrcpy built with Tauri v2, React 19, and Rust.
+
-
---
-ScrcpyGUI v4 is a modern, feature-rich GUI for [scrcpy](https://github.com/Genymobile/scrcpy), completely rebuilt from the ground up using **Tauri v2**, **React 19**, and **Rust**. It transforms your Android device into a professional tool for gaming, development, and content creation.
-
-## 🚀 Key Features
-
-- **✨ Best Looking GUI**: A stunning, modern interface with smooth animations and a premium look and feel.
-- **🎨 Custom Theme Engine**: 5 premium, hand-crafted themes including **Ultraviolet**, **Astro**, **Carbon**, **Emerald**, and **Bloodmoon** to match your workspace setup.
-- **🔄 Automated Binary Updates**: Deep-integrated system that automatically checks if your local `scrcpy` binary is outdated compared to Genymobile's latest official release, prompting you with a beautiful one-click update modal.
-- **🎮 Precision Input (OTG)**:
- - **HID Keyboard**: Native hardware simulation for international layouts and special characters.
- - **HID Mouse**: Zero-lag, high-precision cursor control for a "native desktop" feel.
-- **🖥️ Graphics Renderer Selection**:
- - Choose a renderer backend such as Direct3D, OpenGL, OpenGL ES, Metal, or Software (capability-aware, OS-filtered).
-- **🌐 Seamless Connectivity**:
- - **Wireless Pairing**: Native UI for Android 11+ wireless pairings.
- - **Connection History**: Remember and reconnect to wireless devices with one click.
-- **📹 Pro Camera Mode (Webcam)**:
- - **Refresh Lenses**: Click to automatically scan and list all physical camera sensors, resolutions, and zoom ranges.
- - **Torch & Zoom**: Toggle your device's flashlight or adjust zoom level (1.0x - 5.0x) natively.
- - **Failsafe Camera-Size**: Automatically maps resolutions and defaults to safe 1080p dimensions, preventing hardware encoder crashes on high-megapixel devices.
-- **🖥️ Desktop Mode (Virtual Display)**:
- - **Flex Display**: Drag and resize your virtual desktop window dynamically on the fly!
- - **Background Colors**: Customize scrcpy's border and letterbox color with hex values and a live color swatch.
- - **Keep Active**: Periodic user activity simulator preventing device sleep without changing global settings.
-- **📁 Fluid File Management**:
- - Drag & drop APK installation or file pushing directly to `/sdcard/Download/`.
-- **🖼️ Premium UX**:
- - **Splash Screen**: Zero-flicker, themed startup experience.
- - **Smart Folder Picker**: Automatically falls back to local `scrcpy-bin` or application executable directories when browsing folders.
+ScrcpyGUI wraps scrcpy in a proper interface so you are not stuck writing flags by hand every time. It handles the binary, remembers your settings, and surfaces all the options you actually care about without burying you in a wall of text.
----
+## What it does
-## 📖 Getting Started
+**Themes** - Ships with five built-in themes: Ultraviolet, Astro, Carbon, Emerald, and Bloodmoon. Light, dark, and system color modes are all supported.
-To learn how to enable **USB Debugging**, set up **Wireless Pairing**, or install requirements, please read our comprehensive guide:
+**Auto update checks** - On launch it compares your local scrcpy binary against the latest Genymobile release. If you are behind it shows a one-click download prompt.
-### 👉 **[View the Complete User Guide (GUIDE.md)](GUIDE.md)**
+**Three capture modes** - Screen mirror, camera (webcam), and desktop (virtual display). Each has its own set of controls in the panel.
----
+**HID input** - Proper hardware simulation for keyboard and mouse. Fixes international layout issues and removes the double-cursor problem you get with standard mirroring. There is also a pure HID mode if you want input only with no video stream.
+
+**Camera controls** - Scan all physical lenses on the device, toggle the torch, and adjust zoom from 1x to 5x. Resolution is automatically capped to a safe size so high-megapixel sensors do not crash the encoder.
+
+**Desktop mode** - Runs a virtual display on the phone. Flex Display lets you drag and resize the window and the phone resolution follows along. You can set a custom hex background color and enable Keep Active to stop the display from sleeping.
-## 🛠️ Development
+**Graphics renderer** - Pick Direct3D, OpenGL, OpenGL ES, Metal, or Software. The list is filtered to what your scrcpy build and OS actually support so you will not see options that do not work.
-### Prerequisites
-- [Node.js](https://nodejs.org/) (v18+)
-- [Rust](https://rust-lang.org/) & Cargo
-- [Tauri v2 Prerequisites](https://v2.tauri.app/start/prerequisites/)
+**Wireless pairing** - Built-in UI for Android 11 wireless debugging. Previously connected devices are saved so reconnecting is one click.
-### Build Instructions
-1. `npm install`
-2. `npm run tauri dev` (Development)
-3. `npm run tauri build` (Production)
+**File transfer** - Drag an APK onto the window to install it. Drag anything else to push it to the device Downloads folder.
-## ❄️ NixOS Installation (flakes)
+## Getting started
+
+Read [GUIDE.md](GUIDE.md) for setup steps including enabling USB debugging, wireless pairing, and first-launch walkthrough.
+
+## Development
+
+Requirements: Node.js 18+, Rust and Cargo, [Tauri v2 prerequisites](https://v2.tauri.app/start/prerequisites/).
+
+```bash
+npm install
+npm run tauri dev
+npm run tauri build
+```
-To install it permanently with a desktop launcher, add the flake to your system's `flake.nix`:
+## NixOS
```nix
inputs.scrcpy-gui.url = "github:kil0bit-kb/scrcpy-gui";
```
-Then add it to your system packages:
-
```nix
environment.systemPackages = [
inputs.scrcpy-gui.packages.${pkgs.system}.default
];
```
----
-
-## 💖 Support the Project
-
-If ScrcpyGUI helps you in your daily workflow, consider supporting its development on Patreon. Your support keeps the project alive and independent!
-
-
-
-
-
-
-
----
-## � Acknowledgments
+## Support
-ScrcpyGUI is made possible by the following amazing open-source projects:
+
+
+
-- **[scrcpy](https://github.com/Genymobile/scrcpy)**: The ultra-fast core engine.
-- **[Tauri](https://tauri.app/)**: The secure, lightweight framework for the desktop app.
-- **[Lucide Icons](https://lucide.dev/)**: For the clean and consistent iconography.
-- **[React](https://react.dev/)**: Powering the modern, interactive interface.
-
----
+## Built on top of
-## �📜 License
+[scrcpy](https://github.com/Genymobile/scrcpy), [Tauri](https://tauri.app/), [React](https://react.dev/), [Lucide Icons](https://lucide.dev/)
-This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
+## License
-*ScrcpyGUI is an independent project and is not affiliated with Genymobile or scrcpy authors.*
+MIT. See [LICENSE](LICENSE).
+ScrcpyGUI is not affiliated with Genymobile or the scrcpy authors.
From c8be4f1add77f00c37dbb1baf60e7dbb8fedbf71 Mon Sep 17 00:00:00 2001
From: Mohammad Faiz
Date: Thu, 11 Jun 2026 20:00:59 +0530
Subject: [PATCH 3/5] chore: bump version to v4.0.1
---
src-tauri/Cargo.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index 3968c30..823bff8 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -3208,7 +3208,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "scrcpy-gui-v3"
-version = "4.0.0"
+version = "4.0.1"
dependencies = [
"chrono",
"flate2",
From 7a81659ffdc138c7bee92fdb794dd793a9a00532 Mon Sep 17 00:00:00 2001
From: Mohammad Faiz
Date: Thu, 11 Jun 2026 20:10:42 +0530
Subject: [PATCH 4/5] chore: update icon and banner
---
Banner.png | Bin 0 -> 753781 bytes
README.md | 2 +-
icon.png | Bin 1156780 -> 1290599 bytes
3 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 Banner.png
diff --git a/Banner.png b/Banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a488671f7faad0058306c6192952f826815a5a6
GIT binary patch
literal 753781
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ð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
z
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