NeuController turns your Android smartphone into a low-latency virtual gamepad for Linux PCs and laptops. Controller inputs are streamed over UDP (60 Hz) in real-time and translated into a virtual game controller using Linux uinput. It includes a modern neumorphic Electron desktop manager for background server lifecycle control, network diagnostics, and real-time input visualization.
[Phone: Flutter App] --- UDP (Port 9876) ---> [Laptop: Electron / Python Server] ---> [Virtual Gamepad /dev/uinput] ---> Games
Ready-to-use packages for mobile and desktop. No development environment or build tools required.
| Platform | Package | Architecture | Direct Download |
|---|---|---|---|
| Android Mobile | APK Package | arm64-v8a, armeabi-v7a |
neu-controller.apk |
| Linux Desktop | Standalone AppImage | x86_64 (Universal Linux) |
NeuController-x86_64.AppImage |
| Linux Desktop | Debian / Ubuntu Package | amd64 |
neu-controller-amd64.deb |
All packages are automatically published on the GitHub Releases page.
| Desktop Manager (Electron GUI) | Mobile Controller (Flutter App) |
|---|---|
![]() |
![]() |
To allow the server to create a virtual input device without requiring root permissions (sudo) on every launch, configure access to /dev/uinput:
# 1. Add current user to the input group
sudo usermod -aG input $USER
# 2. Install permanent udev rule (persists across reboots)
sudo cp server/99-neucontroller-uinput.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
# 3. Allow UDP port in firewall if enabled
sudo ufw allow 9876/udpNote: After running
usermod, log out and log back in (or restart your session) for group membership changes to take effect.
Download the universal AppImage directly without installing Node.js or Python:
- Download NeuController-x86_64.AppImage.
- Make it executable and run:
chmod +x NeuController-x86_64.AppImage ./NeuController-x86_64.AppImage
(Or install the .deb package on Ubuntu/Debian: sudo dpkg -i neu-controller-amd64.deb).
cd electron
npm install
npm startIf you prefer running the server via command line without a GUI:
cd server
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python server.py --port 9876(Note: You can pass --dry-run to test network communication without creating a virtual hardware device).
Download and install the APK directly on your Android phone without needing Flutter:
- Tap Direct Download neu-controller.apk on your Android device (or view all versions on GitHub Releases).
- Allow installation from unknown sources when prompted and install the app.
- Open Neu Controller, select your laptop under Nearby servers (or enter the IP address manually), and tap Connect.
cd mobile
flutter pub get
flutter run- Ultra-Low Latency UDP: 60 Hz input updates with real-time round-trip latency tracking (<30 ms on local Wi-Fi or phone hotspot).
- Neumorphism Dark Theme: Consistent soft-shadow aesthetic across both Android and Desktop applications.
- Desktop Manager GUI:
- Built with Electron and Lucide icons.
- Live controller visualizer (dynamic analog stick deflection and button highlights).
- Background process management (automatic start, stop, and status monitoring of the Python backend).
- Window controls with minimize-to-system-tray functionality.
- Full Gamepad Emulation: Dual analog sticks, D-pad, action buttons (Cross, Circle, Square, Triangle), shoulder bumpers (L1/R1), triggers (L2/R2), and Start/Select buttons.
- Fail-Safe Mechanism: Automatically resets all virtual controller inputs to neutral if connection drops for more than 500 ms to prevent stuck inputs.
Verify that the system registers the virtual gamepad:
# Check input events using evtest
sudo evtest
# Select "NeuController" (or "PadLink") and press buttons on your phone to observe events
# Alternatively, test with jstest
jstest /dev/input/js0| Issue | Likely Cause | Solution |
|---|---|---|
| Server not found in mobile app | Wi-Fi client isolation (common on public/campus Wi-Fi) | Use phone hotspot to connect laptop and phone directly, or manually enter the IP displayed in the desktop app |
| Connection indicator remains red / ping timeout | Laptop firewall is blocking incoming UDP packets | Run sudo ufw allow 9876/udp |
Cannot open /dev/uinput: Permission denied |
User does not have read/write access to /dev/uinput |
Run sudo chmod 660 /dev/uinput && sudo chgrp input /dev/uinput or add user to input group and re-login |
Server crashes immediately without --dry-run |
/dev/uinput permission issue or missing module |
Configure uinput permissions as shown above, or run with --dry-run to test network only |
| Noticeable input delay or packet loss | 2.4 GHz Wi-Fi congestion or distance | Switch to 5 GHz Wi-Fi or tether laptop via phone Wi-Fi hotspot |
neu-controller/
├── electron/ # Desktop manager UI (Electron, Lucide icons, IPC)
├── mobile/ # Mobile gamepad app (Flutter, neumorphic UI, UDP client)
├── server/ # Virtual controller backend (Python, Linux uinput)
├── image/ # Screenshots and preview assets
└── documentation/ # Technical specifications and design documents
- Author: Brenanda Caesa Pamudya
- Email: brenandapamudya178@gmail.com
- Repository: github.com/brenandapamudya1/neu-controller
This project is licensed under the MIT License - see the LICENSE file for details.

