Build packs
How VAC detects your stack, what each adapter generates, and the managed add-on catalog.
Every app, whatever its shape, is turned into a Docker Compose stack that VAC builds and runs. The translation is done by a build adapter, selected by the app's build kind. This page is the detection and behavior matrix; for the day-to-day settings UI, see Build settings.
Detection matrix
With the default auto kind, VAC inspects the repository in this order and stops at the first
match:
| Order | Adapter | Triggered by | Produces |
|---|---|---|---|
| 1 | compose | compose.yaml, compose.yml, docker-compose.yml, docker-compose.yaml | the file, used as-is |
| 2 | dockerfile | a Dockerfile at the repo root | a generated single-service Compose wrapper around it |
| 3 | framework | a package.json that depends on React | a generated build (Node build → static output served by nginx) |
| — | (none) | nothing above matches | a clear "couldn't detect how to build this" error |
Set the build kind explicitly to skip detection — including static, which auto-detection never
picks on its own.
The adapters
compose
Your Compose file is the source of truth. VAC resolves it with docker compose config (expanding
includes and overrides), runs preflight,
and builds it. Multi-service apps work out of the box.
dockerfile
A repo with just a Dockerfile gets wrapped in a one-service Compose stack. Point at an alternate
Dockerfile path via the build config.
framework
Today this means React: VAC detects a react dependency in package.json, generates a
Dockerfile that runs your build command (npm install && npm run build by default) and serves the
output as static files behind nginx, then wraps it in a Compose stack. Use this when you'd rather
not write Docker yourself.
React is the only auto-detected framework today. The adapter is structured so more frameworks slot in later — until then, anything else should ship a Dockerfile or a Compose file.
static
Serves a directory of static files behind a small file server, with an optional SPA fallback
(serve index.html for unmatched routes). Choose the source directory in the build config.
Whatever the adapter produces, the rest of the deploy is identical — preflight, routing over vac-edge, Caddy health gating, memory limits. The adapter only decides how the Compose file comes to exist.
Managed add-on catalog
Separately from building your repos, VAC ships a small catalog of templated apps you can install with one click — pre-packaged Compose stacks bundled into the binary. They deploy through the same pipeline as Git apps, but are materialized from a template instead of cloned.
- Enabled with managed services (
VAC_MANAGED_SERVICES). - Each template declares its memory footprint and any managed-database dependency, so VAC can provision a database for it automatically.
Managed databases
Also under managed services, VAC can provision databases (Postgres, MariaDB, Redis, Mongo) for an app — either on the shared instance or, optionally, an isolated one. The connection string is encrypted and injected into the app's environment on the next deploy, under a variable name you choose.