The configuration is the source of truth
keel.yaml lives at the repository root and is versioned with the code. It
declares one or more deployments. Each deployment names:
- an environment — a Dockerfile in the repository that installs every tool the steps need;
- ordered steps — shell scripts executed inside that environment;
- variables — the inputs the steps read as environment variables, with types, validation, defaults, and documentation;
- optional outputs — environment variables to capture when a run succeeds.
Targets hold the values
A target is one concrete destination for a deployment —client-acme,
staging, eu-cluster. Targets are created in the UI and belong to a
deployment. Each target stores its own value for every variable, encrypted at
rest, and keeps its own run history.
A target is ready when every required, active configuration variable has
a value or a default. Until then the deploy button stays disabled and the UI
says how many values are still needed.
A run executes the steps
Pressing Deploy (or runningkeel deploy) starts a run:
- Build. The environment image is built from the deployment’s Dockerfile with the repository as build context. Image tags are stable per deployment, so Docker layer caching keeps repeat builds fast.
- Run. A container starts from that image with the repository mounted
read-write at
/workspaceand every variable exported. The steps execute in order with/bin/sh; a step that exits non-zero fails the run and skips the rest. - Capture. When every step succeeded, the declared outputs are read from the container’s final environment and stored with the run.
Manifests describe what to supply
Because the variables carry descriptions, “why”, and “how” text, Keel can generate a variable manifest: a Markdown or HTML document listing the values a client or another team must provide, in their language, without exposing the repository.What lives where
In Keel Dev the run works on your actual working tree, uncommitted changes
included. That is convenient while authoring and something to remember
before pressing Deploy with a half-finished script in the tree.