web-unified-docs and how the system serves the right content to users.
Which products are versioned
The following table lists whether each product in the repository uses versioned content directories.| Product | Directory | Versioned |
|---|---|---|
| Boundary | ./content/boundary | Yes |
| Consul | ./content/consul | Yes |
| HCP | ./content/hcp-docs | No |
| Nomad | ./content/nomad | Yes |
| Sentinel | ./content/sentinel | Yes |
| Terraform | ./content/terraform | Yes |
| Terraform CDK | ./content/terraform-cdk | Yes |
| HCP Terraform agents | ./content/terraform-docs-agents | Yes |
| Terraform Enterprise | ./content/terraform-enterprise | Yes |
| Terraform Plugin Framework | ./content/terraform-plugin-framework | Yes |
| Terraform Plugin SDK | ./content/terraform-sdk | Yes |
| Vault | ./content/vault | Yes |
| Well-architected framework | ./content/well-architected-framework | No |
Directory-based versioning
For versioned products, thecontent/<product> directory contains one subdirectory per supported version. All documentation, navigation data, and redirects for that version live inside the version folder.
Version naming conventions
Version directories use semantic versioning with a patch wildcard:v1.20.x, v2.0.x.
The .x suffix indicates that the folder covers all patch releases for that minor version (e.g., v1.20.0, v1.20.1, v1.20.2).
Vault uses a date-based format for release branches (
vault/YYYYMM), but the content directory naming still follows the vX.Y.x convention.Latest version vs. pinned versions
The latest version is the most recently released version of a product. Its documentation is served at the unversioned URL:web-unified-docs API determines which version folder maps to the “latest” label.
When editing published documentation for the current or a previous release, make your updates in the corresponding version folder. If you need to update multiple versions, update each version folder separately.
Version metadata API
Theweb-unified-docs API exposes version metadata to the dev-portal front end, which uses it to populate the version picker. The API reads the list of available version directories for each product and returns them as ordered version metadata.
The productConfig.mjs file in the repository root configures how each product’s versions are discovered and sorted:
semverCoerce function normalizes version strings so that the API can sort versions correctly even when directory names use the vX.Y.x patch-wildcard format.
Difference from the old branch/tag approach
Prior toweb-unified-docs, many HashiCorp products maintained versioned documentation in separate Git branches or tags within their product repositories. Each version lived on a branch like stable-website or a tag like v1.19.0.
The unified approach replaces this with directory-based versioning in a single repository:
| Old approach | New approach |
|---|---|
| One Git branch per version | One directory per version in content/<product>/ |
| Versioned content spread across multiple repos | All versioned content in web-unified-docs |
| Branch-level redirects | Per-docset redirects.jsonc files |
| Version metadata from Git tags | Version metadata from directory names via productConfig.mjs |