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.
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
[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: 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: