A client application that automatically captures and sends Visual Pinball X (VPX) scores and screenshots to VPinLeaders. The application runs in the background and provides a system tray icon for easy configuration and mode switching
- Live PinMAME memory polling
.nvfile polling fallback for roms with flush after closing VPX.
You need:
- A VPinLeaders account at vpinleaders.com
- A VPX 10.8.1 setup
- The latest GitHub Actions artifact for your operating system
Create your account first:
Then open the latest successful workflow run in the repo Actions tab and download the artifact for your platform:
- macOS arm64:
VPinLeaders-macOS-arm64.zip - Windows x64:
VPinLeaders-Windows-x64.zip - Linux x64:
VPinLeaders-Linux-x64.zip - Batocera x64: follow batocera/README.md
- Unzip
VPinLeaders-macOS-arm64.zip - Remove the quarantine attribute:
xattr -d com.apple.quarantine VPinLeaders-macOS-arm64- Run the client:
./VPinLeaders-macOS-arm64 --register --machine-id YOUR_MACHINE_ID --nvrams-folder /Your/tables/folderAfter registration, start it normally:
./VPinLeaders-macOS-arm64- Download
VPinLeaders-Windows-x64.zip - Right-click the downloaded
.zip, openProperties, and clickUnblock - Unzip it
- Run registration:
.\VPinLeaders-Windows-x64.exe --register --machine-id YOUR_MACHINE_ID --nvrams-folder C:\Your\tables\folderAfter registration, start it normally:
.\VPinLeaders-Windows-x64.exe- Unzip
VPinLeaders-Linux-x64.zip - Run registration with the regular binary:
./VPinLeaders-Linux-x64/VPinLeaders-Linux-x64 --register --machine-id YOUR_MACHINE_ID --nvrams-folder /Your/tables/folder
- Start the app with the bundled launcher:
./vpinleaders-start.shThe launcher exists because Linux needs extra permission to read live VPX data. It applies the required capability for the packaged binary:
sudo setcap cap_sys_ptrace=eip /path/to/VPinLeaders-Linux-x64/VPinLeaders-Linux-x64You may be prompted for sudo the first time the launcher runs.
Registration creates the config file automatically in the correct location:
- Linux:
~/.config/vpinleaders-client/config.ini - macOS:
~/Library/Application Support/vpinleaders-client/config.ini - Windows:
%APPDATA%\vpinleaders-client\config.ini
A sanitized config.example.ini is kept in the repo only as a reference/template and for seeding the generated config.
Main config sections:
[credentials]API values[screenshot]options (used only for manual sends)[hotkeys]manual keyboard/joystick bindings[nvram]base NVRAM discovery folder (base_dir)[score-mode],[send-mode],[challenge]as needed
NVRAM monitor settings are internal defaults in code:
- Scan pattern:
**/pinmame/nvram/*.nv;*.nv - Live PinMAME: enabled
If you want to run from source instead of the packaged artifacts:
pip install -r requirements.txt
python3 main.py --register --machine-id YOUR_MACHINE_ID
python3 main.pyOptional explicit config path for development/testing only:
python3 main.py --config /path/to/config.iniThe nvram-maps/ directory contains JSON map files that describe how each
pinball ROM stores scores and game state inside its non-volatile RAM (.nv
files).
This program makes use of content from the Pinball Memory Maps project, licensed under the GNU Lesser General Public License v3.0 (LGPL-3.0).
The upstream map files are included unmodified where available. A local fork is maintained here for two reasons:
- Extended maps — some ROMs required for VPinLeaders are not yet covered
by the upstream project, or need additional
game_statefields (live ball, player and score tracking) that go beyond its current scope. - Custom conventions — a few maps deviate slightly from the upstream
format to accommodate edge cases specific to this client (e.g. live RAM
addresses vs.
.nvfile offsets for the Frida memory-polling path).
The intention is to upstream all compatible additions back to the tomlogic/pinmame-nvram-maps project once they are stable and conform to its file-format conventions.
List supported ROMs:
python3 main.py --list-romsList high scores for one ROM (offline from .nv file):
python3 main.py --list-highscores afm_113bOptional alternate NVRAM base dir:
python3 main.py --list-highscores afm_113b --base-dir /path/to/nvram-root