Skip to main content

documentation-standards

Standards for Kubebuilder documentation in docs/book/src/. Use when writing or reviewing documentation, tutorials, guides, or plugin docs.

Source facts

Repository
kubernetes-sigs/kubebuilder
Last source activity
April 17, 2026 at 13:35
Detected SKILL.md language
English
Stars
9,361
Forks
1,714

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
documentation-standards
description
Standards for Kubebuilder documentation in docs/book/src/. Use when writing or reviewing documentation, tutorials, guides, or plugin docs.
license
Apache-2.0
metadata
{"author":"The Kubernetes Authors"}
## Workflow ### For Writing New Documentation 1. Identify the documentation type (tutorial, plugin, reference, conceptual) 2. **Verify technical accuracy**: Check controller-runtime/controller-tools source code (see "Verifying Dependency Information" in [references/REFERENCE.md](references/REFERENCE.md)) 3. Apply Language Standards and Formatting Standards (see sections below) 4. **CRITICAL**: Use `{{#include}}` or `{{#literatego}}` from testdata when available (see Code Examples section) 5. Review against checklist before submitting ## Auto-Generated Testdata Tutorial testdata projects under `docs/book/src/*/testdata/project/` are auto-generated. **Critical**: Files in testdata are generated from two sources: 1. **Tutorial-specific generators** in `hack/docs/internal/`: - `internal/cronjob-tutorial/` - CronJob tutorial - `internal/getting-started/` - Getting Started guide - `internal/multiversion-tutorial/` - Multiversion tutorial 2. **Default scaffold from plugins** in `pkg/plugins/`: - `AGENTS.md` generated by `pkg/plugins/golang/v4/scaffolds/internal/templates/agents.go` - `config/` kustomize files generated by `pkg/plugins/common/kustomize/*/scaffolds/internal/templates/` - Other boilerplate files from their respective plugin templates **To fix documentation issues in testdata**: - If in tutorial-specific files: Edit generators in `hack/docs/internal/` - If in default scaffold files (`AGENTS.md`, `config/` files): Edit plugin templates in `pkg/plugins/` - After template changes: Run `make install` to rebuild binary, then `make generate-docs` See [references/REFERENCE.md](references/REFERENCE.md) for generator locations and commands. ## Auto-Generated Marker Documentation **Marker documentation is auto-generated from controller-tools** and **cannot be edited directly**. Files using `{{#markerdocs}}` preprocessor (auto-generated from controller-tools comments): - `docs/book/src/reference/markers/crd.md` - `docs/book/src/reference/markers/webhook.md` - `docs/book/src/reference/markers/object.md` - `docs/book/src/reference/markers/crd-validation.md` - `docs/book/src/reference/markers/rbac.md` - `docs/book/src/reference/markers/crd-processing.md` - `docs/book/src/reference/controller-gen.md` (sections with `{{#markerdocs}}`) **To fix marker documentation**: 1. Marker documentation comes from controller-tools repository, not Kubebuilder 2. Edit marker comments in controller-tools source code at `github.com/kubernetes-sigs/controller-tools` 3. Documentation is extracted from Go comments using the `markerdocs` preprocessor 4. The preprocessor is configured in `docs/book/book.toml` and runs via `docs/book/markerdocs.sh` **Do NOT**: - Edit marker documentation files directly in Kubebuilder - Try to fix formatting or language issues in these generated sections - Commit changes to auto-generated marker content **If you find issues in marker documentation**: Report them to controller-tools repository. ## Language Standards - **Plain English**: Avoid jargon, corporate speak, unnecessary complexity - Avoid: "leverage", "utilize", "facilitate", "in order to" - Use: "use", "help", "to" - **Active voice**: Not passive - Good: "Kubebuilder generates the controller" - Bad: "The controller is generated by Kubebuilder" - **Present tense**: Not future - Good: "The webhook validates the request" - Bad: "The webhook will validate the request" - **Direct address**: Use "you", not "we" or "one" - Good: "Run the command to install" - Bad: "We can run the command" or "One should run the command" - **No contractions**: Write out fully - Good: "do not", "it is", "you will" - Bad: "don't", "it's", "you'll" - **Show, don't tell**: Use examples and demonstrations instead of abstract explanations - Good: Show code example with inline comments explaining behavior - Bad: Long paragraph describing what code should do ## Formatting Standards - **Headings**: Use sentence case (`## Creating a new controller`) - **Code blocks**: Must have language tags (` ```go ` not ` ``` `) - **Inline code**: For commands, file names, API objects, field names - **Internal links**: Use relative paths (`../guide.md` not `/docs/guide.md`) - **Link aliases**: Always at bottom of page - **Link text**: Descriptive (not "here" or "click here") - **Admonitions**: Use `<aside class="note">` or `<aside class="warning">` (see [references/REFERENCE.md](references/REFERENCE.md)) ## Code Examples **ALWAYS prefer including from testdata when available** - do not copy/paste code inline. ### Why Use Testdata Includes - **Tested**: Examples validated by `make test-book` - **Maintained**: Docs auto-update when code changes - **Accurate**: No drift between docs and reality ### When to Use Includes vs Inline Code **Use includes** (tutorial code, plugin examples, any testdata project code) **Use inline code** (very short snippets 1-3 lines, pseudo-code, code not in testdata yet) ### Include Shortcodes ```markdown # For Go code (adds syntax highlighting, imports) {{#literatego ./testdata/project/internal/controller/cronjob_controller.go}} # For other files (YAML, JSON, shell) {{#include ./testdata/project/config/manager/manager.yaml}} # For specific sections with anchors {{#include ./testdata/project/Makefile:docker-build}} ``` ### Code Example Structure 1. Context before the code 2. Code include or inline block 3. Explanation after Shell commands: Use `$` prefix for commands, no prefix for output. **All examples and commands must be tested in clean environment before documenting.** See [references/REFERENCE.md](references/REFERENCE.md) for detailed examples. ## Terminology **Always capitalize in prose:** - Kubernetes - YAML, JSON, XML - API, CRD, RBAC, HTTP, HTTPS - Go (the language) **Always lowercase in prose:** - namespace, cluster, controller, webhook, pod, service - kubectl, kubebuilder, kustomize - docker, helm **In code**: Exact capitalization as defined (`corev1.Namespace{}`, `metav1.ObjectMeta`) ## Checklist Before submitting: - [ ] Technical accuracy verified (check source code for controller-runtime/controller-tools features) - [ ] Code examples use `{{#include}}` or `{{#literatego}}` from testdata (not inline copy/paste) - [ ] Language Standards applied (see section above) - [ ] Formatting Standards applied (see section above) - [ ] Terminology correct (see section above) - [ ] No manual edits to auto-generated files (testdata or marker docs) - [ ] All commands tested in clean environment - [ ] Run `make fix-docs` before committing See [references/REFERENCE.md](references/REFERENCE.md) for detailed examples and technical references.
View on GitHub