Skip to main content

Custom resource definitions

The custom resource definitions of the gentianos.io API group, with every field of their spec and status. Paths are dotted from the object root; [] marks the items of a list and {} the values of a map. apiVersion, kind and metadata are the standard object fields and are not listed.

KindScopeDescription
AppNamespaced
AppGrantNamespacedAppGrant is a tenant-scoped authorization grant — a subset of what the ComponentProfile declares.
AppPackageClusterAppPackage is a named addon preset for a family.
BackupPolicyClusterBackupPolicy is where a tenant's bundles go and who can read them.
BrandingClusterBranding is the brand every page on the cluster shows: the concierge, the identity provider's screens, the desktop and the consoles.
BundleSourceClusterBundleSource is a place outside the cluster that holds bundles: the cluster's, declared by its administrator and read to make a tenant; or a tenant's own…
ComponentNamespacedComponent is an installed instance of a ComponentProfile.
ComponentProfileClusterComponentProfile is a catalog entry for a system service, an app or an agent.
CredentialRequirementClusterCredentialRequirement declares a secret that must be supplied from outside the cluster: a registry token, a DNS provider key, an SMTP relay password.
CustomizationNamespacedCustomization is a tracked, owned, dated deviation from an app as shipped.
IntegrationBindingNamespacedIntegrationBinding is the Schema for the integrationbindings API.
MailboxRemovalClusterMailboxRemoval records what whoever removed a person decided about that person's mailbox, and what became of it.
OIDCPackCatalogClusterOIDCPackCatalog is a cluster-scoped catalog of OIDC packs for tenant apps.
PlanOrderingClusterPlanOrdering is the cluster's notice on how to order another plan.
PlatformSecurityPolicyClusterPlatformSecurityPolicy is the cluster singleton where platform administrators approve MAC waivers and other cluster-wide security posture settings.
ProfileBuildClusterProfileBuild is one build of a profile, as a catalog published it: the bundle at one digest, kept on the cluster for as long as a tenant runs it.
ResourcePlanClusterResourcePlan is a named preset of tenant resource limits.
TenantClusterTenant is the Schema for the tenants API.
TenantDomainClusterTenantDomain moves the tenant it is named after to spec.domain.
TenantExportNamespacedTenantExport captures one tenant's data into an encrypted bundle.
TenantRestoreNamespacedTenantRestore restores a tenant's data from a bundle.
XTenantCluster

1. App​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluralapps
Short names
FieldTypeRequiredDescription
specobject (free-form)
statusobject (free-form)

2. AppGrant​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluralappgrants
Short namesag, grant

AppGrant is a tenant-scoped authorization grant — a subset of what the ComponentProfile declares.

FieldTypeRequiredDescription
specobjectAppGrantSpec defines tenant-approved integration permissions for one installed app.
spec.allowConsumers[]objectAllowConsumers controls which other installed apps may invoke this app's provides contracts.
spec.allowConsumers[].appstringyesApp is the consumer ComponentProfile name.
spec.allowConsumers[].contractstringyesContract matches ComponentProfile.spec.provides[].name.
spec.allowConsumers[].scope[]stringyesScope lists approved capability strings for the consumer.
spec.appstringyesApp is the installed ComponentProfile name (matches Tenant.spec.apps[].profile).
spec.consume[]objectConsume lists contract capabilities this app may use from providers in the tenant.
spec.consume[].contractstringyesContract matches IntegrationBinding.spec.contract.
spec.consume[].granted[]stringyesGranted lists approved capability strings (subset of the binding declaration).
statusobjectAppGrantStatus holds observed grant state.
status.conditions[]objectConditions provide detailed status.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.observedGenerationinteger (int64)ObservedGeneration is the last reconciled spec generation.
status.phasestringPhase summarizes OpenFGA tuple sync.

3. AppPackage​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralapppackages
Short namesapkg, apkgs

AppPackage is a named addon preset for a family. Presentation only — see the type comment above for why it carries no status and no reconciler.

FieldTypeRequiredDescription
specobjectAppPackageSpec is the desired state of an AppPackage.
spec.addons[]stringyesAddons lists the ComponentProfile names this preset preselects.
spec.authorstringAuthor is who supplies this preset — a company, an organization, or an individual.
spec.descriptionstringDescription explains what the preset bundles, for the selection window.
spec.displayNamestringyesDisplayName is the name shown in the App Store (e.g.
spec.familystringyesFamily is the app family this preset belongs to (a ComponentProfile's gentianos.io/profile-family label).
spec.tileobjectTile is the App Store icon for the preset.
spec.tile.iconstringIcon selects a pre-made tile from the Gentian catalog (path 2).
spec.tile.imagestringImage is a profile-relative PNG path used in git only (e.g.
spec.tile.logostringLogo is a custom tile as a PNG data URI (path 1).

4. BackupPolicy​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralbackuppolicies
Short namesbkpol

BackupPolicy is where a tenant's bundles go and who can read them. Cluster-scoped for both scopes, as CredentialRequirement is: the console mediates access by spec.tenant, and the credential itself is governed by the OpenBao policy its scope selects. The name is not free. Every reader of a policy fetches it by name — the cluster's as "default", a tenant's as the tenant's own name — so a policy whose name does not match its scope is never read by anything. That failed silently: the policy reported Accepted, published an effective destination, and bundles went to the platform's own storage as though it had never been written. The two rules below make that object unadmittable rather than merely ineffective.

FieldTypeRequiredDescription
specobjectBackupPolicySpec is one backup arrangement: the cluster's default, or one tenant's override of it.
spec.allowTenantOverridebooleanAllowTenantOverride lets tenants state policies of their own.
spec.destinationobjectDestination is where bundles are written.
spec.destination.addressingStylestringAddressingStyle is how a bucket is named in a request to Endpoint: path (https://host/bucket/key, the default when empty) or virtualHost…
spec.destination.bucketstringBucket holds the bundles.
spec.destination.endpointstringEndpoint is the S3 API URL, e.g. https://sos-ch-gva-2.exo.io or https://s3.example.org:9000.
spec.destination.regionstringRegion, for providers that require one — Exoscale SOS and AWS do, the platform's own store does not.
spec.encryptionobjectEncryption names the keys bundles are encrypted to.
spec.encryption.recipients[]stringRecipients are age public keys (age1…) to encrypt to.
spec.scopestringyesScope decides whether this is the cluster default or one tenant's override, and with it who may edit the policy and which OpenBao path its credential lives at.
spec.tenantstringTenant names the tenant a tenant-scoped policy belongs to.
statusobjectBackupPolicyStatus reports what this policy resolved to and whether it can actually be used.
status.conditions[]objectConditions carries Accepted: whether this policy is permitted and usable.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.credentialRequirementstringCredentialRequirement names the requirement carrying this destination's keys, and CredentialSatisfied reports whether it has been filled.
status.credentialSatisfiedboolean
status.effectiveBucketstring
status.effectiveEndpointstringEffectiveEndpoint and EffectiveBucket are the values in force after inheritance, published so an admin reads what applies rather than recomputing the merge.
status.effectiveRecipients[]stringEffectiveRecipients are the age public keys in force, empty when the cluster's own key is used.
status.observedGenerationinteger (int64)

5. Branding​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralbrandings
Short names

Branding is the brand every page on the cluster shows: the concierge, the identity provider's screens, the desktop and the consoles. One per cluster, named "default"; without it they show the platform's own.

FieldTypeRequiredDescription
specobjectBrandingSpec is the cluster's brand.
spec.identityobjectIdentity is the product's name and icons.
spec.identity.descriptionstringDescription is the installed app's description.
spec.identity.icons[]objectIcons are the logo and favicon, as a manifest's icons: the first whose purpose includes "any" is the logo on the pages.
spec.identity.icons[].purposestringPurpose, as the manifest says it: any, maskable, monochrome.
spec.identity.icons[].sizesstringSizes, as the manifest says them: "any", or "192x192 512x512".
spec.identity.icons[].srcstringyesSrc is an https URL, or the image itself as a data URL.
spec.identity.icons[].typestringType is the image's media type: one of those a data URL may carry.
spec.identity.namestringName is the product's name, on sign-in cards, page titles and the sender of the identity provider's mail.
spec.identity.shortNamestringShortName is where Name does not fit: an installed app's label.
spec.tokensobject (free-form)Tokens is the brand's look: a design-token document in the W3C Design Tokens Community Group format (2025.10).
statusobjectBrandingStatus says whether the brand is what the pages show.
status.conditions[]objectConditions: Rendered is True once the pages' stylesheet is the brand's, False with the reason when the tokens cannot be rendered.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.observedGenerationinteger (int64)ObservedGeneration is the generation Rendered describes.

6. BundleSource​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralbundlesources
Short namesbsrc

BundleSource is a place outside the cluster that holds bundles: the cluster's, declared by its administrator and read to make a tenant; or a tenant's own (spec.tenant), declared by that tenant's administrator, written to by its exports and read for its recovery.

FieldTypeRequiredDescription
specobjectBundleSourceSpec is S3 storage outside the cluster that holds bundles: the cluster's, which its administrator imports tenants from -- another cluster's…
spec.addressingStylestringAddressingStyle is how a bucket is named in a request to Endpoint: path (the default when empty) or virtualHost.
spec.bucketstringyesBucket holds the bundles.
spec.descriptionstringDescription says what the storage is, for whoever picks a bundle from it.
spec.endpointstringyesEndpoint is the S3 API URL, e.g. https://sos-ch-gva-2.exo.io.
spec.prefixstringPrefix is where in the bucket the bundles are, each one a prefix of its own directly below it.
spec.recipients[]stringRecipients are age public keys (age1…) a tenant's store holds its bundles readable by.
spec.regionstringRegion, for a provider that requires one.
spec.tenantstringTenant makes this a tenant's own store, declared by its administrator, its keys in the tenant's part of the vault.
statusobjectBundleSourceStatus reports whether the source can be read.
status.conditions[]objectConditions carries Ready: whether bundles can be read from here.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.credentialRequirementstringCredentialRequirement names the requirement carrying the keys, and CredentialSatisfied reports whether it has been filled.
status.credentialSatisfiedboolean
status.observedGenerationinteger (int64)

7. Component​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluralcomponents
Short namescomp

Component is an installed instance of a ComponentProfile.

FieldTypeRequiredDescription
specobjectComponentSpec is one installed instance of a ComponentProfile.
spec.addonPins[]objectAddonPins is the build each pinned addon was installed from, as the Tenant records it.
spec.addonPins[].cataloguestringCatalogue is the catalog the pinned build was fetched from: the first half of its coordinate, <catalogue>/<name>.
spec.addonPins[].digeststringyesDigest pins the addon's profile bundle: the build the install asked for.
spec.addonPins[].namestringyesName is the addon's profile name, as addons lists it.
spec.addons[]stringAddons enabled on this instance, by the profile's own names.
spec.classstringyesClass is the one mode this instance runs under.
spec.configobjectConfig is what this install overrides of the profile's defaults: the replica count and chart values the tenant chose.
spec.config.dropIns[]objectDropIns supply tenant-authored files into drop-in directories the target ComponentProfile declares as tenantEditable.
spec.config.dropIns[].filesmap[string]stringyesFiles maps filename to content.
spec.config.dropIns[].namestringyesName must match a ComponentProfile.spec.customization.dropIns[].name entry that sets tenantEditable: true.
spec.config.extraValuesobject (free-form)ExtraValues deep-merges Helm values over the profile's defaults.
spec.config.replicasinteger (int32)Replicas overrides the default replica count.
spec.exposures[]objectExposures are the entries of the profile a perimeter approver approved: the perimeter entries that are switched on, and the entries behind sign-in whose…
spec.exposures[].aliasstringAlias is the label of a second address for this surface directly under the cluster's own domain, copied from the Tenant's entry.
spec.exposures[].apexbooleanApex is the approver saying that this surface is for the cluster's main address (the bare domain), copied from the Tenant's entry.
spec.exposures[].expiresAtstring (date-time)ExpiresAt ends the exposure, for one that was published for a while: at expiry the operator treats the enablement as absent, and the entry stays in git as…
spec.exposures[].exposureNamestringyesExposureName names an entry of the profile's expose list that asks for approval.
spec.exposures[].kindstringKind is what was approved, copied from the Tenant's entry; empty is a public address.
spec.exposures[].ownerstringyesOwner is the Keycloak subject that enabled the surface, set by the director from the caller's token.
spec.exposures[].reviewAtstring (date-time)yesReviewAt is when the owner and the perimeter approver look at it again, and it is always set: what is public is known and revisited, whether or not it ends.
spec.fulfilmentstringFulfilment pins how a tenant install is backed.
spec.movedAtstringMovedAt and MovedBy are the request behind the current pin, as the tenant's manifest records them (TenantApp.MovedAt, MovedBy): when the pin was last moved…
spec.movedBystring
spec.privileges[]objectPrivileges are the profile's privilege requests that a person granted.
spec.privileges[].approvedAtstring (date-time)yes
spec.privileges[].approverstringyesApprover is the Keycloak subject who said yes, set by the director from the caller's token.
spec.privileges[].digeststringDigest pins an apiExtensions grant to the definitions it approved: sha256 of the request as the approver read it (security.APIExtensionDigest).
spec.privileges[].expiresAtstring (date-time)ExpiresAt bounds the grant.
spec.privileges[].privilegestringyesPrivilege names one entry of the profile's request, as <kind>/<name>, where kind is podSecurity, egress, clusterRoles or apiExtensions.
spec.privileges[].reasonstringyesReason in the approver's words, not the profile's.
spec.profileRefobjectyesProfileRef names the catalog entry this is an instance of.
spec.profileRef.digeststringDigest pins the profile bundle this instance was installed from.
spec.profileRef.namestringyes
statusobjectComponentStatus is the observed state of a Component.
status.conditions[]object
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.fulfilmentstringFulfilment is "dedicated" or "shared".
status.pendingPrivileges[]stringPendingPrivileges are requests of the profile that nobody has granted yet, as <kind>/<name>.
status.rolloutobjectRollout is which build this instance actually runs, and how the last move to the pinned build went.
status.rollout.digeststringDigest is the build the instance runs: the last one that rolled out and verified.
status.rollout.exportstringExport names the TenantExport taken before the move, in the tenant's namespace.
status.rollout.finishedAtstring (date-time)
status.rollout.messagestring
status.rollout.movedAtstringMovedAt and MovedBy are the request this move answers, as the tenant's manifest records them.
status.rollout.movedBystring
status.rollout.phasestringPhase is where the move to Target stands.
status.rollout.previousstringPrevious is the build the instance ran before the last move to Digest.
status.rollout.reasonstringReason and Message say why a move was rolled back or failed.
status.rollout.startedAtstring (date-time)StartedAt is when the pinned build began rolling out; FinishedAt when the move ended, either way.
status.rollout.targetstringTarget is the build the move under way, or the last move, was to.

8. ComponentProfile​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralcomponentprofiles
Short namescprof

ComponentProfile is a catalog entry for a system service, an app or an agent. The cluster holds only the profiles something installed refers to.

FieldTypeRequiredDescription
specobjectComponentProfileSpec is one catalog entry: what a component is, what it needs from the platform, and what it may expose.
spec.adapterobjectAdapter is what an adapter adapts.
spec.adapter.adaptsobjectAdapts names the app whose interface this adapter uses: the app's ComponentProfile, which must be installed in the same tenant.
spec.adapter.adapts.profilestringyesProfile is the ComponentProfile of the app.
spec.adapter.adapts.versions[]stringVersions are the catalog versions of the app this adapter was reviewed against.
spec.backupobjectBackup declares what a consistent copy of this component consists of.
spec.backup.boundSecrets[]objectBoundSecrets lists secrets this app's data is welded to: not derived, held outside the app's own captured data, and required to make sense of that data again.
spec.backup.boundSecrets[].keys[]stringKeys selects individual keys at that path.
spec.backup.boundSecrets[].openBaoPathstringyesOpenBaoPath is relative to this tenant's own prefix (gentian-os/tenants/{tenant}/), so a profile can only ever name secrets belonging to the tenant being…
spec.backup.quiesceobjectQuiesce controls how writes are paused while the app is captured.
spec.backup.quiesce.containerstringContainer names the container to run Pre and Post in.
spec.backup.quiesce.modestringMode selects how writes are paused.
spec.backup.quiesce.post[]stringPost is the command that resumes writes.
spec.backup.quiesce.pre[]stringPre is the command that pauses writes, required when mode is command.
spec.backup.restoreobjectRestore declares what must run after this app's data is loaded and before it is resumed.
spec.backup.restore.domainBoundbooleanDomainBound says the app's data cannot be moved to another domain: it names the tenant's domain in a way the app refuses to run with another (a server name…
spec.backup.restore.post[][]stringPost lists commands run in order once the app's data is loaded and before it is resumed — cache invalidation, re-indexing, fingerprinting, and rewriting what…
spec.backup.restore.verify[]stringVerify is a single command that must exit zero before the restore is reported successful.
spec.backup.volumesobjectVolumes narrows what is captured from the app's PersistentVolumeClaims.
spec.backup.volumes.excludePaths[]stringExcludePaths drops matching paths from the captured archive, as glob patterns relative to each volume root.
spec.backup.volumes.include[]stringInclude names the PersistentVolumeClaims to capture.
spec.classes[]stringyesClasses lists the modes this component may be deployed under.
spec.customizationobjectCustomization declares what a tenant may change about this component.
spec.customization.addonobjectAddon declares that this profile is an addon rather than a deployable app, and how the base activates it.
spec.customization.addon.idstringyesID is what the hosting app's own addon system calls this addon: an Odoo module name, a Nextcloud app id, an XWiki extension.
spec.customization.addon.ofstringyesOf is the ComponentProfile name of the base this addon activates into.
spec.customization.addonActivationobjectAddonActivation tells the platform how to turn a tenant's addon selection into Helm values for this base.
spec.customization.addonActivation.scriptstringyesScript is written to ValuesPath with the token GENTIAN_ADDON_IDS replaced by the space-separated addon ids.
spec.customization.addonActivation.valuesPathstringyesValuesPath is the dot-separated Helm values path the rendered Script is written to, e.g. "nextcloud.hooks.before-starting".
spec.customization.addonValues[]objectAddonValues overlays extra Helm values onto this app's release when a given addon is selected.
spec.customization.addonValues[].valuesobject (free-form)yesValues are merged into the release values when that addon is selected, and omitted entirely when it is not.
spec.customization.addonValues[].whenAddonstringyesWhenAddon is the app-side addon id — the value of spec.customization.addon.id on the addon's profile, e.g. "richdocuments", not the profile name.
spec.customization.configureobjectConfigure describes the L0 surface.
spec.customization.configure.hotReloadbooleanHotReload reports whether a values change applies without a restart.
spec.customization.configure.valuesSchemastringValuesSchema is the repo-relative path to the chart's values.schema.json.
spec.customization.dropIns[]objectDropIns declares the L1 surface: directories the app treats as extension points.
spec.customization.dropIns[].formatstringyesFormat is the content format expected in this directory.
spec.customization.dropIns[].maxBytesinteger (int32)MaxBytes caps the total tenant-supplied content for this drop-in.
spec.customization.dropIns[].namestringyesName identifies the drop-in.
spec.customization.dropIns[].pathstringyesPath is the absolute in-container directory the files are mounted at.
spec.customization.dropIns[].sourcestringSource is the Kubernetes object the content is delivered through.
spec.customization.dropIns[].tenantEditablebooleanTenantEditable allows tenant admins to supply files here through Tenant.spec.apps[].config.dropIns.
spec.customization.dropIns[].upstreamDocumentedbooleanUpstreamDocumented reports whether upstream documents this path as an extension point.
spec.customization.extensionobjectExtension describes the L3 surface: the app's own addon system.
spec.customization.extension.addonPathstringAddonPath is the in-container directory addons are loaded from (Odoo's custom-addons, Nextcloud's custom_apps).
spec.customization.extension.apiDocsstringAPIDocs links to the extension API documentation.
spec.customization.extension.apiStabilitystringAPIStability rates the extension API.
spec.customization.extension.delivery[]stringDelivery lists the supported ways an addon reaches the running app.
spec.customization.extension.mechanismstringyesMechanism names the app's extension system (for example "odoo-addon", "nextcloud-app", "xwiki-extension").
spec.customization.extension.perTenantAddonsbooleanPerTenantAddons reports whether tenants may have divergent addon sets.
spec.customization.extension.registrystringRegistry is the repository or index addons are sourced from.
spec.customization.extension.testMatrix[]stringTestMatrix lists the upstream app versions addons are tested against.
spec.customization.forkobjectFork describes the L6 surface: whether a fork is permitted, and who owns it.
spec.customization.fork.allowedbooleanAllowed gates whether a fork is a permitted outcome for this app.
spec.customization.fork.cveWatchbooleanCVEWatch reports whether the fork has active vulnerability monitoring.
spec.customization.fork.ownerstringOwner is the team or organization accountable for the fork, including its CVE response.
spec.customization.fork.repostringRepo is the Gentian-owned fork.
spec.customization.fork.upstreamstringUpstream is the project the fork diverged from.
spec.customization.gradestringGrade rates customization readiness (see CustomizationGrade).
spec.customization.ladderDocsstringLadderDocs links to human documentation of this app's ladder.
spec.customization.patchobjectPatch describes the L5 surface: whether a patch series is permitted.
spec.customization.patch.allowedbooleanAllowed gates whether a patch series may be carried for this app at all.
spec.customization.patch.buildRepostringBuildRepo is the repository holding the pinned upstream and the series.
spec.customization.patch.requiresApprovalstringRequiresApproval names the role that must approve a new patch.
spec.customization.patch.seriesPathstringSeriesPath is the repo-relative path to the quilt-style series file.
spec.customization.publishesobjectPublishes describes what this app offers so that another app can be built at L2 against it.
spec.customization.publishes.apis[]objectAPIs lists the published interfaces a companion app can build against.
spec.customization.publishes.apis[].authstringAuth is the authentication method companions must use.
spec.customization.publishes.apis[].contractstringyesContract is the Gentian contract name this API satisfies.
spec.customization.publishes.apis[].pathstringPath is the base path the API is served at.
spec.customization.publishes.apis[].protocolstringProtocol is the wire protocol (for example "http-json", "webdav", "matrix").
spec.customization.publishes.apis[].specstringSpec names the interface description format (for example "openapi", "graphql").
spec.customization.repackageobjectRepackage describes the L4 surface: who owns the packaging.
spec.customization.repackage.chartOwnershipstringChartOwnership records whether the chart is upstream's, Gentian-authored, or a vendored copy.
spec.customization.repackage.compositionRefstringCompositionRef names the profile-scoped Crossplane composition, when the app needs a custom managed-resource graph.
spec.customization.rubricScoreinteger (int32)RubricScore is the §4.1 rubric total backing Grade (0-8).
spec.customization.supportedRungs[]stringSupportedRungs lists the rungs at which this app can be customized.
spec.defaultForPlatformbooleanDefaultForPlatform is placement {tenants: platform}.
spec.defaultForTenantsbooleanDefaultForTenants is placement {tenants: every}.
spec.defaultWhereStoreOfferedbooleanDefaultWhereStoreOffered is placement {tenants: users, while: storeOffered}.
spec.expose[]objectExpose declares entry points.
spec.expose[].annotationsmap[string]stringAnnotations are gateway policy for this host.
spec.expose[].apexbooleanApex publishes this entry on the cluster's bare domain -- its main address -- instead of a host under the zone's domain.
spec.expose[].authModestringyesAuthMode is mandatory and has no default.
spec.expose[].backendobjectyesBackend is the Service the entry routes to.
spec.expose[].backend.componentstringComponent names another component whose Service this entry routes to.
spec.expose[].backend.portinteger (int32)yes
spec.expose[].backend.servicestringyes
spec.expose[].clientAuthorizationstringClientAuthorization says whose the Authorization header is on this entry.
spec.expose[].denyPaths[]stringDenyPaths are refused even where Paths admits them.
spec.expose[].exchangeTokenbooleanExchangeToken asks the front door to hand this backend a token of the person that is valid at this app and nowhere else: the session's token exchanged at the…
spec.expose[].forwardTokenbooleanForwardToken asks the gateway to pass the edge access token to this backend.
spec.expose[].namestringyes
spec.expose[].paths[]stringPaths this entry serves.
spec.expose[].subDomainstringSubDomain is the host label of this entry in the tenant's zone.
spec.expose[].surfacestringyesSurface selects where this entry is published.
spec.expose[].tileobjectTile is how this entry appears on the portal, for an entry a person is meant to open.
spec.expose[].tile.descriptionstringDescription is the sentence the portal shows beside the label.
spec.expose[].tile.displayNamestringyesDisplayName is the label under the icon.
spec.expose[].tile.displayNamesmap[string]stringDisplayNames are translations of DisplayName, keyed by locale ("de_DE", "en_US").
spec.expose[].tile.imagestringImage is the profile-relative path the PNG lives at in git, e.g. assets/tile.png.
spec.expose[].tile.logostringyesLogo is the tile's default image: a square PNG, 128x128, inline as a data URI.
spec.expose[].tile.objectstringObject is what Relation is checked against.
spec.expose[].tile.pathstringPath is where within the host the tile leads.
spec.expose[].tile.relationstringyesRelation is what the caller must hold, on the object Object names, for the tile to be on their page: a permission of the authorization model…
spec.extensions[]objectExtensions are containers shipped inside the component's own pod: the only escape hatch, and one that cannot create a cluster-scoped object.
spec.extensions[].appSecrets[]objectAppSecrets are sidecar-internal secrets stored at gentian-os/tenants/{tenant}/apps/{parent}-{name}/internal/{secret}.
spec.extensions[].appSecrets[].namestringyesName is the logical identifier for this secret (e.g., "admin_password").
spec.extensions[].appSecrets[].valuePathstringyesValuePath is the dot-notation (or bracket-notation) Helm value key that should receive the generated secret value.
spec.extensions[].chartobjectyesChart references the sidecar Helm chart.
spec.extensions[].chart.namestringyesName is the chart name within the repository.
spec.extensions[].chart.repositorystringyesRepository is the OCI repository URL (e.g., oci://registry.example.com/charts).
spec.extensions[].chart.versionstringyesVersion is the chart version to deploy.
spec.extensions[].extraValuesobject (free-form)ExtraValues are merged into the sidecar Helm release values.
spec.extensions[].kernelRequirementsobjectServiceRequirements declares kernel services the sidecar needs.
spec.extensions[].kernelRequirements.authorizationobjectAuthorization declares that the component keeps its own relations in an authorization store the platform makes for it.
spec.extensions[].kernelRequirements.authorization.groupsstringGroups "mirror" has the platform keep the tenant realm's group memberships in the store, as tuples group:<realm>/<group name>#member of…
spec.extensions[].kernelRequirements.authorization.modelstringyesModel is the store's authorization model in the OpenFGA DSL ("model / schema 1.1 / type user / ...").
spec.extensions[].kernelRequirements.authorization.tuples[]objectTuples are the store's starting tuples, written by the platform and held to the model when the profile is admitted.
spec.extensions[].kernelRequirements.authorization.tuples[].objectstringyes
spec.extensions[].kernelRequirements.authorization.tuples[].relationstringyes
spec.extensions[].kernelRequirements.authorization.tuples[].userstringyes
spec.extensions[].kernelRequirements.cacheobjectCache specifies a caching backend requirement.
spec.extensions[].kernelRequirements.cache.enginestringEngine selects the caching backend.
spec.extensions[].kernelRequirements.databaseobjectDatabase specifies a relational database requirement.
spec.extensions[].kernelRequirements.database.allowDynamicDatabaseCreationbooleanAllowDynamicDatabaseCreation lets the app create databases of its own at runtime.
spec.extensions[].kernelRequirements.database.connectionLimitinteger (int32)ConnectionLimit is the most connections the app's account may hold at once on the shared server, which every tenant's apps use.
spec.extensions[].kernelRequirements.database.enginestringEngine selects the database engine.
spec.extensions[].kernelRequirements.database.schemaPreferencestringSchemaPreference decides which schema the app's role resolves unqualified table names against first.
spec.extensions[].kernelRequirements.identityobjectIdentity specifies OIDC requirements.
spec.extensions[].kernelRequirements.identity.oidcobjectOIDC describes the OIDC client to register in the tenant's Keycloak realm.
spec.extensions[].kernelRequirements.identity.oidc.accessTypestringAccessType controls whether the client requires a shared secret (CONFIDENTIAL, for server-side apps) or relies on PKCE without a secret (PUBLIC, for SPAs and…
spec.extensions[].kernelRequirements.identity.oidc.audiences[]stringAudiences are names the access tokens of this client carry in aud, beside what Keycloak puts there itself: the name a service the app hands its tokens to…
spec.extensions[].kernelRequirements.identity.oidc.backchannelLogoutobjectBackchannelLogout says where in the app the realm tells it that a person signed out (OpenID Connect Back-Channel Logout).
spec.extensions[].kernelRequirements.identity.oidc.backchannelLogout.exposurestringyesExposure names the entry of this profile (spec.expose) whose backend the path is served by.
spec.extensions[].kernelRequirements.identity.oidc.backchannelLogout.pathstringyesPath is the app's back-channel logout endpoint: a plain path.
spec.extensions[].kernelRequirements.identity.oidc.backchannelLogoutUrlstringBackchannelLogoutURL is withdrawn and refused: declare BackchannelLogout instead.
spec.extensions[].kernelRequirements.identity.oidc.clientIdstringyesClientID is the OIDC client identifier registered in Keycloak.
spec.extensions[].kernelRequirements.identity.oidc.directAccessGrantsEnabledbooleanDirectAccessGrantsEnabled enables the Resource Owner Password Credentials grant (legacy / CLI apps).
spec.extensions[].kernelRequirements.identity.oidc.namestringName is the human-readable display name shown in the Keycloak admin UI.
spec.extensions[].kernelRequirements.identity.oidc.oidcPackRefstringOIDCPackRef selects a pack entry from an OIDCPackCatalog CR when the pack key differs from clientId.
spec.extensions[].kernelRequirements.identity.oidc.postLogoutRedirectUris[]stringPostLogoutRedirectURIs lists the allowed post-logout redirect URIs.
spec.extensions[].kernelRequirements.identity.oidc.redirectUris[]stringRedirectURIs lists the valid OAuth2 redirect URIs for the authorization code flow.
spec.extensions[].kernelRequirements.identity.oidc.requestParameterobjectRequestParameter binds an authorization-request parameter of this client's sign-ins to where the code is delivered, and puts it in the access token: for an…
spec.extensions[].kernelRequirements.identity.oidc.requestParameter.claimstringClaim is the access-token claim the value is put in.
spec.extensions[].kernelRequirements.identity.oidc.requestParameter.namestringyesName is the parameter, as the app sends it on the authorization request.
spec.extensions[].kernelRequirements.identity.oidc.requestParameter.patternstringyesPattern is what the value must be, matched as a whole.
spec.extensions[].kernelRequirements.identity.oidc.requestParameter.redirectUristringyesRedirectURI is the one address a code for the request is delivered to: https, with at least one ${group} for a named group of the pattern's match, and no…
spec.extensions[].kernelRequirements.identity.samlobjectSAML describes the SAML client to register in the tenant's Keycloak realm.
spec.extensions[].kernelRequirements.identity.saml.acsUrlstringyesACSURL is the SAML Assertion Consumer Service URL for the auth callback.
spec.extensions[].kernelRequirements.identity.saml.entityIdstringyesEntityID is the SAML Service Provider Entity ID registered in Keycloak.
spec.extensions[].kernelRequirements.identity.sidecarobjectSidecar signs people in through the platform's sign-in sidecar.
spec.extensions[].kernelRequirements.identity.sidecar.appPortinteger (int32)AppPort lets the handler call the app itself inside the cluster: it is the port the app's pods listen on, and the network path is opened to that port of the…
spec.extensions[].kernelRequirements.identity.sidecar.databasebooleanDatabase gives the handler the app's own database: where it is and the app's own login to it, as DB_HOST, DB_PORT, DB_NAME, DB_USER and DB_PASSWORD, and the…
spec.extensions[].kernelRequirements.identity.sidecar.entryPaths[]stringEntryPaths are paths of the app that lead to the sign-in instead of to the app: its front page, and the address of its own sign-in form.
spec.extensions[].kernelRequirements.identity.sidecar.exposurestringExposure names the gateway entry people open the app at: the sidecar's two paths are on that entry's host.
spec.extensions[].kernelRequirements.identity.sidecar.secrets[]stringSecrets gives the handler secrets of this app, by the names they have under spec.secrets.generated: each as SECRET_<NAME>, the name in upper case.
spec.extensions[].kernelRequirements.llmobjectLLM declares that the component calls language models through the platform's model gateway.
spec.extensions[].kernelRequirements.llm.optionalbooleanOptional means the component runs without the gateway.
spec.extensions[].kernelRequirements.logDestinationobjectLogDestination declares that the component receives the platform's log forwarder over HTTPS inside the cluster.
spec.extensions[].kernelRequirements.logDestination.portinteger (int32)yesPort is the port that Service and its pods serve HTTPS on, the same number on both: it is the pods' port the network admits.
spec.extensions[].kernelRequirements.logDestination.servicestringyesService is the name of the component's Service the forwarder is sent to.
spec.extensions[].kernelRequirements.mailobjectMail specifies SMTP and/or IMAP requirements.
spec.extensions[].kernelRequirements.mail.imapobjectIMAP requests inbound mail (IMAP) credentials.
spec.extensions[].kernelRequirements.mail.imap.tokenSignInbooleanTokenSignIn declares that the app opens a person's mailbox with that person's sign-in token (SASL XOAUTH2) instead of an app password.
spec.extensions[].kernelRequirements.mail.smtpobjectSMTP requests outbound mail (SMTP submission) credentials.
spec.extensions[].kernelRequirements.mcpobjectMCP declares that the component exposes a Model Context Protocol endpoint.
spec.extensions[].kernelRequirements.mcp.authstringAuth is the authentication method the endpoint expects.
spec.extensions[].kernelRequirements.mcp.enabledbooleanyesEnabled says the component exposes the endpoint.
spec.extensions[].kernelRequirements.mcp.endpointstringEndpoint is the HTTP path where the app exposes its MCP server.
spec.extensions[].kernelRequirements.partnersobjectPartners declares that the component calls apps of partner realms on a person's behalf, takes such calls, or commissions partners of other tenants.
spec.extensions[].kernelRequirements.partners.acceptbooleanAccept says the component takes partners' assertions, turning each into the linked local account by the JWT authorization grant, for every partner the tenant…
spec.extensions[].kernelRequirements.partners.call[]stringCall names the tenant's partners the component asks assertions towards (standard token exchange, scope partner-<name>): a person's token in, a token for the…
spec.extensions[].kernelRequirements.partners.commissionbooleanCommission says the component asks the director to add receiving partners to the tenants that name it, or to take them away.
spec.extensions[].kernelRequirements.partners.serviceAccountstringServiceAccount is the Kubernetes service account the component's pods run as; its token is the client's credential.
spec.extensions[].kernelRequirements.rightsobjectRights declares that the component asks the platform whether a person may use an app of its tenant, for a person who is not at a browser.
spec.extensions[].kernelRequirements.rights.auditbooleanAudit lets the same key ask three more questions, for a person of the platform tenant: may they audit the cluster (cluster#can_audit), may they configure it…
spec.extensions[].kernelRequirements.storageobjectStorage specifies object storage (S3) and/or filesystem (WebDAV) requirements.
spec.extensions[].kernelRequirements.storage.filesobjectFiles requests WebDAV access to the tenant's file-storage service.
spec.extensions[].kernelRequirements.storage.files.capabilities[]stringCapabilities lists the required access capabilities.
spec.extensions[].kernelRequirements.storage.files.protocolstringProtocol is the access protocol.
spec.extensions[].kernelRequirements.storage.s3objectS3 requests a per-tenant S3 bucket from the platform's object store.
spec.extensions[].kernelRequirements.storage.s3.objectLockbooleanObjectLock makes the bucket with S3 Object Lock, which cannot be switched off again, and lets the app read and set the bucket's default retention…
spec.extensions[].kernelRequirements.turnobjectTURN declares that the component's clients relay real-time media through the platform's TURN edge.
spec.extensions[].kernelRequirements.vouchingobjectVouching declares that the component obtains tokens of a person who is not at a browser, on the strength of that person's earlier consent: it signs a short…
spec.extensions[].kernelRequirements.vouching.director[]stringDirector names what a token the component obtains for a person may do at the platform's own API, beside the apps: plans-read reads the cluster's plans, its…
spec.extensions[].kernelRequirements.vouching.keysobjectyesKeys says where the component publishes the keys its statements are signed with, as a JWKS.
spec.extensions[].kernelRequirements.vouching.keys.pathstringPath is where the JWKS is served.
spec.extensions[].kernelRequirements.vouching.keys.portinteger (int32)yesPort is the Service's port.
spec.extensions[].kernelRequirements.vouching.keys.servicestringyesService is the name of the component's Service.
spec.extensions[].namestringyesName identifies the sidecar (e.g.
spec.extensions[].stableServiceNamestringStableServiceName is the Kubernetes Service name the tenant ingress reconciler routes to (e.g.
spec.extensions[].stableServicePortinteger (int32)StableServicePort is the port on StableServiceName.
spec.extensions[].valueMappingobjectValueMapping places what the platform granted the sidecar into its chart's values, as package.valueMapping does for the app.
spec.extensions[].valueMapping.oidcobjectOIDC maps the sidecar's OIDC client to Helm keys, as the app's own valueMapping.oidc does.
spec.extensions[].valueMapping.oidc.clientIdKeystringClientIDKey is the Helm value key for the OIDC client ID.
spec.extensions[].valueMapping.oidc.clientSecretKeystringClientSecretKey is the Helm value key for the OIDC client secret.
spec.extensions[].valueMapping.oidc.clientSecretOpenbaoPathstringClientSecretOpenbaoPath overrides the default per-tenant OpenBao secret path (gentian-os/tenants/{tenant}/apps/{app}/oidc) for reading the OIDC client secret.
spec.extensions[].valueMapping.oidc.clientSecretOpenbaoPropertystringClientSecretOpenbaoProperty overrides the property name within the OpenBao secret (default: "client-secret").
spec.extensions[].valueMapping.oidc.issuerKeystringIssuerKey is the Helm value key for the OIDC issuer URL.
spec.hooksobjectHooks are lifecycle actions at install, upgrade and resync.
spec.hooks.postInstallobjectPostInstall runs once after the component is first ready.
spec.hooks.postInstall.envFrom[]stringEnvFrom names Secrets already present in the tenant namespace to inject wholesale (matches how this app's own secrets already land — e.g.…
spec.hooks.postInstall.imagestringyesImage is the container image the Job runs.
spec.hooks.postInstall.readOnlyPVCobjectReadOnlyPVC optionally mounts an existing PersistentVolumeClaim read-only, for the rare case a bootstrap script needs information only available in the app's…
spec.hooks.postInstall.readOnlyPVC.claimNamestringyesClaimName is the PersistentVolumeClaim name in the tenant namespace.
spec.hooks.postInstall.readOnlyPVC.mountPathstringyesMountPath is where the claim is mounted read-only in the Job container.
spec.hooks.postInstall.scriptstringyesScript is the shell script body, run via /bin/sh -c.
spec.hooks.postInstall.serviceAccountNamestringServiceAccountName runs the Job under an existing ServiceAccount in the tenant namespace (e.g.
spec.hooks.provisioningobjectProvisioning configures the component through its own API after install and on resync.
spec.hooks.provisioning.privilegedRoleobjectPrivilegedRole maps gentian:tenant:<t>:app-admins members to an in-app administrator role (for example the Nextcloud "admin" group).
spec.hooks.provisioning.privilegedRole.kindstringyesKind is the application's native role type.
spec.hooks.provisioning.privilegedRole.namestringyesName is the in-app role identifier (for example Nextcloud group "admin").
spec.hooks.provisioning.syncJobobjectSyncJob is how this app applies PrivilegedRole.
spec.hooks.provisioning.syncJob.env[]objectEnv binds individual Secret keys to environment variables.
spec.hooks.provisioning.syncJob.env[].namestringyesName of the environment variable.
spec.hooks.provisioning.syncJob.env[].secretKeyRefobjectyesSecretKeyRef is the Secret key to read it from.
spec.hooks.provisioning.syncJob.env[].secretKeyRef.keystringyes
spec.hooks.provisioning.syncJob.env[].secretKeyRef.namestringyes
spec.hooks.provisioning.syncJob.envFrom[]stringEnvFrom names Secrets in the tenant namespace whose keys become environment variables.
spec.hooks.provisioning.syncJob.imagestringyesImage the script runs in.
spec.hooks.provisioning.syncJob.scriptstringyesScript executed with /bin/sh.
spec.hooks.provisioning.syncJob.serviceAccountNamestringServiceAccountName runs the Job under an existing ServiceAccount.
spec.integrations[]objectIntegrations are opportunistic relationships with peer components.
spec.integrations[].capabilities[]stringCapabilities lists the specific capabilities required from the contract.
spec.integrations[].contractstringyesContract is the name of the contract to consume.
spec.integrations[].providerstringProvider is the expected provider app by profile name.
spec.launchstringyesLaunch is how a person reaches this component.
spec.packageobjectyesPackage is how the component is deployed.
spec.package.addonobjectAddon describes a component the platform does not deploy at all: it flips a switch inside another component's own addon system.
spec.package.addon.idstringyesID is what the hosting component's own addon system calls this addon: an Odoo module name, a Nextcloud app id, an XWiki extension.
spec.package.addon.ofstringyesOf is the ComponentProfile this addon activates into.
spec.package.apiobjectAPI describes a component the platform routes to rather than runs.
spec.package.api.baseUrlstringyesBaseURL is the external service origin (e.g.
spec.package.api.runtimestringRuntime selects how the tenant reaches the external service.
spec.package.api.tenantBindingstringTenantBinding declares how the tenant is identified to the external service.
spec.package.api.tileobjectTile puts this entry on the desktop of whoever holds its relation.
spec.package.api.tile.descriptionstringDescription is the sentence the portal shows beside the label.
spec.package.api.tile.displayNamestringyesDisplayName is the label under the icon.
spec.package.api.tile.displayNamesmap[string]stringDisplayNames are translations of DisplayName, keyed by locale ("de_DE", "en_US").
spec.package.api.tile.imagestringImage is the profile-relative path the PNG lives at in git, e.g. assets/tile.png.
spec.package.api.tile.logostringyesLogo is the tile's default image: a square PNG, 128x128, inline as a data URI.
spec.package.api.tile.objectstringObject is what Relation is checked against.
spec.package.api.tile.pathstringPath is where within the host the tile leads.
spec.package.api.tile.relationstringyesRelation is what the caller must hold, on the object Object names, for the tile to be on their page: a permission of the authorization model…
spec.package.chartobjectChart is the Helm chart or OCI artifact.
spec.package.chart.namestringyesName is the chart name within the repository.
spec.package.chart.repositorystringyesRepository is the OCI repository URL (e.g., oci://registry.example.com/charts).
spec.package.chart.versionstringyesVersion is the chart version to deploy.
spec.package.compositionstringComposition names a Crossplane composition, for a component that is not a single chart.
spec.package.extraValuesobject (free-form)ExtraValues are static chart values.
spec.package.images[]objectImages are the private images the component runs, each at the one build it may run.
spec.package.images[].digeststringyesDigest is the build.
spec.package.images[].repositorystringyesRepository is the image's address without a tag.
spec.package.valueMappingobjectValueMapping places what the platform granted into the chart's values.
spec.package.valueMapping.cacheobjectCache maps caching backend values to Helm keys.
spec.package.valueMapping.cache.hostKeystringHostKey is the Helm value key for the cache host.
spec.package.valueMapping.cache.passwordKeystringPasswordKey is the Helm value key for the cache password/ACL token.
spec.package.valueMapping.cache.portKeystringPortKey is the Helm value key for the cache port.
spec.package.valueMapping.cache.userKeystringUserKey is the Helm value key for the cache ACL username.
spec.package.valueMapping.databaseobjectDatabase maps database connection values to Helm keys.
spec.package.valueMapping.database.hostKeystring
spec.package.valueMapping.database.nameKeystringNameKey is the Helm value key for the database name.
spec.package.valueMapping.database.passwordKeystringPasswordKey is the Helm value key for the database password.
spec.package.valueMapping.database.portKeystringPortKey is the Helm value key for the database port.
spec.package.valueMapping.database.readNameKeystringReadNameKey is the Helm value key for the read-replica database name.
spec.package.valueMapping.database.readUserKeystringReadUserKey is the Helm value key for the read-replica database user.
spec.package.valueMapping.database.secretNameKeystringHostKey is the Helm value key for the database host.
spec.package.valueMapping.database.userKeystringUserKey is the Helm value key for the database user.
spec.package.valueMapping.imapobjectIMAP maps mail access values to Helm keys.
spec.package.valueMapping.imap.hostKeystringHostKey is the Helm value key for the IMAP host.
spec.package.valueMapping.imap.portKeystringPortKey is the Helm value key for the IMAP port.
spec.package.valueMapping.integrationsmap[string]objectIntegrations maps optional integration credentials to Helm keys, keyed by the contract name.
spec.package.valueMapping.integrations{}.endpointKeystringEndpointKey is the Helm value key for the integration's service endpoint URL.
spec.package.valueMapping.integrations{}.passwordKeystringPasswordKey is the Helm value key for the integration password.
spec.package.valueMapping.integrations{}.userKeystringUserKey is the Helm value key for the integration username.
spec.package.valueMapping.llmobjectLLM maps the model gateway's address and the component's key to Helm keys, for a component that declares requires.services.llm.
spec.package.valueMapping.llm.apiKeyKeystringAPIKeyKey is the Helm value key for the key the component presents.
spec.package.valueMapping.llm.availableKeystringAvailableKey receives true when the gateway's address and the component's key are delivered, and false while an optional requirement…
spec.package.valueMapping.llm.baseUrlKeystringBaseURLKey is the Helm value key for the gateway's OpenAI-compatible base address (it ends in /v1).
spec.package.valueMapping.llm.secretNameKeystringSecretNameKey receives the NAME of the Secret the component's model credentials are in (llm-credentials-<component>, in the component's namespace; the key is…
spec.package.valueMapping.oidcobjectOIDC maps OIDC provider values to Helm keys.
spec.package.valueMapping.oidc.clientIdKeystringClientIDKey is the Helm value key for the OIDC client ID.
spec.package.valueMapping.oidc.clientSecretKeystringClientSecretKey is the Helm value key for the OIDC client secret.
spec.package.valueMapping.oidc.clientSecretOpenbaoPathstringClientSecretOpenbaoPath overrides the default per-tenant OpenBao secret path (gentian-os/tenants/{tenant}/apps/{app}/oidc) for reading the OIDC client secret.
spec.package.valueMapping.oidc.clientSecretOpenbaoPropertystringClientSecretOpenbaoProperty overrides the property name within the OpenBao secret (default: "client-secret").
spec.package.valueMapping.oidc.issuerKeystringIssuerKey is the Helm value key for the OIDC issuer URL.
spec.package.valueMapping.platformobjectPlatform maps the facts of the cluster a component runs in to Helm keys: which zone it is served in, which realm signs that zone's tokens, where the director…
spec.package.valueMapping.platform.audienceKeystringAudienceKey receives the audience the forwarded edge token carries, so a backend can require it rather than accept any token the realm signs.
spec.package.valueMapping.platform.clusterKeystringClusterKey receives the id the director knows this cluster by.
spec.package.valueMapping.platform.countryKeystringCountryKey receives the tenant's country (spec.country), an ISO 3166-1 alpha-2 code in upper case, and the empty string while the tenant names none.
spec.package.valueMapping.platform.custodianUrlKeystringCustodianURLKey receives the custodian's in-cluster URL.
spec.package.valueMapping.platform.defaultLanguageKeystringDefaultLanguageKey receives the tenant's own language, as an ISO 639-1 code (AD-15).
spec.package.valueMapping.platform.desktopUrlKeystringDesktopURLKey receives the in-cluster address of the API of the desktop in the component's own namespace, from the desktop profile's "api" entry: http://<its…
spec.package.valueMapping.platform.directorUrlKeystringDirectorURLKey receives the director's in-cluster URL.
spec.package.valueMapping.platform.hostKeystringHostKey receives the host this component answers on in its zone: the host of its first gateway entry, as the operator routes it.
spec.package.valueMapping.platform.issuerKeystringIssuerKey receives the zone's OIDC issuer, the realm on the identity provider whose tokens the edge forwards.
spec.package.valueMapping.platform.kernelDomainKeystringKernelDomainKey receives the cluster's kernel domain.
spec.package.valueMapping.platform.organizationKeystringOrganizationKey receives who the tenant is, as one object: displayName, legalName, country, languages (the first is the tenant's own), currency, timeZone…
spec.package.valueMapping.platform.realmKeystringRealmKey receives the name of the zone's realm.
spec.package.valueMapping.platform.registrarUrlKeystringRegistrarURLKey receives the registrar's in-cluster URL: where a console relays, with the person's own token, the managing of a tenant's people and groups.
spec.package.valueMapping.platform.storeUrlKeystringStoreURLKey receives the base address of the App Store API this cluster names (the Cluster claim's spec.catalogue.storeUrl), and the empty string while the…
spec.package.valueMapping.platform.tenantKeystringTenantKey receives the name of the tenant the component runs in.
spec.package.valueMapping.platform.tenantUIDKeystringTenantUIDKey receives the tenant's unique id, its metadata.uid: the id the usage statistics report names it by, and the one the store keys its sign-in through…
spec.package.valueMapping.platform.timeZoneKeystringTimeZoneKey receives the tenant's time zone (spec.organization.timeZone), an IANA name, for a chart that takes only the zone, such as a TZ variable.
spec.package.valueMapping.platform.usherUrlKeystringUsherURLKey receives the usher's in-cluster URL: where a desktop asks, with the person's own token, what that person may open.
spec.package.valueMapping.platform.zoneClientIdKeystringZoneClientIDKey receives the client id the edge holds the zone's session with.
spec.package.valueMapping.platform.zoneKindKeystringZoneKindKey receives "kernel" for a component served in the kernel zone and "tenant" otherwise.
spec.package.valueMapping.s3objectS3 maps object storage values to Helm keys.
spec.package.valueMapping.s3.accessKeyKeystringAccessKeyKey is the Helm value key for the S3 access key ID.
spec.package.valueMapping.s3.bucketKeystringBucketKey is the Helm value key for the bucket name.
spec.package.valueMapping.s3.endpointKeystringEndpointKey is the Helm value key for the S3 endpoint URL.
spec.package.valueMapping.s3.regionKeystringRegionKey is the Helm value key for the S3 region.
spec.package.valueMapping.s3.secretKeyKeystringSecretKeyKey is the Helm value key for the S3 secret access key.
spec.package.valueMapping.smtpobjectSMTP maps mail submission values to Helm keys.
spec.package.valueMapping.smtp.hostKeystringHostKey is the Helm value key for the SMTP host.
spec.package.valueMapping.smtp.passwordKeystringPasswordKey is the Helm value key for the SMTP password.
spec.package.valueMapping.smtp.portKeystringPortKey is the Helm value key for the SMTP port.
spec.package.valueMapping.smtp.userKeystringUserKey is the Helm value key for the SMTP username.
spec.package.valueMapping.volumesobjectVolumes names where this chart takes extra pod volumes and mounts, for charts that do not use the conventional extraVolumes/extraVolumeMounts.
spec.package.valueMapping.volumes.volumeMountsPathstringVolumeMountsPath is the dot-separated values path holding a list of container volume mounts (e.g.
spec.package.valueMapping.volumes.volumesPathstringVolumesPath is the dot-separated values path holding a list of pod volumes (e.g.
spec.placementobjectPlacement makes this a component the platform places, and says where.
spec.placement.tenantsstringyesTenants are the tenants that get the component.
spec.placement.whilestringWhile names the condition the placement lasts for; absent, it lasts for the life of each tenant.
spec.provides[]objectProvides lists the contracts this component supplies.
spec.provides[].endpointobjectEndpoint is where this component answers the contract in the tenant's namespace.
spec.provides[].endpoint.pathstringPath is appended to the address the consumer is told, for an API served below the root.
spec.provides[].endpoint.portinteger (int32)yesPort is the Service's port, and must be the port the provider's pods listen on: a network policy matches the port a pod listens on, and the way it opens is to…
spec.provides[].endpoint.servicestringyesService is the provider's Service, in the namespace it is installed in.
spec.provides[].namestringyesName is the contract name (e.g., "file-store", "project-management").
spec.provides[].protocolstringProtocol is the technical protocol used (e.g., "http-json", "webdav").
spec.requiresobjectRequires is what the platform is obliged to provide before this component may run.
spec.requires.platformstringPlatform is the oldest platform version line this build runs on, as a floor: ">=0.5", or "0.5" which means the same.
spec.requires.privilegesobjectPrivileges escape the default posture.
spec.requires.privileges.apiExtensions[]objectAPIExtensions are resource types the component adds to the cluster's API.
spec.requires.privileges.apiExtensions[].definitions[]object (free-form)yesDefinitions are the CustomResourceDefinitions, apiextensions.k8s.io/v1, as they are installed.
spec.requires.privileges.apiExtensions[].groupstringyesGroup is the API group every definition is in: the add-on's own, never one of Kubernetes' or the platform's.
spec.requires.privileges.apiExtensions[].namestringyesName is what a PrivilegeGrant refers to (apiExtensions/<name>).
spec.requires.privileges.apiExtensions[].reasonstringyesReason is what the approver reads.
spec.requires.privileges.apiExtensions[].serviceAccountstringyesServiceAccount is the account the component's chart runs its pods under, in the component's namespace: the one that reads the types and writes their status.
spec.requires.privileges.clusterRoles[]objectClusterRoles the component's ServiceAccount needs.
spec.requires.privileges.clusterRoles[].namestringyesName is the platform's name of the role, and what a PrivilegeGrant refers to (clusterRoles/<name>).
spec.requires.privileges.clusterRoles[].reasonstringyesReason is what the approver reads.
spec.requires.privileges.clusterRoles[].rules[]objectRules is not used.
spec.requires.privileges.clusterRoles[].rules[].apiGroups[]stringAPIGroups is the name of the APIGroup that contains the resources.
spec.requires.privileges.clusterRoles[].rules[].nonResourceURLs[]stringNonResourceURLs is a set of partial urls that a user should have access to.
spec.requires.privileges.clusterRoles[].rules[].resourceNames[]stringResourceNames is an optional white list of names that the rule applies to.
spec.requires.privileges.clusterRoles[].rules[].resources[]stringResources is a list of resources this rule applies to.
spec.requires.privileges.clusterRoles[].rules[].verbs[]stringyesVerbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule.
spec.requires.privileges.clusterRoles[].serviceAccountstringServiceAccount is the ServiceAccount the component's chart runs its pods under, in the component's namespace.
spec.requires.privileges.egress[]objectEgress opens outbound network beyond the tenant baseline.
spec.requires.privileges.egress[].namestringyesName is what a PrivilegeGrant refers to.
spec.requires.privileges.egress[].reasonstringyesReason is what the approver reads.
spec.requires.privileges.egress[].ruleobjectyesRule is the egress to allow.
spec.requires.privileges.egress[].rule.ports[]objectports is a list of destination ports for outgoing traffic.
spec.requires.privileges.egress[].rule.ports[].endPortinteger (int32)endPort indicates that the range of ports from port to endPort if set, inclusive, should be allowed by the policy.
spec.requires.privileges.egress[].rule.ports[].portint-or-stringport represents the port on the given protocol.
spec.requires.privileges.egress[].rule.ports[].protocolstringprotocol represents the protocol (TCP, UDP, or SCTP) which traffic must match.
spec.requires.privileges.egress[].rule.to[]objectto is a list of destinations for outgoing traffic of pods selected for this rule.
spec.requires.privileges.egress[].rule.to[].ipBlockobjectipBlock defines policy on a particular IPBlock.
spec.requires.privileges.egress[].rule.to[].ipBlock.cidrstringyescidr is a string representing the IPBlock Valid examples are "192.168.1.0/24" or "2001:db8::/64"
spec.requires.privileges.egress[].rule.to[].ipBlock.except[]stringexcept is a slice of CIDRs that should not be included within an IPBlock Valid examples are "192.168.1.0/24" or "2001:db8::/64" Except values will be rejected…
spec.requires.privileges.egress[].rule.to[].namespaceSelectorobjectnamespaceSelector selects namespaces using cluster-scoped labels.
spec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[]objectmatchExpressions is a list of label selector requirements.
spec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].keystringyeskey is the label key that the selector applies to.
spec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].operatorstringyesoperator represents a key's relationship to a set of values.
spec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].values[]stringvalues is an array of string values.
spec.requires.privileges.egress[].rule.to[].namespaceSelector.matchLabelsmap[string]stringmatchLabels is a map of {key,value} pairs.
spec.requires.privileges.egress[].rule.to[].podSelectorobjectpodSelector is a label selector which selects pods.
spec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[]objectmatchExpressions is a list of label selector requirements.
spec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].keystringyeskey is the label key that the selector applies to.
spec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].operatorstringyesoperator represents a key's relationship to a set of values.
spec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].values[]stringvalues is an array of string values.
spec.requires.privileges.egress[].rule.to[].podSelector.matchLabelsmap[string]stringmatchLabels is a map of {key,value} pairs.
spec.requires.privileges.podSecurity[]objectPodSecurity waives a named admission policy for a named part of the component.
spec.requires.privileges.podSecurity[].namestringyesName is what a PrivilegeGrant refers to.
spec.requires.privileges.podSecurity[].policystringyesPolicy is the ClusterPolicy this waives.
spec.requires.privileges.podSecurity[].reasonstringyesReason is what the approver reads.
spec.requires.privileges.podSecurity[].scopestringyesScope is the container or composition part it is waived for.
spec.requires.servicesobjectServices are what the platform must fulfill before this component runs: identity, database, object storage, cache, mail, MCP.
spec.requires.services.authorizationobjectAuthorization declares that the component keeps its own relations in an authorization store the platform makes for it.
spec.requires.services.authorization.groupsstringGroups "mirror" has the platform keep the tenant realm's group memberships in the store, as tuples group:<realm>/<group name>#member of…
spec.requires.services.authorization.modelstringyesModel is the store's authorization model in the OpenFGA DSL ("model / schema 1.1 / type user / ...").
spec.requires.services.authorization.tuples[]objectTuples are the store's starting tuples, written by the platform and held to the model when the profile is admitted.
spec.requires.services.authorization.tuples[].objectstringyes
spec.requires.services.authorization.tuples[].relationstringyes
spec.requires.services.authorization.tuples[].userstringyes
spec.requires.services.cacheobjectCache specifies a caching backend requirement.
spec.requires.services.cache.enginestringEngine selects the caching backend.
spec.requires.services.databaseobjectDatabase specifies a relational database requirement.
spec.requires.services.database.allowDynamicDatabaseCreationbooleanAllowDynamicDatabaseCreation lets the app create databases of its own at runtime.
spec.requires.services.database.connectionLimitinteger (int32)ConnectionLimit is the most connections the app's account may hold at once on the shared server, which every tenant's apps use.
spec.requires.services.database.enginestringEngine selects the database engine.
spec.requires.services.database.schemaPreferencestringSchemaPreference decides which schema the app's role resolves unqualified table names against first.
spec.requires.services.identityobjectIdentity specifies OIDC requirements.
spec.requires.services.identity.oidcobjectOIDC describes the OIDC client to register in the tenant's Keycloak realm.
spec.requires.services.identity.oidc.accessTypestringAccessType controls whether the client requires a shared secret (CONFIDENTIAL, for server-side apps) or relies on PKCE without a secret (PUBLIC, for SPAs and…
spec.requires.services.identity.oidc.audiences[]stringAudiences are names the access tokens of this client carry in aud, beside what Keycloak puts there itself: the name a service the app hands its tokens to…
spec.requires.services.identity.oidc.backchannelLogoutobjectBackchannelLogout says where in the app the realm tells it that a person signed out (OpenID Connect Back-Channel Logout).
spec.requires.services.identity.oidc.backchannelLogout.exposurestringyesExposure names the entry of this profile (spec.expose) whose backend the path is served by.
spec.requires.services.identity.oidc.backchannelLogout.pathstringyesPath is the app's back-channel logout endpoint: a plain path.
spec.requires.services.identity.oidc.backchannelLogoutUrlstringBackchannelLogoutURL is withdrawn and refused: declare BackchannelLogout instead.
spec.requires.services.identity.oidc.clientIdstringyesClientID is the OIDC client identifier registered in Keycloak.
spec.requires.services.identity.oidc.directAccessGrantsEnabledbooleanDirectAccessGrantsEnabled enables the Resource Owner Password Credentials grant (legacy / CLI apps).
spec.requires.services.identity.oidc.namestringName is the human-readable display name shown in the Keycloak admin UI.
spec.requires.services.identity.oidc.oidcPackRefstringOIDCPackRef selects a pack entry from an OIDCPackCatalog CR when the pack key differs from clientId.
spec.requires.services.identity.oidc.postLogoutRedirectUris[]stringPostLogoutRedirectURIs lists the allowed post-logout redirect URIs.
spec.requires.services.identity.oidc.redirectUris[]stringRedirectURIs lists the valid OAuth2 redirect URIs for the authorization code flow.
spec.requires.services.identity.oidc.requestParameterobjectRequestParameter binds an authorization-request parameter of this client's sign-ins to where the code is delivered, and puts it in the access token: for an…
spec.requires.services.identity.oidc.requestParameter.claimstringClaim is the access-token claim the value is put in.
spec.requires.services.identity.oidc.requestParameter.namestringyesName is the parameter, as the app sends it on the authorization request.
spec.requires.services.identity.oidc.requestParameter.patternstringyesPattern is what the value must be, matched as a whole.
spec.requires.services.identity.oidc.requestParameter.redirectUristringyesRedirectURI is the one address a code for the request is delivered to: https, with at least one ${group} for a named group of the pattern's match, and no…
spec.requires.services.identity.samlobjectSAML describes the SAML client to register in the tenant's Keycloak realm.
spec.requires.services.identity.saml.acsUrlstringyesACSURL is the SAML Assertion Consumer Service URL for the auth callback.
spec.requires.services.identity.saml.entityIdstringyesEntityID is the SAML Service Provider Entity ID registered in Keycloak.
spec.requires.services.identity.sidecarobjectSidecar signs people in through the platform's sign-in sidecar.
spec.requires.services.identity.sidecar.appPortinteger (int32)AppPort lets the handler call the app itself inside the cluster: it is the port the app's pods listen on, and the network path is opened to that port of the…
spec.requires.services.identity.sidecar.databasebooleanDatabase gives the handler the app's own database: where it is and the app's own login to it, as DB_HOST, DB_PORT, DB_NAME, DB_USER and DB_PASSWORD, and the…
spec.requires.services.identity.sidecar.entryPaths[]stringEntryPaths are paths of the app that lead to the sign-in instead of to the app: its front page, and the address of its own sign-in form.
spec.requires.services.identity.sidecar.exposurestringExposure names the gateway entry people open the app at: the sidecar's two paths are on that entry's host.
spec.requires.services.identity.sidecar.secrets[]stringSecrets gives the handler secrets of this app, by the names they have under spec.secrets.generated: each as SECRET_<NAME>, the name in upper case.
spec.requires.services.llmobjectLLM declares that the component calls language models through the platform's model gateway.
spec.requires.services.llm.optionalbooleanOptional means the component runs without the gateway.
spec.requires.services.logDestinationobjectLogDestination declares that the component receives the platform's log forwarder over HTTPS inside the cluster.
spec.requires.services.logDestination.portinteger (int32)yesPort is the port that Service and its pods serve HTTPS on, the same number on both: it is the pods' port the network admits.
spec.requires.services.logDestination.servicestringyesService is the name of the component's Service the forwarder is sent to.
spec.requires.services.mailobjectMail specifies SMTP and/or IMAP requirements.
spec.requires.services.mail.imapobjectIMAP requests inbound mail (IMAP) credentials.
spec.requires.services.mail.imap.tokenSignInbooleanTokenSignIn declares that the app opens a person's mailbox with that person's sign-in token (SASL XOAUTH2) instead of an app password.
spec.requires.services.mail.smtpobjectSMTP requests outbound mail (SMTP submission) credentials.
spec.requires.services.mcpobjectMCP declares that the component exposes a Model Context Protocol endpoint.
spec.requires.services.mcp.authstringAuth is the authentication method the endpoint expects.
spec.requires.services.mcp.enabledbooleanyesEnabled says the component exposes the endpoint.
spec.requires.services.mcp.endpointstringEndpoint is the HTTP path where the app exposes its MCP server.
spec.requires.services.partnersobjectPartners declares that the component calls apps of partner realms on a person's behalf, takes such calls, or commissions partners of other tenants.
spec.requires.services.partners.acceptbooleanAccept says the component takes partners' assertions, turning each into the linked local account by the JWT authorization grant, for every partner the tenant…
spec.requires.services.partners.call[]stringCall names the tenant's partners the component asks assertions towards (standard token exchange, scope partner-<name>): a person's token in, a token for the…
spec.requires.services.partners.commissionbooleanCommission says the component asks the director to add receiving partners to the tenants that name it, or to take them away.
spec.requires.services.partners.serviceAccountstringServiceAccount is the Kubernetes service account the component's pods run as; its token is the client's credential.
spec.requires.services.rightsobjectRights declares that the component asks the platform whether a person may use an app of its tenant, for a person who is not at a browser.
spec.requires.services.rights.auditbooleanAudit lets the same key ask three more questions, for a person of the platform tenant: may they audit the cluster (cluster#can_audit), may they configure it…
spec.requires.services.storageobjectStorage specifies object storage (S3) and/or filesystem (WebDAV) requirements.
spec.requires.services.storage.filesobjectFiles requests WebDAV access to the tenant's file-storage service.
spec.requires.services.storage.files.capabilities[]stringCapabilities lists the required access capabilities.
spec.requires.services.storage.files.protocolstringProtocol is the access protocol.
spec.requires.services.storage.s3objectS3 requests a per-tenant S3 bucket from the platform's object store.
spec.requires.services.storage.s3.objectLockbooleanObjectLock makes the bucket with S3 Object Lock, which cannot be switched off again, and lets the app read and set the bucket's default retention…
spec.requires.services.turnobjectTURN declares that the component's clients relay real-time media through the platform's TURN edge.
spec.requires.services.vouchingobjectVouching declares that the component obtains tokens of a person who is not at a browser, on the strength of that person's earlier consent: it signs a short…
spec.requires.services.vouching.director[]stringDirector names what a token the component obtains for a person may do at the platform's own API, beside the apps: plans-read reads the cluster's plans, its…
spec.requires.services.vouching.keysobjectyesKeys says where the component publishes the keys its statements are signed with, as a JWKS.
spec.requires.services.vouching.keys.pathstringPath is where the JWKS is served.
spec.requires.services.vouching.keys.portinteger (int32)yesPort is the Service's port.
spec.requires.services.vouching.keys.servicestringyesService is the name of the component's Service.
spec.secretsobjectSecrets are values the platform generates and holds that have no external counterparty.
spec.secrets.derived[]objectDerived secrets are keys the platform adds to the credentials Secret it manages for the component, under the names given.
spec.secrets.derived[].keystringyesKey is the Secret key, and therefore the environment variable name when the app consumes the Secret with envFrom (e.g.
spec.secrets.generated[]objectGenerated secrets are random, created once and held in the vault.
spec.secrets.generated[].namestringyesName is the logical identifier for this secret (e.g., "admin_password").
spec.secrets.generated[].valuePathstringyesValuePath is the dot-notation (or bracket-notation) Helm value key that should receive the generated secret value.
spec.secrets.supplied[]objectSupplied secrets are credentials only a person can provide.
spec.secrets.supplied[].descriptionstringDescription says what the credential is for and where to obtain it, for a tenant administrator who did not write the profile.
spec.secrets.supplied[].displayNamestringyesDisplayName is the label the form renders.
spec.secrets.supplied[].fields[]objectyesFields are the values the form collects, set together.
spec.secrets.supplied[].fields[].examplestringExample is a non-secret illustration of the expected shape.
spec.secrets.supplied[].fields[].formatstringFormat hints at how the form renders and checks the field.
spec.secrets.supplied[].fields[].keystringyesKey is the property's name at the vault path and in the form.
spec.secrets.supplied[].fields[].publicbooleanPublic marks a value that is not secret -- a publishable key, an account id -- which the form then shows as typed.
spec.secrets.supplied[].fields[].valuePathstringyesValuePath is the Helm value key that receives the value, as for a generated secret.
spec.secrets.supplied[].namestringyesName identifies the credential within the app: the last part of its vault path and of the requirement's name, app-{tenant}-{app}-{name}.
spec.sessionMaxAgestringSessionMaxAge caps, at the realm, how long a sign-in through the app's own OIDC clients lasts: the operator sets it as the clients' session lifespan, and past…
spec.trustTierstringyesTrustTier is the review level of this entry.
spec.versionstringyesVersion is the catalog entry's version, not the upstream project's.
statusobjectComponentProfileStatus is the observed state of a ComponentProfile.
status.conditions[]object
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.deliverystringDelivery is read from the package: workload for a chart or a composition, api for a component the platform routes to, addon for one it does not deploy at all.

9. CredentialRequirement​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralcredentialrequirements
Short namescredreq

CredentialRequirement declares a secret that must be supplied from outside the cluster: a registry token, a DNS provider key, an SMTP relay password. It is catalog data, not a provisioning API — a schema, a target path in OpenBao, and a validation hint. It is deliberately a plain CRD rather than a Crossplane XRD. It composes nothing: an XRD requires a Composition producing managed resources, and there are none to produce. It sits beside ComponentProfile as catalog. There is no controller. Each requirement emits an ExternalSecret, and ESO's sync status IS the satisfaction probe — path absent in OpenBao gives SecretSyncedError, path present gives Ready. That keeps satisfaction a Kubernetes condition (so Compositions can gate on it) and means no bespoke component has to hold an OpenBao token in order to poll. Naming: these are "credential requirements" or "credential inputs", never "external secrets". ESO's ExternalSecret is a reference to a secret stored externally, which is nearly the opposite of a secret that must be supplied from outside.

FieldTypeRequiredDescription
specobjectCredentialRequirementSpec describes one credential an operator must supply.
spec.consumedBy[]objectConsumedBy documents which resources depend on this credential.
spec.consumedBy[].kindstringyesKind of the consuming resource, e.g. XRepository.
spec.consumedBy[].namestringyesName of the consuming resource.
spec.descriptionstringDescription explains what the credential is for and where to obtain it.
spec.displayNamestringyesDisplayName is the label a form renders for this requirement.
spec.fields[]objectyesFields enumerates the keys stored at VaultPath.
spec.fields[].examplestringExample is a non-secret illustration of the expected shape.
spec.fields[].formatstringFormat hints at how a form should render and check the field.
spec.fields[].keystringyesKey is the field name within the OpenBao secret.
spec.fields[].minLengthintegerMinLength enforces a minimum, declared once here rather than hardcoded at each site that checks it.
spec.fields[].secretbooleanSecret marks a field whose value must never be displayed or logged.
spec.optionalbooleanOptional marks an unsatisfied requirement as an informational gap rather than an error.
spec.phasestringyesPhase decides whether an unsatisfied requirement blocks installation.
spec.scopestringyesScope determines which OpenBao policy governs the write and who may see the requirement.
spec.tenantstringTenant names the tenant a tenant-scoped requirement belongs to.
spec.validateobjectValidate is the probe run BEFORE the value is written, so a bad paste becomes a red field at install time rather than a stalled provisioning job hours later.
spec.validate.hoststringHost is the endpoint probed, when the validator needs one that is not derivable from the fields themselves.
spec.validate.typestringyesType keys the validator.
spec.validate.urlstringURL is the full endpoint probed, for validators that need a path.
spec.vaultPathstringyesVaultPath is the only coupling between this requirement and the storage layer.

10. Customization​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluralcustomizations
Short namescust, customizations

Customization is a tracked, owned, dated deviation from an app as shipped.

FieldTypeRequiredDescription
specobjectCustomizationSpec is the desired state of a Customization record.
spec.artifacts[]objectArtifacts point at the implementing code or content.
spec.artifacts[].pathstringPath is the repo-relative location of the artifact.
spec.artifacts[].repostringyesRepo is the repository holding the artifact.
spec.artifacts[].versionstringVersion pins the artifact.
spec.createdstringCreated is the date the record was written (RFC 3339 date).
spec.deliverystringDelivery is how an L3 module reaches the running app.
spec.exitCriteriastringExitCriteria states what would allow this customization to be dropped.
spec.licensingobjectLicensing records the licensing effect.
spec.licensing.effectstringEffect records whether licensing terms change.
spec.licensing.notesstringNotes explains a non-none effect.
spec.originobjectOrigin records authorship and repository ownership.
spec.origin.authorshipstringAuthorship records who wrote the customization.
spec.origin.contactstringContact is the maintainer contact for the customization.
spec.origin.organisationstringOrganisation names the authoring organization, when not Gentian.
spec.origin.repostringRepo is the backing repository, when externally owned.
spec.origin.repoOwnershipstringRepoOwnership records who controls that repository.
spec.origin.reviewedBystringReviewedBy names the role at Gentian that accepted the customization.
spec.origin.supportContractstringSupportContract records the support terms.
spec.ownerstringyesOwner is the team or person accountable.
spec.reviewBystringyesReviewBy is the date this deviation must be reconsidered.
spec.rungstringyesRung is the ladder rung this customization sits at.
spec.rungJustificationmap[string]stringRungJustification explains, per rung skipped, why nothing cheaper would do.
spec.scopestringyesScope is the blast radius.
spec.securityobjectSecurity records the security posture.
spec.security.handlesPersonalDatabooleanHandlesPersonalData flags customizations that process personal data.
spec.security.macWaivers[]stringMACWaivers lists waivers this customization requires.
spec.security.newEgress[]stringNewEgress lists network destinations the customization introduces.
spec.summarystringyesSummary states what the customization does, in one line.
spec.targetobjectyesTarget identifies the app being customized.
spec.target.appVersionstringAppVersion is the upstream application version this was built against.
spec.target.chartVersionstringChartVersion is the chart version this was built against.
spec.target.familystringFamily is the logical app id shared across profile revisions.
spec.target.profilestringyesProfile is the ComponentProfile name this customization targets.
spec.tenants[]stringTenants lists affected tenants.
spec.testedAgainst[]stringTestedAgainst lists the app versions this customization was verified against.
spec.tests[]stringTests lists the regression tests covering this customization.
spec.upgradeRiskstringUpgradeRisk estimates the cost of the next upstream version bump.
spec.upstreamFirstobjectUpstreamFirst records the upstream-first obligation.
spec.upstreamFirst.appliedUpstreambooleanAppliedUpstream reports whether upstream has accepted the change.
spec.upstreamFirst.attemptedbooleanAttempted reports whether upstream was searched and, where applicable, offered the change.
spec.upstreamFirst.forwardedstringForwarded mirrors DEP-3: was the change sent upstream?
spec.upstreamFirst.reasonstringReason explains a Forwarded value of "no" or "not-needed".
spec.upstreamFirst.urlstringURL links the upstream issue or pull request.
statusobjectCustomizationStatus is the observed state, computed by the operator.
status.conditions[]objectConditions provide detailed status.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.observedGenerationinteger (int64)ObservedGeneration is the last reconciled spec generation.
status.phasestringPhase summarizes record health.
status.reviewOverduebooleanReviewOverdue is true once spec.reviewBy has passed.
status.rungAboveRecommendedbooleanRungAboveRecommended is true when the target's customization surface offers a lower rung this record's rungJustification has no entry for — a rung the app has…
status.targetVersionDriftbooleanTargetVersionDrift is true when the target profile now pins a chart or app version outside spec.testedAgainst.
status.upstreamStalebooleanUpstreamStale is true when the change was never forwarded upstream and no reason was recorded, or when upstream has accepted it and the local delta is still…

11. IntegrationBinding​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluralintegrationbindings
Short namesib, ibs

IntegrationBinding is the Schema for the integrationbindings API. IntegrationBinding is namespace-scoped — it lives in the tenant's namespace and is auto-generated by the orchestrator when both the provider and consumer apps are present in a tenant's app list and their profiles declare compatible integration contracts. The binding provisions shared credentials in OpenBao and wires the authentication method between provider and consumer.

FieldTypeRequiredDescription
specobjectIntegrationBindingSpec defines the desired state of an IntegrationBinding.
spec.authobjectAuth configures how the consumer authenticates to the provider.
spec.auth.vaultPathstringVaultPath is the OpenBao path where shared credentials are stored.
spec.capabilities[]stringCapabilities lists the specific contract capabilities being granted.
spec.consumerobjectyesConsumer identifies the app that consumes the contract.
spec.consumer.appstringyesApp is the name of the app (corresponds to the ComponentProfile name).
spec.consumer.namespacestringyesNamespace is the Kubernetes namespace where the app is running.
spec.contractstringyesContract is the name of the integration contract being fulfilled (e.g., "file-store", "filepicker", "central-navigation").
spec.endpointobjectEndpoint is where the provider answers the contract, copied from its profile's spec.provides entry.
spec.endpoint.pathstringPath is appended to the address the consumer is told, for an API served below the root.
spec.endpoint.portinteger (int32)yesPort is the Service's port, and must be the port the provider's pods listen on: a network policy matches the port a pod listens on, and the way it opens is to…
spec.endpoint.servicestringyesService is the provider's Service, in the namespace it is installed in.
spec.providerobjectyesProvider identifies the app that fulfils the contract.
spec.provider.appstringyesApp is the name of the app (corresponds to the ComponentProfile name).
spec.provider.namespacestringyesNamespace is the Kubernetes namespace where the app is running.
statusobjectIntegrationBindingStatus holds the observed state of an IntegrationBinding.
status.conditions[]objectConditions provides detailed status conditions.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.statestringState summarizes whether the binding is functional.

12. MailboxRemoval​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralmailboxremovals
Short namesmbxr

MailboxRemoval records what whoever removed a person decided about that person's mailbox, and what became of it. The registrar writes it, when a person is removed from a tenant that keeps mailboxes on the cluster's own mail server; the operator carries it out, by a Job beside the mail server's volume, and reports here. For as long as the mailbox is archived this is also the record an administrator reads the archive from, and where its deletion is asked for.

FieldTypeRequiredDescription
specobjectMailboxRemovalSpec is the decision.
spec.addressstringyesAddress is the address the removed person received mail at.
spec.deleteArchiveobjectDeleteArchive, once set, asks for the archived mailbox to be deleted, and says who asked.
spec.deleteArchive.atstring (date-time)At is when they asked.
spec.deleteArchive.namestringName is how the person is shown: their address or name at the time.
spec.deleteArchive.requestIDstringRequestID joins this to the registrar's record of the authority and to the identity provider's own event.
spec.deleteArchive.subjectstringyesSubject is the person's id at the identity provider.
spec.mailboxstringyesMailbox is the choice: archive or delete.
spec.requestedByobjectyesRequestedBy is who removed the person and made the choice.
spec.requestedBy.atstring (date-time)At is when they asked.
spec.requestedBy.namestringName is how the person is shown: their address or name at the time.
spec.requestedBy.requestIDstringRequestID joins this to the registrar's record of the authority and to the identity provider's own event.
spec.requestedBy.subjectstringyesSubject is the person's id at the identity provider.
spec.restoredobjectRestored says this record was not written at a removal: a restore wrote it, for an archived mailbox it put back from a backup, so that the archive is listed…
spec.restored.addressstringAddress is the address the removed person received at, in the domain of the tenant restored into.
spec.restored.archivestringyesArchive is the archived mailbox's name in the domain's archive.
spec.restored.archivedAtstring (date-time)ArchivedAt is when it was archived, where the bundle was taken; By who chose that, as they were shown there.
spec.restored.bystring
spec.restored.domainstringDomain is the mail domain whose archive it is in.
spec.restored.messagesinteger (int64)
spec.restored.sizeBytesinteger (int64)
spec.tenantstringyesTenant is the tenant the person was removed from.
statusobjectMailboxRemovalStatus is what became of the mailbox.
status.archivestringArchive is the archived mailbox's name in the domain's archive.
status.archivedAtstring (date-time)ArchivedAt is when the mailbox was archived; DeletedAt when the mailbox, or later its archive, was deleted.
status.attemptsinteger (int32)Attempts counts the Jobs that failed, and LastFailureAt is when the last one did: the next is started later each time.
status.deletedAtstring (date-time)
status.domainstringDomain is the mail domain the mailbox was in.
status.lastFailureAtstring (date-time)
status.messagestringMessage says, in a sentence, what happened or what is waited for.
status.messagesinteger (int64)
status.phasestringMailboxRemovalPhase is where a removed person's mailbox stands.
status.refusedbooleanRefused is set when the operator will not act on this record at all: the address is not one of the tenant's mailboxes, or still belongs to a person.
status.signInGoneAtstring (date-time)SignInGoneAt is when the operator last saw that no mail password of the address is left with the mail server.
status.sizeBytesinteger (int64)SizeBytes and Messages are what the mailbox held when it was archived or deleted.

13. OIDCPackCatalog​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluraloidcpackcatalogs
Short namesoidcpack, oidcpacks

OIDCPackCatalog is a cluster-scoped catalog of OIDC packs for tenant apps. Shipped from gentian-apps (profiles/<app>/oidc-catalog.yaml) and consumed by the operator for pack Jobs and an app's client default scopes.

FieldTypeRequiredDescription
specobjectOIDCPackCatalogSpec holds mapper templates and per-clientId pack definitions.
spec.mapperTemplatesmap[string]objectMapperTemplates are reusable Keycloak protocol mapper definitions.
spec.mapperTemplates{}.configmap[string]stringConfig holds Keycloak mapper configuration key/value pairs.
spec.mapperTemplates{}.keycloakNamestringKeycloakName overrides the mapper name in Keycloak when it differs from the catalog template key.
spec.mapperTemplates{}.protocolMapperstringyesProtocolMapper is the Keycloak protocol mapper type.
spec.packsmap[string]objectPacks maps OIDC clientId to pack configuration.
spec.packs{}.clientRolestringClientRole is the Keycloak client role mapped from the entitlement group.
spec.packs{}.defaultScopes[]stringDefaultScopes are realm default scopes attached before the pack scope.
spec.packs{}.entitlementGroupstringEntitlementGroup is the Keycloak group name mapped to the pack client role.
spec.packs{}.fullScopeAllowedbooleanFullScopeAllowed controls Keycloak fullScopeAllowed on the client.
spec.packs{}.mappers[]stringMappers lists mapper template keys from spec.mapperTemplates.
spec.packs{}.publicClientbooleanPublicClient marks the OIDC client as PUBLIC (PKCE, no secret).
spec.packs{}.scopeDescriptionstringScopeDescription is shown in the Keycloak admin UI.
spec.packs{}.scopeNamestringScopeName is the Keycloak client scope created for this pack.
spec.packs{}.serviceClientbooleanServiceClient provisions a confidential client for a backend service rather than an application users log in to.
statusobjectOIDCPackCatalogStatus is optional observed state.

14. PlanOrdering​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralplanorderings
Short names

PlanOrdering is the cluster's notice on how to order another plan.

FieldTypeRequiredDescription
specobjectyesPlanOrderingSpec says where a tenant orders another resource plan.
spec.emailstringEmail is an address to write to.
spec.phonestringPhone is a number to call, as it is dialed from abroad.
spec.textmap[string]stringyesText is the notice by language: a two-letter code, such as en or de, and what to show a person reading in it.
spec.urlstringURL is where to order, opened in a new page.

15. PlatformSecurityPolicy​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralplatformsecuritypolicies
Short namespsp, platformsec

PlatformSecurityPolicy is the cluster singleton where platform administrators approve MAC waivers and other cluster-wide security posture settings.

FieldTypeRequiredDescription
specobjectPlatformSecurityPolicySpec holds cluster-admin security configuration.
spec.allowedClusterRoles[]objectAllowedClusterRoles lists, per profile, the platform's cluster roles this cluster permits.
spec.allowedClusterRoles[].profilestringyesProfile is the ComponentProfile metadata.name that may be bound to it.
spec.allowedClusterRoles[].rolestringyesRole is the platform's name of the role, as a profile asks for it in requires.privileges.clusterRoles[].name.
spec.allowedMacWaivers[]objectAllowedMacWaivers lists profile/policy/scope tuples the cluster permits.
spec.allowedMacWaivers[].policystringyesPolicy is the Kyverno ClusterPolicy name.
spec.allowedMacWaivers[].profilestringyesProfile is the ComponentProfile metadata.name that may use this waiver.
spec.allowedMacWaivers[].scopestringyesScope matches MacWaiverRequest.scope on the profile.
statusobjectPlatformSecurityPolicyStatus reports observed policy state.
status.allowedMacWaiverCountintegerAllowedMacWaiverCount is len(spec.allowedMacWaivers) last written to the gentian-platform-security ConfigMap.
status.conditions[]objectConditions provide reconciliation detail.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.

16. ProfileBuild​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralprofilebuilds
Short namespb

ProfileBuild is one build of a profile, as a catalog published it: the bundle at one digest, kept on the cluster for as long as a tenant runs it. A ComponentProfile is one object per name for the whole cluster, and it is the newest build any tenant installed. A tenant pinned to another build runs it from here: the operator reads its profile out of the bundle this object carries, verified against the digest, and a profile's own Composition reads the same spec from profileSpec. So two tenants on two builds of one app share nothing, and a tenant moved back to a build it ran before finds it without fetching anything. Written by the director beside the profile, into the catalog directory of the deployments repository, and applied from there by Argo CD; the installer writes the same file for the profile it places. Nothing edits it: a build is its digest. The operator reads the bundle, holds it to the digest and to what a bundle may hold, and writes the profile's spec it found onto the status, which is what a profile's own Composition reads.

FieldTypeRequiredDescription
specobjectyesProfileBuildSpec is the build.
spec.bundlestringyesBundle is the published file, base64: the profile and its companions, the bytes that hash to Digest.
spec.digeststringyesDigest is the sha256 of the bundle, "sha256:<hex>", as the catalog's index states it and as an install pins it.
spec.originstringyesOrigin is which catalog the bundle was fetched from, as the director records it on the profile (cluster/<source> or tenant/<t>/<source>).
spec.profilestringyesProfile is the name of the ComponentProfile this is a build of: the app's identity across every build.
statusobjectProfileBuildStatus is what the operator found in the bundle.
status.conditions[]objectConditions: Verified is True when the bundle is the digest it claims and holds what a bundle may; False names what was found.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.profileSpecobjectProfileSpec is the bundle's profile spec, with the defaults the API server gives a ComponentProfile, written once the bundle verified.
status.profileSpec.adapterobjectAdapter is what an adapter adapts.
status.profileSpec.adapter.adaptsobjectAdapts names the app whose interface this adapter uses: the app's ComponentProfile, which must be installed in the same tenant.
status.profileSpec.adapter.adapts.profilestringyesProfile is the ComponentProfile of the app.
status.profileSpec.adapter.adapts.versions[]stringVersions are the catalog versions of the app this adapter was reviewed against.
status.profileSpec.backupobjectBackup declares what a consistent copy of this component consists of.
status.profileSpec.backup.boundSecrets[]objectBoundSecrets lists secrets this app's data is welded to: not derived, held outside the app's own captured data, and required to make sense of that data again.
status.profileSpec.backup.boundSecrets[].keys[]stringKeys selects individual keys at that path.
status.profileSpec.backup.boundSecrets[].openBaoPathstringyesOpenBaoPath is relative to this tenant's own prefix (gentian-os/tenants/{tenant}/), so a profile can only ever name secrets belonging to the tenant being…
status.profileSpec.backup.quiesceobjectQuiesce controls how writes are paused while the app is captured.
status.profileSpec.backup.quiesce.containerstringContainer names the container to run Pre and Post in.
status.profileSpec.backup.quiesce.modestringMode selects how writes are paused.
status.profileSpec.backup.quiesce.post[]stringPost is the command that resumes writes.
status.profileSpec.backup.quiesce.pre[]stringPre is the command that pauses writes, required when mode is command.
status.profileSpec.backup.restoreobjectRestore declares what must run after this app's data is loaded and before it is resumed.
status.profileSpec.backup.restore.domainBoundbooleanDomainBound says the app's data cannot be moved to another domain: it names the tenant's domain in a way the app refuses to run with another (a server name…
status.profileSpec.backup.restore.post[][]stringPost lists commands run in order once the app's data is loaded and before it is resumed — cache invalidation, re-indexing, fingerprinting, and rewriting what…
status.profileSpec.backup.restore.verify[]stringVerify is a single command that must exit zero before the restore is reported successful.
status.profileSpec.backup.volumesobjectVolumes narrows what is captured from the app's PersistentVolumeClaims.
status.profileSpec.backup.volumes.excludePaths[]stringExcludePaths drops matching paths from the captured archive, as glob patterns relative to each volume root.
status.profileSpec.backup.volumes.include[]stringInclude names the PersistentVolumeClaims to capture.
status.profileSpec.classes[]stringyesClasses lists the modes this component may be deployed under.
status.profileSpec.customizationobjectCustomization declares what a tenant may change about this component.
status.profileSpec.customization.addonobjectAddon declares that this profile is an addon rather than a deployable app, and how the base activates it.
status.profileSpec.customization.addon.idstringyesID is what the hosting app's own addon system calls this addon: an Odoo module name, a Nextcloud app id, an XWiki extension.
status.profileSpec.customization.addon.ofstringyesOf is the ComponentProfile name of the base this addon activates into.
status.profileSpec.customization.addonActivationobjectAddonActivation tells the platform how to turn a tenant's addon selection into Helm values for this base.
status.profileSpec.customization.addonActivation.scriptstringyesScript is written to ValuesPath with the token GENTIAN_ADDON_IDS replaced by the space-separated addon ids.
status.profileSpec.customization.addonActivation.valuesPathstringyesValuesPath is the dot-separated Helm values path the rendered Script is written to, e.g. "nextcloud.hooks.before-starting".
status.profileSpec.customization.addonValues[]objectAddonValues overlays extra Helm values onto this app's release when a given addon is selected.
status.profileSpec.customization.addonValues[].valuesobject (free-form)yesValues are merged into the release values when that addon is selected, and omitted entirely when it is not.
status.profileSpec.customization.addonValues[].whenAddonstringyesWhenAddon is the app-side addon id — the value of spec.customization.addon.id on the addon's profile, e.g. "richdocuments", not the profile name.
status.profileSpec.customization.configureobjectConfigure describes the L0 surface.
status.profileSpec.customization.configure.hotReloadbooleanHotReload reports whether a values change applies without a restart.
status.profileSpec.customization.configure.valuesSchemastringValuesSchema is the repo-relative path to the chart's values.schema.json.
status.profileSpec.customization.dropIns[]objectDropIns declares the L1 surface: directories the app treats as extension points.
status.profileSpec.customization.dropIns[].formatstringyesFormat is the content format expected in this directory.
status.profileSpec.customization.dropIns[].maxBytesinteger (int32)MaxBytes caps the total tenant-supplied content for this drop-in.
status.profileSpec.customization.dropIns[].namestringyesName identifies the drop-in.
status.profileSpec.customization.dropIns[].pathstringyesPath is the absolute in-container directory the files are mounted at.
status.profileSpec.customization.dropIns[].sourcestringSource is the Kubernetes object the content is delivered through.
status.profileSpec.customization.dropIns[].tenantEditablebooleanTenantEditable allows tenant admins to supply files here through Tenant.spec.apps[].config.dropIns.
status.profileSpec.customization.dropIns[].upstreamDocumentedbooleanUpstreamDocumented reports whether upstream documents this path as an extension point.
status.profileSpec.customization.extensionobjectExtension describes the L3 surface: the app's own addon system.
status.profileSpec.customization.extension.addonPathstringAddonPath is the in-container directory addons are loaded from (Odoo's custom-addons, Nextcloud's custom_apps).
status.profileSpec.customization.extension.apiDocsstringAPIDocs links to the extension API documentation.
status.profileSpec.customization.extension.apiStabilitystringAPIStability rates the extension API.
status.profileSpec.customization.extension.delivery[]stringDelivery lists the supported ways an addon reaches the running app.
status.profileSpec.customization.extension.mechanismstringyesMechanism names the app's extension system (for example "odoo-addon", "nextcloud-app", "xwiki-extension").
status.profileSpec.customization.extension.perTenantAddonsbooleanPerTenantAddons reports whether tenants may have divergent addon sets.
status.profileSpec.customization.extension.registrystringRegistry is the repository or index addons are sourced from.
status.profileSpec.customization.extension.testMatrix[]stringTestMatrix lists the upstream app versions addons are tested against.
status.profileSpec.customization.forkobjectFork describes the L6 surface: whether a fork is permitted, and who owns it.
status.profileSpec.customization.fork.allowedbooleanAllowed gates whether a fork is a permitted outcome for this app.
status.profileSpec.customization.fork.cveWatchbooleanCVEWatch reports whether the fork has active vulnerability monitoring.
status.profileSpec.customization.fork.ownerstringOwner is the team or organization accountable for the fork, including its CVE response.
status.profileSpec.customization.fork.repostringRepo is the Gentian-owned fork.
status.profileSpec.customization.fork.upstreamstringUpstream is the project the fork diverged from.
status.profileSpec.customization.gradestringGrade rates customization readiness (see CustomizationGrade).
status.profileSpec.customization.ladderDocsstringLadderDocs links to human documentation of this app's ladder.
status.profileSpec.customization.patchobjectPatch describes the L5 surface: whether a patch series is permitted.
status.profileSpec.customization.patch.allowedbooleanAllowed gates whether a patch series may be carried for this app at all.
status.profileSpec.customization.patch.buildRepostringBuildRepo is the repository holding the pinned upstream and the series.
status.profileSpec.customization.patch.requiresApprovalstringRequiresApproval names the role that must approve a new patch.
status.profileSpec.customization.patch.seriesPathstringSeriesPath is the repo-relative path to the quilt-style series file.
status.profileSpec.customization.publishesobjectPublishes describes what this app offers so that another app can be built at L2 against it.
status.profileSpec.customization.publishes.apis[]objectAPIs lists the published interfaces a companion app can build against.
status.profileSpec.customization.publishes.apis[].authstringAuth is the authentication method companions must use.
status.profileSpec.customization.publishes.apis[].contractstringyesContract is the Gentian contract name this API satisfies.
status.profileSpec.customization.publishes.apis[].pathstringPath is the base path the API is served at.
status.profileSpec.customization.publishes.apis[].protocolstringProtocol is the wire protocol (for example "http-json", "webdav", "matrix").
status.profileSpec.customization.publishes.apis[].specstringSpec names the interface description format (for example "openapi", "graphql").
status.profileSpec.customization.repackageobjectRepackage describes the L4 surface: who owns the packaging.
status.profileSpec.customization.repackage.chartOwnershipstringChartOwnership records whether the chart is upstream's, Gentian-authored, or a vendored copy.
status.profileSpec.customization.repackage.compositionRefstringCompositionRef names the profile-scoped Crossplane composition, when the app needs a custom managed-resource graph.
status.profileSpec.customization.rubricScoreinteger (int32)RubricScore is the §4.1 rubric total backing Grade (0-8).
status.profileSpec.customization.supportedRungs[]stringSupportedRungs lists the rungs at which this app can be customized.
status.profileSpec.defaultForPlatformbooleanDefaultForPlatform is placement {tenants: platform}.
status.profileSpec.defaultForTenantsbooleanDefaultForTenants is placement {tenants: every}.
status.profileSpec.defaultWhereStoreOfferedbooleanDefaultWhereStoreOffered is placement {tenants: users, while: storeOffered}.
status.profileSpec.expose[]objectExpose declares entry points.
status.profileSpec.expose[].annotationsmap[string]stringAnnotations are gateway policy for this host.
status.profileSpec.expose[].apexbooleanApex publishes this entry on the cluster's bare domain -- its main address -- instead of a host under the zone's domain.
status.profileSpec.expose[].authModestringyesAuthMode is mandatory and has no default.
status.profileSpec.expose[].backendobjectyesBackend is the Service the entry routes to.
status.profileSpec.expose[].backend.componentstringComponent names another component whose Service this entry routes to.
status.profileSpec.expose[].backend.portinteger (int32)yes
status.profileSpec.expose[].backend.servicestringyes
status.profileSpec.expose[].clientAuthorizationstringClientAuthorization says whose the Authorization header is on this entry.
status.profileSpec.expose[].denyPaths[]stringDenyPaths are refused even where Paths admits them.
status.profileSpec.expose[].exchangeTokenbooleanExchangeToken asks the front door to hand this backend a token of the person that is valid at this app and nowhere else: the session's token exchanged at the…
status.profileSpec.expose[].forwardTokenbooleanForwardToken asks the gateway to pass the edge access token to this backend.
status.profileSpec.expose[].namestringyes
status.profileSpec.expose[].paths[]stringPaths this entry serves.
status.profileSpec.expose[].subDomainstringSubDomain is the host label of this entry in the tenant's zone.
status.profileSpec.expose[].surfacestringyesSurface selects where this entry is published.
status.profileSpec.expose[].tileobjectTile is how this entry appears on the portal, for an entry a person is meant to open.
status.profileSpec.expose[].tile.descriptionstringDescription is the sentence the portal shows beside the label.
status.profileSpec.expose[].tile.displayNamestringyesDisplayName is the label under the icon.
status.profileSpec.expose[].tile.displayNamesmap[string]stringDisplayNames are translations of DisplayName, keyed by locale ("de_DE", "en_US").
status.profileSpec.expose[].tile.imagestringImage is the profile-relative path the PNG lives at in git, e.g. assets/tile.png.
status.profileSpec.expose[].tile.logostringyesLogo is the tile's default image: a square PNG, 128x128, inline as a data URI.
status.profileSpec.expose[].tile.objectstringObject is what Relation is checked against.
status.profileSpec.expose[].tile.pathstringPath is where within the host the tile leads.
status.profileSpec.expose[].tile.relationstringyesRelation is what the caller must hold, on the object Object names, for the tile to be on their page: a permission of the authorization model…
status.profileSpec.extensions[]objectExtensions are containers shipped inside the component's own pod: the only escape hatch, and one that cannot create a cluster-scoped object.
status.profileSpec.extensions[].appSecrets[]objectAppSecrets are sidecar-internal secrets stored at gentian-os/tenants/{tenant}/apps/{parent}-{name}/internal/{secret}.
status.profileSpec.extensions[].appSecrets[].namestringyesName is the logical identifier for this secret (e.g., "admin_password").
status.profileSpec.extensions[].appSecrets[].valuePathstringyesValuePath is the dot-notation (or bracket-notation) Helm value key that should receive the generated secret value.
status.profileSpec.extensions[].chartobjectyesChart references the sidecar Helm chart.
status.profileSpec.extensions[].chart.namestringyesName is the chart name within the repository.
status.profileSpec.extensions[].chart.repositorystringyesRepository is the OCI repository URL (e.g., oci://registry.example.com/charts).
status.profileSpec.extensions[].chart.versionstringyesVersion is the chart version to deploy.
status.profileSpec.extensions[].extraValuesobject (free-form)ExtraValues are merged into the sidecar Helm release values.
status.profileSpec.extensions[].kernelRequirementsobjectServiceRequirements declares kernel services the sidecar needs.
status.profileSpec.extensions[].kernelRequirements.authorizationobjectAuthorization declares that the component keeps its own relations in an authorization store the platform makes for it.
status.profileSpec.extensions[].kernelRequirements.authorization.groupsstringGroups "mirror" has the platform keep the tenant realm's group memberships in the store, as tuples group:<realm>/<group name>#member of…
status.profileSpec.extensions[].kernelRequirements.authorization.modelstringyesModel is the store's authorization model in the OpenFGA DSL ("model / schema 1.1 / type user / ...").
status.profileSpec.extensions[].kernelRequirements.authorization.tuples[]objectTuples are the store's starting tuples, written by the platform and held to the model when the profile is admitted.
status.profileSpec.extensions[].kernelRequirements.authorization.tuples[].objectstringyes
status.profileSpec.extensions[].kernelRequirements.authorization.tuples[].relationstringyes
status.profileSpec.extensions[].kernelRequirements.authorization.tuples[].userstringyes
status.profileSpec.extensions[].kernelRequirements.cacheobjectCache specifies a caching backend requirement.
status.profileSpec.extensions[].kernelRequirements.cache.enginestringEngine selects the caching backend.
status.profileSpec.extensions[].kernelRequirements.databaseobjectDatabase specifies a relational database requirement.
status.profileSpec.extensions[].kernelRequirements.database.allowDynamicDatabaseCreationbooleanAllowDynamicDatabaseCreation lets the app create databases of its own at runtime.
status.profileSpec.extensions[].kernelRequirements.database.connectionLimitinteger (int32)ConnectionLimit is the most connections the app's account may hold at once on the shared server, which every tenant's apps use.
status.profileSpec.extensions[].kernelRequirements.database.enginestringEngine selects the database engine.
status.profileSpec.extensions[].kernelRequirements.database.schemaPreferencestringSchemaPreference decides which schema the app's role resolves unqualified table names against first.
status.profileSpec.extensions[].kernelRequirements.identityobjectIdentity specifies OIDC requirements.
status.profileSpec.extensions[].kernelRequirements.identity.oidcobjectOIDC describes the OIDC client to register in the tenant's Keycloak realm.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.accessTypestringAccessType controls whether the client requires a shared secret (CONFIDENTIAL, for server-side apps) or relies on PKCE without a secret (PUBLIC, for SPAs and…
status.profileSpec.extensions[].kernelRequirements.identity.oidc.audiences[]stringAudiences are names the access tokens of this client carry in aud, beside what Keycloak puts there itself: the name a service the app hands its tokens to…
status.profileSpec.extensions[].kernelRequirements.identity.oidc.backchannelLogoutobjectBackchannelLogout says where in the app the realm tells it that a person signed out (OpenID Connect Back-Channel Logout).
status.profileSpec.extensions[].kernelRequirements.identity.oidc.backchannelLogout.exposurestringyesExposure names the entry of this profile (spec.expose) whose backend the path is served by.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.backchannelLogout.pathstringyesPath is the app's back-channel logout endpoint: a plain path.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.backchannelLogoutUrlstringBackchannelLogoutURL is withdrawn and refused: declare BackchannelLogout instead.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.clientIdstringyesClientID is the OIDC client identifier registered in Keycloak.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.directAccessGrantsEnabledbooleanDirectAccessGrantsEnabled enables the Resource Owner Password Credentials grant (legacy / CLI apps).
status.profileSpec.extensions[].kernelRequirements.identity.oidc.namestringName is the human-readable display name shown in the Keycloak admin UI.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.oidcPackRefstringOIDCPackRef selects a pack entry from an OIDCPackCatalog CR when the pack key differs from clientId.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.postLogoutRedirectUris[]stringPostLogoutRedirectURIs lists the allowed post-logout redirect URIs.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.redirectUris[]stringRedirectURIs lists the valid OAuth2 redirect URIs for the authorization code flow.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.requestParameterobjectRequestParameter binds an authorization-request parameter of this client's sign-ins to where the code is delivered, and puts it in the access token: for an…
status.profileSpec.extensions[].kernelRequirements.identity.oidc.requestParameter.claimstringClaim is the access-token claim the value is put in.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.requestParameter.namestringyesName is the parameter, as the app sends it on the authorization request.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.requestParameter.patternstringyesPattern is what the value must be, matched as a whole.
status.profileSpec.extensions[].kernelRequirements.identity.oidc.requestParameter.redirectUristringyesRedirectURI is the one address a code for the request is delivered to: https, with at least one ${group} for a named group of the pattern's match, and no…
status.profileSpec.extensions[].kernelRequirements.identity.samlobjectSAML describes the SAML client to register in the tenant's Keycloak realm.
status.profileSpec.extensions[].kernelRequirements.identity.saml.acsUrlstringyesACSURL is the SAML Assertion Consumer Service URL for the auth callback.
status.profileSpec.extensions[].kernelRequirements.identity.saml.entityIdstringyesEntityID is the SAML Service Provider Entity ID registered in Keycloak.
status.profileSpec.extensions[].kernelRequirements.identity.sidecarobjectSidecar signs people in through the platform's sign-in sidecar.
status.profileSpec.extensions[].kernelRequirements.identity.sidecar.appPortinteger (int32)AppPort lets the handler call the app itself inside the cluster: it is the port the app's pods listen on, and the network path is opened to that port of the…
status.profileSpec.extensions[].kernelRequirements.identity.sidecar.databasebooleanDatabase gives the handler the app's own database: where it is and the app's own login to it, as DB_HOST, DB_PORT, DB_NAME, DB_USER and DB_PASSWORD, and the…
status.profileSpec.extensions[].kernelRequirements.identity.sidecar.entryPaths[]stringEntryPaths are paths of the app that lead to the sign-in instead of to the app: its front page, and the address of its own sign-in form.
status.profileSpec.extensions[].kernelRequirements.identity.sidecar.exposurestringExposure names the gateway entry people open the app at: the sidecar's two paths are on that entry's host.
status.profileSpec.extensions[].kernelRequirements.identity.sidecar.secrets[]stringSecrets gives the handler secrets of this app, by the names they have under spec.secrets.generated: each as SECRET_<NAME>, the name in upper case.
status.profileSpec.extensions[].kernelRequirements.llmobjectLLM declares that the component calls language models through the platform's model gateway.
status.profileSpec.extensions[].kernelRequirements.llm.optionalbooleanOptional means the component runs without the gateway.
status.profileSpec.extensions[].kernelRequirements.logDestinationobjectLogDestination declares that the component receives the platform's log forwarder over HTTPS inside the cluster.
status.profileSpec.extensions[].kernelRequirements.logDestination.portinteger (int32)yesPort is the port that Service and its pods serve HTTPS on, the same number on both: it is the pods' port the network admits.
status.profileSpec.extensions[].kernelRequirements.logDestination.servicestringyesService is the name of the component's Service the forwarder is sent to.
status.profileSpec.extensions[].kernelRequirements.mailobjectMail specifies SMTP and/or IMAP requirements.
status.profileSpec.extensions[].kernelRequirements.mail.imapobjectIMAP requests inbound mail (IMAP) credentials.
status.profileSpec.extensions[].kernelRequirements.mail.imap.tokenSignInbooleanTokenSignIn declares that the app opens a person's mailbox with that person's sign-in token (SASL XOAUTH2) instead of an app password.
status.profileSpec.extensions[].kernelRequirements.mail.smtpobjectSMTP requests outbound mail (SMTP submission) credentials.
status.profileSpec.extensions[].kernelRequirements.mcpobjectMCP declares that the component exposes a Model Context Protocol endpoint.
status.profileSpec.extensions[].kernelRequirements.mcp.authstringAuth is the authentication method the endpoint expects.
status.profileSpec.extensions[].kernelRequirements.mcp.enabledbooleanyesEnabled says the component exposes the endpoint.
status.profileSpec.extensions[].kernelRequirements.mcp.endpointstringEndpoint is the HTTP path where the app exposes its MCP server.
status.profileSpec.extensions[].kernelRequirements.partnersobjectPartners declares that the component calls apps of partner realms on a person's behalf, takes such calls, or commissions partners of other tenants.
status.profileSpec.extensions[].kernelRequirements.partners.acceptbooleanAccept says the component takes partners' assertions, turning each into the linked local account by the JWT authorization grant, for every partner the tenant…
status.profileSpec.extensions[].kernelRequirements.partners.call[]stringCall names the tenant's partners the component asks assertions towards (standard token exchange, scope partner-<name>): a person's token in, a token for the…
status.profileSpec.extensions[].kernelRequirements.partners.commissionbooleanCommission says the component asks the director to add receiving partners to the tenants that name it, or to take them away.
status.profileSpec.extensions[].kernelRequirements.partners.serviceAccountstringServiceAccount is the Kubernetes service account the component's pods run as; its token is the client's credential.
status.profileSpec.extensions[].kernelRequirements.rightsobjectRights declares that the component asks the platform whether a person may use an app of its tenant, for a person who is not at a browser.
status.profileSpec.extensions[].kernelRequirements.rights.auditbooleanAudit lets the same key ask three more questions, for a person of the platform tenant: may they audit the cluster (cluster#can_audit), may they configure it…
status.profileSpec.extensions[].kernelRequirements.storageobjectStorage specifies object storage (S3) and/or filesystem (WebDAV) requirements.
status.profileSpec.extensions[].kernelRequirements.storage.filesobjectFiles requests WebDAV access to the tenant's file-storage service.
status.profileSpec.extensions[].kernelRequirements.storage.files.capabilities[]stringCapabilities lists the required access capabilities.
status.profileSpec.extensions[].kernelRequirements.storage.files.protocolstringProtocol is the access protocol.
status.profileSpec.extensions[].kernelRequirements.storage.s3objectS3 requests a per-tenant S3 bucket from the platform's object store.
status.profileSpec.extensions[].kernelRequirements.storage.s3.objectLockbooleanObjectLock makes the bucket with S3 Object Lock, which cannot be switched off again, and lets the app read and set the bucket's default retention…
status.profileSpec.extensions[].kernelRequirements.turnobjectTURN declares that the component's clients relay real-time media through the platform's TURN edge.
status.profileSpec.extensions[].kernelRequirements.vouchingobjectVouching declares that the component obtains tokens of a person who is not at a browser, on the strength of that person's earlier consent: it signs a short…
status.profileSpec.extensions[].kernelRequirements.vouching.director[]stringDirector names what a token the component obtains for a person may do at the platform's own API, beside the apps: plans-read reads the cluster's plans, its…
status.profileSpec.extensions[].kernelRequirements.vouching.keysobjectyesKeys says where the component publishes the keys its statements are signed with, as a JWKS.
status.profileSpec.extensions[].kernelRequirements.vouching.keys.pathstringPath is where the JWKS is served.
status.profileSpec.extensions[].kernelRequirements.vouching.keys.portinteger (int32)yesPort is the Service's port.
status.profileSpec.extensions[].kernelRequirements.vouching.keys.servicestringyesService is the name of the component's Service.
status.profileSpec.extensions[].namestringyesName identifies the sidecar (e.g.
status.profileSpec.extensions[].stableServiceNamestringStableServiceName is the Kubernetes Service name the tenant ingress reconciler routes to (e.g.
status.profileSpec.extensions[].stableServicePortinteger (int32)StableServicePort is the port on StableServiceName.
status.profileSpec.extensions[].valueMappingobjectValueMapping places what the platform granted the sidecar into its chart's values, as package.valueMapping does for the app.
status.profileSpec.extensions[].valueMapping.oidcobjectOIDC maps the sidecar's OIDC client to Helm keys, as the app's own valueMapping.oidc does.
status.profileSpec.extensions[].valueMapping.oidc.clientIdKeystringClientIDKey is the Helm value key for the OIDC client ID.
status.profileSpec.extensions[].valueMapping.oidc.clientSecretKeystringClientSecretKey is the Helm value key for the OIDC client secret.
status.profileSpec.extensions[].valueMapping.oidc.clientSecretOpenbaoPathstringClientSecretOpenbaoPath overrides the default per-tenant OpenBao secret path (gentian-os/tenants/{tenant}/apps/{app}/oidc) for reading the OIDC client secret.
status.profileSpec.extensions[].valueMapping.oidc.clientSecretOpenbaoPropertystringClientSecretOpenbaoProperty overrides the property name within the OpenBao secret (default: "client-secret").
status.profileSpec.extensions[].valueMapping.oidc.issuerKeystringIssuerKey is the Helm value key for the OIDC issuer URL.
status.profileSpec.hooksobjectHooks are lifecycle actions at install, upgrade and resync.
status.profileSpec.hooks.postInstallobjectPostInstall runs once after the component is first ready.
status.profileSpec.hooks.postInstall.envFrom[]stringEnvFrom names Secrets already present in the tenant namespace to inject wholesale (matches how this app's own secrets already land — e.g.…
status.profileSpec.hooks.postInstall.imagestringyesImage is the container image the Job runs.
status.profileSpec.hooks.postInstall.readOnlyPVCobjectReadOnlyPVC optionally mounts an existing PersistentVolumeClaim read-only, for the rare case a bootstrap script needs information only available in the app's…
status.profileSpec.hooks.postInstall.readOnlyPVC.claimNamestringyesClaimName is the PersistentVolumeClaim name in the tenant namespace.
status.profileSpec.hooks.postInstall.readOnlyPVC.mountPathstringyesMountPath is where the claim is mounted read-only in the Job container.
status.profileSpec.hooks.postInstall.scriptstringyesScript is the shell script body, run via /bin/sh -c.
status.profileSpec.hooks.postInstall.serviceAccountNamestringServiceAccountName runs the Job under an existing ServiceAccount in the tenant namespace (e.g.
status.profileSpec.hooks.provisioningobjectProvisioning configures the component through its own API after install and on resync.
status.profileSpec.hooks.provisioning.privilegedRoleobjectPrivilegedRole maps gentian:tenant:<t>:app-admins members to an in-app administrator role (for example the Nextcloud "admin" group).
status.profileSpec.hooks.provisioning.privilegedRole.kindstringyesKind is the application's native role type.
status.profileSpec.hooks.provisioning.privilegedRole.namestringyesName is the in-app role identifier (for example Nextcloud group "admin").
status.profileSpec.hooks.provisioning.syncJobobjectSyncJob is how this app applies PrivilegedRole.
status.profileSpec.hooks.provisioning.syncJob.env[]objectEnv binds individual Secret keys to environment variables.
status.profileSpec.hooks.provisioning.syncJob.env[].namestringyesName of the environment variable.
status.profileSpec.hooks.provisioning.syncJob.env[].secretKeyRefobjectyesSecretKeyRef is the Secret key to read it from.
status.profileSpec.hooks.provisioning.syncJob.env[].secretKeyRef.keystringyes
status.profileSpec.hooks.provisioning.syncJob.env[].secretKeyRef.namestringyes
status.profileSpec.hooks.provisioning.syncJob.envFrom[]stringEnvFrom names Secrets in the tenant namespace whose keys become environment variables.
status.profileSpec.hooks.provisioning.syncJob.imagestringyesImage the script runs in.
status.profileSpec.hooks.provisioning.syncJob.scriptstringyesScript executed with /bin/sh.
status.profileSpec.hooks.provisioning.syncJob.serviceAccountNamestringServiceAccountName runs the Job under an existing ServiceAccount.
status.profileSpec.integrations[]objectIntegrations are opportunistic relationships with peer components.
status.profileSpec.integrations[].capabilities[]stringCapabilities lists the specific capabilities required from the contract.
status.profileSpec.integrations[].contractstringyesContract is the name of the contract to consume.
status.profileSpec.integrations[].providerstringProvider is the expected provider app by profile name.
status.profileSpec.launchstringyesLaunch is how a person reaches this component.
status.profileSpec.packageobjectyesPackage is how the component is deployed.
status.profileSpec.package.addonobjectAddon describes a component the platform does not deploy at all: it flips a switch inside another component's own addon system.
status.profileSpec.package.addon.idstringyesID is what the hosting component's own addon system calls this addon: an Odoo module name, a Nextcloud app id, an XWiki extension.
status.profileSpec.package.addon.ofstringyesOf is the ComponentProfile this addon activates into.
status.profileSpec.package.apiobjectAPI describes a component the platform routes to rather than runs.
status.profileSpec.package.api.baseUrlstringyesBaseURL is the external service origin (e.g.
status.profileSpec.package.api.runtimestringRuntime selects how the tenant reaches the external service.
status.profileSpec.package.api.tenantBindingstringTenantBinding declares how the tenant is identified to the external service.
status.profileSpec.package.api.tileobjectTile puts this entry on the desktop of whoever holds its relation.
status.profileSpec.package.api.tile.descriptionstringDescription is the sentence the portal shows beside the label.
status.profileSpec.package.api.tile.displayNamestringyesDisplayName is the label under the icon.
status.profileSpec.package.api.tile.displayNamesmap[string]stringDisplayNames are translations of DisplayName, keyed by locale ("de_DE", "en_US").
status.profileSpec.package.api.tile.imagestringImage is the profile-relative path the PNG lives at in git, e.g. assets/tile.png.
status.profileSpec.package.api.tile.logostringyesLogo is the tile's default image: a square PNG, 128x128, inline as a data URI.
status.profileSpec.package.api.tile.objectstringObject is what Relation is checked against.
status.profileSpec.package.api.tile.pathstringPath is where within the host the tile leads.
status.profileSpec.package.api.tile.relationstringyesRelation is what the caller must hold, on the object Object names, for the tile to be on their page: a permission of the authorization model…
status.profileSpec.package.chartobjectChart is the Helm chart or OCI artifact.
status.profileSpec.package.chart.namestringyesName is the chart name within the repository.
status.profileSpec.package.chart.repositorystringyesRepository is the OCI repository URL (e.g., oci://registry.example.com/charts).
status.profileSpec.package.chart.versionstringyesVersion is the chart version to deploy.
status.profileSpec.package.compositionstringComposition names a Crossplane composition, for a component that is not a single chart.
status.profileSpec.package.extraValuesobject (free-form)ExtraValues are static chart values.
status.profileSpec.package.images[]objectImages are the private images the component runs, each at the one build it may run.
status.profileSpec.package.images[].digeststringyesDigest is the build.
status.profileSpec.package.images[].repositorystringyesRepository is the image's address without a tag.
status.profileSpec.package.valueMappingobjectValueMapping places what the platform granted into the chart's values.
status.profileSpec.package.valueMapping.cacheobjectCache maps caching backend values to Helm keys.
status.profileSpec.package.valueMapping.cache.hostKeystringHostKey is the Helm value key for the cache host.
status.profileSpec.package.valueMapping.cache.passwordKeystringPasswordKey is the Helm value key for the cache password/ACL token.
status.profileSpec.package.valueMapping.cache.portKeystringPortKey is the Helm value key for the cache port.
status.profileSpec.package.valueMapping.cache.userKeystringUserKey is the Helm value key for the cache ACL username.
status.profileSpec.package.valueMapping.databaseobjectDatabase maps database connection values to Helm keys.
status.profileSpec.package.valueMapping.database.hostKeystring
status.profileSpec.package.valueMapping.database.nameKeystringNameKey is the Helm value key for the database name.
status.profileSpec.package.valueMapping.database.passwordKeystringPasswordKey is the Helm value key for the database password.
status.profileSpec.package.valueMapping.database.portKeystringPortKey is the Helm value key for the database port.
status.profileSpec.package.valueMapping.database.readNameKeystringReadNameKey is the Helm value key for the read-replica database name.
status.profileSpec.package.valueMapping.database.readUserKeystringReadUserKey is the Helm value key for the read-replica database user.
status.profileSpec.package.valueMapping.database.secretNameKeystringHostKey is the Helm value key for the database host.
status.profileSpec.package.valueMapping.database.userKeystringUserKey is the Helm value key for the database user.
status.profileSpec.package.valueMapping.imapobjectIMAP maps mail access values to Helm keys.
status.profileSpec.package.valueMapping.imap.hostKeystringHostKey is the Helm value key for the IMAP host.
status.profileSpec.package.valueMapping.imap.portKeystringPortKey is the Helm value key for the IMAP port.
status.profileSpec.package.valueMapping.integrationsmap[string]objectIntegrations maps optional integration credentials to Helm keys, keyed by the contract name.
status.profileSpec.package.valueMapping.integrations{}.endpointKeystringEndpointKey is the Helm value key for the integration's service endpoint URL.
status.profileSpec.package.valueMapping.integrations{}.passwordKeystringPasswordKey is the Helm value key for the integration password.
status.profileSpec.package.valueMapping.integrations{}.userKeystringUserKey is the Helm value key for the integration username.
status.profileSpec.package.valueMapping.llmobjectLLM maps the model gateway's address and the component's key to Helm keys, for a component that declares requires.services.llm.
status.profileSpec.package.valueMapping.llm.apiKeyKeystringAPIKeyKey is the Helm value key for the key the component presents.
status.profileSpec.package.valueMapping.llm.availableKeystringAvailableKey receives true when the gateway's address and the component's key are delivered, and false while an optional requirement…
status.profileSpec.package.valueMapping.llm.baseUrlKeystringBaseURLKey is the Helm value key for the gateway's OpenAI-compatible base address (it ends in /v1).
status.profileSpec.package.valueMapping.llm.secretNameKeystringSecretNameKey receives the NAME of the Secret the component's model credentials are in (llm-credentials-<component>, in the component's namespace; the key is…
status.profileSpec.package.valueMapping.oidcobjectOIDC maps OIDC provider values to Helm keys.
status.profileSpec.package.valueMapping.oidc.clientIdKeystringClientIDKey is the Helm value key for the OIDC client ID.
status.profileSpec.package.valueMapping.oidc.clientSecretKeystringClientSecretKey is the Helm value key for the OIDC client secret.
status.profileSpec.package.valueMapping.oidc.clientSecretOpenbaoPathstringClientSecretOpenbaoPath overrides the default per-tenant OpenBao secret path (gentian-os/tenants/{tenant}/apps/{app}/oidc) for reading the OIDC client secret.
status.profileSpec.package.valueMapping.oidc.clientSecretOpenbaoPropertystringClientSecretOpenbaoProperty overrides the property name within the OpenBao secret (default: "client-secret").
status.profileSpec.package.valueMapping.oidc.issuerKeystringIssuerKey is the Helm value key for the OIDC issuer URL.
status.profileSpec.package.valueMapping.platformobjectPlatform maps the facts of the cluster a component runs in to Helm keys: which zone it is served in, which realm signs that zone's tokens, where the director…
status.profileSpec.package.valueMapping.platform.audienceKeystringAudienceKey receives the audience the forwarded edge token carries, so a backend can require it rather than accept any token the realm signs.
status.profileSpec.package.valueMapping.platform.clusterKeystringClusterKey receives the id the director knows this cluster by.
status.profileSpec.package.valueMapping.platform.countryKeystringCountryKey receives the tenant's country (spec.country), an ISO 3166-1 alpha-2 code in upper case, and the empty string while the tenant names none.
status.profileSpec.package.valueMapping.platform.custodianUrlKeystringCustodianURLKey receives the custodian's in-cluster URL.
status.profileSpec.package.valueMapping.platform.defaultLanguageKeystringDefaultLanguageKey receives the tenant's own language, as an ISO 639-1 code (AD-15).
status.profileSpec.package.valueMapping.platform.desktopUrlKeystringDesktopURLKey receives the in-cluster address of the API of the desktop in the component's own namespace, from the desktop profile's "api" entry: http://<its…
status.profileSpec.package.valueMapping.platform.directorUrlKeystringDirectorURLKey receives the director's in-cluster URL.
status.profileSpec.package.valueMapping.platform.hostKeystringHostKey receives the host this component answers on in its zone: the host of its first gateway entry, as the operator routes it.
status.profileSpec.package.valueMapping.platform.issuerKeystringIssuerKey receives the zone's OIDC issuer, the realm on the identity provider whose tokens the edge forwards.
status.profileSpec.package.valueMapping.platform.kernelDomainKeystringKernelDomainKey receives the cluster's kernel domain.
status.profileSpec.package.valueMapping.platform.organizationKeystringOrganizationKey receives who the tenant is, as one object: displayName, legalName, country, languages (the first is the tenant's own), currency, timeZone…
status.profileSpec.package.valueMapping.platform.realmKeystringRealmKey receives the name of the zone's realm.
status.profileSpec.package.valueMapping.platform.registrarUrlKeystringRegistrarURLKey receives the registrar's in-cluster URL: where a console relays, with the person's own token, the managing of a tenant's people and groups.
status.profileSpec.package.valueMapping.platform.storeUrlKeystringStoreURLKey receives the base address of the App Store API this cluster names (the Cluster claim's spec.catalogue.storeUrl), and the empty string while the…
status.profileSpec.package.valueMapping.platform.tenantKeystringTenantKey receives the name of the tenant the component runs in.
status.profileSpec.package.valueMapping.platform.tenantUIDKeystringTenantUIDKey receives the tenant's unique id, its metadata.uid: the id the usage statistics report names it by, and the one the store keys its sign-in through…
status.profileSpec.package.valueMapping.platform.timeZoneKeystringTimeZoneKey receives the tenant's time zone (spec.organization.timeZone), an IANA name, for a chart that takes only the zone, such as a TZ variable.
status.profileSpec.package.valueMapping.platform.usherUrlKeystringUsherURLKey receives the usher's in-cluster URL: where a desktop asks, with the person's own token, what that person may open.
status.profileSpec.package.valueMapping.platform.zoneClientIdKeystringZoneClientIDKey receives the client id the edge holds the zone's session with.
status.profileSpec.package.valueMapping.platform.zoneKindKeystringZoneKindKey receives "kernel" for a component served in the kernel zone and "tenant" otherwise.
status.profileSpec.package.valueMapping.s3objectS3 maps object storage values to Helm keys.
status.profileSpec.package.valueMapping.s3.accessKeyKeystringAccessKeyKey is the Helm value key for the S3 access key ID.
status.profileSpec.package.valueMapping.s3.bucketKeystringBucketKey is the Helm value key for the bucket name.
status.profileSpec.package.valueMapping.s3.endpointKeystringEndpointKey is the Helm value key for the S3 endpoint URL.
status.profileSpec.package.valueMapping.s3.regionKeystringRegionKey is the Helm value key for the S3 region.
status.profileSpec.package.valueMapping.s3.secretKeyKeystringSecretKeyKey is the Helm value key for the S3 secret access key.
status.profileSpec.package.valueMapping.smtpobjectSMTP maps mail submission values to Helm keys.
status.profileSpec.package.valueMapping.smtp.hostKeystringHostKey is the Helm value key for the SMTP host.
status.profileSpec.package.valueMapping.smtp.passwordKeystringPasswordKey is the Helm value key for the SMTP password.
status.profileSpec.package.valueMapping.smtp.portKeystringPortKey is the Helm value key for the SMTP port.
status.profileSpec.package.valueMapping.smtp.userKeystringUserKey is the Helm value key for the SMTP username.
status.profileSpec.package.valueMapping.volumesobjectVolumes names where this chart takes extra pod volumes and mounts, for charts that do not use the conventional extraVolumes/extraVolumeMounts.
status.profileSpec.package.valueMapping.volumes.volumeMountsPathstringVolumeMountsPath is the dot-separated values path holding a list of container volume mounts (e.g.
status.profileSpec.package.valueMapping.volumes.volumesPathstringVolumesPath is the dot-separated values path holding a list of pod volumes (e.g.
status.profileSpec.placementobjectPlacement makes this a component the platform places, and says where.
status.profileSpec.placement.tenantsstringyesTenants are the tenants that get the component.
status.profileSpec.placement.whilestringWhile names the condition the placement lasts for; absent, it lasts for the life of each tenant.
status.profileSpec.provides[]objectProvides lists the contracts this component supplies.
status.profileSpec.provides[].endpointobjectEndpoint is where this component answers the contract in the tenant's namespace.
status.profileSpec.provides[].endpoint.pathstringPath is appended to the address the consumer is told, for an API served below the root.
status.profileSpec.provides[].endpoint.portinteger (int32)yesPort is the Service's port, and must be the port the provider's pods listen on: a network policy matches the port a pod listens on, and the way it opens is to…
status.profileSpec.provides[].endpoint.servicestringyesService is the provider's Service, in the namespace it is installed in.
status.profileSpec.provides[].namestringyesName is the contract name (e.g., "file-store", "project-management").
status.profileSpec.provides[].protocolstringProtocol is the technical protocol used (e.g., "http-json", "webdav").
status.profileSpec.requiresobjectRequires is what the platform is obliged to provide before this component may run.
status.profileSpec.requires.platformstringPlatform is the oldest platform version line this build runs on, as a floor: ">=0.5", or "0.5" which means the same.
status.profileSpec.requires.privilegesobjectPrivileges escape the default posture.
status.profileSpec.requires.privileges.apiExtensions[]objectAPIExtensions are resource types the component adds to the cluster's API.
status.profileSpec.requires.privileges.apiExtensions[].definitions[]object (free-form)yesDefinitions are the CustomResourceDefinitions, apiextensions.k8s.io/v1, as they are installed.
status.profileSpec.requires.privileges.apiExtensions[].groupstringyesGroup is the API group every definition is in: the add-on's own, never one of Kubernetes' or the platform's.
status.profileSpec.requires.privileges.apiExtensions[].namestringyesName is what a PrivilegeGrant refers to (apiExtensions/<name>).
status.profileSpec.requires.privileges.apiExtensions[].reasonstringyesReason is what the approver reads.
status.profileSpec.requires.privileges.apiExtensions[].serviceAccountstringyesServiceAccount is the account the component's chart runs its pods under, in the component's namespace: the one that reads the types and writes their status.
status.profileSpec.requires.privileges.clusterRoles[]objectClusterRoles the component's ServiceAccount needs.
status.profileSpec.requires.privileges.clusterRoles[].namestringyesName is the platform's name of the role, and what a PrivilegeGrant refers to (clusterRoles/<name>).
status.profileSpec.requires.privileges.clusterRoles[].reasonstringyesReason is what the approver reads.
status.profileSpec.requires.privileges.clusterRoles[].rules[]objectRules is not used.
status.profileSpec.requires.privileges.clusterRoles[].rules[].apiGroups[]stringAPIGroups is the name of the APIGroup that contains the resources.
status.profileSpec.requires.privileges.clusterRoles[].rules[].nonResourceURLs[]stringNonResourceURLs is a set of partial urls that a user should have access to.
status.profileSpec.requires.privileges.clusterRoles[].rules[].resourceNames[]stringResourceNames is an optional white list of names that the rule applies to.
status.profileSpec.requires.privileges.clusterRoles[].rules[].resources[]stringResources is a list of resources this rule applies to.
status.profileSpec.requires.privileges.clusterRoles[].rules[].verbs[]stringyesVerbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule.
status.profileSpec.requires.privileges.clusterRoles[].serviceAccountstringServiceAccount is the ServiceAccount the component's chart runs its pods under, in the component's namespace.
status.profileSpec.requires.privileges.egress[]objectEgress opens outbound network beyond the tenant baseline.
status.profileSpec.requires.privileges.egress[].namestringyesName is what a PrivilegeGrant refers to.
status.profileSpec.requires.privileges.egress[].reasonstringyesReason is what the approver reads.
status.profileSpec.requires.privileges.egress[].ruleobjectyesRule is the egress to allow.
status.profileSpec.requires.privileges.egress[].rule.ports[]objectports is a list of destination ports for outgoing traffic.
status.profileSpec.requires.privileges.egress[].rule.ports[].endPortinteger (int32)endPort indicates that the range of ports from port to endPort if set, inclusive, should be allowed by the policy.
status.profileSpec.requires.privileges.egress[].rule.ports[].portint-or-stringport represents the port on the given protocol.
status.profileSpec.requires.privileges.egress[].rule.ports[].protocolstringprotocol represents the protocol (TCP, UDP, or SCTP) which traffic must match.
status.profileSpec.requires.privileges.egress[].rule.to[]objectto is a list of destinations for outgoing traffic of pods selected for this rule.
status.profileSpec.requires.privileges.egress[].rule.to[].ipBlockobjectipBlock defines policy on a particular IPBlock.
status.profileSpec.requires.privileges.egress[].rule.to[].ipBlock.cidrstringyescidr is a string representing the IPBlock Valid examples are "192.168.1.0/24" or "2001:db8::/64"
status.profileSpec.requires.privileges.egress[].rule.to[].ipBlock.except[]stringexcept is a slice of CIDRs that should not be included within an IPBlock Valid examples are "192.168.1.0/24" or "2001:db8::/64" Except values will be rejected…
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelectorobjectnamespaceSelector selects namespaces using cluster-scoped labels.
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[]objectmatchExpressions is a list of label selector requirements.
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].keystringyeskey is the label key that the selector applies to.
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].operatorstringyesoperator represents a key's relationship to a set of values.
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelector.matchExpressions[].values[]stringvalues is an array of string values.
status.profileSpec.requires.privileges.egress[].rule.to[].namespaceSelector.matchLabelsmap[string]stringmatchLabels is a map of {key,value} pairs.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelectorobjectpodSelector is a label selector which selects pods.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[]objectmatchExpressions is a list of label selector requirements.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].keystringyeskey is the label key that the selector applies to.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].operatorstringyesoperator represents a key's relationship to a set of values.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelector.matchExpressions[].values[]stringvalues is an array of string values.
status.profileSpec.requires.privileges.egress[].rule.to[].podSelector.matchLabelsmap[string]stringmatchLabels is a map of {key,value} pairs.
status.profileSpec.requires.privileges.podSecurity[]objectPodSecurity waives a named admission policy for a named part of the component.
status.profileSpec.requires.privileges.podSecurity[].namestringyesName is what a PrivilegeGrant refers to.
status.profileSpec.requires.privileges.podSecurity[].policystringyesPolicy is the ClusterPolicy this waives.
status.profileSpec.requires.privileges.podSecurity[].reasonstringyesReason is what the approver reads.
status.profileSpec.requires.privileges.podSecurity[].scopestringyesScope is the container or composition part it is waived for.
status.profileSpec.requires.servicesobjectServices are what the platform must fulfill before this component runs: identity, database, object storage, cache, mail, MCP.
status.profileSpec.requires.services.authorizationobjectAuthorization declares that the component keeps its own relations in an authorization store the platform makes for it.
status.profileSpec.requires.services.authorization.groupsstringGroups "mirror" has the platform keep the tenant realm's group memberships in the store, as tuples group:<realm>/<group name>#member of…
status.profileSpec.requires.services.authorization.modelstringyesModel is the store's authorization model in the OpenFGA DSL ("model / schema 1.1 / type user / ...").
status.profileSpec.requires.services.authorization.tuples[]objectTuples are the store's starting tuples, written by the platform and held to the model when the profile is admitted.
status.profileSpec.requires.services.authorization.tuples[].objectstringyes
status.profileSpec.requires.services.authorization.tuples[].relationstringyes
status.profileSpec.requires.services.authorization.tuples[].userstringyes
status.profileSpec.requires.services.cacheobjectCache specifies a caching backend requirement.
status.profileSpec.requires.services.cache.enginestringEngine selects the caching backend.
status.profileSpec.requires.services.databaseobjectDatabase specifies a relational database requirement.
status.profileSpec.requires.services.database.allowDynamicDatabaseCreationbooleanAllowDynamicDatabaseCreation lets the app create databases of its own at runtime.
status.profileSpec.requires.services.database.connectionLimitinteger (int32)ConnectionLimit is the most connections the app's account may hold at once on the shared server, which every tenant's apps use.
status.profileSpec.requires.services.database.enginestringEngine selects the database engine.
status.profileSpec.requires.services.database.schemaPreferencestringSchemaPreference decides which schema the app's role resolves unqualified table names against first.
status.profileSpec.requires.services.identityobjectIdentity specifies OIDC requirements.
status.profileSpec.requires.services.identity.oidcobjectOIDC describes the OIDC client to register in the tenant's Keycloak realm.
status.profileSpec.requires.services.identity.oidc.accessTypestringAccessType controls whether the client requires a shared secret (CONFIDENTIAL, for server-side apps) or relies on PKCE without a secret (PUBLIC, for SPAs and…
status.profileSpec.requires.services.identity.oidc.audiences[]stringAudiences are names the access tokens of this client carry in aud, beside what Keycloak puts there itself: the name a service the app hands its tokens to…
status.profileSpec.requires.services.identity.oidc.backchannelLogoutobjectBackchannelLogout says where in the app the realm tells it that a person signed out (OpenID Connect Back-Channel Logout).
status.profileSpec.requires.services.identity.oidc.backchannelLogout.exposurestringyesExposure names the entry of this profile (spec.expose) whose backend the path is served by.
status.profileSpec.requires.services.identity.oidc.backchannelLogout.pathstringyesPath is the app's back-channel logout endpoint: a plain path.
status.profileSpec.requires.services.identity.oidc.backchannelLogoutUrlstringBackchannelLogoutURL is withdrawn and refused: declare BackchannelLogout instead.
status.profileSpec.requires.services.identity.oidc.clientIdstringyesClientID is the OIDC client identifier registered in Keycloak.
status.profileSpec.requires.services.identity.oidc.directAccessGrantsEnabledbooleanDirectAccessGrantsEnabled enables the Resource Owner Password Credentials grant (legacy / CLI apps).
status.profileSpec.requires.services.identity.oidc.namestringName is the human-readable display name shown in the Keycloak admin UI.
status.profileSpec.requires.services.identity.oidc.oidcPackRefstringOIDCPackRef selects a pack entry from an OIDCPackCatalog CR when the pack key differs from clientId.
status.profileSpec.requires.services.identity.oidc.postLogoutRedirectUris[]stringPostLogoutRedirectURIs lists the allowed post-logout redirect URIs.
status.profileSpec.requires.services.identity.oidc.redirectUris[]stringRedirectURIs lists the valid OAuth2 redirect URIs for the authorization code flow.
status.profileSpec.requires.services.identity.oidc.requestParameterobjectRequestParameter binds an authorization-request parameter of this client's sign-ins to where the code is delivered, and puts it in the access token: for an…
status.profileSpec.requires.services.identity.oidc.requestParameter.claimstringClaim is the access-token claim the value is put in.
status.profileSpec.requires.services.identity.oidc.requestParameter.namestringyesName is the parameter, as the app sends it on the authorization request.
status.profileSpec.requires.services.identity.oidc.requestParameter.patternstringyesPattern is what the value must be, matched as a whole.
status.profileSpec.requires.services.identity.oidc.requestParameter.redirectUristringyesRedirectURI is the one address a code for the request is delivered to: https, with at least one ${group} for a named group of the pattern's match, and no…
status.profileSpec.requires.services.identity.samlobjectSAML describes the SAML client to register in the tenant's Keycloak realm.
status.profileSpec.requires.services.identity.saml.acsUrlstringyesACSURL is the SAML Assertion Consumer Service URL for the auth callback.
status.profileSpec.requires.services.identity.saml.entityIdstringyesEntityID is the SAML Service Provider Entity ID registered in Keycloak.
status.profileSpec.requires.services.identity.sidecarobjectSidecar signs people in through the platform's sign-in sidecar.
status.profileSpec.requires.services.identity.sidecar.appPortinteger (int32)AppPort lets the handler call the app itself inside the cluster: it is the port the app's pods listen on, and the network path is opened to that port of the…
status.profileSpec.requires.services.identity.sidecar.databasebooleanDatabase gives the handler the app's own database: where it is and the app's own login to it, as DB_HOST, DB_PORT, DB_NAME, DB_USER and DB_PASSWORD, and the…
status.profileSpec.requires.services.identity.sidecar.entryPaths[]stringEntryPaths are paths of the app that lead to the sign-in instead of to the app: its front page, and the address of its own sign-in form.
status.profileSpec.requires.services.identity.sidecar.exposurestringExposure names the gateway entry people open the app at: the sidecar's two paths are on that entry's host.
status.profileSpec.requires.services.identity.sidecar.secrets[]stringSecrets gives the handler secrets of this app, by the names they have under spec.secrets.generated: each as SECRET_<NAME>, the name in upper case.
status.profileSpec.requires.services.llmobjectLLM declares that the component calls language models through the platform's model gateway.
status.profileSpec.requires.services.llm.optionalbooleanOptional means the component runs without the gateway.
status.profileSpec.requires.services.logDestinationobjectLogDestination declares that the component receives the platform's log forwarder over HTTPS inside the cluster.
status.profileSpec.requires.services.logDestination.portinteger (int32)yesPort is the port that Service and its pods serve HTTPS on, the same number on both: it is the pods' port the network admits.
status.profileSpec.requires.services.logDestination.servicestringyesService is the name of the component's Service the forwarder is sent to.
status.profileSpec.requires.services.mailobjectMail specifies SMTP and/or IMAP requirements.
status.profileSpec.requires.services.mail.imapobjectIMAP requests inbound mail (IMAP) credentials.
status.profileSpec.requires.services.mail.imap.tokenSignInbooleanTokenSignIn declares that the app opens a person's mailbox with that person's sign-in token (SASL XOAUTH2) instead of an app password.
status.profileSpec.requires.services.mail.smtpobjectSMTP requests outbound mail (SMTP submission) credentials.
status.profileSpec.requires.services.mcpobjectMCP declares that the component exposes a Model Context Protocol endpoint.
status.profileSpec.requires.services.mcp.authstringAuth is the authentication method the endpoint expects.
status.profileSpec.requires.services.mcp.enabledbooleanyesEnabled says the component exposes the endpoint.
status.profileSpec.requires.services.mcp.endpointstringEndpoint is the HTTP path where the app exposes its MCP server.
status.profileSpec.requires.services.partnersobjectPartners declares that the component calls apps of partner realms on a person's behalf, takes such calls, or commissions partners of other tenants.
status.profileSpec.requires.services.partners.acceptbooleanAccept says the component takes partners' assertions, turning each into the linked local account by the JWT authorization grant, for every partner the tenant…
status.profileSpec.requires.services.partners.call[]stringCall names the tenant's partners the component asks assertions towards (standard token exchange, scope partner-<name>): a person's token in, a token for the…
status.profileSpec.requires.services.partners.commissionbooleanCommission says the component asks the director to add receiving partners to the tenants that name it, or to take them away.
status.profileSpec.requires.services.partners.serviceAccountstringServiceAccount is the Kubernetes service account the component's pods run as; its token is the client's credential.
status.profileSpec.requires.services.rightsobjectRights declares that the component asks the platform whether a person may use an app of its tenant, for a person who is not at a browser.
status.profileSpec.requires.services.rights.auditbooleanAudit lets the same key ask three more questions, for a person of the platform tenant: may they audit the cluster (cluster#can_audit), may they configure it…
status.profileSpec.requires.services.storageobjectStorage specifies object storage (S3) and/or filesystem (WebDAV) requirements.
status.profileSpec.requires.services.storage.filesobjectFiles requests WebDAV access to the tenant's file-storage service.
status.profileSpec.requires.services.storage.files.capabilities[]stringCapabilities lists the required access capabilities.
status.profileSpec.requires.services.storage.files.protocolstringProtocol is the access protocol.
status.profileSpec.requires.services.storage.s3objectS3 requests a per-tenant S3 bucket from the platform's object store.
status.profileSpec.requires.services.storage.s3.objectLockbooleanObjectLock makes the bucket with S3 Object Lock, which cannot be switched off again, and lets the app read and set the bucket's default retention…
status.profileSpec.requires.services.turnobjectTURN declares that the component's clients relay real-time media through the platform's TURN edge.
status.profileSpec.requires.services.vouchingobjectVouching declares that the component obtains tokens of a person who is not at a browser, on the strength of that person's earlier consent: it signs a short…
status.profileSpec.requires.services.vouching.director[]stringDirector names what a token the component obtains for a person may do at the platform's own API, beside the apps: plans-read reads the cluster's plans, its…
status.profileSpec.requires.services.vouching.keysobjectyesKeys says where the component publishes the keys its statements are signed with, as a JWKS.
status.profileSpec.requires.services.vouching.keys.pathstringPath is where the JWKS is served.
status.profileSpec.requires.services.vouching.keys.portinteger (int32)yesPort is the Service's port.
status.profileSpec.requires.services.vouching.keys.servicestringyesService is the name of the component's Service.
status.profileSpec.secretsobjectSecrets are values the platform generates and holds that have no external counterparty.
status.profileSpec.secrets.derived[]objectDerived secrets are keys the platform adds to the credentials Secret it manages for the component, under the names given.
status.profileSpec.secrets.derived[].keystringyesKey is the Secret key, and therefore the environment variable name when the app consumes the Secret with envFrom (e.g.
status.profileSpec.secrets.generated[]objectGenerated secrets are random, created once and held in the vault.
status.profileSpec.secrets.generated[].namestringyesName is the logical identifier for this secret (e.g., "admin_password").
status.profileSpec.secrets.generated[].valuePathstringyesValuePath is the dot-notation (or bracket-notation) Helm value key that should receive the generated secret value.
status.profileSpec.secrets.supplied[]objectSupplied secrets are credentials only a person can provide.
status.profileSpec.secrets.supplied[].descriptionstringDescription says what the credential is for and where to obtain it, for a tenant administrator who did not write the profile.
status.profileSpec.secrets.supplied[].displayNamestringyesDisplayName is the label the form renders.
status.profileSpec.secrets.supplied[].fields[]objectyesFields are the values the form collects, set together.
status.profileSpec.secrets.supplied[].fields[].examplestringExample is a non-secret illustration of the expected shape.
status.profileSpec.secrets.supplied[].fields[].formatstringFormat hints at how the form renders and checks the field.
status.profileSpec.secrets.supplied[].fields[].keystringyesKey is the property's name at the vault path and in the form.
status.profileSpec.secrets.supplied[].fields[].publicbooleanPublic marks a value that is not secret -- a publishable key, an account id -- which the form then shows as typed.
status.profileSpec.secrets.supplied[].fields[].valuePathstringyesValuePath is the Helm value key that receives the value, as for a generated secret.
status.profileSpec.secrets.supplied[].namestringyesName identifies the credential within the app: the last part of its vault path and of the requirement's name, app-{tenant}-{app}-{name}.
status.profileSpec.sessionMaxAgestringSessionMaxAge caps, at the realm, how long a sign-in through the app's own OIDC clients lasts: the operator sets it as the clients' session lifespan, and past…
status.profileSpec.trustTierstringyesTrustTier is the review level of this entry.
status.profileSpec.versionstringyesVersion is the catalog entry's version, not the upstream project's.

17. ResourcePlan​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralresourceplans
Short namesrplan, rplans

ResourcePlan is a named preset of tenant resource limits. It is deliberately not deployable. Nothing reconciles a ResourcePlan and it owns no namespace, workload or quota of its own: it exists so that a tenant's ceiling is chosen from a catalog rather than typed. Selecting one writes its quantities into that tenant's spec.quotas — see docs/concepts/resource-plans.md. Why a catalog at all, when Tenant.spec.quotas already accepts any quantity: a quota that can be any number can be any number that was never sold. The plan is the unit the platform prices, meters and invoices, so the write path accepts a plan name and nothing else, and every tenant's ceiling is at all times one of a known, priced set. Free-form quantities remain available to whoever edits the deployments repository by hand, which is the cluster operator, which is the person entitled to make an unpriced choice. This mirrors the role AppPackage plays for addons: a curated preset that replaces a combinatorial choice with a named one, without becoming an artifact of its own.

FieldTypeRequiredDescription
specobjectResourcePlanSpec is the desired state of a ResourcePlan.
spec.defaultbooleanDefault marks the plan a tenant is assumed to be on when its quotas match no plan in the catalog and none has been selected.
spec.descriptionstringDescription explains what the plan is for, in one or two sentences.
spec.displayNamestringyesDisplayName is the name shown in the Admin Console (e.g.
spec.productSkustringProductSku identifies this plan to the commerce backend.
spec.quotasobjectyesQuotas are the limits a tenant on this plan receives.
spec.quotas.cpuint-or-stringCPU caps the sum of container CPU limits in the namespace.
spec.quotas.maxAppsinteger (int32)MaxApps is the maximum number of apps this tenant may install.
spec.quotas.maxPodsinteger (int32)MaxPods caps the number of pods in the tenant namespace (init Jobs + app workloads).
spec.quotas.memoryint-or-stringMemory caps the sum of container memory limits in the namespace.
spec.quotas.requestsCpuint-or-stringRequestsCPU caps the sum of container CPU requests in the namespace.
spec.quotas.requestsMemoryint-or-stringRequestsMemory caps the sum of container memory requests in the namespace — reserved capacity, priced, as RequestsCPU is.
spec.quotas.storageint-or-stringStorage is the total storage quota (PVCs + S3 buckets).
spec.retiredbooleanRetired withholds the plan from every new choice and keeps it for the tenants already on it.
spec.tierinteger (int32)yesTier orders plans from smallest to largest.
spec.unitsinteger (int32)Units is how many node units the plan is, for a commerce backend that sells a number of nodes rather than a named plan: it moves a tenant to the plan whose…
statusobjectResourcePlanStatus reports observed plan state.

18. Tenant​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluraltenants
Short namestenant, tenants

Tenant is the Schema for the tenants API. Tenant is cluster-scoped and represents a customer organization. Creating a Tenant CR triggers the orchestrator's full provisioning pipeline: namespace creation, Keycloak realm, per-app databases/buckets/cache, and ArgoCD Application (or Crossplane App claim) CRs for each requested app.

FieldTypeRequiredDescription
specobject
spec.adminobjectAdmin is how the tenant's administrator account is handed over.
spec.admin.requireMFAbooleanRequireMFA makes enrolling a second factor part of activating the account.
spec.apps[]objectApps lists the applications to install for this tenant.
spec.apps[].addonGrants[]objectAddonGrants says which addons of this app every member of the tenant has access to by default.
spec.apps[].addonGrants[].defaultGrantbooleanDefaultGrant says every member of the tenant has access to this addon by default, as an app's defaultGrant does for the app.
spec.apps[].addonGrants[].namestringyesName is the addon's profile name, as addons lists it.
spec.apps[].addonPins[]objectAddonPins pins addons of this app to the build each was installed from, like digest and catalog do for the app itself.
spec.apps[].addonPins[].cataloguestringCatalogue is the catalog the pinned build was fetched from: the first half of its coordinate, <catalogue>/<name>.
spec.apps[].addonPins[].digeststringyesDigest pins the addon's profile bundle: the build the install asked for.
spec.apps[].addonPins[].namestringyesName is the addon's profile name, as addons lists it.
spec.apps[].addons[]stringAddons lists the addon profiles activated inside this app for this tenant — customization-ladder rung L3.
spec.apps[].cataloguestringCatalogue is the catalog the pinned build was fetched from: the first half of its coordinate, <catalogue>/<profile>.
spec.apps[].configobjectConfig provides per-tenant overrides for this app installation.
spec.apps[].config.dropIns[]objectDropIns supply tenant-authored files into drop-in directories the target ComponentProfile declares as tenantEditable.
spec.apps[].config.dropIns[].filesmap[string]stringyesFiles maps filename to content.
spec.apps[].config.dropIns[].namestringyesName must match a ComponentProfile.spec.customization.dropIns[].name entry that sets tenantEditable: true.
spec.apps[].config.extraValuesobject (free-form)ExtraValues deep-merges Helm values over the profile's defaults.
spec.apps[].config.replicasinteger (int32)Replicas overrides the default replica count.
spec.apps[].defaultGrantbooleanDefaultGrant says every member of the tenant has access to this app by default.
spec.apps[].digeststringDigest pins the profile bundle this app was installed from: the build the install asked for.
spec.apps[].movedAtstringMovedAt is when the pin was last moved to another build, RFC 3339, and MovedBy who or what moved it: a person's id, or the policy that did ("policy:latest").
spec.apps[].movedBystring
spec.apps[].placedbooleanPlaced says the platform put this app here, because its profile is placeable (ComponentProfile spec.placement).
spec.apps[].profilestringProfile is the name of the ComponentProfile to install.
spec.apps[].profileRefobjectProfileRef selects a ComponentProfile by catalog identity (family, version, edition, offering tier).
spec.apps[].profileRef.identityobjectIdentity selects a profile by catalog tuple when Name is empty.
spec.apps[].profileRef.identity.catalogueVersionstringyesCatalogueVersion is the semver of this catalog entry.
spec.apps[].profileRef.identity.editionstringEdition selects the edition (ce, me, ie, pe, ee).
spec.apps[].profileRef.identity.familystringyesFamily is the stable logical application id (e.g.
spec.apps[].profileRef.namestringName is the ComponentProfile metadata.name.
spec.apps[].updateModestringUpdateMode overrides, for this tenant and this app, how the app moves to newer builds: latest (the platform moves it), manual (the cluster's administrator…
spec.catalogueobjectCatalogue is where this tenant may install from beside the catalogs the whole cluster offers: the catalogs only this tenant sees, and whether its own…
spec.catalogue.delegatedbooleanDelegated says the tenant's own administrators may add and remove catalogs for this tenant.
spec.catalogue.sources[]objectSources are the catalogs only this tenant sees.
spec.catalogue.sources[].addedBystringAddedBy says who added it: the cluster's administrator, or the tenant's own under delegation.
spec.catalogue.sources[].namestringyesName is the catalog's name: the first half of a coordinate, <name>/<app>.
spec.catalogue.sources[].ociobjectOCI is an OCI artifact the catalog is kept as, in place of an address: read with the credential of a repository declared for this tenant, and with no other.
spec.catalogue.sources[].oci.artifactstringyesArtifact is the reference, without a scheme: <registry host>/<repository>:<tag>, or @sha256:<digest> in place of or after the tag.
spec.catalogue.sources[].oci.repositorystringyesRepository is the name of the repository whose credential the artifact is read with: one declared for the tenant, for a tenant's catalog; one declared for the…
spec.catalogue.sources[].urlstringURL is the https address the catalog is served from.
spec.countrystringCountry is the country the tenant is in, as an ISO 3166-1 alpha-2 code in upper case (CH, DE).
spec.deletionobjectDeletion refines what a Delete leaves behind.
spec.deletion.keepBundlesbooleanKeepBundles keeps the tenant's backup bucket and the bundles in it when everything else is deleted: the offboarding case, where the tenant was handed a copy…
spec.deletionPolicystringDeletionPolicy controls behavior when the Tenant CR is deleted.
spec.displayNamestringyesDisplayName is a human-readable name for this tenant/organization.
spec.exposures[]objectExposures are the perimeter surfaces a perimeter approver published (AD-6): what this tenant has on the internet, from when, until when, and who said so.
spec.exposures[].aliasstringAlias is a second address for this surface, directly under the cluster's own domain: the one label of <alias>.<kernelDomain>.
spec.exposures[].aliasSetAtstring (date-time)
spec.exposures[].aliasSetBystringAliasSetBy is the subject that set the alias, and AliasSetAt when.
spec.exposures[].apexbooleanApex is the approver saying that this surface is for the cluster's main address: the bare domain.
spec.exposures[].apexAcknowledgedAtstring (date-time)
spec.exposures[].apexAcknowledgedBystringApexAcknowledgedBy is the subject that acknowledged the rule for a website on the main address, and ApexAcknowledgedAt when: only a site whose scripts the…
spec.exposures[].expiresAtstring (date-time)ExpiresAt is when it stops answering, for a surface published for a while.
spec.exposures[].exposureNamestringyesExposureName names an entry of that component's profile that asks for approval: one whose surface is perimeter, or one behind sign-in that declares the…
spec.exposures[].installstringyesInstall names the Component this publishes from.
spec.exposures[].kindstringKind is what was approved, set by the director from what the profile's entry declared when the approver said yes: a public address, a public address that…
spec.exposures[].lastReviewedAtstring (date-time)
spec.exposures[].lastReviewedBystringLastReviewedBy is the subject that last confirmed this should stay public, and LastReviewedAt when.
spec.exposures[].ownerstringyesOwner is the subject that published it, set by the director from the caller's token.
spec.exposures[].publishedAtstring (date-time)PublishedAt is when it was first published.
spec.exposures[].reasonstringReason is why this is public, in the approver's words.
spec.exposures[].reviewAtstring (date-time)yesReviewAt is when the owner and the approver look at it again.
spec.grants[]objectGrants are what each app of the tenant may consume from the others, and which of them may consume from it, as the tenant's administrators granted it…
spec.grants[].allowConsumers[]objectAllowConsumers controls which other installed apps may invoke this app's provides contracts.
spec.grants[].allowConsumers[].appstringyesApp is the consumer ComponentProfile name.
spec.grants[].allowConsumers[].contractstringyesContract matches ComponentProfile.spec.provides[].name.
spec.grants[].allowConsumers[].scope[]stringyesScope lists approved capability strings for the consumer.
spec.grants[].appstringyesApp is the installed ComponentProfile name (matches Tenant.spec.apps[].profile).
spec.grants[].consume[]objectConsume lists contract capabilities this app may use from providers in the tenant.
spec.grants[].consume[].contractstringyesContract matches IntegrationBinding.spec.contract.
spec.grants[].consume[].granted[]stringyesGranted lists approved capability strings (subset of the binding declaration).
spec.grants[].grantedAtstring (date-time)GrantedAt is when.
spec.grants[].grantedBystringGrantedBy is the Keycloak subject who granted it, set by the director from the caller's token, never supplied by a caller.
spec.grants[].reasonstringReason in the granter's words, where they gave one.
spec.groups[]objectGroups are groups of the tenant's realm declared in git; see TenantGroup.
spec.groups[].namestringyesName is the group's name in the realm.
spec.isolationobjectIsolation describes the workload isolation boundaries for this tenant.
spec.isolation.databasePrefixstringDatabasePrefix is the prefix for all database names belonging to this tenant.
spec.isolation.keycloakRealmstringKeycloakRealm is the Keycloak realm name for this tenant.
spec.isolation.modestringMode selects the isolation strategy.
spec.isolation.namespacestringNamespace overrides the target namespace name.
spec.isolation.s3PrefixstringS3Prefix is the prefix for all S3 bucket names belonging to this tenant.
spec.locales[]stringLocales are the languages this tenant's realm renders its login and account pages in, as ISO 639-1 codes (AD-15).
spec.mailobjectMail configures the mail mode and settings for this tenant.
spec.mail.modestringMode selects the mail delivery strategy.
spec.mail.smtpCredentialsSecretstringSmtpCredentialsSecret is the name of an existing Kubernetes Secret in the kernel namespace that contains SMTP relay credentials for external mail delivery.
spec.organizationobjectOrganization is who the tenant is: the facts an app needs to set itself up for this organization rather than a placeholder (its company, its currency, its…
spec.organization.addressobjectAddress is where the organization is.
spec.organization.address.citystringCity is the city or town.
spec.organization.address.postalCodestringPostalCode is the postal code.
spec.organization.address.regionstringRegion is the state, canton or province, where the address has one.
spec.organization.address.streetstringStreet is the street and number, a line per line of the address.
spec.organization.currencystringCurrency is the organization's currency, ISO 4217 (CHF, EUR).
spec.organization.emailstringEmail is the organization's contact address.
spec.organization.fiscalYearStartMonthinteger (int32)FiscalYearStartMonth is the month the organization's fiscal year begins in, 1 to 12.
spec.organization.legalNamestringLegalName is the name the organization is registered under (Example AG), beside the tenant's display name, which is what its people call it.
spec.organization.phonestringPhone is the organization's phone number, preferably international (+41 44 123 45 67).
spec.organization.registrationNumberstringRegistrationNumber is its number in the commercial register (CHE-123.456.789, HRB 12345).
spec.organization.taxIdstringTaxID is the organization's VAT number (CHE-123.456.789 MWST, DE123456789).
spec.organization.timeZonestringTimeZone is the organization's time zone, an IANA name (Europe/Zurich).
spec.organization.websitestringWebsite is the organization's public site, an http(s) address.
spec.partnerCommissioners[]objectPartnerCommissioners are the components, of this tenant or another, that may ask the director to add a receiving partner (accept only) or take one away.
spec.partnerCommissioners[].profilestringyesProfile is the profile it runs.
spec.partnerCommissioners[].tenantstringyesTenant is the tenant the component runs in.
spec.partners[]objectPartners are realms outside this tenant it has a relation with; see TenantPartner.
spec.partners[].acceptobjectAccept lets the partner's people arrive here: the identity provider partner-<name>, with the JWT authorization grant.
spec.partners[].accept.accountsstringyesAccounts is what a first arrival becomes; see PartnerAccounts.
spec.partners[].accept.displayNamestringDisplayName is the organization's name as people read it (organization only).
spec.partners[].accept.domainstringDomain is the organization's domain (organization only): the domain of its people's addresses.
spec.partners[].asstringAs is the name the partner gives this realm: its broker endpoint for this realm is <issuer>/broker/partner-<as>/endpoint, the one address the partner client…
spec.partners[].issuebooleanIssue lets this tenant's people sign in at the partner and its apps ask for assertions towards it: the partner client (client ID = Issuer) and the scope…
spec.partners[].issuerstringyesIssuer is the partner's realm, https://<host>/<path to the realm>.
spec.partners[].namestringyesName is the partner's name here: the realm's scope and identity provider for it are partner-<name>.
spec.platformAccessobjectPlatformAccess is what the tenant opens to the platform's own people beyond the director: whether the platform's administrators may sign in to the tenant.
spec.platformAccess.adminsEnterbooleanAdminsEnter says the members of the platform's administrators' group may sign in to this tenant, through the kernel realm, and hold its admins group for as…
spec.privileges[]objectPrivileges are the privilege requests a person granted for this tenant's components (AD-5).
spec.privileges[].approvedAtstring (date-time)yes
spec.privileges[].approverstringyesApprover is the Keycloak subject who said yes, set by the director from the caller's token.
spec.privileges[].digeststringDigest pins an apiExtensions grant to the definitions it approved: sha256 of the request as the approver read it (security.APIExtensionDigest).
spec.privileges[].expiresAtstring (date-time)ExpiresAt bounds the grant.
spec.privileges[].installstringyesInstall names the Component this grant is for, which is the component's object name in the tenant's namespace.
spec.privileges[].privilegestringyesPrivilege names one entry of the profile's request, as <kind>/<name>.
spec.privileges[].reasonstringyesReason in the approver's words, not the profile's.
spec.quotasobjectQuotas sets resource limits for this tenant.
spec.quotas.cpuint-or-stringCPU caps the sum of container CPU limits in the namespace.
spec.quotas.maxAppsinteger (int32)MaxApps is the maximum number of apps this tenant may install.
spec.quotas.maxPodsinteger (int32)MaxPods caps the number of pods in the tenant namespace (init Jobs + app workloads).
spec.quotas.memoryint-or-stringMemory caps the sum of container memory limits in the namespace.
spec.quotas.requestsCpuint-or-stringRequestsCPU caps the sum of container CPU requests in the namespace.
spec.quotas.requestsMemoryint-or-stringRequestsMemory caps the sum of container memory requests in the namespace — reserved capacity, priced, as RequestsCPU is.
spec.quotas.storageint-or-stringStorage is the total storage quota (PVCs + S3 buckets).
spec.securityobjectSecurity is the realm policy this tenant runs under: how strong a password has to be, how long a session lasts, what happens after repeated failures.
spec.security.bruteForceobjectBruteForce is what happens after repeated failures.
spec.security.bruteForce.enabledbooleanEnabled turns detection on.
spec.security.bruteForce.lockoutDurationSecondsinteger (int32)LockoutDurationSeconds is how long a lockout lasts.
spec.security.bruteForce.maxLoginFailuresinteger (int32)MaxLoginFailures before the account is locked out.
spec.security.passwordobjectPassword is how strong a password must be.
spec.security.password.historyCountinteger (int32)HistoryCount refuses a password the person has used in their last N.
spec.security.password.maxAgeDaysinteger (int32)MaxAgeDays forces a change after that many days.
spec.security.password.minLengthinteger (int32)MinLength is the shortest password accepted.
spec.security.password.requireDigitsbooleanRequireDigits, RequireLowercase, RequireUppercase and RequireSpecialChars each demand at least one of that kind.
spec.security.password.requireLowercaseboolean
spec.security.password.requireSpecialCharsboolean
spec.security.password.requireUppercaseboolean
spec.security.sessionobjectSession is how long one lasts.
spec.security.session.idleMinutesinteger (int32)IdleMinutes ends a session that has done nothing for this long.
spec.security.session.maxHoursinteger (int32)MaxHours ends it regardless of activity.
spec.security.session.rememberMebooleanRememberMe offers the longer session the realm is configured for.
spec.signInFrom[]objectSignInFrom are other tenants of this cluster whose people sign in here; see TenantSignInFrom.
spec.signInFrom[].groups[]stringGroups are the groups of this tenant its people are in: a name of spec.groups, or members (the tenant's members, who may enter it).
spec.signInFrom[].tenantstringyesTenant is the other tenant.
spec.signInTo[]stringSignInTo are other tenants of this cluster this tenant's people may sign in to with their account here: this tenant's half of the other's spec.signInFrom.
spec.signUpobjectSignUp is whether people make their own accounts in the realm.
spec.signUp.enabledbooleanEnabled opens the realm's registration page: anybody on the internet may make an account, with an e-mail address as the login, a message to that address to…
spec.signUp.homestringHome is where the people of such a tenant are sent instead of its desktop: the page of the app they made their account for, e.g. a website's account page.
spec.storeTermsobjectStoreTerms records that the tenant accepted the App Store's terms: which version, and when.
spec.storeTerms.acceptedAtstring (date-time)yesAcceptedAt is when they were accepted.
spec.storeTerms.versionstringyesVersion is the version of the terms the store named when they were accepted.
statusobjectTenantStatus holds the observed state of a Tenant.
status.adminEmailstringAdminEmail is the resolved contact address for this tenant, and the administrator's login: admin@<effectiveDomain>.
status.appCountintegerAppCount is the total number of apps requested in spec.
status.conditions[]objectConditions provides detailed status conditions using the standard metav1.Condition type.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.defaultGrantedApps[]stringDefaultGrantedApps lists the apps whose default grant (spec.apps[].defaultGrant) has been applied: the tenant's members at that moment were added to the app's…
status.domainstringDomain is the custom domain a TenantDomain binds this tenant to, copied here by the operator so every consumer of EffectiveDomain reads it from the tenant…
status.mailobjectMail holds the observed DNS record data produced by the mail reconciler.
status.mail.dkimPublicKeystringDKIMPublicKey is the RSA public key for DKIM signing, base64-encoded (PKIX DER).
status.mail.dmarcRecordstringDMARCRecord is the suggested DMARC TXT record value for _dmarc.<mail domain>.
status.mail.spfRecordstringSPFRecord is the suggested SPF TXT record value for the mail domain.
status.mailboxDomainstringMailboxDomain is the domain this tenant's people have mailboxes under on the cluster's own mail server.
status.namespacestringNamespace is the resolved tenant namespace name.
status.observedGenerationinteger (int64)ObservedGeneration is the last processed generation of the spec.
status.phasestringPhase summarizes the overall lifecycle state.
status.provisionedApps[]stringProvisionedApps lists apps that have been successfully provisioned.
status.readyAppsintegerReadyApps is the number of apps that have been successfully provisioned.
status.resourcePlanstringResourcePlan is the plan whose selection was last recorded in the tenant's usage history: the value of the resource-plan annotation at the time the plan event…

19. TenantDomain​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluraltenantdomains
Short namestdomain

TenantDomain moves the tenant it is named after to spec.domain. It is not a field on the Tenant: a custom domain is a separate decision with its own author, written beside the tenant's manifest by the director (PUT /v1/clusters/{c}/tenants/{t}/domain, can_configure) and shown in a console that offers it. The operator copies the domain to the Tenant's status.domain, which is what every consumer reads.

FieldTypeRequiredDescription
specobjectTenantDomainSpec binds a tenant to a custom domain.
spec.domainstringyesDomain is where the tenant is served instead of <tenant>.<kernelDomain>: its zone, its hosts, its mail and its people's logins all move to it.

20. TenantExport​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluraltenantexports
Short namestexp, export

TenantExport captures one tenant's data into an encrypted bundle.

FieldTypeRequiredDescription
specobjectTenantExportSpec requests a point-in-time capture of one tenant's data.
spec.apps[]stringApps limits the export to these installed profile names.
spec.destinationobjectDestination overrides where this one bundle is written.
spec.destination.addressingStylestringAddressingStyle is how a bucket is named in a request to Endpoint: path (the default when empty) or virtualHost (BackupDestination).
spec.destination.bucketstringBucket holds the bundle.
spec.destination.credentialSecretRefstringCredentialSecretRef names a Secret in the tenant's namespace holding accessKey and secretKey for this endpoint.
spec.destination.credentialSourcestringCredentialSource decides where mode: custom gets its keys.
spec.destination.endpointstringEndpoint is the S3 API URL for mode: custom, e.g. https://sos-ch-dk-2.exo.io.
spec.destination.modestringMode selects between the policy's answer, the platform's own storage, an endpoint named here, and one of the tenant's own stores.
spec.destination.regionstringRegion, for providers that require one — Exoscale SOS and AWS do, the platform's own object store does not.
spec.destination.sourcestringSource names the tenant's store for mode: source, by the BundleSource's name (<tenant>.<label>).
spec.encryptionobjectEncryption selects how the bundle is protected.
spec.encryption.modestringMode selects the protection.
spec.encryption.passphraseSecretRefobjectPassphraseSecretRef names a Secret in this tenant's namespace holding the passphrase, used with mode: passphrase.
spec.encryption.passphraseSecretRef.keystringKey defaults to "passphrase".
spec.encryption.passphraseSecretRef.namestringyes
spec.encryption.recipients[]stringRecipients are age public keys (age1…) to encrypt to, used with mode: recipient.
spec.ttlSecondsinteger (int64)TTLSeconds is how long the bundle should be kept before it may be collected.
statusobjectTenantExportStatus reports progress, and carries the state needed to undo a half-finished export after a controller restart.
status.apps[]objectApps reports per-app progress, including the window each app was paused for.
status.apps[].artefacts[]objectArtefacts lists each artifact captured for this app, or planned to be restored for it: what the bundle's manifest says the bundle holds.
status.apps[].artefacts[].claimobjectClaim is the volume claim a volume was captured from, as far as making it again takes.
status.apps[].artefacts[].claim.accessModes[]stringAccessModes are the claim's.
status.apps[].artefacts[].claim.annotationsmap[string]string
status.apps[].artefacts[].claim.labelsmap[string]stringLabels and Annotations are the ones that say whose the claim is: the release it records is how the next install and a purge find it.
status.apps[].artefacts[].claim.sizestringyesSize is the storage the claim asked for.
status.apps[].artefacts[].claim.storageClassstringStorageClass is the class the claim named, empty for the default.
status.apps[].artefacts[].databases[]stringDatabases are, for an archive of the databases an app made itself (postgresOwned, mariadbOwned), each database it held as "<name in the bundle>=<name here>"…
status.apps[].artefacts[].kindstringyesKind is postgres, postgresOwned, mariadb, mariadbOwned, s3, volume or secrets; for what is the tenant's own also identity, mailboxes or rights.
status.apps[].artefacts[].namestringyesName is what the artifact was captured from: the database, bucket or volume claim, by its name in the tenant the bundle was taken of; for secrets, the app.
status.apps[].artefacts[].pathstringPath is the artifact's place in the bundle.
status.apps[].artefacts[].releasestringRelease is the Helm release a captured volume claim recorded.
status.apps[].artefacts[].targetstringTarget is where a restore puts the artifact: the database, bucket or claim of that kind in the tenant being restored into, which is named differently when the…
status.apps[].attemptsinteger (int32)Attempts counts capture Jobs run for this app.
status.apps[].authorizationobjectAuthorization says what was done with the app's authorization store: how many tuples an export put into the bundle, and when a restore put them back into a…
status.apps[].authorization.restoredAtstring (date-time)RestoredAt is when a restore put the store back.
status.apps[].authorization.tuplesinteger (int32)Tuples is how many tuples the bundle holds of the store.
status.apps[].chartVersionstringChartVersion records the chart the app was running when captured.
status.apps[].completedUnits[]stringCompletedUnits records each capture Job that finished, by Job name.
status.apps[].digeststringDigest is the pinned digest of the app's build, when the tenant pins one.
status.apps[].heldBackAtstring (date-time)HeldBackAt is when a restore asked the edge to hold this app back (TenantRestoreStatus.HeldBack).
status.apps[].lastFailurestringLastFailure is what the capture container actually said, from the last attempt that failed.
status.apps[].messagestringMessage explains a non-terminal or failed state.
status.apps[].namestringName is the installed profile name.
status.apps[].phasestringPhase is this app's own phase, using the same vocabulary as the export.
status.apps[].quiesceEndstring (date-time)
status.apps[].quiesceModestringQuiesceMode records how this app was actually paused — command (maintenance hook) or scale-down.
status.apps[].quiesceStartstring (date-time)QuiesceStart and QuiesceEnd bound the window this app was paused for.
status.apps[].retainedbooleanRetained says the app is not installed: it was uninstalled and its data kept.
status.apps[].rolloutStartstring (date-time)RolloutStart is when a restore started this app again on the restored data, after its post-restore commands.
status.apps[].secretsobjectSecrets says what was done with the app's own secrets: which an export put into the bundle, and which a restore set from it.
status.apps[].secrets.appliedAtstring (date-time)AppliedAt is when the vault held the bundle's values.
status.apps[].secrets.deliveredAtstring (date-time)DeliveredAt is when the app's Secrets held them too and its releases had been upgraded with them.
status.apps[].secrets.names[]stringNames are the secrets an export captured, or the ones a restore sets: those the bundle holds and the app's profile here declares.
status.apps[].secrets.notDeclared[]stringNotDeclared are the secrets the bundle holds that the app's profile here does not declare.
status.apps[].secrets.notHeld[]stringNotHeld are the secrets the app's profile here declares that the bundle holds no value for.
status.apps[].secrets.plannedbooleanPlanned says Replaced and Releases are final: the stored values were compared with the bundle's.
status.apps[].secrets.releases[]objectReleases are the Helm releases that are handed a replaced secret as a value, each with the revision it was at before the secret was replaced.
status.apps[].secrets.releases[].namestringyesName is the Release object's.
status.apps[].secrets.releases[].revisioninteger (int64)Revision is the revision the release was at before.
status.apps[].secrets.replaced[]stringReplaced are the secrets the app was handed anew: those whose stored value was another than the bundle's and was replaced by it, and those the vault held…
status.apps[].stores[]stringStores lists the kinds captured for this app (postgres, mariadb, s3, volumes), derived from the profile's requires.services.
status.bundleobjectBundle locates the output.
status.bundle.addressingStylestringAddressingStyle is how the bucket was named in requests to Endpoint when the bundle was written: path (empty) or virtualHost.
status.bundle.bucketstringBucket holds the tenant's bundles.
status.bundle.credentialSecretstringCredentialSecret names the Secret whose keys open this endpoint.
status.bundle.endpointstringEndpoint records the storage this bundle was actually written to, empty for the platform's own.
status.bundle.prefixstringPrefix is the directory-like key prefix this bundle occupies.
status.bundle.regionstringRegion accompanies Endpoint for tooling that needs it.
status.completedAtstring (date-time)CompletedAt is when the export reached a terminal phase.
status.conditions[]objectConditions carry the usual per-concern detail.
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.encryptionobjectEncryption records how the bundle was protected, so a restore knows what it needs before it starts and an operator can tell at a glance whether a bundle is…
status.encryption.modestringMode is the protection used.
status.encryption.platformReadablebooleanPlatformReadable states plainly whether any platform-held identity can decrypt this bundle.
status.encryption.recipients[]stringRecipients are the public keys the bundle was encrypted to.
status.notIncluded[]stringNotIncluded names what the tenant has that this export's bundle does not hold, beyond what no bundle holds: the data uninstalled apps left behind, which an…
status.observedGenerationinteger (int64)ObservedGeneration is the spec generation this status was computed from.
status.phasestringPhase is the overall lifecycle phase.
status.quiesced[]stringQuiesced names the apps currently paused for writes.
status.startedAtstring (date-time)StartedAt is when the first app began capturing.

21. TenantRestore​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeNamespaced
Pluraltenantrestores
Short namestrst

TenantRestore restores a tenant's data from a bundle.

FieldTypeRequiredDescription
specobjectTenantRestoreSpec puts a bundle back into a live tenant.
spec.apps[]stringApps limits the restore to these profiles.
spec.bundleobjectBundle locates a bundle directly, for restoring one this cluster did not produce — a migration, or a rebuild where the original export is gone.
spec.bundle.addressingStylestringAddressingStyle is how the bucket was named in requests to Endpoint when the bundle was written: path (empty) or virtualHost.
spec.bundle.bucketstringBucket holds the tenant's bundles.
spec.bundle.credentialSecretstringCredentialSecret names the Secret whose keys open this endpoint.
spec.bundle.endpointstringEndpoint records the storage this bundle was actually written to, empty for the platform's own.
spec.bundle.prefixstringPrefix is the directory-like key prefix this bundle occupies.
spec.bundle.regionstringRegion accompanies Endpoint for tooling that needs it.
spec.confirmTenantstringyesConfirmTenant must equal the tenant being restored into.
spec.decryptionobjectDecryption supplies the key material for the bundle.
spec.decryption.identitySecretRefobjectIdentitySecretRef holds an age identity (AGE-SECRET-KEY-1…) for a recipient-encrypted bundle.
spec.decryption.identitySecretRef.keystringKey defaults to "passphrase".
spec.decryption.identitySecretRef.namestringyes
spec.decryption.passphraseSecretRefobjectPassphraseSecretRef holds the passphrase for a passphrase-encrypted bundle, in this tenant's namespace.
spec.decryption.passphraseSecretRef.keystringKey defaults to "passphrase".
spec.decryption.passphraseSecretRef.namestringyes
spec.exportRefstringExportRef names a TenantExport in this namespace to restore from.
spec.intoNewTenantbooleanIntoNewTenant says the tenant restored into was made new for this bundle: an import.
spec.skipVersionCheckbooleanSkipVersionCheck permits restoring an app's data into a build of the app older than the one that wrote it, or one whose version cannot be compared with it.
statusobjectTenantRestoreStatus reports progress and what was decided during preflight.
status.apps[]objectApps reports per-app progress.
status.apps[].artefacts[]objectArtefacts lists each artifact captured for this app, or planned to be restored for it: what the bundle's manifest says the bundle holds.
status.apps[].artefacts[].claimobjectClaim is the volume claim a volume was captured from, as far as making it again takes.
status.apps[].artefacts[].claim.accessModes[]stringAccessModes are the claim's.
status.apps[].artefacts[].claim.annotationsmap[string]string
status.apps[].artefacts[].claim.labelsmap[string]stringLabels and Annotations are the ones that say whose the claim is: the release it records is how the next install and a purge find it.
status.apps[].artefacts[].claim.sizestringyesSize is the storage the claim asked for.
status.apps[].artefacts[].claim.storageClassstringStorageClass is the class the claim named, empty for the default.
status.apps[].artefacts[].databases[]stringDatabases are, for an archive of the databases an app made itself (postgresOwned, mariadbOwned), each database it held as "<name in the bundle>=<name here>"…
status.apps[].artefacts[].kindstringyesKind is postgres, postgresOwned, mariadb, mariadbOwned, s3, volume or secrets; for what is the tenant's own also identity, mailboxes or rights.
status.apps[].artefacts[].namestringyesName is what the artifact was captured from: the database, bucket or volume claim, by its name in the tenant the bundle was taken of; for secrets, the app.
status.apps[].artefacts[].pathstringPath is the artifact's place in the bundle.
status.apps[].artefacts[].releasestringRelease is the Helm release a captured volume claim recorded.
status.apps[].artefacts[].targetstringTarget is where a restore puts the artifact: the database, bucket or claim of that kind in the tenant being restored into, which is named differently when the…
status.apps[].attemptsinteger (int32)Attempts counts capture Jobs run for this app.
status.apps[].authorizationobjectAuthorization says what was done with the app's authorization store: how many tuples an export put into the bundle, and when a restore put them back into a…
status.apps[].authorization.restoredAtstring (date-time)RestoredAt is when a restore put the store back.
status.apps[].authorization.tuplesinteger (int32)Tuples is how many tuples the bundle holds of the store.
status.apps[].chartVersionstringChartVersion records the chart the app was running when captured.
status.apps[].completedUnits[]stringCompletedUnits records each capture Job that finished, by Job name.
status.apps[].digeststringDigest is the pinned digest of the app's build, when the tenant pins one.
status.apps[].heldBackAtstring (date-time)HeldBackAt is when a restore asked the edge to hold this app back (TenantRestoreStatus.HeldBack).
status.apps[].lastFailurestringLastFailure is what the capture container actually said, from the last attempt that failed.
status.apps[].messagestringMessage explains a non-terminal or failed state.
status.apps[].namestringName is the installed profile name.
status.apps[].phasestringPhase is this app's own phase, using the same vocabulary as the export.
status.apps[].quiesceEndstring (date-time)
status.apps[].quiesceModestringQuiesceMode records how this app was actually paused — command (maintenance hook) or scale-down.
status.apps[].quiesceStartstring (date-time)QuiesceStart and QuiesceEnd bound the window this app was paused for.
status.apps[].retainedbooleanRetained says the app is not installed: it was uninstalled and its data kept.
status.apps[].rolloutStartstring (date-time)RolloutStart is when a restore started this app again on the restored data, after its post-restore commands.
status.apps[].secretsobjectSecrets says what was done with the app's own secrets: which an export put into the bundle, and which a restore set from it.
status.apps[].secrets.appliedAtstring (date-time)AppliedAt is when the vault held the bundle's values.
status.apps[].secrets.deliveredAtstring (date-time)DeliveredAt is when the app's Secrets held them too and its releases had been upgraded with them.
status.apps[].secrets.names[]stringNames are the secrets an export captured, or the ones a restore sets: those the bundle holds and the app's profile here declares.
status.apps[].secrets.notDeclared[]stringNotDeclared are the secrets the bundle holds that the app's profile here does not declare.
status.apps[].secrets.notHeld[]stringNotHeld are the secrets the app's profile here declares that the bundle holds no value for.
status.apps[].secrets.plannedbooleanPlanned says Replaced and Releases are final: the stored values were compared with the bundle's.
status.apps[].secrets.releases[]objectReleases are the Helm releases that are handed a replaced secret as a value, each with the revision it was at before the secret was replaced.
status.apps[].secrets.releases[].namestringyesName is the Release object's.
status.apps[].secrets.releases[].revisioninteger (int64)Revision is the revision the release was at before.
status.apps[].secrets.replaced[]stringReplaced are the secrets the app was handed anew: those whose stored value was another than the bundle's and was replaced by it, and those the vault held…
status.apps[].stores[]stringStores lists the kinds captured for this app (postgres, mariadb, s3, volumes), derived from the profile's requires.services.
status.archivedMailboxes[]objectArchivedMailboxes are the archived mailboxes the bundle holds: the mailboxes of people who had been removed from the bundle's tenant with their mail kept.
status.archivedMailboxes[].addressstringAddress is the address the removed person received at, in the domain of the tenant restored into.
status.archivedMailboxes[].archivestringyesArchive is the archived mailbox's name in the domain's archive.
status.archivedMailboxes[].archivedAtstring (date-time)ArchivedAt is when it was archived, where the bundle was taken; By who chose that, as they were shown there.
status.archivedMailboxes[].bystring
status.archivedMailboxes[].domainstringDomain is the mail domain whose archive it is in.
status.archivedMailboxes[].messagesinteger (int64)
status.archivedMailboxes[].sizeBytesinteger (int64)
status.bundleobjectBundle is the bundle actually used, resolved from exportRef or spec.
status.bundle.addressingStylestringAddressingStyle is how the bucket was named in requests to Endpoint when the bundle was written: path (empty) or virtualHost.
status.bundle.bucketstringBucket holds the tenant's bundles.
status.bundle.credentialSecretstringCredentialSecret names the Secret whose keys open this endpoint.
status.bundle.endpointstringEndpoint records the storage this bundle was actually written to, empty for the platform's own.
status.bundle.prefixstringPrefix is the directory-like key prefix this bundle occupies.
status.bundle.regionstringRegion accompanies Endpoint for tooling that needs it.
status.bundleSchemaVersionintegerBundleSchemaVersion is the format version of the manifest this restore read.
status.completebooleanComplete says whether everything the bundle holds -- or, with spec.apps, everything asked for -- was put back.
status.completedAtstring (date-time)
status.conditions[]objectConditions carry Accepted (admitted, and preflight passed) and Complete, and OutsideGuarantee when the restore is not the round trip the platform guarantees…
status.conditions[].lastTransitionTimestring (date-time)yeslastTransitionTime is the last time the condition transitioned from one status to another.
status.conditions[].messagestringyesmessage is a human readable message indicating details about the transition.
status.conditions[].observedGenerationinteger (int64)observedGeneration represents the .metadata.generation that the condition was set based upon.
status.conditions[].reasonstringyesreason contains a programmatic identifier indicating the reason for the condition's last transition.
status.conditions[].statusstringyesstatus of the condition, one of True, False, Unknown.
status.conditions[].typestringyestype of condition in CamelCase or in foo.example.com/CamelCase.
status.heldBack[]stringHeldBack names the apps the edge keeps unreachable while this restore runs: each is added before anything of it is changed, and the edge answers 503 on its…
status.importRemovedbooleanImportRemoved records that the uploaded bundle this restore read was removed from the import bucket, which happens once the restore has run to its end.
status.nameDerivationstringNameDerivation says where the restore took the names of what it restores from.
status.notRestored[]objectNotRestored names every app the bundle holds that this restore did not put back, and why.
status.notRestored[].appstringyesApp is the app's name in the bundle's manifest.
status.notRestored[].reasonstringyesReason says why, in a sentence a person can act on.
status.notes[]stringNotes are what a restore does not bring back by design, which whoever ran it has to act on.
status.observedGenerationinteger (int64)
status.passwordResetRequiredbooleanPasswordResetRequired flags that members came back without credentials.
status.phasestringPhase reuses the export vocabulary: Pending, Running, Ready, Failed.
status.quiesced[]stringQuiesced names apps paused right now, and exists for the same reason as the export's: it is the only record that survives a controller restart, and an app…
status.rightsobjectRights is what this restore does with the entries of the rights store the bundle holds: the ones it grants, the ones it withdraws, and the ones it does not…
status.rights.appliedbooleanApplied says the store holds what Grant and Withdraw say.
status.rights.grant[]stringGrant are written to the store: rights the bundle's tenant had been granted beyond what follows from its entry in git.
status.rights.notBrought[]stringNotBrought are entries the bundle holds that this restore does not write, each with the reason.
status.rights.provenancestringProvenance is whether the bundle was written on this cluster, which decides whether what was granted in its tenant comes back: Proven (signed with this…
status.rights.provenanceMessagestringProvenanceMessage says the same in a sentence.
status.rights.waitingSincestring (date-time)WaitingSince is when the restore began to wait for the operator to attach the tenant in the rights store, which has to come first.
status.rights.withdraw[]stringWithdraw are removed from the store: defaults the bundle's tenant no longer held.
status.sourceobjectSource is where and by what the bundle was written, as its manifest records it: what a profile's post-restore commands are told beside where the restore puts…
status.source.clusterstringCluster is the id of the cluster it was written on.
status.source.customDomainstringCustomDomain is the custom domain a TenantDomain bound the tenant to there.
status.source.domainstringDomain is the tenant's domain where it was written.
status.source.kernelDomainstringKernelDomain is the domain of the cluster it was written on, the one its sign-in issuer is under.
status.source.platformVersionstringPlatformVersion is the version line of the platform that wrote it.
status.sourceTenantstringSourceTenant is the tenant the bundle was taken of, as its manifest records it: the tenant restored into, as a bundle of any other is refused.
status.startedAtstring (date-time)

22. XTenant​

AttributeValue
Groupgentianos.io
Versionv1alpha1
ScopeCluster
Pluralxtenants
Short names
FieldTypeRequiredDescription
specobject (free-form)
statusobject (free-form)