Skip to main content
keel.yaml (or keel.yml) lives at the repository root. Keel Dev re-reads it on every page load; Keel Cloud reads it from the connected branch on every sync and push. Unknown keys anywhere in the file are validation errors, so a typo never silently does nothing.

Top level

integer
required
Schema version. Must be 1.
mapping
required
Deployment name → deployment. Names are lowercase DNS-label style: [a-z0-9]([a-z0-9-]*[a-z0-9])?, at most 63 characters, unique.

Deployment

string
One-line plain-text summary shown on deployment cards, in lists, and at the top of generated manifests.
string (Markdown)
Full description rendered on the deployment’s page.
mapping
Group ID (integer) → label string or group definition. Every defined group must be referenced by at least one variable.
mapping
required
Where the steps run. See environment.
list
required
Ordered list of steps; at least one.
mapping
Variable name → variable definition. A bare NAME: with no body declares a required text variable with all defaults.
mapping
Output name → output definition. A bare NAME: uses all defaults.

Environment

string
required
Path to the Dockerfile, relative to the repository root and inside it (.. and absolute paths are rejected). Install every tool the steps need in this image.
string
default:"."
Docker build context, relative to the repository root and inside it.

Step

string
required
Short label shown next to the step’s status.
string
required
Shell script executed with /bin/sh inside the environment container. May be multi-line. Semantics are in the run environment reference.

Variable

Names match [A-Z][A-Z0-9_]* and may not start with KEEL_.
string
default:"the name"
Form label and manifest heading.
string
default:"text"
One of text, multiline, number, email, url, boolean, select. See variable types.
boolean
default:"false"
Store encrypted, render as a password field, mask in logs. Not allowed with a default, or for boolean and select types.
boolean
default:"true"
Whether a value (or default) must be present before a deploy. Inactive variables (see when) are never required.
string (Markdown)
Shown under the form field and in the manifest.
string
Form placeholder. A non-secret field without one shows the default, when there is one.
string
Pre-filled value; also the value used when the field is left blank. Must itself satisfy the variable’s validation. Not allowed for secrets. Write numbers and booleans as strings ("2", "true").
list
Allowed values for type: select; required for that type and forbidden for others. Each entry is a string or {value, label}; values must be non-empty and unique.
mapping
pattern, message, min, max, min_length, max_length. See validation.
mapping
include, title, why, how. Presence of the block includes the variable in the default manifest selection. See manifest.
integer
Layout: the group this variable belongs to. See layout.
integer
Layout: variables sharing a row ID within a group render side by side.
number
default:"1"
Layout: the variable’s share of its row’s width. Positive; requires row.
boolean
default:"false"
Ask for the value every time a deploy starts instead of storing it on the target.
mapping
var plus exactly one operator (eq, ne, in, gt, gte, lt, lte, set). See conditions.

A complete example

keel.yaml

Validation

keel validate and both UIs check the whole document and report every problem at once with the path of the offending key:
The rules are listed on the validation page.