KubeVirt Documentation Analysis
Introduction
This document is an analysis of the effectiveness and completeness of the open source software (OSS) project's documentation and website. It is funded by the Cloud Native Computing Foundation (CNCF) as part of its overall effort to incubate, grow, and graduate open source cloud native software projects.
According to CNCF best practices guidelines, effective documentation is a prerequisite for program graduation. The documentation analysis is the first step of a CNCF process aimed at assisting projects with their documentation efforts.
AI assisted analysis
The following parts of this analysis were generated by AI:
- Overall comments, following the section heading, on the areas in that section.
- Answers to the criteria questions for an area.
- Comments, including strengths and weaknesses, for an area.
- Recommendations for improvements in each area.
Purpose
This document was written to analyze the current state of KubeVirt's documentation. It aims to provide project leaders with an informed understanding of potential problems in current project documentation. A second implementation document outlines an actionable plan for improvement. A third document, the issues list, contains issues to be filed in the project documentation repository so that contributors can take them up.
This document:
- Analyzes the current KubeVirt technical documentation and website
- Compares existing documentation against the CNCF’s standards
- Recommends a program of key improvements with the largest return on investment
Scope of analysis
The documentation discussed here includes the entire contents of the website, the technical documentation, and documentation for contributors and users on the KubeVirt GitHub repository.
The KubeVirt user guide is written in Markdown and built with MkDocs using the
Material for MkDocs theme. The main website is a Jekyll site. Both are published
to GitHub Pages by Prow jobs, and Netlify provides pull-request previews for the
user guide. The sources are stored in the kubevirt/user-guide and
kubevirt/kubevirt.github.io repositories.
In scope
- Website: https://kubevirt.io
- Documentation: https://kubevirt.io/user-guide
- User guide repo: https://github.com/kubevirt/user-guide
- Website and labs repo: https://github.com/kubevirt/kubevirt.github.io
Out of scope
- Other KubeVirt GitHub repositories, except where their documentation or
processes affect the user guide (for example,
kubevirt/kubevirtandkubevirt/community).
How this document is organized
This document is divided into three sections that represent three major areas of concern:
- Project documentation: concerns documentation for users of the KubeVirt software, aimed at people who intend to use the project software.
- Contributor documentation: concerns documentation for new and existing contributors to the KubeVirt OSS project.
- Website & Infrastructure: concerns the mechanics of publishing the documentation, and includes branding, website structure, and maintainability.
Each section begins with the summary ratings of the areas of the section, based on a rubric with appropriate criteria for the section.
Each area in a section has the following areas of analysis:
- Comments, includes answers to criteria questions, strengths and weaknesses, Provides observations about the existing documentation, with a focus on how it does or does not help KubeVirt users achieve their goals.
- Each section has a Recommendations section that covers each of its areas. Provides suggested changes that would improve the effectiveness of the documentation.
The accompanying implementation document breaks the recommendations down into concrete actions that can be implemented by project contributors. Its focus is on drilling down to specific, achievable work that can be completed in constrained blocks of time. Ultimately, the implementation items are decomposed into a series of issues and entered on GitHub.
(Provide link when available)
How to use this document
Readers interested only in actionable improvements should skip this document and read the implementation plan and issues list.
Readers interested in the current state of the documentation and the reasoning behind the recommendations should read the section of this document pertaining to their area of concern:
Examples of CNCF documentation that demonstrate the analysis criteria are linked from the criteria specification.
Recommendations, requirements, and best practices
This analysis measures documentation against CNCF project maturity standards, and suggests possible improvements. In most cases there is more than one way to do things. Few recommendations here are meant to be prescriptive. Rather, the recommended implementations represent the reviewers' experience with how to apply documentation best practices.
In RFC terms, the changes described here should be understood as "recommended" or "should" at the strongest, and "optional" or "may" in many cases. Any "must" or "required" actions are clearly denoted as such, and pertain to legal requirements such as copyright and licensing.
Project documentation
KubeVirt is an incubating project of CNCF. This means that the project should be developing professional-quality documentation alongside the project code.
| Criterion | Rating (1-5) |
|---|---|
| Information architecture | 3 - Meets standards |
| New user content | 3 - Meets standards |
| Content maintainability | 3 - Meets standards |
| Content creation processes | 3 - Meets standards |
| Inclusive language | 4 - Meets or exceeds standards |
The KubeVirt user guide meets the standard for an incubating project across every area and exceeds it on inclusive language. Its feature coverage is deep, its top-level structure is sensible, the toolchain is lightweight, and documentation is coupled to the release process so that new features land with their pages. The guide's problems are not gaps in what it covers but gaps in how it guides readers and contributors through it.
Three themes recur across the areas:
- No guided path. The guide reads as a well-organized encyclopedia. New users must assemble the install-to-first-VM sequence from five pages in two sections, and the oldest foundational pages contradict the VirtualMachine-first approach used elsewhere. Both the information architecture and new user content areas rate this as the most important weakness.
- Uneven page age. Older pages use
$-prefixed code blocks, reference manifests that are never shown, carry legacy distribution content, and use the most minimizing language. Newer pages are clean and pasteable. The gap shows up in new user content, information architecture, and inclusive language alike. - Implicit process and ownership. The release checklist makes documentation happen, but nothing explains who reviews, how release branches are meant to be used, whether the site will ever be versioned, or what a good page looks like. Content maintainability and content creation process both trace their weaknesses to this missing written guidance.
The project does two things well enough to point to as examples: feature developers document their own features in the same release cycle because the pull request template and VEP checklist require it, and the project's own names, commands, and feature gates are free of non-inclusive terms.
The following sections contain assessments of each element of the Project Documentation rubric.
Comments
Information architecture
The overall structure (pages/subpages/sections/subsections) of your project documentation. We evaluate on the following:
-
Is there high level conceptual content?
Yes. The Architecture page gives a conceptual overview of the KubeVirt stack, explains how CRDs, controllers, and node daemons extend Kubernetes, and describes each component (
virt-api,virt-controller,virt-handler,virt-launcher). Several feature pages open with a short overview before the procedure, for example Live Migration, Run Strategies, and VirtualMachine Templates.Conceptual content is thin at the section level. The Welcome page describes each top-level section in one line, but the Compute, Network, and Storage sections have no landing or overview page that explains how their pages relate or which one a reader needs first. The User Workloads section relies on the two-paragraph Basic Use page and the Lifecycle page for its conceptual framing.
-
Is the documentation feature complete?
Mostly. The guide covers the core VirtualMachine and VirtualMachineInstance lifecycle, instance types and preferences, pools, replica sets, templates, live migration, hotplug of CPU, memory, volumes, and interfaces, snapshots and restore, clone, export, network binding plugins, feature gates, node maintenance, confidential computing, and debugging. The Arm64 pages document per-architecture device and feature-gate status.
Some recently released features have no page. The v1.9.0 release notes describe the
VirtualMachineBackupAPI, theCrossArchitectureVirtualizationfeature gate, masqueradePortRanges, and MigrationPolicy compression, but none of these terms appears outside the release notes. The new Plugins page exists incluster_admin/but is absent from the section.nav.yml, so it is reachable only from a link on the deprecated Hook Sidecar page. -
Are there step-by-step instructions documented for features in tasks and tutorials?
Yes, for most features. Pages such as Accessing Virtual Machines, Creating VirtualMachines by using virtctl, Live Migration, Hotplug Volumes, and Snapshot and Restore API pair a short explanation with manifests and commands the reader can run. The Debug page and the Virtualization Debugging section walk through log verbosity, privileged node debugging, and launching QEMU under
straceandgdb.The guide does not contain a tutorial of its own. The Quickstarts page and Welcome page link out to Killercoda scenarios, kubevirt.io quickstarts, and kubevirt.io labs for the guided "install, create a VM, connect to it" experience.
-
Are there any key features that are documented but missing task documentation?
Yes. Basic Use lists four
kubectlcommands and states that the following pages describe how to use the API, but it does not include a samplevmi.yamlor link to a page that does. Lifecycle showskubectl create -f vmi.yamlwithout a manifest. The Architecture page describes components without linking to the operational pages that configure them. The Plugins page describes domain hooks and node hooks at Alpha but is not integrated into the navigation. -
Is the "happy path" (most common use case) documented?
Partially. Installation,
virtctlinstallation, creating a VirtualMachine withvirtctl create vm, starting and stopping it, and connecting over console, VNC, or SSH are all documented. However, these steps sit on five different pages across two sections, and no single page strings them together for a first-time reader. The Welcome page delegates that path to external labs. -
Are tasks clearly named according to user goals?
Mixed. User Workloads pages use goal-oriented names such as "Creating VirtualMachines by using virtctl", "Accessing Virtual Machines", and "Boot from external source". Many Compute, Network, and Storage pages are named for the feature or API rather than the task, for example "Clone API", "Export API", "Snapshot Restore API", "Migration Controller", "CSI Overlay", and "Virtual Hardware". Cluster Administration mixes both styles ("Activating and deactivating feature gates" next to "KSM" and "Scheduler").
-
If the documentation doesn't suffice, is there a clear escalation path for users needing more help? (FAQ, Troubleshooting)
Partially. The Welcome page has a Getting Help section that links to the GitHub issue tracker, the kubevirt-dev mailing list, and the Kubernetes Slack channel. The Virtualization Debugging section is the closest thing to troubleshooting content and is aimed at developers and advanced users.
There is no FAQ and no user-facing troubleshooting page that lists common symptoms (VMI stuck in
Scheduling, migration failures, console access errors) with causes and fixes. Troubleshooting notes exist but are scattered inside individual feature pages such as Accessing Virtual Machines ("Debugging console access") and Memory Dump. -
If the product exposes an API, is there a complete reference that includes documented CLIs as applicable?
Partially. The Welcome page links to the generated API reference at kubevirt.io/api-reference, and individual pages deep-link into it where relevant. There is no
virtctlcommand reference in the guide. Thevirtctlpage covers only download and installation, and command usage is distributed across feature pages (create vm,start,stop,pause,migrate,addvolume,vnc,ssh,port-forward). Feature gates are documented by procedure but the guide does not maintain a list of gates and their stages; the release notes are the only place that records graduations. -
Is content up to date and accurate?
Largely, with visible legacy pockets. Recently updated pages carry version-stamped feature-state banners (VirtualMachine Templates, Hook Sidecar, Hotplug Volumes), and deprecated mechanisms such as presets, the OpenShift-based Templates page, and the Hook Sidecar are labeled and point to replacements. Release notes extend to v1.9.0.
Older content shows its age. Installation still documents installing from the OKD Service Catalog as an Ansible Playbook Bundle and installing on k3OS, and links to OpenShift 4.10 documentation. Basic Use and Lifecycle were last touched in May 2024 and still frame VirtualMachineInstance as the primary object, while the rest of the guide and
virtctl create vmcenter on VirtualMachine.compute/windows_virtio_drivers.mdis a byte-identical, unlisted duplicate ofuser_workloads/windows_virtio_drivers.md. -
Does the documentation need restructuring?
Not a full restructure. The 2024 move from a flat
operations/andvirtual_machines/layout into audience- and layer-based sections (Cluster Administration, User Workloads, Compute, Network, Storage) with explicit.nav.ymlordering and redirects is sound. The remaining problems are within sections rather than between them:- The User Workloads section mixes lifecycle basics, Windows guidance, monitoring, and a "Workloads" sub-group of nine pages that includes deprecated presets and both template mechanisms.
- The long Compute and Storage lists have no internal grouping or landing page.
- Five pages exist outside the navigation.
- Release Notes, a 3,000-line page, sits in the main navigation between Storage and Contributing.
Comment
Strengths:
- Audience- and layer-based top-level sections with explicit, intentional page ordering.
- Redirects preserve old
operations/andvirtual_machines/URLs after the reorganization. - Consistent feature-page pattern: concept, feature-state banner, then manifests and commands.
- Deprecated features (presets, OpenShift templates, Hook Sidecar) are labeled and link to replacements.
- Per-architecture (Arm64) device and feature-gate status pages.
- Deep, multi-level debugging content for advanced users.
Weaknesses:
- No end-to-end getting-started path inside the guide; the happy path is spread across five pages and external labs.
- Basic Use and Lifecycle are dated and VMI-centric, contradicting the VirtualMachine-first guidance elsewhere.
- No consolidated
virtctlcommand reference or feature-gate table. - No FAQ or user-facing troubleshooting page.
- Several v1.9 features (VirtualMachineBackup, CrossArchitectureVirtualization, PortRanges, migration compression) appear only in release notes; the Plugins page is orphaned from navigation.
- Compute and Storage sections are flat lists with API-style names and no landing page.
- Legacy installation content (OKD Service Catalog APB, k3OS, OpenShift 4.10 links) and a duplicate Windows virtio drivers page remain.
Rating: 3 - Meets standards
New user content
New users are the most avid users of documentation, and need content specifically for them. We evaluate on the following:
-
Is "getting started" clearly labeled? ("Getting started", "Installation", "First steps", etc.)
Partially. There is no page or navigation entry titled "Getting Started" or "First steps." New-user entry points are instead spread across a top-level "Quickstarts" item, an "Installation" page (the first page under Cluster Administration), and a "Try it out" section on the homepage. "Installation" is clearly labeled, but without a single, conventionally named getting-started landing page the on-ramp is harder to find than it needs to be.
-
Is installation documented step-by-step?
Yes.
cluster_admin/installation.mdlists prerequisites and then provides copy-pasteable, ordered commands to deploy the KubeVirt operator, create the KubeVirt CR, wait for the components to become available, and verify the running pods. It also covers optional steps such as software emulation fallback and node-placement restrictions. -
If needed, are multiple OSes documented?
Partially. Because KubeVirt is a Kubernetes add-on, the installation guide documents multiple Kubernetes platforms (Kubernetes, OKD, k3OS) and both the x86_64 and Arm64 architectures, rather than host operating systems. Host-OS-specific concerns are limited to AppArmor and SELinux notes. Guest operating systems such as Windows and Linux are documented separately under User Workloads. There is no per-Linux-distribution installation walkthrough, which is reasonable for a cluster add-on.
-
Do users know where to go after reading the getting started guide?
Partially. The Installation page ends with optional topics (network plugins, node placement) rather than an explicit "Next steps" pointer to creating a first virtual machine. Users must find their own way to User Workloads pages such as Basic Use or Creating VirtualMachines by using virtctl.
-
Is your new user content clearly signposted on your site's homepage or at the top of your information architecture?
Yes. The homepage lists all major sections and includes prominent "Try it out," "KubeVirt Labs," and "Getting help" sections, and "Quickstarts" appears near the top of the navigation. However, most of this new-user content is external (Killercoda scenarios, the minikube, kind, and cloud quickstarts, and the kubevirt.io labs), so the signposting leads users off-site quickly.
-
Is there sample code or other example content that can easily be copy-pasted?
Yes. The documentation makes extensive use of fenced and indented code blocks with ready-to-run examples, including installation shell commands,
virtctl create vminvocations,kubectllifecycle commands, and YAML manifests. These are formatted for direct copy-paste.
Comment
Strengths:
- Installation gives a correct, short operator-based procedure with expected output and a software-emulation fallback.
- The Welcome page links to live Killercoda scenarios, quickstarts for minikube, kind, and cloud providers, and four hands-on labs.
- Arm64 platform status is documented in a dedicated sub-section.
- Recently revised pages provide clean, pasteable manifests and
virtctlpipelines. - Requirements are stated up front, including
--allow-privileged=trueand hardware virtualization validation.
Weaknesses:
- No page labeled "Getting started" and no single in-guide path from install to first running VM.
- Installation mixes the core procedure with AppArmor, kernel compatibility, OKD, k3OS, developer builds, and node placement, and ends without a next step.
virtctlinstall covers only Linux amd64 viawget; macOS, Windows, and arm64 binaries andPATHsetup are not mentioned.- Basic Use and Lifecycle reference
vmi.yamlwithout providing it and do not link onward. - Older pages use
$-prefixed indented code blocks interleaved with output, and the copy button is not enabled. - The Quickstarts page has no introduction, prerequisites, or outcome statement.
Rating: 3 - Meets standards
Content maintainability & site mechanics
As a project scales, concerns like localized (translated) content and versioning become large maintenance burdens, particularly if you don’t plan for them. We evaluate on the following:
-
Is the documentation searchable?
Yes. The site uses the built-in MkDocs search plugin with the Material for MkDocs theme, so a search box appears in the header on every page and results are served from a client-side index built at deploy time.
mkdocs.ymlsets a custom separator that splits on hyphens, colons, and slashes while preserving version numbers likev1.9.0, which helps with identifiers such askubevirt.io/libvirt-log-filtersandvirt-handler.Search is confined to the user guide. The API reference at kubevirt.io/api-reference, the quickstarts and labs on kubevirt.io, and the release notes in the kubevirt/kubevirt repository are separate sites with their own or no search, so a user cannot search across the KubeVirt documentation set from one box. The theme's search enhancements (
search.suggest,search.highlight,search.share) are not enabled. -
Are there plans for localization/internationalization with regards to site directory structure? Is a localization framework present?
No. All content is English and lives directly under
docs/, with no language-code directory such asdocs/en/.mkdocs.ymldoes not configure the theme'salternatelanguage selector or thei18nplugin, and neither README nor CONTRIBUTING mentions translation. No open plans for localization are documented in the repository.The directory layout does not block a future effort. Content is plain Markdown organized by section, ordering is controlled by
.nav.ymlfiles, and redirects are centralized inmkdocs.yml, so a language-prefixed tree could be introduced later. The absence of a root language directory means that step would require moving every file and updating every redirect. -
Is there a clearly documented method for versioning of content?
No. The published site at kubevirt.io/user-guide is built from the
mainbranch and has no version selector; the only version indicators are a v1.9.0 release notes page and in-text "as of vX.Y" feature-state banners on about ten pages.mkdocs.ymlhas noextra.versionconfiguration and themikeversioning tool is not used.The repository does contain release branches (
release-v1.7-stable,release-v1.8-stable,release-v1.9-stable, and matching-develbranches for 1.7 and 1.8), and they have received commits, so a branching convention exists in practice. However, no document in the repository explains what those branches are for, whether they are published anywhere, how or when they are cut, or how contributors should decide whether a change needs a cherry-pick. README, CONTRIBUTING, and the Contributing page all describe the fork-and-PR flow againstmainonly.Release notes are maintained by a script (
update_changelog.sh) that regenerates the page from kubevirt/kubevirt tags, but that process is also undocumented outside the script itself.
Comment
Strengths:
- Lightweight, low-dependency MkDocs toolchain with search enabled on every page.
- Custom search separator tuned for hyphenated and dotted Kubernetes identifiers.
- Explicit
.nav.ymlordering and a centralized redirects map preserve URLs across reorganizations. - Makefile targets for local build, spell check, and link check.
- Release branches exist for recent minors, providing a foundation for versioned publishing.
Weaknesses:
- No published version selector; the live site tracks
mainonly. - No document describes the purpose, lifecycle, or publication status of the
release-vX.Y-*branches, or when to cherry-pick. - Version applicability is signaled inconsistently through ad hoc "as of vX.Y" banners on a minority of pages.
- No localization framework, language directory, or stated position on translation.
- Search does not span the API reference, quickstarts, or labs hosted elsewhere on kubevirt.io.
Rating: 3 - Meets standards
Content creation processes
Documentation is only as useful as it is accurate and well-maintained, and requires the same kind of review and approval processes as code. We evaluate on the following:
-
Is there a clearly documented (ongoing) contribution process for documentation?
Partially. The repository README documents the mechanics: fork, edit Markdown under
docs/, keep.nav.ymlordering current, sign commits with-s, runmake build_img,make check_spelling,make check_links, andmake runin a container, then open a pull request. The root CONTRIBUTING.md is a two-line pointer to the Contributing page on the published site. That page covers community-wide onboarding (prerequisites, where to find good-first-issues, the Code of Conduct, membership policy, governance, and the AI contribution policy) and lists the user guide as a low-barrier repository.The process stops at "open a PR". Nothing in the repository describes what happens next:
- which labels are applied and who is expected to review
- what the approval flow is and how long a contributor should expect to wait
- when to use the release branches
- when a change needs a redirect entry in
mkdocs.yml
There is no documentation style guide or page template, and no pull request or issue templates under
.github/. Twelve pull requests are open, the oldest from March 2026. -
Does the code release process account for documentation creation & updates?
Yes. The kubevirt/kubevirt pull request template includes a checklist item that a user-guide update "was considered and is present (link) or not required" for any user-facing feature or API change, and approvers are asked to review the list. The Virtualization Enhancement Proposal (VEP) process in kubevirt/enhancements requires SIGs, after code freeze, to confirm that the "Docs PR is merged (plan review ahead of release if only placeholder is opened)" as part of the release tracking checklist.
The process is visible in practice. Recent merged pull requests include VEP 190 plugins documentation, GPU DRA, Migration Stall Detector alpha docs, PersistentReservation GA graduation, Template Beta graduation, and the v1.9.0 release notes, most authored by the feature developers themselves. Release notes are regenerated from kubevirt/kubevirt tags with
update_changelog.sh. Neither the PR checklist item nor the VEP requirement is enforced by tooling, and the user guide repository itself does not document how itsrelease-vX.Y-*branches relate to the KubeVirt release cycle. -
Who reviews and approves documentation pull requests?
Prow, using the
OWNERSandOWNERS_ALIASESfiles. The rootOWNERSfile assigns every path to thereviewersalias (seven people) and theapproversalias (ten people), and automatically labels changes underdocs/withkind/documentation.OWNERS_ALIASESalso defines per-SIG reviewer and approver groups for network, storage, compute, observability, release, test, scale, and buildsystem, but theOWNERSfile does not route any directory to them, so SIG experts are not auto-assigned to pages in their area. Pre-submit and post-submit Prow jobs for the repository are defined in kubevirt/project-infra.The reviewer and approver lists are made up of KubeVirt core maintainers rather than documentation specialists, and one contributor accounts for most commits over the last six months, including the v1.9.0 release notes and site fixes. The process is discoverable only by reading the
OWNERSfiles; no human-readable page names the documentation approvers or explains the Prow/lgtmand/approveflow to a first-time contributor. -
Does the website have a clear owner/maintainer?
Partially. The user guide is owned collectively by the
approversalias inOWNERS_ALIASES, the site is published frommainby a Prow job with Netlify builds configured innetlify.toml(badge in the README), and theOWNERSfile labels changes undersite/withkind/website. Seven emeritus approvers are listed, showing the list is curated over time. The main website, kubevirt.io, is a separate repository (kubevirt/kubevirt.github.io) with its own ownership.There is no MAINTAINERS file, no named documentation lead or SIG Docs, and no statement on the Contributing page or README of who is responsible for the user guide's infrastructure, the Netlify account, or the release-notes process. Ownership is inferable from Git history and OWNERS files but is not documented.
Comment
Strengths:
- The kubevirt/kubevirt PR template and the VEP release checklist both require a user-guide update to be considered and merged.
- Feature developers author the documentation for their features in the same release cycle.
- Prow OWNERS automation with a curated approver list, emeritus tracking, and
automatic
kind/documentationlabeling. - README documents local build, spell check, link check, and DCO sign-off.
- Release notes are generated by a script from upstream tags.
Weaknesses:
- No documented review and approval flow, expected turnaround, or explanation of Prow commands for documentation contributors.
- No documentation style guide, page template, or guidance on redirects and release branches.
- No MAINTAINERS file or named documentation owner; infrastructure ownership (Netlify, release-notes script) is undocumented.
- Per-SIG reviewer aliases exist but are not mapped to directories in
OWNERS. - Root CONTRIBUTING.md is a pointer; the repository has no PR or issue templates.
- Backlog of twelve open pull requests, some six months old.
Rating: 3 - Meets standards
Inclusive language
Creating inclusive project communities is a key goal for all CNCF projects. We evaluate on the following:
-
Are there any customer-facing utilities, endpoints, class names, or feature names that use non-recommended words as documented by the Inclusive Naming Initiative website?
No, within KubeVirt's own naming. The KubeVirt API, CRDs, components (
virt-api,virt-controller,virt-handler,virt-launcher),virtctlsubcommands, and feature gates documented in the user guide do not use "master", "slave", "whitelist", "blacklist", or other Inclusive Naming Initiative tier-1 terms. The kubevirt/kubevirt default branch ismain, and the guide already uses the recommended replacement "allowlist" when describingpermittedHostDevices. The kubevirt.io home page is also free of these terms.The word "master" does appear 28 times in the guide, but almost entirely in URLs and third-party content rather than in KubeVirt-controlled names. Fourteen occurrences are links to the KubeVirt API reference at
kubevirt.io/api-reference/master/...; the API reference site now publishes undermainand per-version paths, so these links point at a legacy path. The rest are links into upstream repositories (libvirt, Kubernetes enhancements, cri-tools, vhost-md, QEMU, kubevirt-ansible) that still use amasterbranch, a CNI configuration field namedmasterin a live migration example, a QEMU process listing, and akubevirt.io/nodeName: masternode label in an example on the deprecated Presets page."Abort" appears in the Live Migration page, both as prose and as the
Abort RequestedandAbort Statusfield names from the VirtualMachineInstanceMigration status. "Kill" appears once in prose on Interfaces and Networks describing kubelet behavior. -
Does the project use language like "simple", "easy", etc.?
Yes, frequently. Excluding the release notes, the guide contains 32 uses of "simple", 28 of "simply", 12 each of "easy" and "easily", 19 of "just", four of "of course", and one each of "obviously" and "trivial", across 39 of the 97 pages. Typical examples are "Live migration can also be canceled by simply deleting the migration object", "Attaching the virtio-win package can be done simply by adding", "it can be easily cancelled", and "This is just a matter of adding the name of the".
These words are concentrated in older, longer pages such as Live Migration, Windows Virtio Drivers, Node Assignment, and vsock. In most cases they add no information and can be deleted without changing meaning. The guide has no gendered pronouns, no "guys", and no other ableist or exclusionary terms in prose. The repository's spelling check has no inclusive-language or minimizing-language rule, so nothing prevents new occurrences.
Comment
Strengths:
- No Inclusive Naming Initiative tier-1 terms in KubeVirt-controlled names, commands, or feature gates.
- "Allowlist" is used consistently for
permittedHostDevices. - No gendered pronouns or other exclusionary terms in prose.
- kubevirt.io home page is free of non-recommended terms.
Weaknesses:
- Over a hundred uses of "simple", "simply", "easy", "easily", and "just" across 39 pages.
- Fourteen API reference links still use the legacy
/api-reference/master/path. - A
kubevirt.io/nodeName: masterexample remains on the Presets page. - No style rule or automated check discourages minimizing language in new content.
Rating: 4 - Meets or exceeds standards
Recommendations
Information architecture
- Add a "Getting started" page that walks through the happy path on a single page. See the New user content recommendations for the proposed content and placement.
- Rewrite Basic Use and Lifecycle to present VirtualMachine as the primary object and VirtualMachineInstance as the running instance it manages. See the New user content recommendations for the proposed page content.
- Add
cluster_admin/plugins.mdtodocs/cluster_admin/.nav.ymlso the Plugins page is discoverable from somewhere other than the deprecated Hook Sidecar page. - Write pages, or add sections to existing pages, for v1.9 features that
currently appear only in the release notes: the
VirtualMachineBackupAPI (Storage), theCrossArchitectureVirtualizationfeature gate (Compute or Cluster Administration), masqueradePortRanges(Network, in Interfaces and Networks), and MigrationPolicy compression (Cluster Administration, in Migration Policies). - Create a
virtctlcommand reference page, or expand the existingvirtctlpage beyond installation, that lists each subcommand with a one-line description and a link to the feature page that explains it in context. - Add a feature-gate table to the Activating and Deactivating Feature Gates page that lists each gate, its stage (Alpha, Beta, GA, Deprecated), the version it was introduced or graduated, and a link to its documentation. Ask the maintainers whether this table can be generated from the kubevirt/kubevirt source to avoid drift.
- Add a user-facing Troubleshooting page (separate from the developer-oriented
Virtualization Debugging section) that lists common symptoms such as a VMI
stuck in
SchedulingorPending, failed live migration, console or VNC connection errors, and missingqemu-guest-agentdata, each with likely causes and links to the relevant fix. Consolidate the troubleshooting notes now embedded in Accessing Virtual Machines and Memory Dump there or link to them. - Add a brief landing page to each of the Compute, Network, and Storage sections that explains what the section covers and groups its pages by task (for example, Storage: provisioning disks, importing images, snapshots and backup, moving data between clusters).
- Rename API-centric page titles to user goals where practical, for example
"Clone API" to "Cloning VirtualMachines", "Export API" to "Exporting
VirtualMachines and volumes", "Snapshot Restore API" to "Snapshotting and
restoring VirtualMachines", and "Migration Controller" to a title that states
what the reader accomplishes with it. Add redirects in
mkdocs.ymlif file names change. - Reorganize the User Workloads "Workloads" sub-group so current mechanisms (instance types, VirtualMachine Templates, pools) come first and legacy or deprecated pages (presets, OpenShift Templates, Hook Sidecar) are grouped under a clearly labeled "Legacy" heading or moved to the end.
- Remove or archive legacy installation content: verify with the maintainers whether the OKD Service Catalog APB and k3OS paths are still supported, and update the OpenShift 4.10 documentation links to a current version or a version-independent URL.
- Delete
docs/compute/windows_virtio_drivers.md, which is a byte-identical unlisted duplicate ofdocs/user_workloads/windows_virtio_drivers.md, and add a redirect if the old URL was ever published. - Move Release Notes out of the middle of the main navigation, either to the end of the list or into a top-bar link, so the section list reads as a progression from concepts through administration, workloads, and infrastructure layers.
New user content
- Add a "Getting started" page, placed immediately after Architecture in the
top-level navigation, that walks a new user from a working cluster to a
running VM on one page: install KubeVirt, install
virtctl, create a VirtualMachine from a provided manifest orvirtctl create vm, start it, connect withvirtctl console, and stop it. Link to the detailed pages at each step. Consider folding the current Quickstarts page into it as a "Try it in a sandbox" section. - Restructure the Installation page so the core procedure comes first: Requirements, the four-command operator install, verification, and the emulation fallback. Move AppArmor, kernel and user-land compatibility, SELinux, OKD, k3OS, daily developer builds, deploying from source, network plugins, and node placement below a "Platform-specific and advanced installation" heading or onto separate pages.
- End the Installation page with a "Next steps" section linking to
virtctlinstallation, Creating VirtualMachines by using virtctl, and Accessing Virtual Machines. - Remove or move to a footnote the historical notes about behavior before v0.20.0 and v0.34.2 on the Installation page; ask the maintainers whether any supported upgrade path still requires them.
- Expand the
virtctlpage to cover all published client binaries. Use the theme's content tabs for Linux, macOS, and Windows on both amd64 and arm64, and include thechmod +xandPATHsteps. Rename the page to "Installing virtctl" and move it to sit next to Installation, or link to it from Installation's Next steps. - Rewrite Basic Use into a short "Your first VirtualMachine" page that presents
VirtualMachine as the primary object and includes a complete minimal
vm.yamlusing a public containerDisk image, thekubectl apply,virtctl start,virtctl console, andvirtctl stopcommands, and explicit links to the next pages. Update Lifecycle to reference that manifest instead of the undefinedvmi.yaml. - Enable
content.code.copyundertheme.featuresinmkdocs.ymlto add a copy button to every code block. - Convert
$-prefixed indented code blocks to fencedshellblocks without prompt characters, and place example output in a separate block or atitle="Output"annotation so commands paste cleanly. Start with the new-user path (Installation,virtctl, Basic Use, Lifecycle), then the longest reference pages (Disks and Volumes, Export API). This also helps screen readers and mobile scrolling. - Give the Quickstarts page a one-paragraph introduction that states prerequisites (a laptop with virtualization enabled, or a browser for Killercoda), the expected time, and what the reader will have at the end, and add a closing link to the in-guide Getting started page.
- On the Welcome page, add a one-line "New to KubeVirt? Start here" link at the top that points to the Getting started page, so the first-run path is discoverable without reading the section list.
Content maintainability & site mechanics
- Document the content versioning model in CONTRIBUTING.md (and summarize it on
the Contributing page). State what the
release-vX.Y-stableandrelease-vX.Y-develbranches are for, when they are cut relative to a KubeVirt release, which branch is published, and how a contributor decides whether a change onmainneeds a cherry-pick. Ask the maintainers to confirm the intended workflow first, since the-develbranches exist for 1.7 and 1.8 but not 1.9. - Publish versioned documentation with a version selector, using either
mikewith the theme'sextra.version.provider: mikesetting or a build per release branch published under a/vX.Y/path. Publish at least the supported N, N-1, and N-2 minors alongsidelatest. - Until versioned publishing exists, adopt a standard feature-state admonition
and apply it consistently to every feature page, stating the version
introduced and the current stage (Alpha, Beta, GA, Deprecated). Nine pages use
a
FEATURE STATE:block today; formalize its format in CONTRIBUTING.md so new pages follow it. - Document the release-notes update process: when
update_changelog.shis run, by whom, and how the result is reviewed, so the page continues to be regenerated after maintainer turnover. - Enable the theme's search features
search.suggest,search.highlight, andsearch.shareundertheme.featuresinmkdocs.yml; this is a one-line change that improves search usability. - Add a short "Localization" statement to CONTRIBUTING.md that records the
project's current position (English only, translations not currently accepted,
or translations welcome via a stated process). If translations are anticipated
within the next few releases, move content to
docs/en/now and configure themkdocs-static-i18nplugin, so the redirects and.nav.ymlfiles only need to change once. - Ask the KubeVirt website maintainers whether the API reference and quickstarts can be indexed by the same search as the user guide, for example by moving the user guide search to a site-wide index, so users can search the full documentation set from one place.
Content creation processes
- Expand CONTRIBUTING.md from a pointer into a documentation contributor guide
that covers the full lifecycle: how to propose a change, how to build and test
locally (move the README build steps here), what happens after opening a PR
(labels,
/lgtm,/approve, expected turnaround), when to add a redirect tomkdocs.yml, and when a change needs a cherry-pick to arelease-vX.Y-stablebranch. Model it on the Thanos "How to contribute to docs" page. - Add a MAINTAINERS.md (or a "Maintainers" section on the Contributing page) that names the user guide approvers and the person or group responsible for the release-notes script, and how to reach them. Model it on the NATS site MAINTAINERS file. Infrastructure accounts are covered in the Maintenance planning recommendations.
- Add a short documentation style guide covering page structure (title, short
concept, feature-state banner, procedure, related links), the standard
feature-state admonition, code block conventions (fenced blocks, no
$prompts), Kubernetes object capitalization, and file naming. Link it from CONTRIBUTING.md and the Contributing page. - Add a pull request template to
.github/with a checklist:.nav.ymlupdated for new pages, redirect added for moved pages, spelling and link checks run, feature-state banner present, and the related kubevirt/kubevirt PR or VEP linked. - Route reviews to subject-matter experts by adding per-directory
OWNERSfiles (for exampledocs/network/OWNERS,docs/storage/OWNERS,docs/compute/OWNERS) that reference the existingsig-network-*,sig-storage-*, andsig-compute-*aliases, while keeping the root approvers for site-wide changes. - Ask the maintainers to consider a documentation-focused reviewer role or SIG Docs alias, so that writers who are not core code approvers can share the review load and reduce the open PR backlog.
- State on the Contributing page that the VEP checklist requires the docs PR to be merged by code freeze. The release-branch and release-notes processes are covered in the Content maintainability recommendations.
- Triage the twelve open pull requests, closing or merging the oldest, and add a stale-PR policy to CONTRIBUTING.md so contributors know what to expect.
Inclusive language
- Remove or reword minimizing language across the guide. Delete "simply", "just", "of course", and "obviously" where they add nothing, and replace "easy" or "easily" with a concrete statement of what the step requires (for example, change "can be easily cancelled" to "can be cancelled by deleting the migration object"). Start with the pages that have the most occurrences: Live Migration, Windows Virtio Drivers, Node Assignment, vsock, and Disks and Volumes.
- Add a rule to the documentation style guide (see the content creation process recommendations) that discourages "simple", "simply", "easy", "easily", "just", and "obviously", with a one-line explanation of why.
- Add an automated check for minimizing and non-recommended language to the
Makefile and the Prow pre-submit, using a tool such as Vale with the
write-goodstyle, or a grep-based check alongsidemake check_spelling, so new occurrences are flagged in pull requests. - Update the 14 links to
kubevirt.io/api-reference/master/...to the/main/path, or to a specific version path such as/v1.9.0/, so the guide no longer points at a legacy branch name. - Replace the
kubevirt.io/nodeName: masterexample on the Presets page with a neutral node name such asnode01, or remove the example, since the page documents a deprecated feature. - Ask the KubeVirt API maintainers whether the
Abort RequestedandAbort Statusfields in the VirtualMachineInstanceMigration status are candidates for a "cancel" alias in a future API version; until then, prefer "cancel" in the prose of the Live Migration page while continuing to show the field names as they appear inkubectloutput. - When upstream projects linked from the guide (libvirt, cri-tools, vhost-md, kubevirt-ansible) rename their default branch, update the links; in the meantime prefer tagged or permalink URLs so the branch name is not repeated in the guide.
Contributor documentation
KubeVirt is an incubating project of CNCF. This means that the project should be developing professional-quality documentation alongside the project code.
| Criterion | Rating (1-5) |
|---|---|
| Communication methods documented | 4 - Meets or exceeds standards |
| Beginner friendly issue backlog | 2 - Needs improvement |
| "New contributor" getting started content | 3 - Meets standards |
| Project governance documentation | 4 - Meets or exceeds standards |
KubeVirt's contributor documentation is strong at the community level and thin at the point of use. The kubevirt/community repository holds mature governance, membership, SIG, and meeting documentation, the communication channels are active and well described, and the user guide has a welcoming Contributing page that is the canonical entry point. Two of the four areas exceed the standard for an incubating project. The one area that falls short, the beginner issue backlog, is the one a newcomer hits first when trying to act on that welcome.
Two themes recur across the areas:
- The good material is not surfaced where contributors and users are. Governance, maintainers, the SIG list, the help-wanted guide, and the community meeting details all live in the community repository and are barely linked from kubevirt.io or the user guide. The guide's header and footer carry no repository or chat icons, and its only help section is three bare URLs on the Welcome page.
- The path from invitation to first contribution breaks. The Contributing page
motivates newcomers and then stops before the mechanics of claiming an issue,
opening a pull request, and getting a review. It sends them to
good-first-issuelists that are empty because every beginner issue from the past year was auto-closed by the stale bot rather than fixed or exempted. Nothing names a channel or person a stuck contributor can ask.
The governance documentation and the September 2025 batch of scoped, self-contained beginner issues are both good enough to cite as models for other projects; the backlog problem is one of triage follow-through, not of knowing how to write the issues.
The following sections contain assessments of each element of the Contributor Documentation rubric.
Comments
Communication methods documented
One of the easiest ways to attract new contributors is making sure they know how to reach you. We evaluate on the following:
-
Is there a Slack/Discord/Discourse/etc. community and is it prominently linked from your website?
Yes. KubeVirt uses two channels in the Kubernetes Slack workspace,
#virtualizationfor users and#kubevirt-devfor contributors. The kubevirt.io home page links to Slack in its footer, and the kubevirt.io Community page has a "Talk to Us!" section that names both channels, links to each, and links to the Kubernetes Slack invitation page so a newcomer can get an account. The kubevirt/community README repeats both channel links.In the user guide the link is less prominent. The Welcome page has a "Getting help" section that links to
#virtualization(as a raw URL rather than a channel name), the GitHub issue tracker, and the mailing list; the Contributing page mentions Slack in passing and points to the Community page. The#kubevirt-devchannel is not mentioned in the guide. No other page in the guide links to Slack, and the theme's header and footer do not carry social or chat icons becauseextra.socialandrepo_urlare not configured inmkdocs.yml. -
Is there a direct link to your GitHub organization/repository?
Yes. The kubevirt.io home page and Community page link to the GitHub organization (github.com/kubevirt) and to the main kubevirt/kubevirt repository. The user guide's Welcome page links to the kubevirt/kubevirt issue tracker under "Getting help" and to the API reference under "Developer", and every page has "Edit this page" and "View source" actions that resolve to the kubevirt/user-guide repository. The Contributing page links to the organization, to the user-guide, kubevirt.github.io, community, kubevirt, and containerized-data-importer repositories, and to their issue lists.
The user guide does not display a repository link in its header, which the theme provides when
repo_urlis set. A reader must reach the Welcome or Contributing page, or use the edit icon, to find the source repository. -
Are weekly/monthly project meetings documented? Is it clear how someone can join those meetings?
Yes, in the community repository; only indirectly on the websites. The kubevirt/community repository's
community_meeting.mddocuments the weekly community meeting in detail: Zoom meeting ID and join link, time (Wednesdays 16:00 CET/CEST), hosts, the running meeting-notes document, how recordings are produced and posted to the YouTube "Community Meetings" playlist, and that minutes are mailed to kubevirt-dev. The kubevirt.io Community page embeds the KubeVirt community calendar (kubevirt@cncf.io) and states that anyone may "join any of our community meetings - no registration required."The user guide itself does not mention the community meeting, the calendar, or SIG meetings; its Contributing page links to the Community page and to a New Contributor session recording on YouTube. SIG charters in kubevirt/community (for example
sig-network/charter.md) do not list meeting times or channels, so SIG meeting cadence is discoverable only through the shared calendar. -
Are mailing lists documented?
Yes. The kubevirt-dev Google Group is linked from the kubevirt.io home page footer, the Community page, the kubevirt/community README, and the user guide's Welcome page under "Getting help". The community meeting document states that weekly minutes are posted to the list, and the kubevirt/kubevirt pull request template asks authors to consider announcing changes there.
The list is presented as a bare link with no description of its purpose, expected traffic, or whether it is the right place for user questions versus development discussion. There is no separate user-oriented list, and the guide does not say so. The Contributing page does not mention the mailing list at all.
Comment
Strengths:
- Two purpose-specific Slack channels, a mailing list, a public calendar, and a weekly recorded meeting are all active and linked from kubevirt.io.
community_meeting.mddocuments Zoom details, time, hosts, notes, recordings, and minutes distribution in depth.- The Community page links the Kubernetes Slack invitation page so newcomers can get an account.
- Every user guide page has edit and view-source actions pointing at the repository.
- The Contributing page links every relevant repository and issue list.
Weaknesses:
- The user guide's only help section is on the Welcome page and consists of bare URLs without guidance on which channel to use.
- No repository, Slack, or mailing list icons in the guide's header or footer.
- The community meeting, calendar, and
#kubevirt-devchannel are not mentioned in the user guide. - Meeting day, time, and join instructions appear only in the community repository, not on kubevirt.io.
- SIG charters do not list meeting times or channels.
Rating: 4 - Meets or exceeds standards
Beginner friendly issue backlog
We evaluate on the following:
-
Are docs issues well-triaged?
Partially. The kubevirt/user-guide repository has a full Prow label set inherited from the KubeVirt organization:
kind/*,sig/*(includingsig/documentation),triage/accepted,triage/needs-information,triage/duplicate, andlifecycle/*. Org-level issue templates (bug_report.md,docs_report.md,feature_request.md) prompt reporters for structured information, and issues opened through them arrive with a consistent shape.The labels are applied inconsistently. Of the four issues open today, two carry a
kind/*label and two carry no label at all; none has atriage/*orsig/*label and none is assigned. The two unlabeled issues are a proposal for Simplified Chinese documentation and a report that the Material theme is reaching end of life, both of which have been open for months without a maintainer response recorded in labels. Twelve issues were opened in the past year, so the volume is small enough that complete triage is achievable. -
Is there a clearly marked way for new contributors to make code or documentation contributions (i.e. a "good first issue" label)?
Yes in form, no in substance. The repository defines both
good-first-issueandgood first issuelabels and ahelp wantedlabel, and the Contributing page in the user guide tells newcomers to look forgood-first-issuein the user-guide, kubevirt.github.io, and community repositories. The Contributing page also links a New Contributor session recording.There are currently zero open
good-first-issueitems in kubevirt/user-guide. In kubevirt/kubevirt, ninegood-first-issueitems are open, but no open issue in that repository carrieskind/documentation. A newcomer who follows the Contributing page's advice finds an empty list. Over the past year tengood-first-issueitems were closed in kubevirt/user-guide, including a well-scoped batch of eight "Update ... Documentation to Reflect Feature Lifecycle Changes" issues (#918 through #925) filed in September 2025; all ten were closed by the stale bot with thelifecycle/rottenlabel rather than by a pull request. -
Are issues well-documented (i.e., more than just a title)?
Yes. All four open issues have bodies over 300 characters. The enhancement issue #948 uses the feature request template, describes the problem (no clear structure for newcomers), and proposes persona-based getting-started paths. The closed
good-first-issuebatch was exemplary: each issue (for example #918) had a summary, a background section citing the specific kubevirt/kubevirt pull requests and versions that changed feature status, a list of affected files, and acceptance criteria, at roughly 1,800 characters.Issue quality is therefore not the constraint. The well-documented beginner issues expired unworked, which points to discoverability and follow-through rather than to how the issues are written.
-
Are issues maintained for staleness?
Yes, mechanically. The KubeVirt Prow instance applies
lifecycle/staleafter inactivity, thenlifecycle/rotten, then auto-closes, andlifecycle/frozenis available to exempt an issue. Of 21 issues closed in the past year, 15 (71 percent) were closed by this automation rather than by a fix. No open issue is older than about ten months and none has gone six months without an update, so the backlog does not accumulate.The same automation removed every beginner-friendly issue in the repository. The eight feature-lifecycle documentation issues were valid when filed and, as far as the closing comments show, were still valid when the bot closed them five months later; nobody applied
lifecycle/frozenorhelp wantedto keep them alive. Staleness handling is tuned for a code repository with active triage and, without a human in the loop, it erases the entry points the Contributing page advertises.
Comment
Strengths:
- Full Prow label taxonomy, org-level issue templates, and automated lifecycle management are in place.
- Open issues are substantive, with structured bodies and clear problem statements.
- The retired
good-first-issuebatch (#918 to #925) is a model for how to write scoped, self-contained documentation tasks. - Issue volume (twelve per year) is small enough to triage completely.
- The Contributing page tells newcomers which label to look for and in which repositories.
Weaknesses:
- Zero open
good-first-issueitems in kubevirt/user-guide and zero documentation-labeled beginner issues in kubevirt/kubevirt. - Every beginner issue closed in the past year was auto-closed as rotten rather than fixed.
- Half of open issues are unlabeled; none carries
triage/*,sig/*, or an assignee. - No process exempts valid, unworked beginner issues from the stale bot.
- A proposal for Simplified Chinese documentation and a theme end-of-life report have no recorded triage decision.
Rating: 2 - Needs improvement
New contributor getting started content
Open source is complex and projects have many processes to manage that. Are processes easy to understand and written down so that new contributors can jump in easily? We evaluate on the following:
-
Do you have a community repository or section on your website?
Yes, both. The kubevirt/community repository holds the governance document, membership policy and checklist, maintainers and alumni lists, code of conduct, AI contribution policy, community meeting mechanics, a SIG list with per-SIG charters, working groups, a help-wanted label guide adapted from Kubernetes, and directories for events, design proposals, and conference proposals. The kubevirt.io website has a Community page with the shared calendar, GitHub, Slack, mailing list, and YouTube links, and a Contributing tab in the user guide's top navigation.
The two are loosely connected. The kubevirt/community
contributors/contributing.mdis a one-line pointer to the user guide's Contributing page, and the user guide's Contributing page links back to the membership policy, governance, code of conduct, and AI policy in kubevirt/community. However, the Contributing page does not link the community repository's SIG list, help-wanted guide, community meeting document, or MAINTAINERS file, so a newcomer sees only part of what the community repository offers. -
Is there a document specifically for new contributors/your first contribution?
Yes. The user guide's Contributing page is written for first-time contributors and is the canonical entry point that both the root CONTRIBUTING.md and kubevirt/community point to. It has a Prerequisites section (CNCF open source primer, Git basics, the organization's repositories, quick start labs), a "Your first contribution" section that lists documentation and community repositories as low-barrier starting points and code repositories for Go developers, an "Other ways to get started" section (review a pull request, watch the New Contributor session recording, open an issue), and links to the community's core documents.
The document stops before the mechanics. It tells readers to look for
good-first-issuebut the linked repositories currently have no such open issues, and it does not describe how to claim an issue, the fork-branch-PR flow with DCO sign-off, what Prow labels and/lgtmand/approvemean, or how long review takes.Those mechanics are split between the repository README (build, spell check, link check, sign-off) for documentation and kubevirt/kubevirt's CONTRIBUTING.md and
docs/getting-started.mdfor code. The kubevirt/kubevirt CONTRIBUTING.md is the more complete document, covering workflow, testing, draft pull requests, DCO, review, and membership, but it is written for code contributors and is not surfaced in the user guide beyond one link. -
Do new users know where to get help?
Partially. The Welcome page's "Getting help" section lists the GitHub issue tracker, the kubevirt-dev mailing list, and the
#virtualizationSlack channel. The Contributing page invites readers to raise a bug if something is missing, points to the Community page, and links the New Contributor session recording. The kubevirt/community help-wanted guide states thatgood first issueitems come with a commitment from members to provide extra assistance.Help is not framed for contributors specifically. Nothing tells a new contributor which Slack channel to ask in when stuck on a documentation pull request (
#kubevirt-devis not named in the guide), who the documentation approvers are, whether there is a mentor or buddy program, or that the weekly community meeting welcomes newcomer introductions. The help links are bare URLs on the Welcome page and are not repeated on the Contributing page or in CONTRIBUTING.md.
Comment
Strengths:
- A dedicated, welcoming Contributing page that is the canonical entry point from both CONTRIBUTING.md and kubevirt/community.
- Explicit low-barrier starting points (documentation, website, community repositories) and non-code ways to contribute.
- A New Contributor session recording on YouTube.
- A comprehensive kubevirt/community repository with governance, membership, SIG, and meeting documentation.
- Community page and Welcome page surface the primary help channels.
Weaknesses:
- The Contributing page omits the contribution mechanics (claiming an issue, fork and PR flow, DCO, Prow labels, review expectations).
- Newcomers are sent to
good-first-issuelists that are empty. - No contributor-specific help guidance: which Slack channel to ask in, who reviews documentation, whether mentoring is available.
- The SIG list, help-wanted guide, community meeting document, and MAINTAINERS file in kubevirt/community are not linked from the guide.
- Build and test instructions for the guide live only in the repository README, not on the Contributing page.
Rating: 3 - Meets standards
Project governance documentation
One of the CNCF’s core project values is open governance. We evaluate on the following:
-
Is project governance clearly documented?
Yes. Governance lives in the kubevirt/community repository and is complete and specific.
GOVERNANCE.md(about 1,350 words) defines:- the maintainer role and its responsibilities
- the criteria and process for selecting maintainers (one year of
participation, demonstrated leadership, nomination by pull request against
MAINTAINERS.md, simple-majority vote) - maintainer meetings, use of CNCF resources, and the code of conduct
- off-boarding and mentorship, and retiring and removing maintainers
- voting rules (lazy consensus by default, simple majority for most matters, two-thirds to remove a maintainer or amend the governance)
- the structure of Special Interest Groups, subprojects, and working groups
MAINTAINERS.mdlists eight current maintainers with employer and area of responsibility, a table of emeritus maintainers with retirement dates, and a note that the list must stay in sync with the CNCF project maintainers list.The surrounding documents are equally thorough.
membership_policy.mddefines a contributor ladder from new contributor through org member, reviewer, approver, SIG chair, subproject lead, and working group chair, with requirements and privileges for each level and an inactivity policy that states how inactivity is measured.membership_checklist.md,code-of-conduct.md,ai-contribution-policy.md, andALUMNI.mdcomplete the set. SIGs and working groups are declared insigs.yaml, from whichsig-list.mdis generated, and each SIG has a charter with scope, roles, and, in at least some cases, meeting mechanics. ACNCF/directory records the incubation application and technical review.Discoverability from the user-facing sites is limited. The user guide's Contributing page links
GOVERNANCE.mdunder "Important community resources" with the one-line description "Project Maintainer responsibilities", and links the membership policy and code of conduct alongside it. The kubevirt.io Community page does not link the governance document, the maintainers list, or the SIG list, and neither site summarizes how decisions are made or who the maintainers are. A user or prospective adopter evaluating the project's governance must know to open the community repository.
Comment
Strengths:
GOVERNANCE.mdcovers maintainer selection, removal, voting thresholds, meetings, SIGs, subprojects, and working groups with concrete rules.MAINTAINERS.mdlists current maintainers with employer and responsibilities plus an emeritus table, and is tied to the CNCF maintainers list.membership_policy.mddefines a full contributor ladder with requirements, privileges, and a measurable inactivity policy.- SIGs and working groups are declared in
sigs.yamland the SIG list is generated, so it cannot drift from the source. - Code of conduct, AI contribution policy, and CNCF incubation records are co-located.
Weaknesses:
- The kubevirt.io Community page does not link governance, maintainers, or the SIG list.
- The user guide's Contributing page links
GOVERNANCE.mdwith a one-line label and no summary. - Neither site names the maintainers or explains how decisions are made.
Rating: 4 - Meets or exceeds standards
Recommendations
Communication methods documented
- Add a "Community and communication" section to the user guide that
consolidates the Slack channels, the kubevirt-dev mailing list, community
meetings, and social accounts in one place, and keep it consistent with
kubevirt.io/communityso readers who stay in the guide do not miss a channel. Give each channel a one-line description of its purpose (for example,#virtualizationfor usage questions,#kubevirt-devfor contributor discussion, the mailing list for announcements and longer threads) so newcomers know where to ask. - Document community meetings within the guide itself: state the cadence, list
the meeting times, and include the public calendar link (
kubevirt@cncf.io) so readers can join without leaving the guide. - Set
repo_urland anextra.socialblock inmkdocs.ymlso the GitHub, Slack, and mailing list links appear in the guide's header and footer on every page, instead of only in the "Getting help" list on the Welcome page. - Replace the raw Slack URL on the Welcome page with the channel name and a link to the Kubernetes Slack invitation page.
Beginner friendly issue backlog
- Consolidate the duplicate labels by standardizing on the GitHub-native
good first issuelabel (spaced) and retiring or aliasing the hyphenatedgood-first-issue, so beginner issues appear in GitHub's "Contribute" tab and good-first-issue discovery tooling. Update the reference on the Contributing page to match the chosen label. - Maintain a small, non-empty pool of beginner issues. Periodically identify
documentation gaps, typos, and small feature-doc updates and file them as
good first issueso a new contributor always finds something to pick up. - Triage the currently open backlog. Apply
kind/*andsig/documentationlabels to unlabeled issues, and usetriage/acceptedto signal that an issue is ready to be worked on. - Add a
help wantedcomplement for slightly larger but still approachable tasks, and reference bothgood first issueandhelp wantedon the Contributing page so contributors understand the difference. - Preserve valuable issues from auto-close by applying
lifecycle/frozen(or promptly triaging) to still-relevant enhancements and documentation requests, rather than letting them reachlifecycle/rottenand close for inactivity alone. - Keep issue quality high by continuing to use the org-level issue templates, and add a short "good first issue" checklist to them (affected page, expected outcome, pointers to relevant docs) so beginner issues are self-contained.
- Publish a lightweight triage cadence (for example, a periodic documentation-issue triage during a SIG or community meeting) to keep labeling, acceptance, and staleness decisions consistent over time.
New contributor getting started content
- Add a "Making your first documentation change" section to the Contributing
page that walks through the mechanics end to end: find or file an issue,
comment to claim it, fork and branch, edit under
docs/and update.nav.yml, runmake check_spellingandmake check_links, sign off withgit commit -s, open the pull request, and what to expect from Prow (ok-to-test,lgtm,approved) and reviewers. Move the build and test steps from the repository README here or link them prominently. - Add a "Where to ask for help" section to the Contributing page, and repeat it
in CONTRIBUTING.md, that names
#kubevirt-devon Kubernetes Slack for contributor questions and#virtualizationfor usage questions, links the Slack invitation page, states that the weekly community meeting includes newcomer introductions with the day, time, and Zoom link, and identifies the documentation approvers or a docs contact. - Link the kubevirt/community resources that newcomers need directly from the Contributing page: the SIG list (to find the right SIG for a topic), the help-wanted guide (to understand the labels), the community meeting document, and the MAINTAINERS file.
- Replace the generic "look for good-first-issue" advice with a direct link to the filtered issue list for each repository, and pair this with the beginner issue backlog recommendations so the lists are populated when newcomers arrive.
- Add a "Contributing to the code" subsection that summarizes the
kubevirt/kubevirt path in three or four steps (read CONTRIBUTING.md, follow
docs/getting-started.mdto build and run a local cluster, pick an issue, open a draft PR) so code-minded newcomers see a clear next step rather than a single link. - Ask the community whether a lightweight mentoring or buddy arrangement exists
or could be offered for first-time contributors, and document it on the
Contributing page if so; the help-wanted guide already promises "extra
assistance" on
good first issueitems, so state how to request it.
Project governance documentation
- Add a "Governance" section to the kubevirt.io Community page that states in
two or three sentences how KubeVirt is governed (CNCF incubating project,
maintainer group, SIGs and working groups, lazy consensus with maintainer
votes) and links
GOVERNANCE.md,MAINTAINERS.md,membership_policy.md, andsig-list.md. - Expand the "Important community resources" list on the user guide's Contributing page so each governance link has a one-sentence description of what the reader will find. The New contributor recommendations also add the maintainers list and SIG list there.
- Add a short "How the project is run" paragraph to the Contributing page, above the resource list, that names the maintainer group, explains that work is organized in SIGs, and states that decisions default to lazy consensus, so a newcomer understands the structure before following the links.
- Ask the maintainers to confirm that every SIG charter includes a "Meeting
Mechanics" section like SIG Storage's, and that
sigs.yamlrecords each SIG's meeting cadence and Slack channel, so the generated SIG list can serve as the single place to find how to participate in each group.
Website & Infrastructure
KubeVirt is an incubating project of CNCF. This means that the project should be developing professional-quality documentation alongside the project code.
| Criterion | Rating (1-5) |
|---|---|
| Single-source for all files | 2 - Needs improvement |
| Meets min website req. (for maturity level) | 3 - Meets standards |
| Usability, accessibility, and design | 3 - Meets standards |
| Branding and design | 4 - Meets or exceeds standards |
| Case studies/social proof | 3 - Meets standards |
| SEO, Analytics, and site-local search | 2 - Needs improvement |
| Maintenance planning | 3 - Meets standards |
Other Metrics:
| Criterion | Rating (1-5) |
|---|---|
| A11y plan & implementation | 3 - Meets standards |
| Mobile-first plan & implementation | 3 - Meets standards |
| HTTPS access & HTTP redirect | 4 - Meets or exceeds standards |
| Google Analytics 4 for production only | 1 - Not present |
| Indexing allowed for production server only | 3 - Meets standards |
| Intra-site / local search | 4 - Meets or exceeds standards |
| Account custodians are documented | 1 - Not present |
The KubeVirt web presence rests on a sound platform. Material for MkDocs gives the user guide responsive layout, accessibility features, full-text search, and sitemaps for free; a Prow pipeline republishes both sites to GitHub Pages over HTTPS within a minute or two of merge; branding is applied once at the theme level; and the main website footer is a model of CNCF compliance. The project also has more adoption evidence than most incubating projects. The shortfalls are in measurement, connection, and stewardship rather than in the tooling.
Three themes recur across the areas:
- The user guide is invisible to the project. It carries no analytics, so nobody
can see which pages are read, which searches fail, or which inbound links
break. Nobody is documented as custodian of the analytics, Netlify, Search
Console, DNS, or GitHub Pages accounts, the community
sig/documentationentry has no members, and both repositories lean on one active documentation maintainer. - The web properties do not act as one. Pages under
kubevirt.ioare built from three repositories with no documented content boundary, and user-facing content also sits in the core and CDI code repositories. The guide and the main site differ in generator, logo, typeface, header, and footer; neither search covers the other; and the guide links to none of the adopters, case studies, talks, or blog that make the project's case. The guide's footer also lacks the copyright, CNCF, and trademark elements the main site carries. - Small defects touch every page. Header text fails WCAG AA contrast,
robots.txthas a malformed sitemap URL,netlify.tomlcarries dead configuration, and production lacks an HSTS header. Each is a one-line fix.
The branding implementation, the automated publish pipeline, and the main website footer are strong enough to cite as examples for other projects.
The following sections contain assessments of each element of the Website & Infrastructure rubric.
Comments
Single-source requirement
Source files for all website pages should reside in a single repo. Among other problems, keeping source files in two places:
- confuses contributors
- requires you to keep two sources in sync
- increases the likelihood of errors
- makes it more complicated to generate the documentation from source files
Ideally, all website files should be in the website repo itself. Alternatively, files should be brought into the website repo through git submodules.
If a project chooses to keep source files in multiple repos, they need a clearly documented strategy for managing mirrored files and new contributions. We evaluate on the following:
-
Does the project have a single source for its documentation? If not, is there a reason?
No. Pages served under the
kubevirt.iodomain come from at least three repositories, none of which pulls the others in as a Git submodule. The main website (kubevirt.io, including the blog, labs, adopters, and community pages) is a Jekyll site built fromkubevirt/kubevirt.github.io. The user guide (kubevirt.io/user-guide) is an MkDocs site built fromkubevirt/user-guide. The API reference (kubevirt.github.io/api-reference) is generated intokubevirt/api-referencefrom the code inkubevirt/kubevirt. Each repository is published independently by its own Prow post-submit job to its owngh-pagesbranch, and the website'spages/docs.mdis a one-line stub that links to the user guide.User-facing documentation is also spread across code repositories. The
docs/directory ofkubevirt/kubevirtcontains about sixty files, includingarchitecture.md,cloud-init.md, andgetting-started.md, several of which cover topics the user guide also covers, and the user guide links out tokubevirt/kubevirt/docs/getting-started.mdin three places. Containerized Data Importer documentation lives in thedoc/directory ofkubevirt/containerized-data-importer(about forty files), and the user guide links to it from six pages. Contributor and governance documentation lives inkubevirt/community. A reader therefore encounters KubeVirt documentation on GitHub in four repositories in addition to the two rendered websites.There is a practical reason for the main split, but it is not written down. The website and the user guide use different static-site generators (Jekyll and MkDocs), have different maintainers listed in their
OWNERSfiles, and target different audiences (marketing and community versus operators and users), so keeping them in separate repositories avoids coupling their toolchains. Within the user guide itself, sourcing is clean: all content is Markdown underdocs/, navigation is declared in.nav.ymlfiles, and redirects are declared inmkdocs.yml.Neither repository's README or contributing guide explains the division of content between the website, the user guide, and the code repositories'
docs/directories, so contributors have to infer where a new page belongs.
Comment
Strengths:
- The user guide keeps all of its content in one
docs/tree with declarative navigation and redirects. - Each repository has one clear publish path, so there is no duplicate deployment of the same content.
- The website's docs page defers to the user guide rather than hosting a parallel copy.
Weaknesses:
- Website, user guide, and API reference are three repositories with no submodule or other mechanism tying them together.
- The
kubevirt/kubevirt/docsdirectory holds about sixty files that overlap with user guide topics, and the guide links into it for getting-started content. - CDI documentation lives in the CDI repository, and the guide links to it from six pages.
- No README or contributing guide explains which content belongs in which repository, or why the split exists.
Rating: 2 - Needs improvement
Website requirements
Listed here are the minimal website requirements for projects based on their maturity level, either incubating or graduated. These are the only two levels for which a tech docs analysis can be requested. We evaluate on the following:
| Criterion | Incubating Requirement | Graduated Requirement |
|---|---|---|
| Website guidelines | All guidelines satisfied | All guidelines satisfied |
| Docs analysis (this) | Requested through CNCF service desk | All follow-up actions addressed |
| Project doc: stakeholders | Roles identified and doc needs documented | All stakeholder need identified |
| Project doc: hosting | Hosted directly | Hosted directly |
| Project doc: user docs | Comprehensive, addressing most stakeholder needs | Fully addresses needs of key stakeholders |
-
Are most of the applicable CNCF Website Guidelines satisfied? See https://github.com/cncf/techdocs/blob/main/docs/website-guidelines-checklist.md
Yes for the main website, and only partly for the user guide. KubeVirt is a CNCF incubating project, so the "developing" standard applies. Taking the checklist items in order:
-
Open source repository. Both sites are hosted in the
kubevirtGitHub organization alongside the main project: the website inkubevirt/kubevirt.github.ioand the user guide inkubevirt/user-guide. Both repositories run the DCO check on every pull request (it appears as a requireddcostatus alongsidetideand the Netlify preview), and the user guide README explains how to sign commits. -
Origin company. The homepage does not refer to Red Hat as the originator; Red Hat appears only as one logo among the alphabetized End Users and Vendors lists.
-
Enterprise support leads. There are no lead-capture links or forms on either site; the only forms are the search boxes and the user guide's color-scheme toggle. The homepage has a Vendors section of eighteen logos, sorted alphabetically, populated from
ADOPTERS.mdthrough a documented process, which serves as the vetting step. -
Vendor links. Several vendor logos link to pages that describe the vendor's KubeVirt offering (Kubermatic, Platform9, Spectro Cloud, KubeSphere), but others link to the vendor's generic corporate homepage (Microsoft, Oracle, SUSE, Red Hat, NCR Voyix, TrueFullstaq), which does not mention KubeVirt support.
-
Copyright notice. The main website footer reads "Copyright KubeVirt a Series of LF Projects, LLC", which is the wording the checklist specifies for projects converted to the Series LLC model, though it omits the © symbol. The user guide footer contains only "Made with Material for MkDocs" and no copyright notice;
mkdocs.ymlsets nocopyrightvalue. -
CNCF branding. The main website footer states "We are a Cloud Native Computing Foundation incubating project", which matches the project's current maturity level, and displays the CNCF color logo linked to
cncf.io. The user guide has no CNCF statement or logo anywhere on the page. -
Footer trademark and policy links. The main website footer links to
https://lfprojects.org/policies/"for website terms of use, trademark policy and other project policies", which satisfies the trademark-guidelines requirement through a terms page. The user guide footer has no trademark or policy link.
Community and license files. Both repositories have a
LICENSEfile. The user guide has aCONTRIBUTING.md; the website repository has none, though its README covers contributing in detail. Neither repository has aCODE_OF_CONDUCT.mdin its root; GitHub applies the organization-wide default from thekubevirt/.githubrepository, so the code of conduct is visible on the repository page but is not a file in the repository as the checklist asks. -
Comment
Strengths:
- Both sites hosted in the
kubevirtorganization with DCO enforced on every pull request. - Main website footer includes the correct maturity statement, Series LLC copyright, CNCF logo, and LF Projects policies link.
- No origin-company references or enterprise lead capture; vendor list is
alphabetized and sourced from
ADOPTERS.md. LICENSEpresent in both repositories andCONTRIBUTING.mdin the user guide.
Weaknesses:
- User guide footer has no copyright, CNCF branding, or trademark link.
- Several vendor logos link to corporate homepages rather than KubeVirt support pages.
- No root
CODE_OF_CONDUCT.mdin either repository; noCONTRIBUTING.mdin the website repository. - Main website copyright line omits the © symbol.
Rating: 3 - Meets standards
Usability, accessibility and devices
Most CNCF websites are accessed from mobile and other non-desktop devices at least 10-20% of the time. Planning for this early in your website's design will be much less effort than retrofitting a desktop-first design. We evaluate on the following:
-
Is the website usable from mobile?
Yes. The user guide uses Material for MkDocs, which is responsive by default, and every page carries a
width=device-width, initial-scale=1viewport meta tag. On narrow screens the header collapses to a hamburger drawer that contains the section navigation, the page's table of contents, and the search entry point, and the footer offers previous and next page links. A light and dark color scheme toggle is available.Two content patterns reduce mobile usability. The site's
extra.csssets.md-typeset table:not([class])todisplay: table; width: max-content, which forces wide tables such as the Arm64 feature-gate and device status pages to their natural width. Whether they remain horizontally scrollable depends on the theme's JavaScript table wrapper; this needs verification on a device. Separately, 531 non-table lines in the source exceed 140 characters, most of them single-line commands and YAML in code blocks, which require horizontal scrolling on phones. The 3,000-line Release Notes page is a single document and is slow to load and scroll on mobile. -
Are doc pages readable?
Yes, for the most part. The theme's typography, line length, and spacing are used unmodified apart from a slightly larger, teal-colored section label in the sidebar on wide screens and a light border on inline code. Pages use a single
h1and a sensible heading hierarchy (h2throughh5on Live Migration), admonitions are used for notes and warnings on newer pages, and footnotes and permalinks are enabled.Readability varies with page age. Older pages such as Installation, Lifecycle, and Disks and Volumes present commands as indented blocks with
$prompts and mix command and output in one block, which is harder to scan than the fenced, language-tagged blocks on newer pages. The Architecture page conveys its central "stack" diagram as ASCII art in a preformatted block, and several long pages (Live Migration at 500 lines, Disks and Volumes at over 1,300 lines, Interfaces and Networks at about 700 lines) have no in-page summary or grouping beyond the table of contents. -
Are all / most website features accessible from mobile -- such as the top-nav, site search and in-page table of contents?
Yes. The theme moves the top-level tabs into the drawer on mobile, the search icon opens a full-screen search overlay, and the in-page table of contents appears inside the drawer under the current page. The Welcome, Architecture, Quickstarts, Release Notes, and Contributing pages hide the navigation sidebar via front matter (
hide: navigation), so on those pages the drawer shows only the table of contents. The section list on the Welcome page is prose rather than links, so a mobile reader must open the drawer to move into a section. -
Are color contrasts significant enough for color-impaired readers?
Mostly, with one clear failure. The site overrides the theme's teal palette with a custom primary color,
#0db2b6. White text on that color, which is how the header bar, tabs, and site title render, has a contrast ratio of about 2.6:1, below the WCAG AA minimum of 4.5:1 for normal text and 3:1 for large text. Body links use the primary color darkened to 80 percent brightness (about#0a8e92), giving roughly 3.96:1 on white, which passes for large text but not for normal body text. The sidebar section labels (#00797f, 5.2:1) and the accent color (#006166, 7.2:1) pass.The site does not rely on color alone. Active tabs are underlined as well as colored, links are distinguished by color and hover underline, and admonitions carry icons and titles in addition to colored borders. The dark scheme uses the same primary color, so the header contrast issue persists in dark mode while link contrast improves slightly (about 4.06:1 on the slate background).
-
Are most website features usable using a keyboard only?
Yes. The theme provides a "Skip to content" link as the first focusable element, the search field is reachable by Tab and by the
/orsshortcut, search results are navigable with arrow keys, and the navigation drawer, table of contents, tabs, color toggle, and previous and next links are standard focusable controls. The rendered page contains 47aria-labelattributes on controls. The site adds no custom JavaScript that would trap or hide focus. Code blocks have no copy button, so there is nothing to reach; enabling one would add a keyboard-accessible control. -
Does text-to-speech offer listeners a good experience?
Partially. Pages declare
lang="en", use real headings for structure, and label controls with ARIA attributes, so a screen reader can announce structure and navigate by heading. The two images on the Windows Virtio Drivers page have descriptive alt text ("Choose driver", "Install driver", and so on).Content patterns work against listeners. The Architecture page's ASCII stack diagram will be read as a stream of plus signs, pipes, and tildes with no textual equivalent. Indented code blocks with
$prompts are announced as "dollar" before each command. Long YAML manifests andkubectloutput tables are read line by line with no summary of what they show. The logo image's alt text is "logo" rather than "KubeVirt". Wide status tables (for example the Arm64 feature-gate table with a status column per gate) are readable but tedious without a caption or summary row.
Comment
Strengths:
- Responsive Material for MkDocs theme with viewport meta, mobile drawer navigation, full-screen search, and in-drawer table of contents.
- Skip-to-content link, search keyboard shortcuts, and ARIA-labeled controls out of the box.
lang="en", singleh1, and consistent heading hierarchy on pages.- Light and dark schemes with a toggle; active tabs underlined as well as colored.
- Descriptive alt text on the Windows driver screenshots.
Weaknesses:
- Header and tab text on the custom teal primary color fails WCAG AA (about 2.6:1); body links are borderline (about 4:1).
- The Architecture stack diagram is ASCII art with no text alternative.
- Older pages use
$-prefixed indented code blocks mixed with output. - Very long pages (Disks and Volumes, Interfaces and Networks, Live Migration, Release Notes) with no internal grouping.
- Wide tables and 500-plus long code lines require horizontal scrolling on
mobile; the
max-contenttable override needs device verification. - Logo alt text is "logo" rather than the project name; no code copy button.
Rating: 3 - Meets standards
Branding and design
CNCF seeks to support enterprise-ready open source software. A key aspect of this is branding and marketing. We evaluate on the following:
-
Is there an easily recognizable brand for the project (logo + color scheme) clearly identifiable?
Yes. The KubeVirt user guide displays the project's teal heptagon logo (
docs/assets/KubeVirt_icon.png) in the site header and uses it for the favicon (favicon32x32.png). Themkdocs.ymltheme configuration selects the Materialtealpalette for both the light and dark color schemes, anddocs/stylesheets/extra.csspins the primary color to#0db2b6and the accent color to#006166. Navigation section labels in the sidebar use a third brand tone,#00797f.The colors come from the same family the main
kubevirt.iowebsite defines in_sass/_colors.scssas$kv-color--green-300through$kv-color--green-700(for example,#00797fand#006166). The logo mark itself is distinctive and is the only mark used in the guide's chrome, so a reader landing on any page can identify the site as KubeVirt immediately. -
Is the brand used across the website consistently?
Yes, within the user guide. Logo, favicon, and palette are set once at the theme level, so every page renders the same header, colors, and active-tab underline without any per-page effort from authors. The dark scheme reuses the same teal primary and accent values, so switching modes keeps the brand intact.
Consistency across the project's two web properties is partial. The main
kubevirt.iosite is a Jekyll and Bootstrap site that uses the horizontal wordmarkKubeVirt_logo_color.svg, the Open Sans typeface, and a fully documented SCSS color scale, while the user guide uses the square icon-only mark, Roboto, and three hand-copied hex values. The two sites share the color family and logo mark but differ in logo variant, typography, header layout, and footer, so the transition between them is noticeable. The user guide'smkdocs.ymldefines noextra.sociallinks orcopyrightfooter, and thedocs/assetsdirectory still contains legacy assets from a previous site generator (asciibinder-logo-horizontal.png,asciibinder_web_logo.svg,book_pages_bg.jpg) that are not referenced by any page. -
Is the website's typography clean and well-suited for reading?
Yes. The guide does not override the theme fonts, so it inherits Roboto for body text and Roboto Mono for code, loaded from Google Fonts. Headings, body copy, admonitions, tables, and syntax-highlighted code blocks all use these two faces at the theme's default sizes and line heights, which are tuned for long-form technical reading. Inline code receives a light
1pxborder fromextra.css, which helps distinguish identifiers from prose.Two custom rules affect readability. The rule
.md-nav a, .md-typeset a { filter: brightness(80%); }darkens all link text, including links in the dark scheme, and its effect on contrast has not been verified. The rule.md-typeset table:not([class]) { width: max-content; }lets wide tables extend past the content column and rely on horizontal scrolling, which is useful for the many API-field tables but can crowd narrow viewports. Typography also differs from the main site, which uses Open Sans at a 16px base.
Comment
Strengths:
- Distinctive logo mark and brand colors applied at the theme level, so branding is uniform on every page.
- Light and dark schemes share the same brand palette.
- Default theme typography (Roboto and Roboto Mono) is legible and consistently applied to prose, tables, and code.
- Brand colors match the color family the main website defines, so the two properties feel related.
Weaknesses:
- The user guide and
kubevirt.iouse different logo variants, typefaces, and header and footer treatments, with no shared brand definition to keep them aligned. - The guide's header and footer contain no link back to
kubevirt.ioor to the project's community channels. - The
filter: brightness(80%)link rule and themax-contenttable rule have not been checked for contrast and small-viewport behavior. - Legacy logos and a background image remain in
docs/assetswithout being used.
Rating: 4 - Meets or exceeds standards
Case studies/social proof
One of the best ways to advertise an open source project is to show other organizations using it. We evaluate on the following:
-
Are there case studies available for the project and are they documented on the website?
Partially. Two CNCF-published end-user case studies feature KubeVirt: NTT Docomo Business and Swisscom, both at
cncf.io/case-studies. Neither thekubevirt.iowebsite nor the user guide links to them, so a visitor to either property has no way to discover them. Thekubevirt.iolanding page and theADOPTERS.mdfile in thekubevirt/kubevirtrepository also invite contributors to submit "blog posts, case studies, or labs", and the user guide'scontributing.mdrepeats that invitation, but the website has no case-study section or category and no blog post is tagged or titled as a case study.The closest thing to project-hosted case studies is the
ADOPTERS.mdtable, which lists roughly 44 organizations across three types (End-user, Integration, Vendor) with a "Since" year and a one- to three-sentence "Use-Case" column. Several entries, such as Cloudflare, CoreWeave, NVIDIA, SK Telecom, and S3NS, describe concrete production uses. This text is only in the GitHub repository; the website reads the same organizations from_data/adopters.ymlbut renders only logos and links, dropping the use-case descriptions. -
Are there user testimonials available?
No, not in the form of attributed quotes on the website. The "Use-Case" statements in
ADOPTERS.mdare written by the adopters in the first person ("We use KubeVirt as part of our ...") and function as informal testimonials, but they are not surfaced onkubevirt.ioor in the user guide. The website's Interviews video playlist contains community and contributor interviews rather than customer testimonials. -
Is there an active project blog?
Yes, at
kubevirt.io/blogs, with about 106 posts plus 24 "This Week in KubeVirt" digests and a set of release announcements. Cadence has slowed markedly: 24 to 25 posts per year in 2018 and 2019, 20 in 2020, 6 to 8 per year from 2021 to 2023, 2 in 2024, 6 in 2025, and 3 so far in 2026 (most recently September 2026). Recent posts are substantive, covering the v1.8 release, beta features on by default in v1.9, a security audit announcement, and cross-cluster live migration networking. Categorization is thin: 92 posts are in thenewscategory, 12 inuncategorized, and tags are used inconsistently, so there is no way to filter for adoption or user-story content. -
Are there community talks for the project and are they present on the website?
Yes. The
kubevirt.io/videossection has pages for Talks, Demos, Interviews, KubeVirt Summit, and Weekly Meetings, each embedding a curated YouTube playlist. The Summit page links per-year playlists for five past editions and advertises the sixth annual KubeVirt Summit in October 2026 with its CfP dates. The Talks page also points to the community Events wiki for upcoming CfPs and conference sessions. The user guide'scontributing.mdlinks only to the New Contributor session recording; nothing in the user guide points to the talks, demos, or Summit content. -
Is there a logo wall of users/participating organizations?
Yes. The
kubevirt.iolanding page renders three logo walls ("End Users", "Vendors", and "Integrations") from_data/adopters.yml, which is generated byadopters.pyand kept in sync withADOPTERS.mdthrough a documented two-step PR process. Each logo links to the organization's site and shows the name in a tooltip. The wall shows who uses KubeVirt but not how or why, because the use-case text is not carried over. The user guide does not display or link to the logo wall.
Comment
Strengths:
- Curated adopters list with a "Since" year and first-person use-case text for roughly 44 organizations, including major production users.
- Three-category logo wall on the landing page, kept in sync with
ADOPTERS.mdthrough a documented process. - Video section with separate Talks, Demos, Interviews, Summit, and Weekly Meetings playlists, plus an annual Summit with a public CfP.
- Blog posts remain technically substantive when published.
Weaknesses:
- Two CNCF case studies featuring KubeVirt are not linked from
kubevirt.ioor the user guide. - Adopter use-case statements are dropped when the adopters list is rendered as a logo wall.
- No attributed testimonials, case-study page, or blog category for user stories.
- Blog cadence has declined sharply since 2020 and categorization is nearly flat.
- The user guide does not link to adopters, case studies, talks, or the blog.
Rating: 3 - Meets standards
SEO, Analytics and site-local search
SEO helps users find your project and its documentation, and analytics helps you monitor site traffic and diagnose issues like page 404s. Intra-site search, while optional, can offer your readers site-focused search results. We evaluate on the following:
-
Is analytics enabled for the production server?
Partially. The main website (kubevirt.io, built from the kubevirt.github.io repository) loads Adobe Analytics through a Red Hat–hosted tag script (
//www.redhat.com/ma/dpal.js) in_includes/head.html, so page views on the main site are collected. The user guide (kubevirt.io/user-guide, built fromkubevirt/user-guidewith MkDocs) has no analytics of any kind:mkdocs.ymlcontains noextra.analyticsblock, and the rendered pages load only the theme bundle. The main site also carries agoogle-site-verificationmeta tag, indicating that Google Search Console is set up for the domain. -
Is analytics disabled for all other deploys?
No for the main site; not applicable for the user guide. The Adobe Analytics script is included unconditionally in the main site's
head.html, with no check on the Jekyll environment or the Netlify deploy context, so it also runs on Netlify deploy previews and local builds. The user guide has no analytics in any deploy, including the Netlify production alias (kubevirt-user-guide.netlify.app) and pull-request previews. -
If project is using Google Analytics, has it migrated to GA4?
Not applicable. The project uses Adobe Analytics rather than Google Analytics, so there is no Universal Analytics property to migrate. No
G-orUA-measurement ID appears in either repository or in the rendered pages. -
Can Page-not-found (404) reports easily be generated from site analytics?
Not for the user guide, because it has no analytics; broken inbound links to the user guide are invisible. Both sites do serve proper 404 responses (the user guide returns HTTP 404 with the theme's not-found page, and the main site has a custom
404.html), so a 404 report would be possible if page-level analytics were collecting the URL. For the main site, whether a 404 report is available depends on the Adobe Analytics workspace that Red Hat administers, and nothing in the repositories documents how to obtain one. -
Is site indexing supported for the production server, while disabled for website previews and builds for non-default branches?
Indexing is supported in production. The main site generates a sitemap with
jekyll-sitemap, and MkDocs generateshttps://kubevirt.io/user-guide/sitemap.xml, which resolves with HTTP 200. Each user-guide page sets a canonical link tohttps://kubevirt.io/user-guide/...becausesite_urlis set inmkdocs.yml, and the canonical is preserved on the Netlify alias, which steers search engines to the production URL.Two configuration defects remain. The
robots.txtat kubevirt.io contains only a Sitemap directive (with a stray double slash,https://kubevirt.io//sitemap.xml) and does not reference the user guide sitemap. Thenetlify.tomlinkubevirt/user-guidestill runs asedcommand that rewritessite_url: https://kubevirt.io/docs, a value that no longer exists inmkdocs.yml, so that step is a no-op. Neither repository sets anoindexmeta tag orX-Robots-Tagheader for previews; the project relies on Netlify's default behavior of marking deploy-preview URLs asnoindex. -
Is local intra-site search available from the website?
Yes for the user guide, and only partially for the main site. The user guide enables the MkDocs
searchplugin with a custom token separator, and the search box appears in the header on every page. The main site has asearch.htmlpage backed by lunr.js, but its index is built only fromsite.posts, so it covers blog posts and not the main site's other pages. Neither search covers the other site; a user-guide search does not surface blog or main-site content, and the main-site search does not surface user-guide pages. -
Are the current custodian(s) of the analytics accounts (such as Google CSE) documented?
No. Neither repository documents who administers the Adobe Analytics property, the Netlify sites (
kubevirt-user-guideand the main site), or the Google Search Console verification. TheOWNERSandOWNERS_ALIASESfiles list code approvers and reviewers only, and the README mentions the Netlify Open Source plan without naming an account owner. Because the analytics script is served from redhat.com, access to the data appears to be held by Red Hat staff rather than by the project, and that dependency is not recorded anywhere.
Comment
Strengths:
- Full-text local search in the user guide, with a tuned separator for technical tokens.
- Sitemaps for both sites and correct canonical links on user-guide pages.
- Google Search Console verification on the production domain.
- Proper HTTP 404 responses and custom not-found pages on both sites.
Weaknesses:
- No analytics on the user guide, so page-level usage and 404 data for documentation are unavailable.
- Main-site analytics run on previews and local builds as well as production.
- Main-site search indexes blog posts only, and there is no cross-site search.
- The
robots.txton kubevirt.io references a malformed sitemap URL and omits the user-guide sitemap. - Custodians of the analytics, Netlify, and Search Console accounts are not documented.
Rating: 2 - Needs improvement
Maintenance planning
Website maintenance is an important part of project success, especially when project maintainers aren’t web developers. We evaluate on the following:
-
Is the website tooling well supported by the community (i.e., Hugo with the Docsy theme) or commonly used by CNCF projects?
Yes. The user guide is built with MkDocs and the Material for MkDocs theme, plus the
mkdocs-awesome-navandmkdocs-redirectsplugins. All four are actively maintained, widely used open-source projects, and Material for MkDocs in particular is common among CNCF and Kubernetes-ecosystem projects. The main website (kubevirt.io) is a Jekyll site with a hand-built Bootstrap 4 layout and a dozen Jekyll plugins. Jekyll is mature and well supported but is less common among CNCF projects than Hugo or Docusaurus, and the custom theme means design changes fall entirely on the project. The two sites use different static-site generators, so maintainers need to know both toolchains. -
Is the project actively cultivating website maintainers from within the community?
Only informally. Both repositories have
OWNERSfiles with active reviewer and approver lists, and the main website'sOWNERSfile records emeritus approvers with dates, which shows the roster is periodically pruned. The website README explicitly invites UI/UX developers to pick upkind/websiteissues, and the user guide README says contributions are welcome. However, there is no documented path from contributor to website maintainer, and the communitysig-list.mdshows asig/documentationlabel with no chairs or members. Commit history over the past year shows one person as the top human committer in both repositories, with most other contributions coming from feature authors documenting their own work or from Dependabot. -
Are site build times reasonable?
Yes. Both sites are built by a Prow post-submit job that runs
make buildand pushes the output to agh-pagesbranch served by GitHub Pages. Comparing commit timestamps onmainwith the corresponding post-submit site update commits ongh-pagesshows the user guide is republished within about 40 seconds of a merge and the main website within about 90 seconds. Pull-request previews for the user guide build on Netlify from a pinnednetlify.tomlcommand that installs MkDocs withpipon every build. As noted under SEO,netlify.tomlstill contains an obsoletesedstep, which is harmless but suggests the file has not been reviewed recently. -
Do site maintainers have adequate permissions?
Partly documented. Merging is governed by Prow and the
OWNERSfiles, so approvers can land content changes without additional access. Deployment is fully automated through thekubevirt-botaccount, which pushes togh-pages, so no maintainer needs push rights to the published branch. Access to the supporting services is not documented: nothing in either repository states who can administer the Netlify site (kubevirt-user-guide), the GitHub Pages and custom-domain settings, DNS for kubevirt.io, or the Prow job definitions inkubevirt/project-infra. Whether current approvers hold those permissions cannot be determined from the repositories. -
Is the website accessible via HTTPS?
Yes. Both
https://kubevirt.io/andhttps://kubevirt.io/user-guide/are served over HTTPS by GitHub Pages with a valid certificate for the custom domain. The Netlify preview aliashttps://kubevirt-user-guide.netlify.app/is also served over HTTPS. -
Does HTTP access, if any, redirect to HTTPS?
Yes. Requests to
http://kubevirt.io/,http://www.kubevirt.io/, andhttp://kubevirt.io/user-guide/all return301 Moved Permanentlyto the HTTPS equivalent (withwwwalso collapsing to the bare domain), and the Netlify alias redirects HTTP to HTTPS as well. The production responses do not include aStrict-Transport-Securityheader, so browsers rely on the redirect rather than HSTS to enforce HTTPS on repeat visits.
Comment
Strengths:
- Material for MkDocs is well supported and common among CNCF projects.
- Fully automated publish pipeline: merge to
maintriggers a Prow job that pushes togh-pagesin roughly 40 to 90 seconds. - HTTPS everywhere, with HTTP and
wwwredirecting to the canonical HTTPS domain. OWNERSfiles are maintained, including dated emeritus entries on the website repository.- Netlify pull-request previews and a periodic Prow link checker catch problems before and after publish.
Weaknesses:
- Two different static-site generators and a custom Jekyll theme double the maintenance surface.
- No documented path for cultivating website maintainers; the
sig/documentationentry in the community SIG list is empty. - Heavy reliance on one active documentation maintainer across both repositories.
- Administrative access to Netlify, DNS, GitHub Pages, and Prow job definitions is undocumented.
- No
Strict-Transport-Securityheader on production responses.
Rating: 3 - Meets standards
Recommendations
Single-source requirement
- Document the content boundary. Add a short "Where documentation lives" section
to the README of
kubevirt/user-guide,kubevirt/kubevirt.github.io, andkubevirt/kubevirtstating that user and operator documentation belongs in the user guide, marketing, blog, and community content belongs on the website, andkubevirt/kubevirt/docsis for design and developer notes only. Link to it fromdocs/contributing.mdin the user guide. - Audit
kubevirt/kubevirt/docsfor user-facing content. Start with the files the user guide already links to (getting-started.md,architecture.md,cloud-init.md), move the user-facing portions into the guide, and replace the originals with a one-line pointer so search results and old links still resolve. - Do the same triage for the CDI
doc/directory: move the pages the user guide links to from six storage pages into the guide'sstorage/section, or add a clear "CDI reference documentation" page in the guide that explains why the rest remains in the CDI repository. - Decide whether the website and user guide should share a repository, and record the decision. If they stay separate, note the reason (different generators, maintainers, and audiences) in both READMEs. If the project later converges the two toolchains, as suggested in the maintenance-planning recommendations, move the website pages into the user-guide repository or bring the guide into the website repository as a Git submodule.
- Give the API reference a visible home in the user guide by adding a navigation
entry or landing page that links to
kubevirt.github.io/api-reference, so readers do not need to know it is published from a separate repository.
Website requirements
- Bring the user guide footer into compliance. Set
copyright: "Copyright © KubeVirt a Series of LF Projects, LLC"inmkdocs.yml, and add anoverrides/partials/copyright.html(or afooter.htmloverride) that appends "We are a Cloud Native Computing Foundation incubating project", the CNCF logo linked tocncf.io, and a link tohttps://lfprojects.org/policies/for trademark and terms. Match the wording and links used in the main website footer so the two properties read as one. - Add the © symbol to the main website copyright line in
_includes/footer.htmlso it reads "Copyright © KubeVirt a Series of LF Projects, LLC". - Point vendor logos at KubeVirt-specific pages. For each entry in
ADOPTERS.mdwhose link is a corporate homepage, ask the vendor for a URL that mentions KubeVirt support or their KubeVirt-based product, and update the link; drop the logo from the Vendors section if none exists. - Add a root
CODE_OF_CONDUCT.mdto bothkubevirt/user-guideandkubevirt/kubevirt.github.iothat links to thekubevirt/communitycode of conduct, so the file is present where the checklist expects it rather than only inherited from the organization default. - Add a
CONTRIBUTING.mdtokubevirt/kubevirt.github.iothat points to the existing contributing content in its README and to the user guide's contributing page. - Update the maturity statement in both footers when the project's CNCF status changes, and add a note in each repository's README naming the file to edit so the statement does not go stale.
Usability, accessibility and devices
- Fix the header and link contrast in
docs/stylesheets/extra.css. Darken--md-primary-fg-colorto a teal that gives at least 4.5:1 against white (for example#007a7eor darker), or keep the brand teal for decorative elements only and set the header and tab text to a dark foreground. Check links against the same 4.5:1 target in both schemes and replace thefilter: brightness(80%)rule with explicit--md-typeset-a-colorvalues per scheme. Verify both light and dark schemes with a contrast checker. - Replace the ASCII stack diagram on the Architecture page with an image that
has descriptive alt text or, better, a Mermaid diagram (enable
pymdownx.superfencescustom fences formermaidinmkdocs.yml) accompanied by a one-paragraph prose description of the layers, so screen reader users and mobile readers get the same information. - Convert
$-prefixed indented code blocks to fenced blocks and enable the code copy button, as described in the New user content recommendations. Break commands over 100 characters across lines with\continuations in the source so they do not require horizontal scrolling on mobile. - Verify on a phone that tables on the Arm64 feature-gate and device status
pages scroll horizontally rather than overflowing the page; if they overflow,
remove the
display: table; width: max-contentoverride fromextra.cssor scope it to specific tables withattr_listclasses. - Split or restructure pages over about 500 lines. Candidates are Disks and Volumes (split by volume type), Interfaces and Networks (split binding methods from network attachment), and Live Migration (move migration strategies and network configuration to sub-pages). Split Release Notes into one page per minor release or paginate it, and set the Release Notes tab to open the newest release.
- Set the logo alt text to "KubeVirt" by adding
extra.homepageor a custompartials/logo.htmloverride, and add a short caption or introductory sentence above each wide status table stating what the table shows. - Add an accessibility check to the Makefile and Prow pre-submit, for example
running
pa11y-cior Lighthouse against the built site for a sample of pages, so contrast regressions are caught in pull requests.
Branding and design
- Publish a short brand reference, either in the
kubevirt.github.iorepository or in thecommunityrepository, that lists the canonical logo files (icon and horizontal wordmark), the hex values of the$kv-color--green-*scale, and the approved typefaces. Havedocs/stylesheets/extra.cssin the user guide cite that reference in a comment so the two sites stay aligned when the palette changes. - Align the user guide's brand tokens with the main site's scale. Replace the ad
hoc
#0db2b6primary with a value from the documented scale (for example,$kv-color--green-300,#00aab2), or add#0db2b6to the scale so both properties draw from the same list. - Add an
extra.socialblock tomkdocs.ymlso the theme footer shows the project's GitHub, Slack, andkubevirt.iolinks. This gives readers a visual and navigational link between the guide and the main site at almost no cost. The Communication methods recommendations propose the same change together withrepo_url; thecopyrightline is covered in the Website requirements recommendations. - Consider using the horizontal
KubeVirt_logo_color.svgwordmark in the guide's header, or add the wordmark to the main site's header alongside the icon, so both properties present the same logo variant. - Remove the unused legacy assets
asciibinder-logo-horizontal.png,asciibinder_web_logo.svg, andbook_pages_bg.jpgfromdocs/assetsso the repository contains only current brand assets. - Remove the unsupported top-level
site_faviconkey frommkdocs.yml; MkDocs ignores it and the active favicon is already set undertheme.favicon.
Case studies/social proof
- Link the two existing CNCF case studies (NTT Docomo Business and Swisscom)
from
kubevirt.io, for example in a "Case Studies" block beneath the End Users logo wall on the landing page. This is a quick win: the content already exists and is published by CNCF. - Extend
adopters.pyand_data/adopters.ymlto carry the "Use-Case" text fromADOPTERS.md, and show it on the website as a tooltip or an expandable card on each logo. This turns the logo wall into a set of short, attributed testimonials at no authoring cost. - Create a
/adopters/or/case-studies/page onkubevirt.iothat renders the full adopters table (type, name, since, use case) and links to the CNCF case studies, so evaluators have a single place for adoption evidence. Add it to_data/site_nav_pages.yml. - Invite two or three adopters with strong use-case statements (for example
Cloudflare, CoreWeave, or SK Telecom) to expand them into short blog posts or
Summit talks, and tag those posts with a
case-studyoruser-storycategory so they can be listed together. - Add a blog category or tag scheme beyond
newsanduncategorized, and backfill recent posts, so the blog index can filter by release, feature, community, and user story. - Set a modest publishing target for the blog, such as one post per KubeVirt minor release plus one community or adopter post per quarter, and track it in the community repository so cadence does not depend on a single author.
- In the user guide, add a short "Community and adoption" block to
docs/index.mdthat links to thekubevirt.ioblog, videos, Summit, adopters or case-studies page, and Slack. Optionally add a top-level "Community" entry todocs/.nav.ymlthat opens thekubevirt.io/communitypage. - In
docs/contributing.md, in addition to inviting readers to submit case studies, link to the existing adopters list and case studies so contributors can see the format they are being asked to follow.
SEO, Analytics and site-local search
- Enable analytics on the user guide. Add an
extra.analyticsblock tomkdocs.yml(the theme supports Google Analytics 4 natively, or use a customoverrides/main.htmlpartial to load the same Adobe Analytics tag the main site uses) so documentation page views, search terms, and 404 hits are captured. - Gate analytics to production only. In the main site, wrap the
dpal.jsinclude in_includes/head.htmlwith a check onjekyll.environment == "production"and setJEKYLL_ENV=productiononly in the Netlify production context. In the user guide, inject the analytics snippet only when the NetlifyCONTEXTvariable equalsproduction, for example by templating it in thenetlify.tomlbuild command. - Add an explicit
noindexfor non-production deploys rather than relying on Netlify defaults. EmitX-Robots-Tag: noindexfrom a_headersfile or a[context.deploy-preview]/[context.branch-deploy]section in each repository'snetlify.toml. - Fix
robots.txton kubevirt.io: correct the sitemap URL tohttps://kubevirt.io/sitemap.xmland add a secondSitemap:line forhttps://kubevirt.io/user-guide/sitemap.xml. - Remove the obsolete
sedline in the user guide'snetlify.tomlthat rewritessite_url: https://kubevirt.io/docs, sincemkdocs.ymlalready setssite_urltohttps://kubevirt.io/user-guideand the command no longer has any effect. - Extend the main site's lunr index in
_layouts/search.htmlto includesite.pagesin addition tosite.postsso that non-blog pages are searchable, and add a link from the main site's search page to the user guide search (or vice versa) so users can find documentation from either entry point. - Name the custodians of the Adobe Analytics property and Google Search Console in the "Site infrastructure" section proposed in the Maintenance planning recommendations, and describe how a maintainer requests access or a 404 report.
- Once analytics are in place, set up a recurring 404 report (for example, a
saved report filtered on the not-found page title) and use it to add missing
entries to the
redirectsplugin map inmkdocs.yml.
Maintenance planning
- Document infrastructure ownership. Add a "Site infrastructure" section to the
README of both
kubevirt/user-guideandkubevirt/kubevirt.github.io(or a page inkubevirt/community) that lists who administers the Netlify site, GitHub Pages and custom-domain settings, DNS for kubevirt.io, the analytics and Search Console accounts, and the Prow job definitions inkubevirt/project-infra, and how a maintainer requests access. - Give documentation a formal home. Populate the
sig/documentationentry in the communitysig-list.mdwith chairs, a meeting cadence or async channel, and a charter that includes both the user guide and the website, so newcomers know where to volunteer and maintainers have a succession path. - Publish a maintainer ladder. In the website and user-guide READMEs, describe
how a contributor becomes a reviewer and then an approver (for example, a
number of merged docs PRs and a nomination), mirroring the process in
kubevirt/communityfor code SIGs. - Reduce bus-factor risk by recruiting at least one additional regular website
reviewer for each repository, using the existing
kind/websiteandkind/documentationlabels and agood-first-issuepass to seed starter tasks. - Plan to converge the two toolchains. Evaluate moving the main site to Material for MkDocs or another generator with a supported theme, such as Hugo or Docusaurus, so a single skill set covers both sites, and track the decision in an issue even if the migration is deferred.
- Pin the MkDocs package versions in
netlify.toml(or use arequirements.txt) so preview builds are reproducible and match the Prow image. Removing the obsoletesedline is covered in the SEO recommendations. - Add a
Strict-Transport-Securityheader. GitHub Pages does not let you set response headers directly, so either enable HSTS through the DNS/CDN provider in front of kubevirt.io or, if none exists, record the limitation in the infrastructure section so it is a known gap. - Periodically review
OWNERS_ALIASESin the user-guide repository and add dated emeritus entries as the website repository already does, so the approver list reflects who is actually active.
Related information
References and notes
Rating values
The numeric rating values used in this document are as follows:
- Not present
- Needs improvement
- Meets standards
- Meets or exceeds standards
- Exemplary