A modern, dark-themed GUI for scrcpy — built for macOS, designed for speed, paired in seconds.
No cable. No setup hassle. Just scan, pair, mirror.
|
One-tap pairing for Android 11+ wireless debugging. Scan a QR code with your phone, or pair with a 6-digit code. Mirror in seconds. A clean, modern dark theme with vibrancy effects. Built for macOS, fits right into Big Sur and later. Plug in for instant detection or stay wireless forever. Detects connected devices automatically. |
Record, crop, rotate, control bitrate, FPS, resolution. All scrcpy options exposed through a clean form. Type, click, swipe, copy/paste — your phone behaves like another window. Input validation on every IPC call. No shell injection. No remote code paths. |
# Install scrcpy and adb (one-time setup)
brew install scrcpy android-platform-toolsAndroid 11+ users: enable Wireless Debugging in Developer Options. Android 5–10 users: enable USB Debugging and use the cable on first connection.
Download the latest .app from Releases and drag it to /Applications.
Or build from source — see Development below.
Option A — QR Code (easiest)
| Step | Action |
|---|---|
| 1 | Phone → Settings → Developer Options → Wireless debugging → Pair device with QR code |
| 2 | Open DroidScreen → click Pair via QR Code |
| 3 | Point your phone's camera at the QR code shown on your Mac |
| 4 | Done — auto-pairs and the device appears in the list |
Option B — 6-digit code (auto-discovered)
| Step | Action |
|---|---|
| 1 | Phone → Settings → Developer Options → Wireless debugging → ON |
| 2 | Open DroidScreen → click Scan for Devices |
| 3 | Tap Pair, enter the 6-digit code from your phone |
| 4 | Done — auto-connects and stays paired |
Option C — Manual IP + Code (most reliable)
If QR or scan fails (some routers / Android builds), use the direct pairing flow:
| Step | Action |
|---|---|
| 1 | Phone → Settings → Developer Options → Wireless debugging → Pair device with pairing code |
| 2 | Note the IP address & port + 6-digit code shown |
| 3 | DroidScreen → click Pair Manually → enter IP:port and code |
| 4 | Done — device auto-appears in the list |
💡 Same Wi-Fi network required. mDNS doesn't cross subnets. Phone hotspot may block client-to-host TLS pairing.
- Plug your phone into your Mac
- Authorize the debug prompt on your phone
- Device appears automatically — click Open Selected Mirror
- Connect via USB once to enable
adb tcpip 5555 - Click ▼ Manual IP connect at the bottom of Devices
- Enter your phone's LAN IP → Open wireless connection
When the scrcpy mirror window has focus.
📋 Click to expand full shortcut reference
| Action | macOS Shortcut |
|---|---|
| Switch fullscreen mode | ⌘ F |
| Resize window to 1:1 (pixel-perfect) | ⌘ G |
| Resize window to remove black borders | ⌘ X · Double-click |
| Click on HOME | ⌃ H · Middle-click |
| Click on BACK | ⌘ B · Right-click |
| Click on APP_SWITCH | ⌘ S |
| Click on MENU | ⌃ M |
| VOLUME UP | ⌘ ↑ |
| VOLUME DOWN | ⌘ ↓ |
| POWER | ⌘ P |
| Power on (when off) | Right-click |
| Turn device screen off (keep mirroring) | ⌘ O |
| Expand notification panel | ⌘ N |
| Collapse notification panel | ⌘ ⇧ N |
| Copy device clipboard → Mac | ⌘ C |
| Paste Mac clipboard → device | ⌘ V |
| Copy Mac clipboard → device | ⌘ ⇧ V |
| Enable/disable FPS counter (stdout) | ⌘ I |
The Configuration tab exposes every scrcpy option:
| Setting | What it does |
|---|---|
| scrcpy path | Override location (leave blank if scrcpy is in your PATH) |
| Window title | Custom title for the mirror window |
| Record screen | Save mirror to .mkv file (with optional live preview) |
| Bit rate | Video bitrate (default 8 Mbps — raise for better quality) |
| Max size | Cap longest dimension (e.g. 1920) — 0 = native |
| Max FPS | Cap framerate — 0 = unlimited |
| Rotation | Force 0° / 90° / 180° / 270° |
| Crop | Show only a region of the screen |
| Window position/size | Pre-position mirror window |
| Always on top | Pin mirror above other windows |
| Borderless | Hide window chrome |
| Fullscreen | Start fullscreen |
| Show touches | Visualize taps on the device |
| Render expired frames | Lower latency at cost of CPU |
| Stay awake | Prevent screen sleep while mirroring |
| Auto-open | Automatically mirror when device connects |
| Hide on close | Minimize to tray instead of quitting |
Built with Electron 28 + Vue 2 + Element UI, bundled by Webpack. Native Apple Silicon (arm64).
# Clone & install
git clone https://github.com/8-BitBirdman/droidscreen
cd droidscreen
npm install --legacy-peer-deps
# Dev mode (hot reload, devtools)
npm run dev
# Production build → build/mac-arm64/DroidScreen.app
npm run pack:main && npm run pack:renderer
npx electron-builder --mac --arm64 --publish=never
# Lint
npm run lintsrc/
├── main/ # Electron main process
│ ├── index.js # App lifecycle, IPC registration
│ ├── adb/ # ADB tracker, mDNS, pair, connect
│ └── scrcpy/ # scrcpy spawner with full arg builder
└── renderer/ # Vue app
├── components/
│ ├── dashboard/ # Configuration & device Management
│ ├── layout/ # Header / Footer
│ └── menu/ # Tray + app menus
├── lang/ # i18n (English)
├── plugins/ # Vue plugins (store, notify, openExternal)
└── styles/ # Global SCSS + dark theme overrides
┌──────────────────┐ IPC ┌──────────────────┐ spawn ┌──────────┐
│ Renderer (Vue) │ ◄────► │ Main (Node) │ ──────► │ scrcpy │
│ Management.vue │ │ adb / scrcpy │ │ adb │
└──────────────────┘ └──────────────────┘ └──────────┘
│ │
│ └─► adbkit (TCP)
└─► @electron/remote (tray, menus)
- All IPC inputs validated — addresses match
host:port, codes are 6 digits - No shell interpolation — uses
execFile, notexec, foradbcalls - Mac-only by design — Windows/Linux paths and binaries removed
- No telemetry. No tracking. No network calls beyond your own LAN
Phone not appearing when scanning
- Verify Wireless Debugging is ON (not just Developer Options enabled)
- Confirm Mac and phone are on the same Wi-Fi (mDNS won't traverse VLANs)
- Some routers block mDNS / multicast — try disabling AP Isolation
- Run
adb mdns servicesin Terminal — if empty, it's a network issue, not the app
Pairing fails repeatedly
- The pairing code expires fast — enter it within ~30 seconds
- The pairing port changes every time you toggle Wireless Debugging — re-scan
- Make sure no other tool (Android Studio, Vysor) is holding the adb server
protocol fault (couldn't read status message)fromadb pair→ toggle Wireless Debugging off/on on the phone, thenadb kill-server && adb start-serverand retry- Phone hotspot can block client-to-host TLS — use a shared Wi-Fi router instead
"scrcpy not found" error
- Confirm install:
which scrcpyshould print a path - If installed but not found, set the scrcpy path explicitly in Configuration
- macOS apps inherit a limited
PATH— Homebrew paths usually work viafix-path
Mirror window opens but is black/laggy
- Lower the bit rate or max size in Configuration
- Disable Render expired frames
- Check
~/Library/Logs/DroidScreen/for scrcpy stdout
Pull requests welcome. For substantial changes, open an issue first to discuss direction.
- Fork the repo
- Create a feature branch (
git checkout -b feat/my-feature) - Run
npm run lintbefore committing - Open a PR with a clear description
- scrcpy by Genymobile — the engine that makes it all possible
- adbkit — Node.js ADB client
- Electron + Vue + Element UI
Made with ☕ for the Android-on-Mac crowd.
If DroidScreen saves you a USB cable, consider giving it a ⭐