SideCast is a lightweight, cross-platform desktop application built with Electron that allows you to mirror and interact with your Android devices using ADB and scrcpy. It's fast, simple, and completely local — no internet required.
- Live Screen Mirroring - Real-time Android device mirroring using scrcpy
- Multi-Device Support - Connect and manage multiple Android devices simultaneously
- USB & Wi-Fi Connection - Support for both USB and wireless ADB connections. (WiFi Connection is a Work in Progress)
- Customizable Quality - Adjust bitrate, resolution, and frame rate settings
- Screen Recording - Capture your device screen with automatic file transfer and format optimization
- Screenshots - Take instant screenshots with automatic saving to local machine
- Real-time Logs - Monitor ADB and scrcpy logs in real-time (WIP)
- Device Management - View detailed device information and connection status
- Settings Management - Configure ADB path, timeouts, and scrcpy options
- Modern UI - Beautiful, responsive interface built with shadcn/ui and Tailwind CSS
- Frontend: React 18, TypeScript, Tailwind CSS
- Desktop: Electron 30
- UI Components: shadcn/ui, Radix UI, Lucide Icons
- Android Tools: ADB (Android Debug Bridge), scrcpy
- Build Tools: Vite, Electron Builder
- State Management: Electron Store for persistent settings
Before using SideCast, ensure you have the following installed:
- Node.js (v18 or higher)
- ADB (Android Debug Bridge) - Download here
- scrcpy - Download here
- FFmpeg (recommended for video compatibility) - Download here
- macOS:
brew install ffmpeg - Windows: Download from website or
choco install ffmpeg - Linux:
sudo apt install ffmpeg(Ubuntu/Debian) orsudo yum install ffmpeg(CentOS/RHEL)
- macOS:
- Enable Developer Options on your Android device
- Enable USB Debugging in Developer Options
- Connect via USB or pair via Wi-Fi (see Wi-Fi pairing section below)
-
Clone the repository
git clone https://github.com/donymvarkey/side-cast.git cd side-cast -
Install dependencies
npm install
-
Start development server
npm run dev
npm run buildThis will create distributable packages for your platform in the dist directory.
- Launch SideCast - The application will automatically detect connected devices
- Check ADB Server - Ensure the ADB server is running (indicated by the green dot)
- Connect Device - Connect your Android device via USB or Wi-Fi
- Start Mirroring - Click the mirror button next to your device
- Connect via USB first to establish initial connection
- Enable Wi-Fi pairing in the device settings
- Use the Wi-Fi pairing dialog to connect wirelessly
SideCast supports high-quality screen recording with automatic file management:
- High Quality: Uses scrcpy for consistent quality with mirroring settings
- Configurable Settings: Same bitrate, resolution, and FPS as mirroring
- Audio Support: Optional audio recording with device audio
- Direct Save: Files are saved directly to your computer (no device transfer needed)
- Format Optimization: Automatic optimization for maximum compatibility
- Start Mirroring: Begin screen mirroring for your device
- Start Recording: Click the red recording button (animated dot)
- Stop Recording: Click the button again to stop recording
- File Location: Recordings are saved to your configured directory
- Container: MP4
- Video Codec: H.264 (same as mirroring)
- Quality: Configurable via mirroring settings
- Audio: Optional AAC audio (if enabled)
- Compatibility: Optimized for playback on most media players
- Video Won't Play on macOS:
- Install FFmpeg:
brew install ffmpeg(macOS) or download from ffmpeg.org - Run
npm run check-ffmpegto verify installation - Videos are automatically optimized for macOS compatibility when FFmpeg is available
- Install FFmpeg:
- Empty Files: Check device connection and scrcpy installation
- Recording Fails: Ensure device is properly connected and scrcpy is installed
- Optimization Fails: Check FFmpeg installation and try running the check script
Take instant screenshots with automatic saving:
- Start Mirroring: Begin screen mirroring for your device
- Take Screenshot: Click the camera icon button
- File Location: Screenshots are automatically saved to your configured directory
- Disconnect USB once Wi-Fi connection is established
- ADB Path: Set custom ADB executable path if not in system PATH
- Scrcpy Settings: Configure bitrate, resolution, frame rate, and other options
- Advanced Settings: Adjust timeouts and other advanced configurations
├── 📁 .git/ 🚫 (auto-hidden)
├── 📁 .idea/ 🚫 (auto-hidden)
├── 📁 dist-electron/ 🚫 (auto-hidden)
├── 📁 electron/
│ ├── 📄 adb.ts
│ ├── 📄 electron-env.d.ts
│ ├── 📄 main.ts
│ ├── 📄 preload.ts
│ └── 📄 store.ts
├── 📁 node_modules/ 🚫 (auto-hidden)
├── 📁 public/
│ ├── 🖼️ electron-vite.animate.svg
│ ├── 🖼️ electron-vite.svg
│ └── 🖼️ vite.svg
├── 📁 src/
│ ├── 📁 assets/
│ │ ├── 📁 fonts/
│ │ │ ├── 📄 Quicksand-Bold.ttf
│ │ │ ├── 📄 Quicksand-Light.ttf
│ │ │ ├── 📄 Quicksand-Medium.ttf
│ │ │ ├── 📄 Quicksand-Regular.ttf
│ │ │ └── 📄 Quicksand-SemiBold.ttf
│ │ ├── 📁 images/
│ │ │ ├── 📄 index.ts
│ │ │ ├── 🖼️ logo_1.png
│ │ │ ├── 🖼️ logo_2.png
│ │ │ └── 🖼️ logo_side_cast_white.png
│ │ └── 🖼️ react.svg
│ ├── 📁 components/
│ │ ├── 📁 ui/
│ │ │ ├── 📄 badge.tsx
│ │ │ ├── 📄 button.tsx
│ │ │ ├── 📄 card.tsx
│ │ │ ├── 📄 dialog.tsx
│ │ │ ├── 📄 input.tsx
│ │ │ ├── 📄 label.tsx
│ │ │ ├── 📄 radio-group.tsx
│ │ │ ├── 📄 separator.tsx
│ │ │ ├── 📄 sheet.tsx
│ │ │ ├── 📄 sidebar.tsx
│ │ │ ├── 📄 skeleton.tsx
│ │ │ ├── 📄 sonner.tsx
│ │ │ ├── 📄 switch.tsx
│ │ │ ├── 📄 textarea.tsx
│ │ │ └── 📄 tooltip.tsx
│ │ ├── 📄 DeviceDetailsDialog.tsx
│ │ ├── 📄 adb-settings.tsx
│ │ ├── 📄 advanced-settings.tsx
│ │ ├── 📄 app-sidebar.tsx
│ │ ├── 📄 device-list-item.tsx
│ │ ├── 📄 scrcpy-settings.tsx
│ │ └── 📄 wifi-pairing-dialog.tsx
│ ├── 📁 constants/
│ │ ├── 📄 index.ts
│ │ └── 📄 versionInfo.ts
│ ├── 📁 context/
│ │ └── 📄 GlobalContext.ts
│ ├── 📁 hooks/
│ │ └── 📄 use-mobile.ts
│ ├── 📁 layouts/
│ │ └── 📄 MainLayout.tsx
│ ├── 📁 lib/
│ │ └── 📄 utils.ts
│ ├── 📁 screens/
│ │ ├── 📄 About.tsx
│ │ ├── 📄 Devices.tsx
│ │ ├── 📄 Home.tsx
│ │ ├── 📄 Logs.tsx
│ │ ├── 📄 Recordings.tsx
│ │ ├── 📄 Settings.tsx
│ │ └── 📄 index.ts
│ ├── 📁 types/
│ │ ├── 📄 global.d.ts
│ │ └── 📄 index.ts
│ ├── 📁 utils/
│ │ └── 📄 index.ts
│ ├── 📄 App.tsx
│ ├── 📄 Routes.tsx
│ ├── 🎨 index.css
│ ├── 📄 main.tsx
│ └── 📄 vite-env.d.ts
├── 📄 .eslintrc.cjs
├── 🚫 .gitignore
├── 📖 README.md
├── 📄 components.json
├── 📄 electron-builder.json5
├── 🌐 index.html
├── 📄 package-lock.json
├── 📄 package.json
├── 📄 tsconfig.json
├── 📄 tsconfig.node.json
└── 📄 vite.config.ts
Generated by FileTree Pro Extension
- ADB Path: Path to ADB executable
- Timeout: ADB command timeout in milliseconds
- Server Management: Start/stop ADB server
- Bitrate: Video bitrate (default: 8000000)
- Max Resolution: Maximum resolution (default: 1920)
- Max FPS: Maximum frame rate (default: 60)
- Show Touches: Display touch events on screen
- Audio Forwarding: Forward device audio to computer
-
Device not detected
- Ensure USB debugging is enabled
- Check ADB server status
- Try restarting ADB server
-
Mirroring fails
- Verify scrcpy is installed and accessible
- Check device connection status
- Review logs for error messages
-
Wi-Fi connection issues
- Ensure device and computer are on same network
- Check firewall settings
- Try re-pairing via USB first
View real-time logs in the Logs section to diagnose issues with:
- ADB commands
- scrcpy execution
- Device connections
- Application errors
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- scrcpy by Genymobile for the excellent screen mirroring tool
- shadcn/ui for the beautiful UI components
- Electron for the cross-platform desktop framework
- Tailwind CSS for the utility-first CSS framework
- GitHub Issues: Report bugs or request features
- Discussions: Join the community
Developed with ❤️ by Dony M Varkey
© 2025 SideCast




