Norn started as a Kubernetes control plane — Docker builds, minikube, the whole ceremony. v2 rips that out for Nomad + Consul + Tailscale.

why#

Kubernetes is great if you’re running a platform team. For a single-node homelab it’s overhead without payoff. Nomad gives me:

  • Single binary — no etcd, no kubelet, no kube-proxy
  • Docker driver — same container workflow, less ceremony
  • Consul integration — service discovery without CoreDNS
  • Tailscale mesh — cross-node networking without CNI plugins

the pipeline#

Every deploy follows the same saga:

clone → build → test → snapshot → migrate → submit → healthy → forge → cleanup

forge is the interesting one — it provisions cloudflared tunnels for public endpoints. No ingress controllers, no cert-manager. Cloudflare handles TLS and routing.

infraspec#

Apps declare themselves in infraspec.yaml:

name: signal-sideband
deploy: true
repo:
  autoDeploy: true
processes:
  web:
    port: 3001
    health:
      path: /health
infrastructure:
  postgres:
    database: signal_sideband

Norn reads this, generates a Nomad job, manages the lifecycle. One file, everything declared.

what’s next#

  • Multi-node federation via Tailscale
  • Cron jobs as first-class citizens
  • Log aggregation (currently just nomad alloc logs)