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.
The short version
Section titled “The short version”| Language and runtime | C# on .NET 10 | One codebase for Windows, macOS and Linux |
| Interface | Avalonia 12 | Native windows, not a browser |
| The OpsLink server | Kestrel, minimal APIs | Runs inside the app, on your network only |
| Game controllers | SDL 3 | The same library Visual Pinball itself uses |
| Video on the wheel | the platform’s own decoder | AVFoundation on macOS, Media Foundation on Windows |
| Typefaces | five open-licence fonts | Shipped with the app so it looks the same everywhere |
Everything else is the .NET standard library.
Why C# and Avalonia
Section titled “Why C# and Avalonia”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.
What it pulls in
Section titled “What it pulls in”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.
Video is the platform’s job
Section titled “Video is the platform’s job”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.
The fonts ship with it
Section titled “The fonts ship with it”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.
Nothing in the cloud
Section titled “Nothing in the cloud”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.
What it costs you on disk
Section titled “What it costs you on disk”Measured on the current builds and rounded, because it moves with every one:
| you download | on 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.
And this site
Section titled “And this site”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.