Built on VyOS#
Wheelhouse is built on VyOS, which is free software under the GNU
General Public License, version 2, on a Debian base. The kernel, nftables, FRR, Kea,
pdns-recursor, WireGuard, strongSwan, OpenVPN, Podman and the configuration tree they all
read are VyOS' work. Wheelhouse adds four things — the agent, the web UI, the installer and
the app catalogue — and each of them is a separate program that drives VyOS over its
documented HTTP API and its op-mode commands. Below: where that line is drawn, which base
each image is built from, and what upstream cannot express.
What the base provides#
Everything in this column exists because VyOS built it, and the product would not be possible without it.
| From VyOS | What Wheelhouse does with it |
|---|---|
A transactional configuration tree: set → staged diff → commit → commit-confirm → versioned revisions → rollback | The Commit Bar, the staged diff, the confirm window and the revision list are this mechanism, driven from a browser |
Linux kernel networking: nftables, tc and CAKE, in-kernel WireGuard, VLANs, bridges, bonds, tunnels | The Firewall, QoS, Interfaces and VPN pages read and write it through the tree |
| FRR: BGP, OSPF, IS-IS, BFD, VRRP | The routing and high-availability pages |
| An HTTP API over the whole configuration tree | The agent's only way in. It posts form-encoded requests to the REST endpoints |
Op-mode commands (show …) | Operational state: counters, conntrack, routes, leases, certificates |
Podman containers as configuration objects (set container …) | The app catalogue. An app install is a configuration diff, which is why it rolls back |
| A Debian base | The agent ships as a plain .deb, and the drivers are Linux drivers |
The REST endpoints stay off until service https api rest is set, which first boot does.
A router that has not had it set answers 404 {"detail": "Not Found"} to everything, and
the agent says so rather than reporting an empty router.
What Wheelhouse adds#
wheelhouse-agent— a single Go binary, run by systemd as root. Staging, native commit-confirm, revision rollback, an attributed audit log, parsed operational state, a telemetry WebSocket, accounts with Argon2id and TOTP, four roles enforced per route, scoped API tokens, OIDC single sign-on, Prometheus metrics, TLS, and the web UI served from the directory--ui-dirnames,/usr/share/wheelhouse/uion the appliance.- The web UI — a React single-page application. Every page edits what it shows through
forms, every pending change reads as a sentence before it is applied, and Advanced mode
shows the
setanddeletelines behind each one. - The installer —
wheelhouse-installand its unattended path, plus the OPNsense importer that turns aconfig.xmlinto VyOS commands and a report. - The console tools —
wheelhouse-rescue, which the medium's rescue boot entry lands on, andwheelhouse-support, which collects a redacted diagnostic archive. Both are Wheelhouse programs that read and write the agent's own files and drive the base's CLI from outside it. - The app catalogue — container entries declared in the router's own configuration tree, and three built-in feature modules.
- The licence — offline-verified subscription keys gating the write plane only.
None of it is derived from VyOS or from any other GPL work.
Where the boundary sits#
agent/ and ui/ are separate processes from every GPL component. The agent links
against no VyOS code and copies none. No file in the repository is derived from vyos-1x,
FRR, Kea, pdns-recursor, nftables or the kernel. Four rules keep it that way, in order
of importance:
- No GPL or AGPL code is copied into
agent/orui/. Not a function, not a parser, not a constant table. Where behaviour is needed that exists in a GPL project, it is called or reimplemented from its documented behaviour. - Permissive only for compiled-in dependencies: MIT, BSD-2/3, ISC, Apache-2.0. Anything weak-copyleft needs a recorded decision first; anything strong-copyleft is out — Third-party licences.
- Patches to GPL components get published. Wheelhouse patches exactly one GPL file today, in the build tooling — see below.
- The trademark is separate from the licence. See Trademarks.
The GPL parts of a Wheelhouse image are ordinary, unmodified upstream packages, and you can obtain their source — Corresponding source. The agent, the UI and the installer are proprietary and their source is not offered — The Wheelhouse licence.
Which base an image is built from#
Images are self-built. The build clones vyos-build, resets it to a pinned commit,
applies the branding, drops the Wheelhouse .deb into packages/ and runs upstream's own
build-vyos-image inside upstream's own build container.
| What | Value |
|---|---|
| Repository | https://github.com/vyos/vyos-build (VYOS_BUILD_REPO) |
| Branch | rolling (VYOS_BRANCH). Upstream renamed current to rolling in 2026 |
| Commit | Pinned in the script: b365961c7513f05e74126924f48873776ed47c1d. VYOS_COMMIT=head follows the branch instead and prints a warning that the result must not be shipped |
| Build container | vyos/vyos-build:rolling, with the digest actually pulled recorded in the source record |
| Flavor | A VyOS build flavor file, rendered with the version and the base substituted in |
The base is a rolling release with no snapshots: the apt repository it installs from
moves, so two builds a week apart are not the same image. The exact package versions of a
given build are recorded in SOURCES-<version>-amd64.txt and in /var/lib/dpkg/status on the
image itself. That record, not the pin, is what identifies a build.
The base version is written into /etc/os-release as VYOS_VERSION, in the form
<branch>@<commit>. Three places on a running router will tell you what you are on:
cat /etc/os-release # NAME, ID=wheelhouse, ID_LIKE="vyos debian", VYOS_VERSION
show version # VyOS' own op-mode commandand the console banner's last lines, which print Built on VyOS <version> above every
login prompt.
The one GPL file Wheelhouse changes#
Not in the image — in the build tooling. The image build applies three substitutions to
vyos-build's own scripts/image-build/build-vyos-image:
--iso-application "VyOS" -> "Wheelhouse"
--iso-volume "VyOS" -> "WHEELHOUSE"
hostname=vyos -> hostname=wheelhouseEach substitution asserts that the string it replaces is really there and fails the build
if it is not. The resulting diff is published with every release as
vyos-build-wheelhouse-<version>-amd64.patch, is named in the source record, and the build fails
if that diff comes out empty. Everything else Wheelhouse contributes to the image is added
as new files — the flavor, two branding hooks, the boot splash, the documents under
/usr/share/doc/wheelhouse/ and the agent package — and none of them is derived from
upstream's.
What the image changes about identity#
| Change | Why |
|---|---|
/etc/os-release becomes Wheelhouse's, keeping ID_LIKE="vyos debian" and VYOS_VERSION | So monitoring, hostnamectl and Ansible facts see both the product and the base |
| The boot splash, the boot menus and the console banner are Wheelhouse's own | None of VyOS' artwork is redistributed in the image |
| Both bootloaders gain Rescue an installed Wheelhouse system, cloned from each live entry and appended last | Upstream's menu has no rescue path to rename, so this is added rather than rewritten. It is appended so that nothing's default changes, and the clone drops quiet because its messages are the reason it exists |
| The login banner is set in the default configuration | Without it, upstream's template renders its own welcome, logo and support links onto a machine sold as Wheelhouse. The upstream credit stays, one line, at the bottom |
/usr/share/vyos/EULA becomes a symlink to /usr/share/doc/wheelhouse/TERMS.txt | A release build otherwise installs VyOS Inc.'s commercial end-user agreement, which governs nothing you bought here. show license reads that path, so it prints the Wheelhouse terms |
VyOS' Secure Boot MOK certificate is removed from /var/lib/shim-signed/mok | It is a public certificate rather than a key, and it is not enrolled in firmware, but it is a trust anchor belonging to somebody else |
Removing those two files strips no required notice. Every licence and every copyright file
stays exactly where the packages put it, under /usr/share/doc/ — Third-party
licences.
The branding hook asserts ID=wheelhouse in /etc/os-release afterwards and fails the
build if the override stopped winning, so the failure mode is a build that stops rather
than an image that calls itself something it is not.
Platform gaps#
What the configuration tree cannot express, with the date it was checked and what Wheelhouse does about it today.
Trademarks, briefly#
VyOS is a registered trademark of Sentrium S.L. Wheelhouse is not affiliated with, endorsed by, certified by or supported by the VyOS project or Sentrium S.L. The images are self-built and rebranded per upstream's trademark policy with attribution intact, and support for this product comes from Wheelhouse — do not ask the VyOS project about it. The full position is on Trademarks.
See also#
- Corresponding source — how to get the source for every GPL and LGPL component in the image.
- Third-party licences — what is compiled into the agent and bundled into the UI, and under what terms.
- The Wheelhouse licence — what the proprietary half is licensed under.
- Roadmap — which of the gaps above are planned, and which are open questions.
- Wheelhouse and VyOS — which half of the box you are looking at, as a concept.
- The agent and the router — what actually talks to what.
- 1:1 NAT and QoS — the two pages where the gaps above are visible on screen.