Install on Linux
Linux covers ordinary desktops and dedicated cabinets — one build, not a special one.
Install it
Section titled “Install it”-
Download the Linux build from Releases and unpack it —
~/vpinops/app/is the suggestion, and nothing looks for it in a fixed place.It carries its own runtime. There is no .NET to install first, and nothing is added to your system — it ran on a machine that had never had .NET on it.
-
Run
./vPinOps.It creates
~/.vpinops/on this first run: your config, your run log, and a generated OpsLink password. Nothing is installed system-wide and nothing needs root. -
Open Settings from the tray icon and check the network.
That window does one job: it makes OpsLink reachable. Port, password and Listen on — that is everything this window holds, deliberately, because those three are exactly what you cannot fix from a phone that cannot connect.
Leave all three as they are unless something else already wants port
7833. -
Check your phone can reach it.
The run log names the address every time it starts. Open it in any browser on the same network and sign in with the password from
~/.vpinops/remote-password, then change it in Settings. More: connecting to OpsLink.If the machine answers itself but nothing else can reach it, that is your firewall — whatever your distribution uses (
ufw,firewalld,nftables), port 7833/tcp on the local network is what OpsLink needs. That is a decision about your machine’s security, so it is yours to make. -
In OpsLink, open Settings and point it at your stuff.
Settings → Where your stuff lives. Press Fill these in for me and it fills in the suggested layout for you:
- Tables →
~/vPinOpsData/tables - VPX settings →
~/vPinOpsData/visualpinball - PinMAME and Your content as well
Then set VPX yourself — point it at
~/vPinOpsData/visualpinball/app/VPinballX_BGFXusing Browse…. The button deliberately leaves this one alone: vPinOps does not install Visual Pinball, so it will not write a path to a file it has not checked is there. It is also the one path you cannot skip — without it the page says Not ready to play.Change any of them — nothing refuses to work if you ignore the suggestion. Nothing is saved until you press Save settings, and folders under your content root are created for you when you do.
- Tables →
-
Now put some tables in it.
That works the same on every platform, so it lives in one place: Importing.
Building a dedicated cabinet
Section titled “Building a dedicated cabinet”Two things decide whether a Linux cab works, and neither is your distribution.
1 · Use a normal user account with auto-login. Not a daemon account.
Section titled “1 · Use a normal user account with auto-login. Not a daemon account.”A daemon account — a systemd service, a nologin shell, no session — can serve OpsLink perfectly
well, because that is just an HTTP listener. What it has no way to do is put a window on a
display, because there is no graphical session for it to put one in. That is how Linux works
rather than anything about vPinOps.
⇒ So if you want vPinOps to play tables, give it a logged-in graphical session. A normal user with auto-login is exactly that, and it needs no privileges of any kind.
Auto-login is a setting in your display manager, not in vPinOps:
| GDM | /etc/gdm3/custom.conf, the [daemon] section |
| LightDM | /etc/lightdm/lightdm.conf |
| SDDM | /etc/sddm.conf |
Most desktops also expose it in their own Settings → Users panel, which is the easier route.
Then make vPinOps start with that session — your desktop’s Startup Applications, or a .desktop
file in ~/.config/autostart/.
vPinOps does not write your display manager’s config, and it never will. Those files need root, they differ on every distribution, and a front end that edits them is a front end that breaks somebody’s login. We document it; you choose it.
2 · Wayland or X11
Section titled “2 · Wayland or X11”If something lands on the wrong screen, the useful things to tell us are which desktop you use, whether you are on Wayland or X11, and what the run log said.
What ended up on your disk
Section titled “What ended up on your disk”~/vpinops/app/ the program. Ours. Replaced wholesale when you update.~/vPinOpsData/ your content. Never touched by an update. tables/ one folder per table pinmame/ the shared ROM fallback .inbox/ tables sent from another device land here visualpinball/ Visual Pinball's own settings visualpinball/app/ Visual Pinball itself~/.vpinops/ your config, your run log, your OpsLink passwordSame rule as everywhere: ours versus yours. The updater writes only inside app/, and the
content root is never inside the install root — so an update cannot reach your library and
uninstalling is deleting a folder.
Where things are
Section titled “Where things are”| The program | wherever you unpacked it — ~/vpinops/app/ is the suggestion |
| Your content | ~/vPinOpsData/ |
| Config | ~/.vpinops/config.json |
| Run log — read this first when anything is wrong | ~/.vpinops/last-run.log |
| OpsLink password | ~/.vpinops/remote-password |
| Uploads waiting to be imported | ~/vPinOpsData/.inbox |
What is not here yet
Section titled “What is not here yet”- Starting a table without a mouse, on Wayland. See the warning above — this is the blocker, and it is Visual Pinball’s, not ours.
- Desktops other than KDE. Testing here is on KDE Plasma. Nothing about GNOME, Xfce or the wlroots compositors is known to be broken — and nothing about them is known to work either. A tiling compositor actively manages window geometry, so it may well fight a cabinet layout.
- A mixed-DPI cabinet. Every display on the machine this was measured on runs at scale 1, so a Linux cab with displays at different scales has never been exercised.
- Visual Pinball’s own screen setup, which is the fiddly half. vPinOps is the easy part; getting Visual Pinball to put each window on the display you meant is where the work is. It matches displays on a name that comes from SDL, which is not always the connector name your desktop settings show you. If a surface opens on the wrong screen, start there rather than with the front end.
- The machine’s own volume. vPinOps reads and sets the system output volume on macOS with no
permission at all; on Linux that needs
pactloramixerand is unbuilt. The control is shown with its reason rather than hidden, so you are told why it is unavailable instead of wondering. - Steam games. Native Steam keeps its registry somewhere neither of the other platforms looks, so Pinball FX is a separate unknown here.
- A packaged build. It is a folder you unpack; there is no
.deb, no.rpm, no Flatpak.