Introduction

Voodu is a self-hosted PaaS — one HCL file, one apply, no git push.

What is Voodu?

Voodu is a Heroku-shaped, Kubernetes-honest deploy tool you run on your own boxes.

One HCL file describes the running system. voodu apply reconciles it: builds, ships, routes, swaps. No bare repo, no git push, no plugin sprawl — apps, ingress with TLS, and stateful services that actually back themselves up.

voodu.hcl
app "myapp" "web" {
  image    = "ghcr.io/myorg/myapp:latest"
  replicas = 3

  env = {
    PORT     = "8080"
    NODE_ENV = "production"
  }

  health_check = "/healthz"
  host         = "myapp.example.com"

  tls {
    email = "ops@example.com"
  }
}
voodu apply -f voodu.hcl -r prod-1
# ✓ apply complete in 11.8s
# ✓ https://myapp.example.com  ·  3/3 healthy

Why Voodu?

  • One file, one command. No git push, no bare repo, no commit ceremony. Edit, save, voodu apply.
  • Declarative apply, not git-push. Diff shows the plan. Apply reconciles. Upsert-only by default — --prune is the explicit opt-in (scoped per (scope, kind)).
  • Stateful services are first-class. Postgres, Mongo, Redis (+ sentinel) declared like apps. Plugins ship backup, replicas, and test-restore.
  • TLS out of the box. Add tls {} and Voodu cuts a Let's Encrypt cert via Caddy. On-demand wildcards.
  • k8s shape, not k8s ops. Same reconciliation loop, none of the CNI/Helm/operator bill.
  • 100% self-hosted, MIT. Single Go binary, embedded etcd, no cloud tier, no telemetry.

Quickstart

  1. Install Voodu on your laptop
  2. Bootstrap a remote
  3. Ship your first app

Manifest reference

The full HCL surface, kind by kind:

CLI

Six verbs cover ~95% of day-to-day:

CommandWhat it does
voodu applyStream context, plan, reconcile
voodu diffDry-run plan, exit-code-gated for CI
voodu logsTail container logs (single, scope, multiplex)
voodu configSet/get env vars per app
voodu remoteSSH targets for multi-host
voodu pluginsInstall/list/update plugins

On this page