Spec validation runs in two places.Documentation Index
Fetch the complete documentation index at: https://docs.slipway.sh/llms.txt
Use this file to discover all available pages before exploring further.
Parse-time
Runs when slipway loads the file — on every push, on every PR, and when you click Enable for a repo. Catches:- Missing required fields (
version,services,services.*.resources.cpu,.memory, etc.). - Invalid service names (don’t match
^[a-z][a-z0-9-]{0,30}$). - Both
buildandimageset on the same service, or neither. - Duplicate public-port prefixes across services.
- Unknown YAML keys (strict decoding — a typo like
enviroment:fails immediately).
Deploy-time
Runs once a deploy actually starts. Catches:- Missing
${secret.*}or${var.*}references (no matching value in the configured stores). - References to a custom
domain:that the org hasn’t claimed and verified. - Image-pull failures, build failures, healthcheck failures.
failed with the reason in failure_reason and surface in the event log.
What’s not supported
Some things are intentionally absent because slipway is a preview tool, not a production platform.| Not supported | Why |
|---|---|
replicas / autoscaling | Previews always run 1 replica. Load-test elsewhere. |
lifecycle / terminationGracePeriodSeconds | Kubernetes defaults are fine for ephemeral envs. |
| Init containers | For pre-start work, run it from your container’s startup command. |
release: block (one-shot Job before deploy) | Run migrations from your container’s entrypoint, or shell-exec into a healthy pod from the UI. |
| Sidecars (same-pod second container) | Define another service. You get independent pods, logs, resources, and inspection. |
kind: cron / kind: job | Cron rarely fires during a preview’s lifetime. Trigger on demand from the UI. |
extends: / spec composition | Deferred until users actually ask. |
gVisor opt-out | Application code stays sandboxed. Not a user-facing knob. |
| Persistent volumes (PVCs) | Previews shouldn’t claim arbitrary cluster storage. Connect to external managed databases via ${secret.DATABASE_URL} instead. |
| CLI | Everything is the UI. |