Tracker Bridge is a tiny localhost HTTP + WebSocket helper so the published Tower Run Tracker website can find and read playerInfo.dat on your computer (emulator, USB phone, or native Mac install).
It only reads your save file — it does not modify the game or inject code.
Tracker Bridge runs on Node.js 18 or newer. npx is part of Node.js, so if npx is "not recognized", Node.js is not installed yet.
Don't want to deal with a terminal? Use the installer — it checks for Node.js, installs it if missing, and sets up the bridge with Start Menu shortcuts and an uninstaller:
- Windows:
TrackerBridgeSetup.exe— a standard install wizard. Installs per-user under%LOCALAPPDATA%\TrackerBridge, so it needs no administrator rights. - macOS:
tracker-bridge-setup.command— double-click it (first time: right-click → Open → Open)
Both are downloadable from the tracker site's import page.
Heads up: the installers are not code-signed, so your OS warns once. On Windows click More info → Run anyway; on macOS right-click → Open → Open.
winget install -e --id JRSoftware.InnoSetup # one-time
npm run build:installer:win # -> dist/TrackerBridgeSetup.exeThe version is read from package.json, so the installer can never drift from the package.
npx tracker-bridgeOn first run the terminal walks you through setup:
- Trust intro and npm source links
- Update check — auto-updates to the newest version and tells you (see below)
- Automatic
adbdiscovery or platform-tools install - Optional OS startup registration
- Optional background mode (safe to close the terminal)
This only affects PowerShell. Easiest fixes, in order of preference:
- Use the one-click
tracker-bridge-setup.cmdabove (never touches PowerShell policy), or - Run the command in Command Prompt (cmd) instead, or
- If you must use PowerShell, run this once in the same window — it applies only to that window:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Automatic updates are on by default. On each run the bridge checks npm for a newer version, updates itself, and prints a notice telling you it did.
npx tracker-bridge --no-auto-update # only notify when an update exists
npx tracker-bridge --auto-update # turn automatic updates back on
npx tracker-bridge --no-update # skip the check just this oncePreferences are stored in ~/.local-adb-bridge/config.json.
npx tracker-bridge --daemon # Run in background
npx tracker-bridge --boot # Register OS login startup
npx tracker-bridge --no-boot # Skip startup prompts
npx tracker-bridge --remove-boot # Remove OS startup entry
npx tracker-bridge --install-path # Add adb to user PATH
npx tracker-bridge --help- Windows USB: Uses host
adbin the bridge terminal. Autoplay can cause reconnect loops — set your phone to Take no action in Autoplay settings. - macOS: Mac save scan checks the App Store bundle-id container, non-App-Store (random-UUID) sandbox containers, and non-sandboxed / Steam-style installs under
~/Library/Application Support, then runs a bounded case-insensitive search under those roots. macOS hides~/Libraryin Finder — reveal it with Finder's Go → Go to Folder (⇧⌘G), or hold Option (⌥) in the Go menu. - Linux: Emulator connect tries
adbfirst, then common on-disk save paths for Waydroid/Anbox installs. - Published site: Click Allow when Chrome or Edge asks for local network access so the site can reach
127.0.0.1:43781.
LOCAL_ADB_BRIDGE_PORT— default43781ADB_PATHorLOCAL_ADB_BRIDGE_ADB— full path toadb/adb.exeLOCAL_ADB_BRIDGE_SKIP_AUTO_INSTALL=1— do not install or modify PATHTRACKER_BRIDGE_SKIP_UPDATE_CHECK=1— do not check for updates
Platform-tools zip installs are stored under ~/.local-adb-bridge/platform-tools/.
The package exposes stable subpath entries, so you can embed the bridge rather than shelling out (the Tower Run Tracker desktop app does exactly this — Electron ships its own Node, so users need nothing installed):
import { startLocalAdbBridge, BRIDGE_VERSION } from 'tracker-bridge/server.mjs'
import { discoverNativeHostPlayerInfoSave } from 'tracker-bridge/native-save-discovery.mjs'
const { server, wss } = startLocalAdbBridge() // listens on 127.0.0.1:43781
const save = await discoverNativeHostPlayerInfoSave() // { source, absolutePath, bytes } | nullAvailable entries: server.mjs, native-save-discovery.mjs, pull-save.mjs, save-paths.mjs, save-bytes.mjs, update-check.mjs, bridge-config.mjs.
The site connects over WebSocket to ws://127.0.0.1:43781 and exchanges JSON messages:
| Send | Reply |
|---|---|
| — (on connect) | { type: 'HELLO', version, port } |
{ type: 'PING' } |
{ type: 'PONG', version } |
{ type: 'CHECK_ADB' } |
{ type: 'ADB_STATUS', ... } |
{ type: 'PULL_SAVE', preferNativeHost?, preferPhysicalDevice?, customPort? } |
{ type: 'SUCCESS', data, remotePath, deviceSerial, byteLength } or { type: 'ERROR', code, message } |
GET /private-network-ping exists to trigger Chrome's Private Network Access permission.
Issues and pull requests are welcome. The bridge is intentionally dependency-light (only ws) and has no build step — clone it and run node bin/tracker-bridge.js.
GPL-3.0-or-later. See LICENSE.
The previous npm package was local-adb-bridge. New releases ship as tracker-bridge.