Maintainer procedures for this site. For day-to-day content contribution and local preview, see CONTRIBUTING.md.
The site uses a copy-on-major-release model. Each major version of a product
lives in its own collection (e.g. docs/_openvox_8x/), and _<product>_latest is a
symlink to the current stable one. When a product ships a new major, you copy the
collection, register it, pin its references, and — once the new major is the stable
release — promote it to latest and freeze the old one. Products version
independently (OpenVox, OpenFact, and OpenBolt have generated references; OpenVox
Server, OpenVoxDB, Ecosystem, and OpenVox Containers are authored-only).
The example below adds OpenVox 9 alongside OpenVox 8; substitute product/version as needed.
- Collections —
docs/_<product>_<major>/, declared in_config.ymlunder bothcollections:(permalink) anddefaults:(which nav to use)._<product>_latestis a symlink to the current stable collection dir, so/<product>/latest/serves the same files as/<product>/<major>.x/. _data/products.yml— the version registry. Per product: alabel, which versionlatestaliases, and (for products with generated references) thereferences:rake task. Per version:id,label,collection,baseURL, and — for generated products — the exact upstreamref:tag to build from.- Navigation —
_data/nav/<key>.yml(sidebar trees),_data/nav_map.yml(which collections map to a nav key),_data/navigation.yml(top product bar). - Version selector — reads
products.yml; it appears automatically once a product has 2+ versions (so it stays hidden until the first cutover). - Reference docs — generated (not committed) by
rake references:allfrom the pinned tags. The new version builds from its pin; the old version stays frozen at its pin.
_config.ymlcollections can't be generated fromproducts.yml(Jekyll reads the config before_data), so they are hand-maintained — keep the two in sync.
Do this when the new major has a tag to build against (a prerelease/RC is fine), but
is not yet the stable release. latest stays on the current major.
-
Copy the collection and its nav file, and stage them so the sweep in step 2 sees all the authored content:
cp -r docs/_openvox_8x docs/_openvox_9x cp _data/nav/openvox_8x.yml _data/nav/openvox_9x.yml git add docs/_openvox_9x _data/nav/openvox_9x.yml
Generated reference pages are gitignored within the collection, so
git addstages only the authored content — andgit grepbelow then skips the generated pages automatically (they self-update from the new tag at build time). -
Sweep the copied authored content for version-specific strings and review each in context (page titles, prose, compatibility notes, "upgrading from N" pages, and the nav file's section headings and link text). Target the major you're leaving behind (here,
8):git grep -nE 'OpenVox 8|8\.x' -- docs/_openvox_9x _data/nav/openvox_9x.ymlDon't forget the nav file — its headings (e.g. "OpenVox 8 Platform") and link text ("Upgrading OpenVox 8") are authored strings that won't update on their own.
This is a review, not a blind find/replace. The hits fall into two kinds: straightforward current-version labels (page titles, "OpenVox 8 uses…") that bump to the new major, and version-specific content (e.g. "8.x still supports hiera 4 for backward compat", the release-notes list of 8.x releases, "upgrading from 8" paths) that needs rewriting or judgment for the new major — not a mechanical bump. Targeting the specific old major (rather than a generic
[0-9]+\.x) keeps out noise like Puppet / hiera / function-API versions in code examples. -
Register the collection in
_config.yml:# under collections: openvox_9x: output: true permalink: '/openvox/9.x/:path:output_ext' # under defaults: - scope: path: '' type: openvox_9x values: nav: openvox_9x
-
Wire up navigation. The nav file (
_data/nav/openvox_9x.yml) was already copied and swept in steps 1–2; adjust it further as the 9.x structure diverges (its links are relative, so they resolve under/openvox/9.x/...automatically). Then add a new entry to_data/nav_map.ymlwhosenav_keymatches thenav:default from step 3 (do not add the collection to the existing 8.x entry —nav: openvox_9xonly resolves against anav_key: openvox_9x):- nav_key: openvox_9x collections: openvox_9x base: /openvox/9.x/
Finally, add the new collection to OpenVox's entry in
_data/navigation.yml(the top product bar) so the "OpenVox" link is marked active on the new version's pages too:- title: OpenVox url: /openvox/latest/ collections: [openvox_latest, openvox_9x, openvox_8x] # add openvox_9x
-
Add the version to
_data/products.yml(newest first), keepinglatest: 8xfor now:openvox: label: OpenVox latest: 8x references: references:openvox versions: - id: 9x label: "9.x" collection: _openvox_9x base: /openvox/9.x/ ref: "9.0.0-rc1" # the prerelease/RC tag to build from - id: 8x label: "8.x" collection: _openvox_8x base: /openvox/8.x/ ref: "8.28.0"
-
Generate references and build locally to verify:
bundle exec rake references:all INSTALLPATH=docs bundle exec jekyll build bundle exec rake test:links
Confirm
/openvox/8.x/,/openvox/9.x/, and/openvox/latest/all render, and that the version selector now shows both9.xand8.x (latest).
Open a PR with these changes. On merge, CI regenerates both versions from their pins and publishes.
Do this when the new major becomes the stable release.
-
Repoint the
latestsymlink:ln -sfn _openvox_9x docs/_openvox_latest -
Point the
latestcollection's navigation at the new version. The/<product>/latest/pages belong to theopenvox_latestcollection, so their nav has to move from 8.x to 9.x:-
In
_config.yml, change theopenvox_latestdefaults scope fromnav: openvox_8xtonav: openvox_9x. -
In
_data/nav_map.yml, moveopenvox_latestinto the 9.x entry'scollectionsand update thebase:fields so the frozen 8.x entry points at its own URL and the 9.x entry owns/latest/:- nav_key: openvox_8x collections: openvox_8x base: /openvox/8.x/ - nav_key: openvox_9x collections: openvox_9x|openvox_latest base: /openvox/latest/
-
-
In
_data/products.yml: set the OpenVoxlatest:to9x(a targeted per-product edit — don't sweep every product'slatest:), and freeze 8.x by pinning itsref:to its final 8.x tag (so the frozen collection stays reproducible). -
No-redirect check: the site has no redirect mechanism. Once
latestpoints at 9.x, any page removed or renamed in 9.x will 404 at/openvox/latest/<page>forlatestbookmarks (the content still lives at/openvox/8.x/<page>). Diff the 8.x vs 9.x page sets and decide how to handle removed pages before promoting. -
Rebuild and verify:
/openvox/latest/now serves the 9.x content,/openvox/8.x/stays frozen, and the version selector marks 9.x aslatest.
To back out a cutover: repoint the _<product>_latest symlink to the previous
collection, revert the _config.yml / nav_map.yml / products.yml / _data/nav
changes, and remove the new docs/_<product>_<major>/ directory.