.claude/skills/helm-charts/SKILL.md
Creates and manages Helm charts for Kubernetes deployments. This skill should be used when packaging applications for Kubernetes using Helm, creating Chart.yaml, values.yaml, and templates. It covers chart structure, templating, dependencies, and deployment patterns. Use this skill for Phase IV+ Kubernetes deployments.
npx skillsauth add anasahmed07/doit helm-chartsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Helm is the package manager for Kubernetes. It packages Kubernetes manifests into reusable charts that can be versioned, shared, and deployed with customizable values.
A chart is a collection of files that describe a related set of Kubernetes resources:
mychart/
├── Chart.yaml # Chart metadata (name, version, dependencies)
├── values.yaml # Default configuration values
├── charts/ # Dependency charts
├── templates/ # Kubernetes manifest templates
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── _helpers.tpl # Template helpers
│ └── NOTES.txt # Post-install notes
└── .helmignore # Files to ignore when packaging
| File | Purpose |
|------|---------|
| Chart.yaml | Metadata: name, version, appVersion, dependencies |
| values.yaml | Default configuration values (overridable) |
| templates/ | Go-templated Kubernetes manifests |
| _helpers.tpl | Reusable template snippets |
apiVersion: v2 # Helm 3 uses v2
name: taskflow # Chart name
description: TaskFlow Platform # Short description
type: application # application or library
version: 1.0.0 # Chart version (SemVer)
appVersion: "1.0.0" # Application version
# Dependencies (optional)
dependencies:
- name: postgresql
version: "12.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
# Global settings
global:
imageRegistry: ""
imagePullSecrets: []
# Per-service configuration
api:
replicaCount: 1
image:
repository: taskflow/api
tag: "latest"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8000
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
env:
DATABASE_URL: ""
SSO_URL: "http://sso:3001"
# Feature flags
postgresql:
enabled: true
auth:
postgresPassword: "postgres"
database: "taskflow"
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "taskflow.fullname" . }}
labels:
{{- include "taskflow.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.api.replicaCount }}
selector:
matchLabels:
{{- include "taskflow.selectorLabels" . | nindent 6 }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.api.image.repository }}:{{ .Values.api.image.tag }}"
ports:
- containerPort: {{ .Values.api.service.port }}
env:
- name: DATABASE_URL
value: {{ .Values.api.env.DATABASE_URL | quote }}
{{/*
Expand the name of the chart.
*/}}
{{- define "taskflow.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
*/}}
{{- define "taskflow.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "taskflow.labels" -}}
helm.sh/chart: {{ include "taskflow.chart" . }}
{{ include "taskflow.selectorLabels" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "taskflow.selectorLabels" -}}
app.kubernetes.io/name: {{ include "taskflow.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
helm create mychart
# From local directory
helm install my-release ./mychart
# With custom values file
helm install my-release ./mychart --values custom-values.yaml
# With inline value overrides
helm install my-release ./mychart \
--set api.replicaCount=3 \
--set api.image.tag=v2.0.0
# To specific namespace (create if needed)
helm install my-release ./mychart \
--namespace production \
--create-namespace
# Dry run (preview without installing)
helm install my-release ./mychart --dry-run --debug
helm upgrade my-release ./mychart --values new-values.yaml
helm rollback my-release 1 # Rollback to revision 1
helm uninstall my-release
helm list
helm list --all-namespaces
# Render templates without installing
helm template my-release ./mychart
# Debug with computed values
helm template my-release ./mychart --debug
For TaskFlow (api, sso, web, mcp-server), use a single chart with multiple templates:
helm/taskflow/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ ├── api/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── configmap.yaml
│ ├── sso/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ ├── web/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ ├── mcp-server/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── ingress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "taskflow.fullname" . }}-config
data:
SSO_URL: {{ .Values.sso.url | quote }}
API_URL: {{ .Values.api.url | quote }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "taskflow.fullname" . }}-secrets
type: Opaque
data:
database-url: {{ .Values.secrets.databaseUrl | b64enc | quote }}
openai-api-key: {{ .Values.secrets.openaiApiKey | b64enc | quote }}
spec:
containers:
- name: api
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "taskflow.fullname" . }}
annotations:
{{- toYaml .Values.ingress.annotations | nindent 4 }}
spec:
ingressClassName: {{ .Values.ingress.className }}
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: {{ include "taskflow.fullname" . }}-api
port:
number: 8000
- path: /
pathType: Prefix
backend:
service:
name: {{ include "taskflow.fullname" . }}-web
port:
number: 3000
{{- end }}
{{ .Values.foo | quote }} for stringsnindent for proper YAML formattingIfNotPresent in production, Always in devRefer to references/ for:
chart-patterns.md - Advanced templating patternsvalues-structure.md - Values.yaml organization guideRefer to assets/ for:
base-chart/ - Complete starter chart templatedevelopment
Use when building real-time communication systems with WebSockets or Socket.IO. Invoke for bidirectional messaging, horizontal scaling with Redis, presence tracking, room management.
development
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
development
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
tools
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.