Skip to content

Getting Started (USB)

The USB flow is the lowest-latency way to play: the "network" is the cable (steady ~3ms, zero WiFi jitter) and the phone charges while you shoot.

No cable? Scan the QR

Running point-bang prints a QR code — scan it with the phone, tap Allow on Chrome's one-time local-network prompt, and you're connected over WiFi with no certificates or flags. See Playing over WiFi for how it works.

Requirements

  • PC — Windows, Linux, or macOS (Apple Silicon macos-arm64 or Intel macos-x64; community-verified — see the macOS tip below). Either grab the single executable (nothing else to install) or use Node.js ≥ 23.6 with a checkout — the server is TypeScript run natively via type stripping, so there is no build step.
  • Phone — Android with ARCore support, Chrome, and Google Play Services for AR installed.
  • Cable + USB debugging — enable Developer Options → USB debugging, and have adb (Android platform-tools) on your PATH.

Run it

sh
git clone https://github.com/ggcaponetto/point-bang.git
cd point-bang
npm install
npm run start:adb   # starts the server AND sets up the adb tunnel

Then open http://localhost:8443 in Chrome on the phone — the server prints a QR for it, so you can scan instead of typing (localhost resolves on the phone, through the adb tunnel). It is a secure context, so WebXR works without any HTTPS certificate.

Every option is a flag — no environment variables, so the same command works in bash, cmd.exe and PowerShell:

sh
npm start -- --port 9000 --mode adb
node cli.ts --help

Pause to use the real mouse

Press shift+s (on the PC keyboard) to pause tracking — the cursor is yours again — and press it again to resume aiming, no reconnect or recalibration needed. The combo is configurable and works the same in the single executable:

sh
point-bang serve --pause-combo ctrl+f9   # any buttons.json-style key combo
point-bang serve --pause-combo off       # disable the hotkey entirely

The keys are read passively (no global hook): the focused game still receives the combo, so pick one your game ignores. While paused, aim and new button presses from the phone are dropped; releases still go through so nothing stays held down.

No Node? The single executable

npm run build:sea produces dist/point-bang (or point-bang.exe on Windows) — one self-contained file with the phone page and the input driver baked in. Copy it anywhere and run it:

sh
point-bang serve --mode adb
point-bang check              # is this install working?

The build targets the OS it runs on; there is no cross-compiling.

Windows

The first run pops a Windows Defender Firewall prompt — allow it on private networks, or the phone cannot reach the server over WiFi. USB (--mode adb) needs no firewall rule.

Linux

Cursor injection uses X11's XTEST extension: install libx11 and libxtst (libxtst6 on Debian/Ubuntu). A Wayland session needs Xwayland. point-bang check tells you whether input is available.

macOS

Grab macos-arm64 for Apple Silicon (any Mac since 2020) or macos-x64 for Intel Macs. Four things macOS wants from you, all one-time (per update):

  1. Exec bit + quarantine — downloads lose the executable bit ("permission denied", or "command not found" under sudo) and carry Gatekeeper's quarantine ("zsh: killed" / "cannot be verified"). No sudo needed for either:
    sh
    chmod +x ./point-bang-*-macos-*
    xattr -d com.apple.quarantine ./point-bang-*-macos-*
    ("No such xattr" just means it wasn't quarantined. Still blocked? See troubleshooting.)
  2. Accessibility — the first cursor move triggers a prompt; grant it to the terminal app running point-bang (System Settings → Privacy & Security → Accessibility). Without it the cursor silently does not move even though point-bang check says input is ready.
  3. Every update re-asks — the binaries are ad-hoc signed (no paid Apple Developer account), so macOS treats each release as a new app and asks for the permissions again.
  4. Pause hotkey — if shift+s does not react, additionally grant Input Monitoring to the terminal.

macOS support is community-verified: every release is built and smoke-tested on real macOS CI (arm64 and x64), and end-to-end aim is verified by players — reports welcome.

Calibrate

  1. Keep the default calibration method (two-ray — recommended), confirm your monitor aspect ratio, and tap START AR.
  2. Sweep the phone slowly around the desk/monitor area until the HUD shows tracking good.
  3. Aim the green crosshair at each named screen corner — top-left, top-right, bottom-left, in that exact order — and press CAPTURE.
    • Two-ray mode (default, recommended): two captures per corner from positions ~50cm apart — works on any screen, no surface tracking needed.
    • Hit-test mode: one capture per corner, but ARCore must see a surface at the screen — monitors often defeat that.
  4. The HUD shows the measured aspect ratio — green means the calibration is geometrically sane.
  5. Aim at the screen: the PC cursor follows. The big LEFT button left-clicks (and it's remappable).

Recalibration takes ~15 seconds and is needed once per session — WebXR anchors don't persist across sessions, and bumping the monitor invalidates the calibration (anchors track the spot in space, not the object).

Multiple monitors

point-bang monitors lists your displays; serve --monitor 2 aims at one of them, --monitor all spans the whole desktop with each monitor calibrated as its own plane (bezels and angled panels stay accurate, with independent aim correction per monitor). During an all calibration the PC cursor jumps to the center of the monitor you should calibrate next — aim at the panel the cursor sits on. Calibrated them in the wrong order anyway? Tap SWAP in the phone's aim panel and the assignment flips instantly, no recalibration.

Released under the MIT License.