Drivers

Mentat supports three workload drivers. Each implements the WorkloadDriver trait with async start, stop, and status methods.

FirecrackerDriver

Launches Unikraft unikernels as Firecracker microVMs via REST API over Unix socket. Supports virtio-blk volumes for persistent storage and snapshot/restore for scale-to-zero.

Used by: Spacing Guild, Sietch/OxideDB, Harkonnen Vault, StreamForge, Harvester

firecracker config
config:
  driver: firecracker
  image: "registry.dune/sietch:latest"
  memory_mb: 128
  vcpus: 2
  snapshot_enabled: true
  volumes:
    - source: /mnt/unikernel-volumes/sietch
      target: /data

Lifecycle

  1. Spawn firecracker --api-sock /tmp/mentat/firecracker/UUID.sock
  2. PUT /machine-config (vcpus, memory)
  3. PUT /boot-source (kernel image)
  4. PUT /drives/rootfs + /drives/vol0..N (virtio volumes)
  5. PUT /actions InstanceStart

Snapshots

For scale-to-zero: pause VM, create full snapshot (memory + disk), kill process. On restore: spawn new firecracker, load snapshot, resume.

DockerDriver

Manages OCI containers via the Docker Engine API over Unix socket (/var/run/docker.sock). No health checks — Traefik handles routing.

Used by: Jarvis API (.NET), Bene Gesserit (.NET), Wagent (Node.js), Eye of Ibad (Next.js)

docker config
config:
  driver: docker
  image: "registry.dune/jarvis-api:latest"
  env:
    - - ASPNETCORE_ENVIRONMENT
      - Production
  ports:
    - "8080:80"
  volumes:
    - source: /data/jarvis
      target: /app/data
      read_only: true

ExecDriver

Spawns Rust static binaries directly via tokio::process::Command. Zero overhead — no container, no VM. Tracks PIDs for lifecycle management.

Used by: Fremen

exec config
config:
  driver: exec
  command: /opt/bin/fremen
  args:
    - "--port"
    - "9090"
    - "--workers"
    - "4"
  env:
    - - RUST_LOG
      - info

VolumeMount

All drivers support volume mounts. For Firecracker, volumes are virtio-blk devices backed by host paths (GCP PD-SSD). For Docker, they map to bind mounts.

volumes:
  - source: /mnt/unikernel-volumes/sietch   # host path
    target: /data                             # guest path
    read_only: false