helm-charts
CLAUDE.md133 starsChanged 6 months agoMITView on GitHub
This is a community Helm chart repository hosting production-grade Kubernetes charts for: actualbudget, cloudflared, drone, kserve, mlflow, n8n, outline, and pypiserver. Charts are published to GitHub Pages via the chart-releaser action. Chart-specific guidance (architecture, external docs, non-obvious patterns) lives in charts/<name>/CLAUDE.md. Read that file when working on a specific chart. Charts that currently have one: actualbudget (charts/actualbudget/CLAUDE.md), mlflow (charts/mlflow/CLAUDE.md), n8n (charts/n8n/CLAUDE.md), outline (charts/outline/CLAUDE.md). Every chart follows this layout: Every non-deprecated chart's .helmignore must exclude files that are not needed in…
In this repository2 other files it gives its agents.
- AGENTS.mdAGENTS.md
- helm-chart-developmentSkill
The file
We split this CLAUDE.md into the rules it gives an agent
8 rules. About 0 are common, 2 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 64
Every chart follows this layout:
- Very specific: line 92
Every non-deprecated chart's .helmignore must exclude files that are not needed in the packaged tarball.
- Very specific: line 101
Do not apply .helmignore changes to deprecated charts (currently: kserve).
- Very specific: line 116
Bump
versiononly once per branch/PR: After the first bump, do not bump again for subsequent commits on the same branch — all changes in … - Very specific: line 144
Always validate field types against the official schema before writing tests: …
- Very specific: line 154
Use @deprecated (not DEPRECATED:) in values.yaml doc comments when deprecating a field:
- Distinctive: line 173
helm-docs re-stage workflow: When README.md is modified by the hook, stage it and re-run:
- Very specific: line 184
Never add a Co-Authored-By trailer to commits.
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Repository Overview
This is a community Helm chart repository hosting production-grade Kubernetes charts for: actualbudget, cloudflared, drone, kserve, mlflow, n8n, outline, and pypiserver. Charts are published to GitHub Pages via the chart-releaser action.
Chart-specific guidance (architecture, external docs, non-obvious patterns) lives in charts/<name>/CLAUDE.md. Read that file when working on a specific chart. Charts that currently have one: actualbudget (charts/actualbudget/CLAUDE.md), mlflow (charts/mlflow/CLAUDE.md), n8n (charts/n8n/CLAUDE.md), outline (charts/outline/CLAUDE.md).
Common Commands
Linting
# Lint all charts (requires chart-testing CLI)
ct lint --debug --config ./.github/configs/ct-lint.yaml --lint-conf ./.github/configs/lintconf.yaml
# Lint with Artifact Hub validator (requires `ah` CLI)
ah lint -p charts/<chart-name>
# Run KubeLinter against a single chart (requires kube-linter CLI)
kube-linter lint charts/<chart-name> --config .kube-linter.yamlUnit Tests
# Run unit tests for a single chart — last argument is the target chart folder
helm unittest --strict --file 'unittests/**/*.yaml' charts/mlflow
helm unittest --strict --file 'unittests/**/*.yaml' charts/outline
# Run unit tests for all charts
for chart in charts/*/; do helm unittest --strict --file 'unittests/**/*.yaml' "${chart%/}"; doneGenerating README
# Regenerate README.md from README.md.gotmpl for a chart (requires helm-docs)
helm-docs --chart-search-root=charts --template-files=README.md.gotmplDependency Updates
# Update chart dependencies
helm dependency update charts/<chart-name>Kind Install Testing
# Install a chart into a local kind cluster (used in CI)
ct install --config ./.github/configs/ct-lint.yaml --charts charts/<chart-name> \
--helm-extra-set-args "--values charts/<chart-name>/values-kind.yaml" \
--helm-extra-args "--timeout 600s"Architecture
Chart Structure
Every chart follows this layout:
charts/<name>/
├── Chart.yaml # Chart metadata, version, appVersion, ArtifactHub annotations
├── Chart.lock # Locked dependency versions
├── .helmignore # Excludes dev/test files from the packaged chart tarball
├── values.yaml # Default values
├── values.schema.json # JSON Schema validation for values (additionalProperties: false)
├── values-kind.yaml # Minimal values for kind cluster CI testing
├── README.md # Auto-generated by helm-docs from README.md.gotmpl
├── README.md.gotmpl # Template source for README generation
├── LICENSE
├── files/ # Static files mounted into containers (e.g., scripts)
├── templates/
│ ├── _helpers.tpl # Template helpers (name, fullname, labels, selectorLabels)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── serviceaccount.yaml
│ ├── hpa.yaml
│ ├── servicemonitor.yaml
│ ├── NOTES.txt
│ └── *_test.yaml # Helm template test files (separate from unittests/)
└── unittests/
└── *_test.yaml # helm-unittest test suites (run via `helm unittest`)Every non-deprecated chart's .helmignore must exclude files that are not needed in the packaged tarball. At minimum it must contain:
README.md.gotmpl
values-kind.yaml
CLAUDE.md
unittests/Do not apply .helmignore changes to deprecated charts (currently: kserve).
Versioning Rules
- Any change to a chart (including docs) requires a
versionbump inChart.yamlfollowing semver. appVersiontracks the upstream application version.- Breaking changes bump MAJOR version and must document manual upgrade steps in
README.md.gotmplunder an "Upgrading" section. - The
artifacthub.io/changesannotation inChart.yamlis used to auto-generate release notes — always populate it for every change. When linking to a GitHub issue or pull request, use the exact name variants below (notIssue,PR, or any other variant):links: - name: GitHub Issue url: https://github.com/community-charts/helm-charts/issues/<number> - name: GitHub PR url: https://github.com/community-charts/helm-charts/pull/<number> - Bump
versiononly once per branch/PR. After the first bump, do not bump again for subsequent commits on the same branch — all changes in the PR are released together under the single bumped version.
CI Pipeline
.github/workflows/release.yml (runs on all PRs/pushes):
- lint-ah: Runs
ah linton all charts for ArtifactHub compliance. - check-helm-docs: Runs
helm-docsand fails if anyREADME.mddiffers from what is committed — catches PRs whereREADME.md.gotmplorvalues.yamldoc comments were updated without regenerating the README. - lint-test: Runs
ct lint(which also callshelm unittest) andct installon changed charts only. Requires bothlint-ahandcheck-helm-docsto pass. Charts with a.skip-kind-testfile skip thect installstep. - release: On merge to
main, runschart-releaserto package, GPG-sign, and publish changed charts to GitHub Pages.
.github/workflows/security-scan.yml (runs on changes to charts/**):
- security-scan: Runs KubeLinter (all built-in checks,
kserveexcluded via.kube-linter.yaml) and Trivy misconfiguration/vulnerability scan (HIGH + CRITICAL severity) against chart templates. Both results are uploaded as SARIF to GitHub Security.
For conditionally-rendered fields (e.g. gated on semverCompare), suppress KubeLinter checks with a per-object annotation rather than a global .kube-linter.yaml exclusion:
metadata:
annotations:
ignore-check.kube-linter.io/<check-name>: "reason"Unit Test Convention
Tests live in unittests/ as YAML files using helm-unittest syntax. Tests assert on rendered template output using set: to override values. Snapshot tests use __snapshot__/ subdirectories.
When asserting a specific value within a larger rendered string (e.g. one line in a multi-line script), use matchRegex with a targeted pattern rather than equal on the full string — keeps tests focused and resilient to unrelated boilerplate changes. matchRegex does substring matching (no anchoring needed); escape regex metacharacters in patterns (e.g. \. for literal dots in version strings).
Always validate field types against the official schema before writing tests:
https://raw.githubusercontent.com/helm-unittest/helm-unittest/refs/heads/main/schema/helm-testsuite.json
Suite-level capabilities can be overridden per-test using the same fields.
Values Schema
values.schema.json uses JSON Schema draft-07 with "additionalProperties": false at the root — every new value added to values.yaml must have a corresponding schema entry or chart linting will fail.
Deprecating Fields
Use @deprecated (not DEPRECATED:) in values.yaml doc comments when deprecating a field:
# -- @deprecated Use newField instead. This field will be removed in a future release.
oldField: ~This is consistent with all existing deprecated fields in the repo and renders as plain text in the helm-docs–generated README. The values.schema.json description strings may use DEPRECATED: since they are not rendered by helm-docs.
Pre-commit Hooks
The repo uses three pre-commit hooks (.pre-commit-config.yaml). Run pre-commit install to activate locally.
| Hook | Trigger | Behavior on failure |
helm-docs | Any chart file change | Regenerates README.md in place; commit fails — re-stage and retry |
kube-linter | Files matching charts/** | Fails commit if Kubernetes best-practice violations found (config: .kube-linter.yaml; kserve is excluded) |
trivyfs-docker | Files matching charts/** | Fails commit if HIGH or CRITICAL misconfigurations/vulnerabilities are detected |
helm-docs re-stage workflow: When README.md is modified by the hook, stage it and re-run:
git add charts/<chart-name>/README.md
git commit -s # retried after hook updatesContributing Requirements
- Each PR must only change one chart at a time.
- Commits require a
Signed-off-bytrailer (git commit -s). - Never add a
Co-Authored-Bytrailer to commits. - YAML files must follow the rules in
.github/configs/lintconf.yaml(2-space indent, no trailing spaces, LF line endings, newline at EOF). - PR descriptions must follow the template in
.github/PULL_REQUEST_TEMPLATE.md: fill in "What this PR does / why we need it", "Which issue this PR fixes" (usingfixes #<number>format), "Special notes for your reviewer", and check all applicable checklist items. - Always use
fixes #<number>(notrefs,closes, or plain#<number>) for every issue the PR addresses. GitHub only creates a bidirectional PR↔issue link and auto-closes issues on merge when thefixeskeyword is present. Usingrefsor a bare#<number>produces no link in GitHub's UI.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

