GitOps source of truth for a Talos Kubernetes cluster managed by ArgoCD and Kargo.
This repository holds application configuration only — Helm values, raw manifests, and local charts. It does not contain the deployment pipeline logic (chart versions, image tags, promotion targets). Those live in kargo-config, which is kept separate to prevent Kargo promotions from triggering ArgoCD feedback loops.
kargo-config/configs/*.yaml argo-config/app-loader
│ │
│ ApplicationSet reads configs │ Helm chart renders ArgoCD Application
└──────────────┐ │ from values supplied by kargo-config
▼ │
ArgoCD managed-apps ───────────┘
ApplicationSet
│
▼ one Application per app
{name}-loader Application
│
┌──────────┴──────────┐
│ │
chart/helm source argo-config
(version from valuesfiles/ + manifests/
kargo-config) (config from argo-config)
-
Bootstrap — the
apps/Helm chart is deployed once (manually or via Talosdeploy). It creates two ArgoCD resources:managed-appsApplicationSet — generates one{name}-loaderApplication for everyconfigs/*.yamlfile inkargo-config.kargo-appsApplication — deploys the Kargo ApplicationSet fromkargo-config/apps/, which manages Kargo CRDs for each app.
-
Per-app Applications — each
{name}-loaderApplication rendered byapp-loaderpulls its chart/image version fromkargo-config/configs/{name}.yamland its values/manifests from this repo (argo-config). -
Kargo writes to
kargo-config, not here — when Kargo promotes a new chart or image version it commits tokargo-config. ArgoCD then picks up the changedconfigs/{name}.yamland redeploys only that app. Nothing inargo-configchanges during a promotion, so no feedback loop is triggered.
argo-config/
├── apps/ Bootstrap Helm chart (deploy once)
│ └── templates/
│ ├── applicationset.yaml Generates {name}-loader Applications from kargo-config/configs/
│ ├── kargo-apps.yaml Deploys kargo-config/apps/ (Kargo CRD ApplicationSet)
│ └── nvidiadevicecclass.yaml
│
├── app-loader/ Helm chart – template for every managed Application
│ └── templates/
│ └── application.yaml Renders an ArgoCD Application; supports multiple source types:
│ • upstream Helm chart (chart.repoURL set)
│ • local Helm chart (helmPath set)
│ • raw git source (gitSource.repoURL set)
│ Always attaches valuesFile and/or manifestsPath from argo-config.
│
├── valuesfiles/ Per-app Helm values overrides
│ ├── cert-manager.yaml
│ ├── cilium.yaml
│ ├── immich.yaml
│ ├── jellyfin.yaml
│ ├── penpot.yaml
│ └── ...
│
├── manifests/ Per-app raw Kubernetes manifests (applied alongside the Helm chart)
│ ├── immich/ e.g. CNPG Cluster, Database, ExternalSecrets
│ ├── penpot/
│ ├── ingress-nginx/
│ └── ...
│
└── helm/ Local Helm charts for custom/bespoke apps
├── omni-tools/
├── paperless-ngx/
└── whoami/
These keys are set in kargo-config/configs/{name}.yaml and consumed by app-loader:
| Key | Purpose |
|---|---|
name |
App name; used as the ArgoCD Application name and namespace default |
namespace |
Target Kubernetes namespace |
gitRepo |
Git repo containing values/manifests (argo-config) |
targetRevision |
Git tag/branch for gitRepo; updated by Kargo on each promotion |
chart.repoURL |
Upstream Helm repo URL |
chart.name |
Chart name |
chart.version |
Chart version; updated by Kargo on each promotion |
valuesFile |
Path to values file in argo-config (e.g. valuesfiles/myapp.yaml) |
manifestsPath |
Path to raw manifests directory in argo-config (e.g. manifests/myapp) |
helmPath |
Path to a local Helm chart in argo-config (instead of upstream chart) |
gitSource.repoURL |
Alternative: deploy directly from a third-party git repo |
extraSyncOptions |
Additional ArgoCD sync options (e.g. ServerSideApply=true) |
ignoreDifferences |
ArgoCD ignoreDifferences rules |
kargo.enabled |
Whether this app has a Kargo pipeline; adds the authorized-stage annotation |
kargo.project |
Kargo project name (namespace for Kargo CRDs) |
Secrets are managed by External Secrets Operator pulling from Pulumi ESC. Each app's manifests/{name}/ directory may contain an ExternalSecret referencing the pulumi-secret-store ClusterSecretStore.
No secrets are stored in this repository.