Sourcecontinuo/docs/instantiate-continuo.md·44fb960·synced 1 Nov 2026·Edit on GitHub ↗

Instantiate the continuo platform

This guide gets continuo itself running on your laptop — an empty control plane for your data pipelines, in about ten minutes. The Run dbt and Python projects in continuo guide puts the real projects on it.

What continuo does

What continuo is and why it exists is on the continuo homepage. This guide just gets it running.

Deploying to your own Kubernetes cluster? This guide is the local quickstart — a single-node cluster with continuo’s own bundled PostgreSQL, Redis, Neo4j and MinIO, meant for evaluation. To install continuo into a real cluster, against your own datastores and with HA and backups, follow deploy/README.md instead.


1. What you need before you start

A container runtime and a few CLI tools. The install commands below are for macOS with Homebrew. On Linux, install the same tools from the linked pages; use Docker Engine in place of Docker Desktop or colima, and skip the colima sizing command further down — the memory and disk figures then apply to the host itself.

Tool Why Install (macOS, Homebrew)
Docker Desktop, or colima Runs the cluster and builds the service images brew install colima && colima start
kind The local Kubernetes cluster brew install kind
kubectl Talking to that cluster brew install kubectl
Helm 3.14+ Installing continuo brew install helm
git, curl, jq Cloning, calling the release API, reading its answers brew install jq
AWS CLI Uploading the python service’s artifacts to the bundled MinIO (chapter 4 of the Run dbt and Python projects in continuo guide) brew install awscli

Room to run it. continuo brings its own PostgreSQL, Redis, Neo4j, MinIO and identity provider in this mode, plus nine of its own services, and then runs your nodes as Kubernetes Jobs alongside all of that. Give the container runtime 6 CPUs, 16 GiB of memory and a 60 GB disk. Close other heavy containers, and a second local cluster especially, before you start. On colima that is:

colima start --cpu 6 --memory 16 --disk 60

A memory-starved runtime does not fail with a clear message: the cluster’s API server stops answering — kubectl hangs or returns net/http: TLS handshake timeout — and the pods sit un-ready for a long time. If you hit that, give the runtime more memory (or stop other containers), then reinstall.

A GitHub account. You will fork the example projects so that the code you release is yours — which matters in chapter 8 of the Run dbt and Python projects in continuo guide, where continuo proposes a fix for a failure as a pull request against your fork.

Credentials: none to install. The install itself needs no secrets, and so does every step of the walkthrough except the LLM-backed extras below. An LLM API key unlocks two optional things: the in-UI assistant (section 3) and chapter 8 of the Run dbt and Python projects in continuo guide, where an LLM proposes a fix for a model you broke.

For the LLM extras What it is
An LLM API key Anthropic (the default), OpenAI, or any OpenAI-compatible server (Mistral, OpenRouter, a model you host) — powers the assistant (section 3) and chapter 8
(optional) A GitHub personal access token Chapter 8 only, and only for a private fork. Read-only, fine-grained, Contents: Read on your fork — the agent reads source through the GitHub API for failures it cannot fix from the release alone
(optional) A GitHub App Chapter 8 only. Needed if you want the UI’s “Create PR” button to actually open the pull request rather than just show you the proposed diff

Where to get them: create an Anthropic key in the Anthropic Console (Settings → API keys — see the Anthropic API docs for details), or an OpenAI key at the OpenAI platform. The GitHub token and App are created in your own GitHub account settings (chapter 8 of the Run dbt and Python projects in continuo guide walks through the App).

Where they go. All three are Helm chart values, not local environment variables — the chart stores them in a Kubernetes Secret and injects them as env vars into the services that use them. Set them the way section 3 sets llm.apiKey: helm upgrade ... --reuse-values --set github.token=... (plus github.installationId and github.appPrivateKey for the App), then kubectl -n continuo rollout restart the affected deployment so it picks up the new value. Chapter 8 walks through the GitHub ones in full.

Set none of these and you still get the whole platform and the whole walkthrough except the assistant and chapter 8 — a complete story without them.

Time. Budget ten to fifteen minutes end to end, nearly all of it waiting for image pulls on the first install.


2. Install continuo

Everything here pulls pre-built, multi-architecture images — nothing is compiled from source, and it works the same on Intel and Apple Silicon.

# A local Kubernetes cluster
kind create cluster --name continuo

# continuo itself, from the published chart
helm install continuo oci://ghcr.io/carolsimone/charts/continuo \
  --version 0.18.0 -n continuo --create-namespace

# Wait for everything to come up (5-10 minutes on a first install)
kubectl -n continuo get pods -w

That single helm install brings up PostgreSQL, Redis, Neo4j, MinIO, an identity provider, and continuo’s services. It is a quickstart layout meant for evaluation — one static login, no backups, no high availability. Production installs bring their own datastores; see deploy/README.md.

While you wait, most service pods sit in Init:0/2 or Init:0/1: each one gates on init containers that wait for Redis to answer and for its database migrations to finish, so services start in dependency order rather than crash-looping. The wait is image pulls plus that gate — on a first install expect several quiet minutes with no restarts. Wait until every pod is Running or Completed before moving on.

Then open it:

kubectl -n continuo port-forward svc/ui 8090:8090 &
kubectl -n continuo port-forward svc/continuo-dex 5556:5556 &
grep -q "continuo-dex" /etc/hosts || echo "127.0.0.1 continuo-dex" | sudo tee -a /etc/hosts

open http://localhost:8090

Log in with [email protected] / password.

The /etc/hosts line exists because logging in uses OIDC, which requires that your browser and the ui service agree on one issuer hostname. ui reaches the identity provider over in-cluster DNS at continuo-dex; your browser cannot resolve that name at all. One loopback line bridges the two. If you cannot use sudo, the chart’s README shows how to do it with a browser resolver rule instead.

You are now looking at an empty continuo. If you want to run data pipelines into it, follow the next guide.


3. Optional: enable the assistant

The panel on the right of the UI is continuo’s assistant — ask it about your platform in plain language (it has more to say once you load real projects into it). It needs an LLM API key; until one is set the panel answers with a provider error (x-api-key header is required).

Set the key and restart the chat service:

helm upgrade continuo oci://ghcr.io/carolsimone/charts/continuo \
  --version 0.18.0 -n continuo --reuse-values \
  --set llm.apiKey='<your-api-key>'

kubectl -n continuo rollout restart deploy/agent-chat

llm.provider defaults to anthropic and llm.model to claude-haiku-4-5. For OpenAI add --set llm.provider=openai --set llm.model=<model>. For any server that speaks OpenAI’s chat-completions API (Mistral, OpenRouter, Groq, or vLLM/Ollama you host; chart 0.12.0 or later) add --set llm.provider=openai-compatible --set llm.baseUrl=<root> --set llm.model=<model>, where <root> is the server’s address without /v1, for example https://api.mistral.ai or http://vllm.ai.svc:8000. Once the pod restarts, the assistant answers live. This is the same llm.apiKey chapter 8 of the Run dbt and Python projects in continuo guide uses, so setting it here covers both.

From chart 0.15.0 the assistant reaches your provider through continuo’s egress proxy, which admits only the hosts your settings name, so a provider on a public address needs no extra configuration; see deploy/README.md for what it allows, how to reach a model you host and how to add a host.


Troubleshooting

A pod is in CrashLoopBackOff during install. Not expected: services gate on init containers (wait-for-redis, wait-for-migrations) and start in dependency order, so a healthy install comes up with zero restarts. A pod stuck in Init: (for example Init:0/2) is still waiting on its gates — look at the datastore pods and the db-init-migrate job first. A pod that is actually crash-looping is a real signal: read its logs.

sudo: a terminal is required to read the password on the /etc/hosts line. sudo reads its password from the controlling terminal, so it cannot prompt inside an IDE panel or an agent shell. Run it in a real terminal window, or skip /etc/hosts entirely by pointing your browser’s resolver at the port-forward:

open -na "Google Chrome" --args \
  --host-resolver-rules="MAP continuo-dex 127.0.0.1" \
  --user-data-dir="$HOME/.continuo-chrome" \
  http://localhost:8090

Everything is slow, or pods are being OOM-killed. The bundled install asks for roughly 4 GiB in resource requests before your own Jobs even start. Give the container runtime more memory (chapter 1) and close other large workloads.


Next

You now have an empty continuo running. Fill it with real data projects: Run dbt and Python projects in continuo.

Projects reach continuo through its release API at http://localhost:8090/api/v1, and every call needs a bearer token. On this install you mint one from the bundled Dex with the demo account: Get a bearer token. A CD pipeline uses its GitHub Actions token instead (Releasing from CI).