The two routes
One endpoint, and the target picks the mechanism.
POST /api/clusters/{target}/helm-releases installs a catalog app. If the target names a supervisor it becomes a Flux HelmRelease; otherwise it becomes a CAAPH HelmChartProxy against the guest cluster. Setting imperative takes the direct-Helm route instead. You do not choose the mechanism — you choose the cluster, and the mechanism follows.The install streams: a 200 arrives when the stream opens, not when the install finishes. Read to the terminal done or error event. Treating the 200 as success is the single most common way to misread this endpoint.Nothing goes through Git
Celum keeps no Git repositories and commits nothing. A cluster is applied to the supervisor’s Kubernetes API when it is created, and a catalog install writes aHelmRelease or a HelmChartProxy directly; the objects on the supervisor and the Helm state in the cluster are the record. The GitOps-to-GitLab integration that once committed cluster manifests was removed in 1.202.0 — see Repositories & manifests. “GitOps” in Celum now means one thing: Flux reconciling the HelmReleases Celum applies.
So the question “what is running on this cluster” has exactly one authoritative answer — GET /api/clusters/{cluster}/helm-releases, which talks Helm through the cluster’s own kubeconfig. There is no second, declared list to reconcile it against.
Where Flux fits
Flux runs on the supervisor. It reconciles theHelmRelease objects behind platform components — the CNI, storage backends, monitoring, cert-manager, the Cluster API stack — and behind any catalog app installed onto a supervisor. Every chart panel in the onboarding wizard is ultimately a Flux HelmRelease, which is why installing Flux is a prerequisite step rather than an option.
Guest clusters have no Flux. Their catalog installs arrive as CAAPH HelmChartProxy objects reconciled from the supervisor, and their one-off installs arrive over Helm directly. Flux’s job stops at the supervisor boundary.
The status probe is deliberately blunt:
installed: false means the flux-system namespace is absent or unreachable — with a message field carrying the reason when it is the latter. installed: true, ready: false means the namespace exists but not all three controllers (source-controller, helm-controller, kustomize-controller) report ready. The install is idempotent: re-running it against a healthy supervisor completes in seconds with every resource unchanged.
Permissions
One family covers this group:The Image Library has its own actions,
image:* on krn:celum:image:…, so granting the catalog does not grant golden images, and the other way round.GET /api/charts/versions, GET /api/charts/mirror-status) use platform:GetDefaults on krn:celum:platform:charts, and ArtifactHub search reuses app:List.
The GitOps pages
App catalog
Authoring app definitions — chart source, values template, render preview, chart validation, import and export.
Repositories & manifests
Where the GitOps repositories went, and what replaced them.
Charts & the mirror
Finding charts, the platform catalogue’s pinned versions, and mirror health.
Registry mirroring
Charts and images travel separately — what reaches a guest cluster, what stays on the supervisor, and which half is Harbor-specific.
Day-2 operations
Direct Helm against a tenant — install, upgrade, rollback.
Celum AI answers these questions from the same endpoints —
list_apps for the catalog, list_cluster_helm_releases for what is actually running on a cluster, and install_app for the install itself.