Wheelhouse docs

About this documentation#

This site is static HTML generated from Markdown by one Python script with no dependencies. Every claim on a page has to be checkable in the source tree: each page records the files it was written from, and the build verifies that all of them are still there. Below: the mechanism, the conventions you will meet while reading, and what to do when you find something here that is wrong.

How the site is built#

One script reads the Markdown and writes one directory of HTML per page. It fails, and names the page, if any of these is true:

  1. a page's front matter has no title;
  2. an internal link points at a page that does not exist;
  3. a #fragment names a heading that is not on the target page;
  4. a page cites a file that is not in the checkout;
  5. a link uses a scheme outside http, https, mailto and the site's own five.

It warns about a missing description, an unknown callout type, an unclosed code fence, and any page whose total weight — HTML, CSS, JavaScript and the one self-hosted typeface — goes over 150 KB.

Anything the renderer does not recognise as Markdown is escaped rather than passed through, so raw HTML written into a page renders as text, and a javascript: or data: link is refused and logged. That is what lets the site be served under a content security policy of default-src 'none' with 'self' and nothing else.

What each page was checked against#

Every page carries a checked list in its front matter and an updated date beside it. Together they mean:

  • The list names the files the page was written from. Not a bibliography — the actual files someone opened before writing the sentences.
  • The build fails if one of them is gone. Each path is verified against the checkout on every build, so moving or deleting a cited file breaks the documentation build instead of quietly leaving a claim behind that nothing supports any more.
  • The date is when the claims were checked, not when a typo was fixed.

The list is not printed on the page. The source tree it names is private, so a file name in the middle of a paragraph about running a router points at something you cannot open; everything a page depends on is either described on the page itself or present on a running router. Pages in the development section still link into the source directly, because that section is written for someone working on it.

The rules these pages are written under#

  1. Open the file, then write the sentence. A claim that cannot be pointed at does not go on a page.
  2. A feature that does not exist is marked as not built, in words, in a callout that says so — never described in the present tense, never as "coming soon". Everything of that kind is collected on Roadmap.
  3. No invented contact details. Where a real address, company name or price does not exist yet, the page says so in plain words — "there is no published support address", "pricing is not published yet" — rather than filling the gap with something plausible or leaving a template marker on a published page. The machine-readable list of what is still outstanding lives in one unpublished file, site/OWNER-DECISIONS.md. There are no testimonials, no customer names and no team biographies anywhere on this site.
  4. Wheelhouse is built on VyOS and says so plainly — in this section, in both footers, with the attribution intact and the corresponding source linked. See Built on VyOS.

Conventions you will notice#

ConventionWhy
British spelling in prose — licence, catalogue, behaviourHouse style
Identifiers keep their own spelling — --license-key-file, catalog.json, the licensed fieldNever respell something you have to type
Router configuration commands are in plain text blocks, one command per line, no promptThey are neither shell nor a language with a lexer here
Shell commands are in bash blocks, with sudo exactly where the product's own documentation uses itSo a copied line behaves
Example addresses come from the documentation ranges (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) and RFC 1918; example domains are example.comNever a real address from anyone's network
Dates are ISO, versions are bare — 2026-09-02, 0.5.1 — except when naming a tag or a release directory, which are v0.5.1One format, no ambiguity
The audit log, the journal and the commit history are three different things and are never blurredThey are three different things

What this site needs from your browser#

  • Reading needs no JavaScript. The navigation tree, the table of contents, the breadcrumbs and every page's content are in the HTML. With scripting off, the navigation stays on the page rather than hiding behind a button that cannot open.
  • Search needs it. The index is built at build time and fetched from this host; the query never leaves your browser. Without JavaScript the field is disabled next to a note saying so. The index covers each page's title, headings, description, tags and its first 4000 characters.
  • Light and dark follow your system preference, with a toggle that remembers your choice in one browser-local key.
  • Nothing loads from anywhere else. One self-hosted typeface, a system monospace stack for code, about 11 KB of hand-written JavaScript and no third-party anything — Privacy.
  • Every page carries the commit it was built from in its footer, next to an "Edit this page" link into the forge, which needs a login the reader may not have.

Where else this material lives#

The same facts are maintained in the repository, versioned with the code that makes them true. Where this site and the code disagree, the code decides and the page is the bug.

This site is built from one branch and describes the current tree. There is no version selector and no archive of documentation for older releases — Release history is where a version's changes are recorded.

Reporting an error in a page#

There is no public issue tracker and the support address is not published yet — that gap is described on Support. When there is a route, the most useful report is three lines:

  1. the page's URL;
  2. the sentence that is wrong;
  3. what the code, the file or the router actually does.

Naming the file is usually the fastest way to show it: if a page describes a file, and that file now says something else, that is the whole report.

See also#

Updated 2026-09-03 meta documentation