Top level
| Path | Type | Required | Notes |
|---|---|---|---|
version | int | yes | Currently 1. |
services | map | yes | Keys: ^[a-z][a-z0-9-]{0,30}$. |
volumes | map | no | Named volumes. Keys: ^[a-z][a-z0-9-]{0,30}$. See Named volumes. |
volumes.<name>.size | string | no | Provisioned 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>
| Path | Type | Required | Notes |
|---|---|---|---|
build | object | one of build/image | Build from repo. |
image | string | one of build/image | Use prebuilt image. |
ports | list | no | Empty / omitted → worker service. |
env | map | no | ${secret.*}, ${var.*}, ${service.*} substitution. |
enabled | bool | no | Defaults 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). |
volumes | list | no | Named-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. |
command | list | no | Override the image’s CMD. |
args | list | no | Override the image’s args. |
workdir | string | no | Override the image’s WORKDIR. Must be absolute. |
depends_on | list | no | Sibling 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.startup | probe | no | See “Probes” below. |
healthcheck.readiness | probe | no | Gates cutover for public services. |
healthcheck.liveness | probe | no | Restarts unhealthy containers. |
slipway.yaml. A volume’s size: is a field, but the total storage budget across all your volumes is plan-controlled.
services.<name>.build
| Path | Type | Required | Notes |
|---|---|---|---|
context | string | yes | Relative to repo root. |
dockerfile | string | no | Defaults to Dockerfile. |
args | map | no | Build args. Values support ${secret.*} / ${var.*} / ${service.*} substitution. |
services.<name>.ports[]
| Path | Type | Required | Notes |
|---|---|---|---|
port | int | yes | 1–65535. |
public | bool | no | Exposes the port publicly on the apps domain. |
prefix | string | no | Public hostname prefix. Defaults to service name. ^[a-z][a-z0-9-]{0,30}$. |
domain | string | no | Verified custom parent zone. Must be claimed under Settings → Domains. |
Probes
A probe is{ <handler>: {...}, <timing-fields...> }. Exactly one handler.
| Handler | Fields |
|---|---|
http | { path, port } |
tcp | { port } |
exec | { command: [...] } |
grpc | { port, service? } |
initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold, successThreshold.
Substitution syntax
| Form | Resolves 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. |
${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.