Skip to content

Local development setup

Run Omnia on a local cluster so you can change the operator or dashboard and see the result.

Terminal window
kind create cluster --name omnia-dev

The Tiltfile refuses any context except kind-omnia-dev, kind-kind, docker-desktop, minikube and orbstack.

Terminal window
# Core features only
tilt up
# With enterprise features
ENABLE_ENTERPRISE=true tilt up

Tilt builds the operator, facade, runtime and dashboard images, installs the CRDs with make install, renders charts/omnia with charts/omnia/values-dev.yaml, and sets up port forwards.

Set these environment variables before tilt up to add components.

VariableDefaultAdds
ENABLE_ENTERPRISEfalseThe arena-controller, promptkit-lsp and policy-broker, with Enterprise in dev mode (no licence)
ENABLE_ARENA_BUILDERfalseThe Arena builder module in the omnia-demo namespace, on a local build of Dockerfile.promptarena-sandbox. Needs ENABLE_ENTERPRISE and an existing Provider named by ARENA_BUILDER_PROVIDER (default arena-builder-haiku)
ENABLE_DEMOfalseThe demo workspace, skills, and its managed session-api and memory-api. The Ollama-backed agents also need ENABLE_OLLAMA
ENABLE_OLLAMAfalseOllama model servers and the four demos that use them (11Gi of memory requests). Needs ENABLE_DEMO
ENABLE_OBSERVABILITYfalsePrometheus, Grafana, Loki, Tempo and Alloy
ENABLE_FULL_STACKfalseIstio and the Gateway API
ENABLE_AUDIO_DEMO, ENABLE_VOICE_DEMOfalseThe Gemini audio and Gemini Live voice agents. Each needs a gemini-credentials Secret in omnia-demo
ENABLE_MEMORY_DEMOfalseA seeded memory galaxy across all tiers. Needs the embedding Secret that make dev-embedding-secret creates
ENABLE_LANGCHAINfalseThe LangChain runtime demo agents

Redis and the NFS-backed workspace storage are always on under Tilt.

The demo toggles set *.enabled values of the omnia-dev-content chart, whose README lists what each deploys. The public demos (mortgage underwriting, claims triage, PII chat, the Larkmere portal, SharePoint/RAG) come from the charts/omnia-demo chart in AltairaLabs/omnia-demo.

ServiceURLPresent when
Dashboardhttp://localhost:3000Always
Operator APIhttp://localhost:8082Always
pgwebhttp://localhost:8081Always
VS Code Serverhttp://localhost:8888Always
Grafanahttp://localhost:3001ENABLE_OBSERVABILITY

Edit files in dashboard/src/. The change syncs into the pod and Next.js reloads it, with no image rebuild. Set DASHBOARD_PROD=1 to build the production dashboard image instead, which has no hot reload and enables the Monaco LSP editor.

Tilt rebuilds the operator image when Go source changes.

Press s in the Tilt UI to stream logs, or open http://localhost:10350. Run tilt down to stop.

Terminal window
kind create cluster --name omnia-dev
Terminal window
make docker-build IMG=omnia-operator:dev
docker build -t omnia-dashboard:dev ./dashboard
kind load docker-image omnia-operator:dev --name omnia-dev
kind load docker-image omnia-dashboard:dev --name omnia-dev

Install the CRDs first, as their own release. The app chart fails to render without them, and helm upgrade of the app chart never updates them.

Terminal window
helm install omnia-crds charts/omnia-crds -n omnia-system --create-namespace

This installs every kind, including the Enterprise ones. Pass --set enterprise.enabled=false to leave them out.

Terminal window
helm install omnia charts/omnia -n omnia-system \
--set image.repository=omnia-operator \
--set image.tag=dev \
--set image.pullPolicy=Never \
--set dashboard.enabled=true \
--set dashboard.image.repository=omnia-dashboard \
--set dashboard.image.tag=dev \
--set dashboard.image.pullPolicy=Never

Reach the dashboard with a port-forward:

Terminal window
kubectl port-forward -n omnia-system deployment/omnia-dashboard 3000:3000

Ollama gives agents a local model with no API costs. Start Tilt with it:

Terminal window
make dev-ollama

This runs ENABLE_DEMO=true ENABLE_OLLAMA=true tilt up. It deploys two Ollama instances into omnia-demo: ollama-chat (llama3.2:3b) and ollama-vision (llava:7b). Each pulls its model on first start, which takes several minutes.

InstanceMemory requestVolume
ollama-chat4Gi8Gi
ollama-vision7Gi12Gi

In the cluster the servers answer at http://ollama-chat.omnia-demo:11434 and http://ollama-vision.omnia-demo:11434. On the host, localhost:11434 is chat and localhost:11435 is vision.

The vision-demo agent in the demo workspace uses the vision instance and needs no API key. Open it from the dashboard to chat or send an image.

Tilt runs Redis for you. For a manual install, the chart runs none, so deploy one and point the chart at it:

Terminal window
kubectl create namespace redis
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install redis bitnami/redis -n redis \
--set auth.enabled=false \
--set architecture=standalone
helm upgrade omnia charts/omnia -n omnia-system --reuse-values \
--set redis.default.host=redis-master.redis.svc.cluster.local

Browser sessions (a browserSession Connection) and an encrypting SessionPrivacyPolicy need a KMS key. On a laptop or in a test cluster, the local provider stands in for one: a 32-byte AES key in a Kubernetes Secret.

Create the Secret in the namespace of the object that encrypts:

Terminal window
hack/dev-kms-secret.sh <kube-context> agents dev-kms

Then name it:

encryption:
kmsProvider: local
keyID: dev
secretRef:
name: dev-kms

The script leaves an existing Secret alone, because a new key would make everything sealed under the old one unreadable.

Apply the sample manifests:

Terminal window
kubectl apply -k config/samples/

The samples include Enterprise kinds, so install the Enterprise CRDs first.

To exercise an agent without LLM API costs, set the facade handler to demo or echo:

apiVersion: omnia.altairalabs.ai/v1alpha1
kind: AgentRuntime
metadata:
name: test-agent
spec:
promptPackRef:
name: test-prompts
facades:
- type: websocket
handler: demo # echo returns each input message unchanged
context:
type: memory

The demo handler streams canned responses and sends simulated tool_call and tool_result messages. Neither handler needs an API key.

Check that the operator and dashboard pods are running:

Terminal window
kubectl get pods -n omnia-system

Then open the dashboard at http://localhost:3000.

Check the Tilt UI for sync status.

The dashboard runs npm run dev, which uses Next.js Fast Refresh. Check the browser console for errors. A DASHBOARD_PROD=1 build has no hot reload.

Terminal window
kubectl logs -n omnia-system deployment/omnia-controller-manager

Set image.pullPolicy=Never and load the image into kind:

Terminal window
kind load docker-image <image>:<tag> --name omnia-dev

Check that the agent Service has endpoints. The Service is named after the AgentRuntime:

Terminal window
kubectl get endpoints <agent-name> -n <agent-namespace>