slipway.yaml
The native manifest. Full control over services, ports, volumes, healthchecks, and secrets.
Docker Compose
Already have a
docker-compose file? Slipway reads and converts it live — no slipway.yaml needed.Where your spec comes from
Slipway picks a spec per repo, in this order:
A committed
slipway.yaml wins unless you explicitly pin a Compose file. Your repo is the source of truth: slipway never keeps an editable copy — it reads the file live on every push. The only thing you manage in the dashboard is the secret and variable values your spec references.
For a monorepo, set a per-component spec path (e.g.
services/api/slipway.yaml) and slipway resolves the spec from there.Minimal example
slipway.yaml
Dockerfile in the repo root, served at <env-name>-web-<id>.<your-apps-domain> on port 3000.
Top-level fields
Everything else lives inside
services.<name>.
Services
build, image, ports, env, healthcheck, depends_on.Secrets & variables
${secret.NAME} and ${var.NAME} substitution and where you set the values.Volumes
Persistent data, snapshots, and seeding previews from real data.
Examples
Worked specs for static sites, workers, and multi-service apps.
Validation
Slipway checks your spec in two places. At parse time — every push and PR, and when you add a repo to an environment. Catches missing required fields, invalid service names, a service with bothbuild and image (or neither), duplicate public-port prefixes, and unknown keys (a typo like enviroment: fails immediately). These block the deploy before any infrastructure is touched.
At deploy time — once a deploy starts. Catches missing ${secret.*} / ${var.*} references, unverified custom domains, bad ${service.*} references, and build / image-pull / healthcheck failures. These mark the deployment failed with the reason in the event log.
What slipway intentionally leaves out
Slipway is a preview tool, not a production platform. A few things are deliberately absent:Stability
The spec isversion: 1. New fields are additive and optional — your existing slipway.yaml keeps working. A breaking change would land as version: 2 with both parsers supported during a deprecation window.