Skip to content

What it is made of

vPinOps is one program: a native desktop app written in C# on .NET 10, with a small web server inside it. The wheel you see on the cabinet and the OpsLink page you open on your phone are the same process — which is why OpsLink needs nothing installed anywhere and no account with anyone.

Language and runtimeC# on .NET 10One codebase for Windows, macOS and Linux
InterfaceAvalonia 12Native windows, not a browser
The OpsLink serverKestrel, minimal APIsRuns inside the app, on your network only
Game controllersSDL 3The same library Visual Pinball itself uses
Video on the wheelthe platform’s own decoderAVFoundation on macOS, Media Foundation on Windows
Typefacesfive open-licence fontsShipped with the app so it looks the same everywhere

Everything else is the .NET standard library.

Three things decided it, and they are the three things a pinball front end actually needs.

Cross-platform, from one codebase. vPinOps runs on Windows, macOS and Linux, and they are not three ports of one idea — they are the same program. One command on a Mac produces a finished Windows build, so a fix can be written and be on the cabinet minutes later, with no second machine and no second toolchain in the way.

Owning its own windows. This is the part a front end lives or dies on. A cabinet needs a playfield window on one display, a backglass on another and a DMD on a third — each staying exactly where it was put, above everything else, covering the desktop and the menu bar and the taskbar, and giving the keyboard back cleanly when a table quits. That is ordinary work for a native toolkit and a fight against anything built on a browser engine. Every fault the front ends before this one were judged on traces back to not owning them.

One look, everywhere. The wheel, its typefaces, the glass bar, the colours — all of it is drawn by vPinOps rather than by whatever the operating system happens to provide. Your cabinet looks the same whichever platform it runs on, and a theme is a set of values rather than three sets of platform quirks.

The whole app depends on three third-party packages — Avalonia, its desktop backend and its Fluent theme — plus SDL 3, which ships beside the binary so a controller works before anything is configured. The core library that does the actual work — finding tables, reading media, planning an import, writing Visual Pinball’s settings — has none at all.

That is deliberate. The aim is a front end that stays light, unpacks anywhere and behaves the same on all three platforms, and every extra dependency works against all three of those at once.

Controllers, and the same library as the table

Section titled “Controllers, and the same library as the table”

Controllers are read through SDL 3 — the same library Visual Pinball itself uses. That matters more than it sounds: the front end and the table are reading your cabinet the same way, so a controller Visual Pinball can see is one vPinOps can see, and a controller neither can see is a wiring problem rather than a mystery about which program is right.

Playfield videos on the wheel are decoded by whatever the machine already has — AVFoundation on macOS, Media Foundation on Windows. No video library is bundled and none is installed.

vPinOps carries five typefaces — Archivo, Barlow, Bebas Neue, Cinzel and Oswald — all under the SIL Open Font License, with their licences included.

Carrying fonts looks like weight for nothing until you have seen the alternative. The wheel used to ask for typefaces that exist on macOS and do not exist on Windows. A missing font does not produce an error — it silently substitutes another one. The result was a cabinet that did not look like the machine it was set up on, with nothing anywhere reporting a problem. Shipping the fonts makes the wheel look the same on every machine, which is the whole point of a cabinet front end.

There is no account, no server of ours, and no telemetry. OpsLink is served by the app itself over your own network, and the only things that ever leave your machine are the table-identification and artwork lookups you ask for during an import — and those are optional. A cabinet in a basement with no internet works.

Measured on the current builds and rounded, because it moves with every one:

you downloadon your disk
Linux~65 MB~145 MB
macOS~65 MB~155 MB
Windows~95 MB~255 MB

There is no installer and nothing goes into a system folder. Unpacking is installing, deleting the folder is uninstalling, and your tables and settings live somewhere else entirely so neither touches them.

These pages are Astro with Starlight, built from the same repository as the app and published as static files. No database, no analytics, nothing to sign in to.