An environment is defined by its components — the (repo, ref, slug) tuples it composes. This page covers how composition behaves at deploy time.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.
Component slugs
Every component carries a DNS-safe slug (^[a-z][a-z0-9-]{0,31}$). The slug:
- defaults to the repo name on create, but the operator can override (
frontend-v2vs the repo’s actualfrontend). - must be unique within the env (enforced by the API).
- is used as the URL prefix and the
SL_<COMPONENT>_*env var prefix every other vessel sees.
- Two repos export a service called
apiand you need them to coexist (set component slugsfrontend-apiandcore-api, or rename the slugs themselves). - You want a more readable URL than the repo name (
acme-cmsrepo, but you wantcmsin the hostname).
Ref kinds
Convoys track refs (the long-lived target) — PR instances clone the convoy and override one component to the PR’s HEAD branch automatically.| Ref kind | What slipway tracks | When the primary instance redeploys |
|---|---|---|
branch | Latest SHA on the named branch | On every push to that branch (if autoRedeploy is on) |
tag | Latest SHA the tag points at | On every push that moves the tag |
commit | An exact SHA, immutable | Never auto-redeploys — pin for snapshots |
main, payments on tag:v2.4.0). Each is resolved to a SHA at deploy time via the GitHub API.
There is no pr ref kind in the composer — PR previews are handled by the per-PR instance flow. See webhooks.
Spec path overrides
Each component reads the spec from its repo’s defaultslipway.yaml. For monorepos, override per component:
- Repo
mono-svc, componentweb, spec pathapps/web/slipway.yaml - Repo
mono-svc, componentapi, spec pathapps/api/slipway.yaml
Cross-service DNS
When a deploy lands, slipway injects sibling URLs into every service’s environment:env: values always win — if your slipway.yaml sets API_URL explicitly, slipway won’t overwrite it.
When a peer hasn’t deployed yet
Sibling injection only includes peers that have at least one healthy deployment. On a fresh convoy, the first deploy pass injects only same-component siblings; the next redeploy of any peer fills in the cross-component refs. This is by design — we’d rather show an emptySL_API_SERVER_URL than point at a service that 502s.
URL pattern
env-slug— set when the convoy was created, immutable.component-slug— the component’s slug, immutable.port-prefix— either the explicitprefix:from the service’sportsentry, or the service name when no prefix is set.
Naming collisions
If two components both expose a service namedapi and both want a public port, the host pattern alone won’t collide (each component has its own slug prefix), and each component lives in its own namespace so internal Service/Deployment object names don’t collide either.
The only collision the operator has to think about is the component slug itself, which the API rejects with a clear error at create-time.