Skip to main content
Quick-scan table of every field slipway parses today. For the rationale and examples, see the slipway.yaml overview and adjacent pages.

Top level

PathTypeRequiredNotes
versionintyesCurrently 1.
servicesmapyesKeys: ^[a-z][a-z0-9-]{0,30}$.
volumesmapnoNamed volumes. Keys: ^[a-z][a-z0-9-]{0,30}$. See Named volumes.
volumes.<name>.sizestringnoProvisioned capacity, e.g. 10Gi, 10GB, 1Ti, or bare 10 (GB). Omitted → plan default. Frozen at first provision (grow-only). Per-volume max 1024 GB; the org-wide total is capped by your plan.

services.<name>

PathTypeRequiredNotes
buildobjectone of build/imageBuild from repo.
imagestringone of build/imageUse prebuilt image.
portslistnoEmpty / omitted → worker service.
envmapno${secret.*}, ${var.*}, ${service.*} substitution.
enabledboolnoDefaults to true. Set false to keep the service in the spec but not build/deploy it (an existing workload is torn down on the next deploy).
volumeslistnoNamed-volume mounts, "<name>:<absolute-path>". The name must be declared in the top-level volumes:. A volume mounted by 2+ services is shared between them.
commandlistnoOverride the image’s CMD.
argslistnoOverride the image’s args.
workdirstringnoOverride the image’s WORKDIR. Must be absolute.
depends_onlistnoSibling services that must be ready before this one starts (Compose service_healthy). Same-spec only; self-refs, disabled refs, and cycles are rejected. See depends_on.
healthcheck.startupprobenoSee “Probes” below.
healthcheck.readinessprobenoGates cutover for public services.
healthcheck.livenessprobenoRestarts unhealthy containers.
CPU and memory caps come from your plan — see Plans & pricing — and aren’t fields in slipway.yaml. A volume’s size: is a field, but the total storage budget across all your volumes is plan-controlled.

services.<name>.build

PathTypeRequiredNotes
contextstringyesRelative to repo root.
dockerfilestringnoDefaults to Dockerfile.
argsmapnoBuild args. Values support ${secret.*} / ${var.*} / ${service.*} substitution.

services.<name>.ports[]

PathTypeRequiredNotes
portintyes1–65535.
publicboolnoExposes the port publicly on the apps domain.
prefixstringnoPublic hostname prefix. Defaults to service name. ^[a-z][a-z0-9-]{0,30}$.
domainstringnoVerified custom parent zone. Must be claimed under Settings → Domains.

Probes

A probe is { <handler>: {...}, <timing-fields...> }. Exactly one handler.
HandlerFields
http{ path, port }
tcp{ port }
exec{ command: [...] }
grpc{ port, service? }
Timing fields (all optional, all Kubernetes-standard): initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold, successThreshold.

Substitution syntax

FormResolves to
${secret.NAME}Secret. Env store first (when part of an environment), then org.
${secret.env.NAME}Secret. Environment store only — strict. Resolves only when this deployment is part of an environment.
${secret.org.NAME}Secret. Org store only — strict.
${var.NAME}Variable. Env → org fallback (same as bare ${secret.NAME}).
${var.env.NAME}Variable. Environment store only — strict.
${var.org.NAME}Variable. Org store only — strict.
${service.<name>.<field>}Sibling service URL/host/port/public_url. <field> is one of url / host / port / public_url. Resolves against any service in the same deployment — and, in an environment, any component’s services.
${NAME}Deprecated. Alias for ${secret.NAME}. Warns at deploy time.
Names for ${secret.*} and ${var.*} match ^[A-Z][A-Z0-9_]*$. ${service.*} uses lowercase service slugs. For ${service.*}: use url for in-cluster sibling-to-sibling calls (bypasses the ingress and any preview auth); public_url is for external consumers (webhook callbacks, OAuth redirects). See talking between services.