Installation
Optio runs on Kubernetes. You can run it locally with Docker Desktop or deploy to a production cluster with the Helm chart.
Local Development
The quickest path uses Docker Desktop's built-in Kubernetes cluster.
Prerequisites
- Docker Desktop with Kubernetes enabled (Settings → Kubernetes → Enable)
- Node.js 22+ and pnpm 10+
- Helm 3+ and kubectl
Automated Setup
git clone https://github.com/jonwiggins/optio.git
cd optio
./scripts/setup-local.shThe setup script performs the following:
- Checks all prerequisites are installed
- Runs
pnpm install - Builds all agent images (base, node, python, go, rust, full)
- Builds API and web Docker images
- Installs the Kubernetes metrics-server
- Deploys via Helm with NodePort services (API: 30400, Web: 30310)
Tip
./scripts/update-local.sh to pull the latest changes, rebuild, and redeploy without starting from scratch.Hot Reload (API + Web)
For iterating on the API or web UI without rebuilding Docker images:
# Start API and web with hot reload
pnpm dev
# Or individually
pnpm dev:api # Fastify API on :4000
pnpm dev:web # Next.js on :3100Info
pnpm dev, you still need Kubernetes running for pod provisioning. The API connects to K8s via kubectl context.Production Deployment
For production, deploy the Helm chart to your Kubernetes cluster. Images are published to GitHub Container Registry (GHCR) on each release.
Helm Install
# Add the Optio Helm repository
helm install optio oci://ghcr.io/jonwiggins/optio/helm/optio \
-f values.production.yaml \
--namespace optio \
--create-namespaceKey Production Settings
Create a values.production.yaml with references to Secrets you have already provisioned. Start from helm/optio/values.production.yaml for the complete ingress and resource settings:
publicUrl: https://optio.example.com
api:
replicas: 1
strategy:
type: Recreate
autoscaling:
enabled: false
postgresql:
enabled: false
redis:
enabled: false
auth:
disabled: false
existingSecrets:
DATABASE_URL: { name: optio-runtime, key: database-url }
REDIS_URL: { name: optio-runtime, key: redis-url }
OPTIO_ENCRYPTION_KEY: { name: optio-runtime, key: encryption-key }
GOOGLE_OAUTH_CLIENT_ID: { name: optio-sign-in, key: client-id }
GOOGLE_OAUTH_CLIENT_SECRET: { name: optio-sign-in, key: client-secret }
# Add your ingress, TLS, and storage settings from the production example.Warning
See the Deployment guide for the full production checklist and the Configuration reference for all available Helm values.