Skip to main content
Field-level reference for the self-hosting release contract: registry layout, umbrella manifest, deployment profiles, runtime config shapes, and trust verification.
New here? Start with the Overview for concepts, then the Get Started page. Execute steps with the Install and Upgrade guides. When those guides and this Reference disagree on shapes and contracts, this Reference wins.

Release registry

All customer-facing artifacts live in one public Artifact Registry repo (anonymous read):
Pull with oras. Non-image artifacts are OCI artifacts; the image is a normal container. Discovery vs trust: mutable tags (latest) are for discovery only. Always resolve to a digest and verify the cosign signature before deploying.

Umbrella version semantics

selfHostVersion (e.g. 0.9.4) is the customer-visible release number. Component versions do not need to equal the umbrella version (a console-only fix can ship as self-host 1.2.1 pinning console 1.2.1 + image 1.2.0). Immutability: a given velt-selfhost-manifest:<X.Y.Z> is never rewritten. Fixes publish a new patch version. Migration-free contract (current): releases do not require customer-side data migrations. If that ever changes, release notes and the manifest call it out explicitly.

Manifest schema (schemaVersion: 2)

Field rules

Index artifact

Sorted newest-first by semver.

Schema version 1 (legacy)

Older manifests used GCS URLs (moduleUrl / bundleUrl) instead of registry refs. New installs must use schemaVersion: 2. If you encounter a v1 manifest, contact Velt.

Trust model

Verify the manifest (mandatory)

The certificate identity is Velt’s GitHub Actions OIDC signer for this release pipeline (repo path appears in the regex by design: you do not need access to that repository). Only deploy releases that verify successfully.

Trust chain

Optional SBOM attestations on console/SDK artifacts (SPDX via cosign) are available for infosec inventory via cosign verify-attestation.

Image scan sign-off

After copying the image into your registry, re-scan it. Diff CRITICAL/HIGH findings against backend.knownFindings. Fixable findings (fixAvailable: true) are never accepted in a published manifest. If you see one, stop and contact Velt.

Deployment profiles

Customers pick a curated profile, then optionally opt in modules. There is no per-function control plane.

Curated profiles

Module catalog

Opt-in

Pass comma-separated module ids at install time (Terraform / guide OPT_IN_MODULES), e.g. migrations,ai. Only modules from the catalog above are valid: the CLI rejects unknown ids.

dataRegions (optional)

Regional setencrypteddata* variants can be filtered. Omit the key for the default “all catalog regions” shape; [] and omitted are different fleets, so never coalesce them when generating SDK config.

Emitted profile document

Terraform / the deployment-profiles CLI writes velt-deployment-profile.json (v1):
Console and SDK consume enabledModules verbatim, and never re-derive the dependency closure.

SDK selfHosted config

Generated during install (Phase 5.1) as velt-selfhosted-config.json. Contains no secrets, only public URLs, web-app firebaseConfig, and the module list.

Semantics

App wiring

CDN serving requirements (CORS, MIME, path shape): see the “Wire your app” step in Get Started on GCP.

Console runtime config

Self-host console builds load same-origin /velt-console-config.json before bootstrap. Terraform emits this file; the install guide deploys it next to the static bundle. Minimum validity (fetch must be 200 + JSON with non-empty):
  • firebaseConfig.apiKey
  • firebaseConfig.projectId
  • firebaseConfig.appId
  • firebaseConfig.databaseURL
Also carries endpoint overrides (sendLoginLink, aiChat, and others), enabledModules, and self-host flags. Fail-soft: if the fetch fails or the payload is invalid, the app boots on build defaults and logs one error. It never falls open to Velt SaaS URLs (self-host builds ship with those stripped). configSchemaVersion inside the bundle’s console-version.json must match the backend-emitted schema (pinned in the umbrella manifest as console.configSchemaVersion).

State file contract

velt-selfhost-state.json (working directory or config repo) is the resume and handoff record for Install/Upgrade.
Store secret values in your secret manager; record only paths and references here. On upgrade, replace release only after the upgrade completes so an interrupted run still knows the installed version.

Backend module archive contents

Pulled from backend.moduleRef, verified with backend.moduleSha256: Install/Upgrade guides are not packed into the archive. Use the copies on this docs site.

Acceptance criteria (definition of done)

A deployment is complete only when all hold:
  1. Console sign-in as a seeded admin lands on the dashboard with the workspace + keys.
  2. App loads velt.js + chunks from your CDN (nothing from cdn.velt.dev); window.Velt.version matches the pin.
  3. Creating a comment in the app persists and appears in the console data browser.
  4. Network audit on app + console sessions: no requests to velt.dev or other Velt-owned hosts.