Skip to main content
You do not run this deployment by hand. You give an AI coding agent the Install guide, and it executes the phases, stopping to ask you whenever a step needs a human. Budget roughly 2 to 4 hours of wall clock. Most of that is waiting on Terraform and Firestore index creation, not typing.
New to full self-hosting? Read the Overview first for what the deployment contains and how it differs from partial self-hosting.
1

Check the prerequisites

People and access
  • A GCP project you can administer (or create), with billing enabled.
  • Ability to create a Google OAuth client for console sign-in. This is one human console step.
  • Someone available to run an AI coding agent, or the shell commands themselves, for the duration.
ToolingThe agent checks exact versions itself in Phase 0 and stops if anything is missing.
2

Decide your inputs

Decide these once, up front. The agent asks for all of them at the start of Phase 0 rather than interrupting you later.
The Gemini and Anthropic keys are required even on the core profile. Memory embeddings and knowledge search run on Gemini; agent paths use Anthropic. Placeholder values pass the install and then fail at runtime, so use real keys you control.
3

Give your agent the guides

This is the step that does the work. Point your AI coding agent at these two pages:
  • Install guide, the phase-by-phase procedure it executes.
  • Reference, the field-level contract it checks shapes against.
Then start it with a prompt like this, filled in with the values you decided in step 2:
Keep velt-selfhost-state.json in your working directory. It is what lets a fresh session pick up where the last one stopped.
4

Stay available for the human steps

Five moments need a person. The agent pauses and asks at each one.
5

Wire your app

Serving the SDK from your CDN only moves code. Runtime still defaults to SaaS until you pass selfHosted.
Vanilla and Vue use initVelt(apiKey, { proxyDomain, version, selfHosted }).Rules that break production if violated:
  1. Path on the CDN is exactly /lib/sdk@<version>/velt.js with all chunks flat in that directory (@ is literal).
  2. CORS: Access-Control-Allow-Origin on every .js file (app origin or *). This is the number one failure mode.
  3. selfHosted.strict: true and deploymentProfile set to Terraform’s resolved enabledModules, never hand-derived.
  4. CSP: allow your CDN in script-src, and remove cdn.velt.dev once you cut over.
Field-level shape: Reference, selfHosted config.
6

Confirm it is done

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

What the agent does

Maintain velt-selfhost-state.json after every phase so a fresh session can resume without guessing.

Troubleshooting

Full tables live in the Install guide’s troubleshooting appendix.

Upgrading later

Upgrades are a delta, not a reinstall. The Upgrade guide pulls and verifies the target manifest, diffs it against the release recorded in your state file, and runs only the tracks that changed. Releases are migration-free today: new backend code reads existing data shapes. If that ever changes, the release notes and the manifest call it out and ship a dedicated migration runbook.