For a simpler start on one machine, use the Single-host deployment — same images, same configuration contract, no cluster required.
Quick start
Get the chart
The chart lives in the Latitude repository under
charts/latitude — a sparse checkout downloads just that folder:Create your values file
Don’t name it
values.yaml — that file already holds the chart’s defaults.my-values.yaml
Install the chart in your cluster
The install brings up the bundled infrastructure, runs database migrations and the Temporal schema setup as one-shot jobs, and starts the five application services.
Verify the Latitude services are running
All pods should reach
Running/Ready and the latitude-migrations, latitude-temporal-schema, and latitude-temporal-namespace jobs should show Complete.What gets deployed
| Workload | Kind | Purpose |
|---|---|---|
web, api, ingest | Deployment + Service | UI, public API & MCP server, OTLP trace ingestion — exposed via the ingress |
workers, workflows | Deployment | BullMQ background jobs and Temporal workers — internal only |
migrations | Job (post-install, pre-upgrade) | One-shot Postgres + ClickHouse migrations |
postgres | StatefulSet + PVC | Primary store + pgvector |
clickhouse | StatefulSet + PVC | Span/telemetry OLAP store |
redis, redis-bullmq | Deployment / StatefulSet + PVC | Cache + durable queues |
temporal | Deployment + schema Jobs | Workflow engine, Postgres-backed (no Elasticsearch/Cassandra) |
seaweedfs | StatefulSet + PVC | S3-compatible object store (single container, same recipe as Single-host) |
Secrets
Optional non-secret settings (email transport,LAT_AI_* model selection, integrations) go in config.extraEnv as standard EnvVar entries; optional secret values (AI provider keys, email passwords, OAuth client secrets) go in secrets.extra, which merges them into the chart-managed Secret — never as extraEnv literals, which would sit readable in the pod spec.
To manage secrets yourself (e.g. with an external secrets operator), create a Secret carrying the chart’s expected keys and set secrets.existingSecret — the chart then renders no Secret of its own. The key list is in the chart README.
See the secrets reference for what each application secret does.
AI features
The stack boots and core observability (ingest + trace viewing) works without API keys. AI-dependent features stay disabled until you add credentials for the providers you configure — keys insecrets.extra, LAT_AI_* provider/model selection in config.extraEnv:
| Capability | Providers | Feature |
|---|---|---|
| Generation | Amazon Bedrock (default), Anthropic, OpenAI, Google, or any OpenAI-compatible endpoint | Flaggers, evaluations, issue summarization, taxonomy naming, AI generation |
| Embeddings | Voyage AI (default), OpenAI, Google, or any OpenAI-compatible endpoint | Semantic trace/issue search, search highlights, issue clustering |
| Reranking | Voyage AI (default) or Amazon Bedrock | Issue-discovery candidate matching |
Scaling
The five application services are stateless and scale horizontally:HorizontalPodAutoscalers to taste. The bundled stateful services stay single-instance by design — for HA move them to managed equivalents (Bring your own infrastructure).
Backups
Persistent state lives in the PVCs ofpostgres, clickhouse, redis-bullmq, and seaweedfs. Use your storage provider’s volume snapshots, plus:
- Postgres —
kubectl exec -n latitude latitude-postgres-0 -- pg_dump -U latitude latitude(the source of truth for projects, users, and metadata). - ClickHouse — volume snapshots or ClickHouse
BACKUP(span/telemetry data). - Object store — volume snapshots (or rely on your managed S3’s durability).
Upgrading
The chart version tracks the Latitude release, and the images default to the chart’sappVersion — so the chart always deploys the release it shipped with. To upgrade, pull the new chart and run:
image.tag (X.Y.Z with no leading v, or latest). Migrations run as a pre-upgrade hook — the schema is upgraded before the new pods roll. Latitude migrations are backward-compatible, so the previous release keeps working during the rollout.
Health and observability
Every service exposes an HTTP health endpoint, wired as readiness and liveness probes (/health; the web app uses /api/health; workers/workflows listen on internal ports 9090/9091). OpenTelemetry export is available through the LAT_OBSERVABILITY_* variables via config.extraEnv.
TLS and reverse proxy
The chart’s Ingress routes the three public hosts (taken fromconfig.{web,api,ingest}Url) to the web, api, and ingest Services over plain HTTP inside the cluster — terminate TLS at your ingress controller. Reference your certificate Secrets in ingress.tls, or have cert-manager issue them via ingress.annotations:
config.*Url values on https:// — they feed the LAT_*_URL and CORS/trusted-origin settings.
Bring your own infrastructure
Every bundled dependency is an independent toggle: set<dep>.enabled: false and fill its external: block, and the chart wires the right LAT_* configuration at your existing or managed instance instead of deploying the bundle.
| Dependency | Toggle | Notes |
|---|---|---|
| Postgres | postgres.enabled | Needs the vector (pgvector) extension and a schema-create admin role |
| ClickHouse | clickhouse.enabled | Dedicated database; external.migrationUrl is host:port only (clickhouse://host:9000) |
| Redis (cache) | redis.enabled | Latitude namespaces all keys under latitude:, so a shared Redis is safe |
| Redis (queue) | redisBullmq.enabled | Same namespacing; needs noeviction |
| Temporal | temporal.enabled | Temporal Cloud or the official temporalio/helm-charts (SQL persistence, no Cassandra/Elasticsearch) for an HA cluster |
| Object storage | seaweedfs.enabled | Any S3-compatible store; omit endpoint/forcePathStyle for AWS S3 |
Next steps
Configuration reference
The full Latitude configurable environment-variable reference for self-hosting.