________ .__ .______ ___ .__
\______ \_______ ____ |__| __| _/ | \ ____ | | ______ ___________
| | \_ __ \/ _ \| |/ __ / ~ \_/ __ \| | \____ \_/ __ \_ __ \
| ` \ | \( <_> ) / /_/ \ Y /\ ___/| |_| |_> > ___/| | \/
/_______ /__| \____/|__\____ |\___|_ / \___ >____/ __/ \___ >__|
\/ \/ \/ \/ |__| \/
A practical Android-to-desktop connection helper powered by scrcpy and adb.
Project by Asish Kumar Sharma
A SafarNow Innovation Product
- What This Project Is
- Why This Exists
- Current Capabilities
- How the Flow Works
- Audio Modes
- Project Structure
- Build and Run
- Compiled Outputs
- USB Workflow
- Wireless Workflow
- Troubleshooting
- Current Limitations
- Roadmap
- Contributing
- Support
- Author and Credits
- License and Usage Notes
DroidHelper is a lightweight Go-based CLI project that helps Android users connect their phone to a desktop and launch mirroring through the existing open-source project scrcpy.
This project does not replace scrcpy. It sits on top of it and simplifies the workflow:
- checks whether
scrcpyexists - checks whether
adbexists - offers guided setup
- supports USB mode
- supports wireless-debugging mode
- lets the user choose how audio should be handled
- launches the final
scrcpysession with the correct command
The main target workflow right now is:
- Android phone -> Mac
The codebase also compiles for Windows, and Windows binaries are generated, but the current dependency-install experience is still macOS-first because automatic installation currently uses Homebrew.
Using scrcpy directly is powerful, but for many users the setup is still too manual:
- they do not know whether
adbis installed - they do not know whether
scrcpyis installed - they do not know which command to run for USB mode
- they do not know how wireless pairing works
- they do not know the difference between normal audio and voice-call mode
- they do not want to remember
adb pair,adb connect,adb mdns services,ping, andnc -vz
This project turns those steps into a guided CLI experience so the user can simply choose:
USBorWirelessNo audio,Normal audio, orVoice-call mode- let the helper do the repetitive work
The intent is simple: reduce friction and make scrcpy more approachable.
Today, the project supports the following:
- interactive CLI flow written in Go
- dependency checks for
scrcpyandadb - optional installation prompts when tools are missing
adb start-serverbootstrap- USB device detection using
adb devices -l - wireless pairing using
adb pair - wireless endpoint discovery using
adb mdns services - basic network verification using:
pingnc -vz
- audio mode selection before launch
- final
scrcpylaunch using the chosen device and mode - compiled outputs for:
- macOS Apple Silicon
- Windows x64
- Windows ARM64
At a high level, this project wraps the standard scrcpy workflow into a guided sequence.
The app checks:
- whether
scrcpyis installed - whether
adbis installed
If a required tool is missing, the CLI asks whether the user wants to install it.
The user chooses one of the following:
USB mirroringWireless mirroring
Depending on the mode, the CLI verifies that a usable device is available:
- in USB mode, it scans
adb devices -l - in wireless mode, it checks the local network path, pairing port, and active connect endpoint
Before starting the session, the user chooses:
- no audio
- normal audio
- voice-call mode
The helper assembles the right scrcpy command and starts the session.
This project currently exposes three practical launch modes:
Launches scrcpy with:
--no-audioUse this when the user wants only screen mirroring and device control.
Launches scrcpy with:
--audio-source=outputUse this when the user wants standard device playback on the computer.
Launches scrcpy with:
--audio-source=voice-call --require-audioUse this when the user specifically wants call-related audio capture.
Important note:
- voice-call capture depends on Android version, OEM restrictions, telephony stack behavior, and
scrcpysupport on that device - this mode may work on one phone and fail on another
DroidHelper/
├── go.mod
├── main.go
├── README.md
├── run-droidhelper.command
└── dist/
├── droidhelper-macos-arm64
├── droidhelper-windows-amd64.exe
└── droidhelper-windows-arm64.exe
main.go- the full interactive CLI logic
run-droidhelper.command- a double-click launcher for macOS
dist/- compiled binaries
From the project folder:
go run .go build -o dist/droidhelper-macos-arm64GOOS=windows GOARCH=amd64 go build -o dist/droidhelper-windows-amd64.exeGOOS=windows GOARCH=arm64 go build -o dist/droidhelper-windows-arm64.exeYou can launch the project by double-clicking:
run-droidhelper.command
That file runs either:
- the prebuilt binary if it exists
- or
go run .if the binary is not present
The current compiled outputs generated for this project are:
dist/droidhelper-macos-arm64dist/droidhelper-windows-amd64.exedist/droidhelper-windows-arm64.exe
These are build artifacts for convenience.
Important:
- the macOS binary is the most practical current target
- Windows binaries compile successfully, but automatic dependency installation is not yet Windows-native
The USB path is designed for users who just want to plug in the phone and start mirroring.
- Connect the Android phone with a USB cable
- Enable USB debugging on the phone if prompted
- Approve the computer on the phone if Android asks for authorization
- Starts the ADB server:
adb start-server- Lists available devices:
adb devices -l-
If no device is found:
- tells the user no device is available
- asks whether they want to retry after reconnecting
-
If one or more devices are found:
- selects the single device automatically
- or asks the user to choose one if multiple are available
-
Asks the user to choose the audio mode
-
Launches
scrcpywith the selected device serial
Example final launch:
scrcpy -s DEVICE_SERIAL --audio-source=outputThe wireless path is meant for Android Wireless Debugging users who want a guided version of the normal adb pair + adb connect flow.
- Turn on:
Developer options > Wireless debugging
-
Make sure the phone and computer are on the same Wi-Fi network
-
Open:
Pair device with pairing code
- Read the following from the phone:
- phone IP address
- pairing port
- pairing code
-
Shows local network hints from the ARP cache
-
Reads existing discoverable ADB services:
adb mdns services-
Asks the user for:
- phone IP
- or
PHONE_IP:PAIR_PORT - pairing code if a fresh pairing is needed
-
If an existing
_adb-tls-connect._tcpendpoint is already visible for that phone, it can skip re-pairing and use the connect endpoint directly -
Verifies basic network reachability:
ping -c 1 PHONE_IP- Verifies the pairing port is reachable when a fresh pairing is needed:
nc -vz PHONE_IP PAIR_PORT- Performs pairing when required:
adb pair PHONE_IP:PAIR_PORT PAIR_CODE- Looks for a connect endpoint using:
adb mdns services-
If a connect endpoint is found, it lets the user choose it
-
If no connect endpoint is found, it asks the user for the connect port manually
-
Connects with:
adb connect PHONE_IP:CONNECT_PORT-
Asks the user to choose the audio mode
-
Launches
scrcpy
Example final launch:
scrcpy -s PHONE_IP:CONNECT_PORT --audio-source=voice-call --require-audioCheck:
- Android platform tools are installed
- the system can run
adbfrom Terminal - another broken
adbprocess is not already stuck
Try:
adb kill-server
adb start-serverCheck:
- USB cable quality
- USB debugging is enabled
- phone authorization prompt is accepted
Run:
adb devices -lCheck:
- phone and Mac are on the same Wi-Fi
- the pairing screen is still active
- the pairing code has not expired
- the pairing port is correct
Check:
- Wireless debugging is still enabled
- the phone did not switch networks
- the phone screen is still on the wireless debugging page
This can happen even when normal mirroring works.
Possible reasons:
- vendor restrictions
- unsupported telephony stack behavior
- Android permission limitations
- call capture not exposed on that ROM/device
In those cases, use:
- no audio
- or normal output audio mode
This README intentionally reflects the current code, not an imaginary future version.
The current project is a CLI, not a native desktop GUI app.
The current dependency bootstrap expects Homebrew:
brew install scrcpy
brew install --cask android-platform-toolsThat means:
- macOS is the best-supported environment today
- Windows binaries exist, but the install flow is not yet Windows-native
This project is a helper around those tools. It does not replace them.
The pairing port and connect port may change over time.
Planned next improvements could include:
- native macOS
.appwrapper - Windows GUI wrapper
- Windows-specific dependency installation flow
- packaged
.dmgfor macOS - packaged
.zipor installer for Windows - improved wireless device discovery UI
- persistent saved device profiles
- richer logging and diagnostics
- optional audio presets and performance presets
Contributions are welcome.
If you want to help:
- read CONTRIBUTING.md
- open an issue before large changes
- keep changes focused and easy to review
- test USB or wireless flows when your change affects connection logic
Good starter contributions:
- Windows-specific setup improvements
- better error messages and recovery steps
- packaging and release automation
- GUI work on top of the current CLI
- docs and troubleshooting improvements
For usage help, bug reports, and feature requests:
- open a GitHub issue in this repository
- read SUPPORT.md for support boundaries and response expectations
Author: Asish Kumar Sharma
Organization: SafarNow
Positioning: A SafarNow Innovation Product
scrcpyby Genymobile is the core mirroring engine this project relies on- Android platform tools provide
adb, which powers discovery, pairing, and connection control
This project exists to make those capabilities easier to use in a guided workflow.
This repository is licensed under the MIT License.
Users should understand that:
- this project launches external tools
- OS-level warnings may still appear depending on how binaries are distributed
- unsigned binaries on macOS or Windows may trigger trust prompts
As with most tooling in this category:
- users should verify the source
- users should build from source when trust matters
- users should understand that device behavior can differ by phone model and OS policy
DroidHelper is a focused utility project for Android-to-desktop mirroring setup. It is built in Go, designed by Asish Kumar Sharma, positioned as a SafarNow innovation product, and powered by the proven scrcpy ecosystem.
It is not trying to be a replacement for scrcpy. It is trying to make scrcpy easier to use for real people.