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 upstreamref:to build from: a series ("8.x", resolved at build time to the newest stable tag in that series) for the current stable version, or an exact tag for a prerelease or a frozen older major.- 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 each version'sref:. The new version builds from its prerelease pin; the old version keeps tracking its series until it is frozen at GA.
_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. The new version pins an exact prerelease tag (a series never resolves to a prerelease); the old version keeps its"8.x"series ref so it still picks up 8.x point releases: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.x"
-
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
ref:s and publishes.
Do this when the new major becomes the stable release.
-
Port content drift from the old version. The Phase 1 copy is frozen at the moment it was made: edits merged to the old collection afterward are absent from the new one, and nothing surfaces them — they merge without conflict and the new collection's pages are simply older. Find the copy point (the commit that added the new collection) and list every old-collection change since:
git log $(git log --diff-filter=A --format=%H -1 -- docs/_openvox_9x/index.md)..master \ -- docs/_openvox_8x _data/nav/openvox_8x.yml
Port each relevant change onto the new collection — a path-rewritten apply usually works as-is:
git show <commit> -- docs/_openvox_8x | sed 's|_openvox_8x|_openvox_9x|g' | git applyReview ported content for version-specific prose, same as the Phase 1 sweep. Re-run this check immediately before merging the promotion PR; if a docs freeze is ever warranted, it only needs to cover the window between that final check and the merge.
-
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 switch 9.x from its prerelease pin to the"9.x"series ref so it tracks 9.x point releases. Leave the 8.x"8.x"series ref in place while 8.x still receives maintenance releases, so its generated reference pages keep tracking them. Freeze 8.x by replacing the series ref with its final 8.x tag once the last 8.x release has shipped (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.
The newest entries on the release-notes pages for OpenVox (the agent), OpenBolt, OpenVox Server, and OpenVoxDB are generated from the GitHub releases. Older entries are hand-written Markdown on the page itself.
rake references:release_notes writes _data/release_notes/<nav>.yml (for example
openvox-server_9x.yml) with one record for each stable release in the page's series
that is newer than its release_notes_after version in _data/products.yml.
_includes/release_notes.html renders the records, newest first, where the page
includes it. Each entry has:
- the heading, such as
## OpenVox Server 9.1.2 - the release date, which is the GitHub release's publication date in UTC
- the release type:
featurefor an x.y.0 release, otherwisebug-fix - the link to the GitHub release
- a collapsed table of the bundled components that changed since the previous release, from the openvox-sbom-tools SBOMs. The table appears once the SBOMs for both releases are merged there.
CI runs the task on every build, and falls back to the committed data files if the
GitHub API is unreachable, so a new release needs no docs PR. It appears with the
next production build. If nothing else is merging, start one from the
"Automatically publish new content" workflow's Run workflow button. To preview
locally, run bundle exec rake references:release_notes before jekyll build. The
generator and the highlights plugin have unit tests in spec/; run
bundle exec rake spec after changing them.
CVE tables are not generated yet. Until they are, add a hand-written
### Security Issues Resolved in <version> table to the release's highlights file.
Put anything a release needs beyond the generated text in
_release_highlights/<nav>/<version>.md, for example
_release_highlights/openvox-server_9x/9.1.2.md. The file is rendered after the
GitHub link, as part of that release's entry:
---
type: security
---
Notable changes in this release:
- The `openvox-server` package now requires `openvox-agent` 9.2.2 or later.- The front matter is optional.
typereplaces the generated release type. - Start with a paragraph or a list, not a heading. Use
###headings for sections inside the entry, as the hand-written entries do. - Keep to what readers need to act on or won't find on the GitHub release: package requirement changes, upgrade steps, links to related releases of other components.
- The build warns about a highlights file whose version has no generated entry, for example because of a typo in the file name.
- In
_data/products.yml, give the product arelease_notesblock with its GitHubrepoandsbompackage name, and setrelease_notes_afteron the version to the newest release that has a hand-written entry. - Add
{% include release_notes.html product="<name>" %}to the page above the first hand-written entry, where<name>is the product name used in the entry headings. - Run
bundle exec rake references:release_notesand commit the new data file.