Kubernetes manifests from values.yaml

A Helm library chart that generates complete Kubernetes manifests from a concise configuration — no templates required in your application repo.

Helm Library Chart Kubernetes 1.26+ Apache 2.0

Installation

1

Add the Helm repository:

helm repo add helm-apps https://helm-apps.github.io/lib
helm repo update
2

Declare the dependency in your .helm/Chart.yaml:

apiVersion: v2
name: my-app
version: 1.0.0
dependencies:
  - name: lib
    version: "~1"
    repository: "@helm-apps"
3

Update dependencies:

helm dependency update .helm
4

Create .helm/templates/init-helm-apps-library.yaml:

{{- /* Initialize the helm-apps library */}}
{{- include "apps-utils.init-library" $ }}
5

Declare your applications in .helm/values.yaml:

global:
  env: prod

apps-stateless:
  nginx:
    enabled: true
    replicas: 2
    containers:
      nginx:
        image:
          name: nginx
          staticTag: "1.27"
        ports: |
          - name: http
            containerPort: 80
    service:
      enabled: true
      ports: |
        - name: http
          port: 80

apps-ingresses:
  nginx:
    enabled: true
    host: "example.com"
    paths: |
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
6

Render locally to verify:

helm template my-app .helm --namespace my-ns --set "global.env=prod"

Supported resource types

apps-stateless
Deployment + Service + PDB + HPA + VPA
apps-stateful
StatefulSet + Service + PDB + VPA
apps-cronjobs
CronJob + VPA
apps-jobs
Job + VPA
apps-configmaps
ConfigMap
apps-secrets
Secret
apps-ingresses
Ingress + Certificate (cert-manager)
apps-services
Service
apps-certificates
Certificate (cert-manager)
apps-pvcs
PersistentVolumeClaim
apps-limit-range
LimitRange
apps-kafka-strimzi
Kafka (Strimzi)
apps-karpenter-node-pool
Karpenter NodePool
apps-karpenter-node-class
Karpenter EC2NodeClass

Key concepts

Per-environment overrides

Any field can carry environment-specific values resolved via global.env:

replicas:
  _default: 1
  prod: 3

Config reuse with _include

Define shared configuration blocks once, reference them anywhere:

# helm-apps-defaults.yaml
my-defaults:
  imagePullSecrets: |
    - name: registry-secret
  revisionHistoryLimit: 3

# values.yaml
apps-stateless:
  my-app:
    _include: ["my-defaults"]
    replicas: 2   # overrides anything from _include

Go template interpolation

Field values support Go template expressions:

apps-stateless:
  my-app:
    service:
      name: "{{ $.CurrentApp.name }}-svc"

Links

GitHub repository  ·  Usage guide  ·  Full example values  ·  Issues