A small Windows desktop app that receives motion from the AirMouse3D phone app over the local Wi-Fi network (direct UDP — no cloud, no internet) and drives the PC's mouse cursor.
It's a real windowed app, not a terminal program: double-click it and it opens a window showing a pairing QR code, the connection address, a Copy button, a live Connected / Waiting status, and packet stats. Close it to stop.
The app installs per-user — no admin rights needed — and adds Start Menu + Desktop shortcuts and an entry in Settings ▸ Apps (so it uninstalls like any other program).
- Build the exe (one-time, needs the Rust toolchain):
This produces
cargo build --releasetarget/release/AirMouse3D-Receiver.exe. - Install it: double-click
installer/Install.bat(or runpowershell -ExecutionPolicy Bypass -File installer/install.ps1 -Launch). - Launch AirMouse3D Receiver from the Start Menu or Desktop.
To remove it: double-click installer/Uninstall.bat, or use Settings ▸ Apps ▸ AirMouse3D
Receiver ▸ Uninstall.
Prefer a single downloadable
Setup.exe?installer/installer.nsiis an optional NSIS script — runmakensis installer.nsi(with NSIS installed) to produceAirMouse3D-Setup.exe. The.ps1/.batinstaller above needs no extra tooling, so it's the default path.
- Open AirMouse3D Receiver on the PC. Its window shows the QR code + address.
- On the phone, open the AirMouse3D app → Scan QR Code (or type the address shown).
- Tap Start Air Mouse, hold the phone flat like a mouse, and tilt to move the cursor.
The window shows ● Connected — <phone ip> once packets arrive, plus live packet count, rate,
and uptime. If the phone drops off it shows Waiting to reconnect… and recovers on its own.
Phone (UDP motion packets) ──► AirMouse3D-Receiver.exe ──► OS mouse APIs (enigo) ──► cursor
◄── (ack packets) ──────────
src/main.rs— launches the GUI (no console window in release builds), sets the window/app icon, spawns the background UDP server.src/gui.rs— theegui/eframewindow: QR image, address + copy, status pill, live stats.src/server.rs— background thread running the async UDP receive loop, independent of the GUI; publishes live status the GUI reads each frame. Surfaces a clear error in-window (instead of crashing) if the port is already in use or cursor control can't initialize.src/cursor/—mapper.rsmaps the phone'sdx/dyto screen axes;controller.rsapplies movement, clicks (left/right/middle), and scroll viaenigo.src/net/discovery.rs— detects this machine's LAN IP for the QR code / address.src/icon.rs— the app icon, drawn procedurally in code (no binary asset);build.rsbakes it into a multi-size.icoembedded in the exe, andmain.rsreuses it for the live window icon.
All the motion shaping — adaptive One-Euro filtering, pointer acceleration, dead zone,
shake rejection, sensitivity — happens on the phone (see ../android_app, MotionProcessor). The
receiver deliberately does no second smoothing pass: the dx/dy in each packet are final,
ready-to-apply pixel deltas. Re-filtering here would just stack a second filter's lag on top and
make the cursor feel mushy. mapper.rs only maps axes and applies one safety clamp.
- Phone and PC must be on the same Wi-Fi network. No internet connection is required.
- The exe-embedded icon step in
build.rsis best-effort: if the Windows resource compiler isn't available it's skipped with a warning and the build still succeeds (the live window icon, set at runtime, is unaffected).