$ houdini server # control plane
$ houdini agent # worker node
$ houdini deploy # CLI
$ houdini server # control plane
$ houdini agent # worker node
$ houdini deploy # CLI
$ houdini server # control plane
$ houdini agent # worker node
$ houdini deploy # CLI
┌─────────── CONTROL PLANE (houdini server) ──────────────┐
│ │
│ REST API (:4646) │ gRPC (:4648) │ Ingress (:443) │
│ │
│ Scheduler │ Reconciler │ Deploy Pipeline │ Autoscaler │
│ │
│ State Store (BoltDB / Raft cluster) │
└──────────────────────────┬───────────────────────────────┘ │ gRPC Streams + WireGuard Mesh ▼
┌──────── WORKER NODE (houdini agent) ─────────┐
│ │
│ Runtime Registry │
│ ├── Docker (containers) │
│ ├── Process (native) │
│ ├── WASM (modules) │
│ └── Function (serverless) │
│ │
│ Workload Manager │ Health Probes │ Logs │
└───────────────────────────────────────────────┘
┌─────────── CONTROL PLANE (houdini server) ──────────────┐
│ │
│ REST API (:4646) │ gRPC (:4648) │ Ingress (:443) │
│ │
│ Scheduler │ Reconciler │ Deploy Pipeline │ Autoscaler │
│ │
│ State Store (BoltDB / Raft cluster) │
└──────────────────────────┬───────────────────────────────┘ │ gRPC Streams + WireGuard Mesh ▼
┌──────── WORKER NODE (houdini agent) ─────────┐
│ │
│ Runtime Registry │
│ ├── Docker (containers) │
│ ├── Process (native) │
│ ├── WASM (modules) │
│ └── Function (serverless) │
│ │
│ Workload Manager │ Health Probes │ Logs │
└───────────────────────────────────────────────┘
┌─────────── CONTROL PLANE (houdini server) ──────────────┐
│ │
│ REST API (:4646) │ gRPC (:4648) │ Ingress (:443) │
│ │
│ Scheduler │ Reconciler │ Deploy Pipeline │ Autoscaler │
│ │
│ State Store (BoltDB / Raft cluster) │
└──────────────────────────┬───────────────────────────────┘ │ gRPC Streams + WireGuard Mesh ▼
┌──────── WORKER NODE (houdini agent) ─────────┐
│ │
│ Runtime Registry │
│ ├── Docker (containers) │
│ ├── Process (native) │
│ ├── WASM (modules) │
│ └── Function (serverless) │
│ │
│ Workload Manager │ Health Probes │ Logs │
└───────────────────────────────────────────────┘ - Studied the architecture of Kubernetes and Nomad in depth
- Catalogued the main community criticisms of K8s, Nomad, and Swarm
- Combined all of that with my practical experience of what works and what doesn't - Absurd complexity for simple use cases
- Dozens of components to maintain (etcd, kube-apiserver, scheduler, controller-manager, kubelet, kube-proxy...)
- YAML hell — verbose configs that are painful to debug
- Service mesh requires external components (Istio, Linkerd)
- Learning curve measured in months - Simple but incomplete — needs Consul for -weight: 500;">service discovery, Vault for secrets
- No built-in -weight: 500;">service mesh
- Smaller community, less tooling - Abandoned by Docker Inc.
- No real autoscaling
- Limited deployment strategies - Container — Docker, for when you need full isolation
- Process — native OS processes, for local dev or binaries that don't need a container
- WASM — WebAssembly modules, <1ms startup, lightweight sandboxing
- Function — serverless, event-driven, automatic scale-to-zero - Validation — does the spec make sense?
- Scheduling — where to run? (bin-pack or spread, with anti-affinity, constraints, failure scoring)
- Dispatch — direct push to agent via gRPC stream - Secrets encrypted with AES-256-GCM (Argon2id for key derivation)
- RBAC with 4 roles (admin, operator, developer, viewer)
- 2FA with TOTP
- Agent↔server communication with token + gRPC streams
- Policy engine for admission control (blocks :latest in prod, requires health checks, etc.)