GET /api/apps returns all of them; GET /api/apps/enabled returns only the ones offered during cluster creation.
What a definition holds
The values template
valuesTemplate is plain Go text/template. The definition stays generic and the substitution makes it specific:
clusters/<cluster>/apps/values/<app>.yaml and referenced by the generated ArgoCD Application, so what the chart receives is a normal values file — no templating survives into the cluster.
The fields available come from the cluster form: ClusterName, Supervisor, Domain, StorageClass, Environment, Region, KubernetesVersion, ClusterNamespace, ArgocdNamespace, and the rest of the creation payload.
Preview and validate before you save
Three endpoints let you check a definition without creating anything.1
Render — see the values a cluster would get
POST /api/apps/render takes { "template": "...", "formData": { ... } } and returns { "rendered": "..." }. A malformed template comes back as 400 with the parser’s own message, so a typo is caught in the editor rather than in a commit. Action: app:Render.2
Helm check — does that chart and version exist?
POST /api/apps/helm-check takes { "helmRepoUrl", "chartName", "chartVersion" } and answers each question separately:repoReachable: false with an error string is a URL or network problem; chartFound: false on a reachable repo means the chart name is wrong; versionFound: false means the version is. At most 20 versions come back, newest first. Both https:// and oci:// sources are supported. Action: app:HelmCheck.3
Helm values — start from the chart's own defaults
POST /api/apps/helm-values takes the same body and returns { "values": "..." } — the chart’s default values.yaml. Use it as the starting point for a values template instead of guessing key names. Same action, app:HelmCheck.The enabled flag
enabled: false keeps a definition in the catalog but out of the cluster-creation picker, which reads GET /api/apps/enabled. Use it to retire an app without deleting its definition — existing clusters that already declare it keep working, since their manifests are committed and independent of the catalog entry.
Deleting a definition does not remove the app from clusters that already have it. It only removes the blueprint, and the enrichment that GET /api/gitlab/clusters/<cluster>/apps performs — the cluster’s declared list will still name the app, just without its chart metadata.
Tanzu packages
isTanzuPackage: true changes what gets committed. Instead of generating a Helm-sourced Application plus a values file, Celum commits every entry in packageFiles under clusters/<cluster>/apps/packages/<app>/, generates a kustomization.yaml for that directory, and points an ArgoCD Application at the directory path. Package file contents are themselves Go templates, rendered with ClusterName and Namespace.
Adding a Tanzu-flagged app with no packageFiles fails with 422 and tells you to add them to the definition first — the check happens before anything is committed.
extraResources works the same way for non-Tanzu apps: the named files are committed under clusters/<cluster>/apps/resources/<app>/ and become a third source on the generated Application, so a chart can ship with the ConfigMaps or CRs it needs.
Import and export
The whole catalog moves between installations as one JSON document.GET /api/apps/exportreturns every definition withid,createdAtandupdatedAtstripped, served as an attachment. Action:app:Export.POST /api/apps/importaccepts that array and upserts byname— matching names are updated in place, new ones created. The response counts both and lists per-app failures rather than aborting the batch:
name, an export/import round-trip is idempotent, and renaming an app in the source installation creates a second definition in the target rather than renaming the existing one.
Permissions
Note that
app:Delete is scoped per definition while app:Create is not — you can grant deletion of specific apps without granting creation.
Related
Repositories & manifests
What actually gets committed when a definition is added to a cluster.
Charts & the mirror
Finding a chart to point a definition at, and why a version list can come back empty.
Cluster templates
The same Go-template model applied to whole clusters rather than single apps.
Day-2 operations
The Helm view of what a definition eventually becomes on the cluster.
Celum AI reads this catalog directly —
list_apps returns the definitions (with kind=enabled for the creation-time subset), get_app returns one in full including its values template, and search_helm_charts covers the discovery step before you add one.