Dispatch · 01 Environment-as-a-Service v2.4

Every pull request,
a live environment.

Slipway turns one slipway.yaml into a real, isolated URL on every push and every open PR. No staging queue. No "works on my machine." No control plane to learn. Reviewers click a link.

Real isolation per PR
One yaml
Cold start ~ 90s
GitHub-only auth
orbit 4 open prs · 4 environments live
building orbit/api · pr-880
elapsed 2m 07s
feat: bulk invite endpoint
https://api-pr880.apps.slipway.sh
healthy orbit/web · pr-412
1m 24s ago
fix(auth): drop legacy session
https://web-pr412.apps.slipway.sh
releasing orbit/billing · pr-104
52s ago
refactor: split invoice writer
https://billing-pr104.apps.slipway.sh
healthy orbit/web · pr-411
14m ago
chore: bump tailwind to v4
https://web-pr411.apps.slipway.sh

push a commit → get a url → send it to your reviewer

Manifesto · 02 the case for a preview

Three reasons the old way hurts.

01

Local dev lies.

Your laptop runs a different node, a different libc, half your env, none of your data. The bug only shows up after merge.

02

Staging is a queue.

One staging environment per team is a serialization point. Whoever pushes last owns the bake. Everyone else waits.

03

Screenshots are debate fuel.

Reviewers want to click around. A Loom is not a click target. A link is the smallest unit of useful feedback.

Procedure · 03 git push → public URL

Five phases. ~90 seconds.

The lifecycle the master schedules for every deployment. Cancel a phase, supersede it with a newer commit, or let it run — the namespace gets torn down on TTL either way.

  1. 01 · Push

    GitHub webhook lands.

  2. 02 · Build

    Kaniko job, in-cluster.

  3. 03 · Release

    Optional one-shot Job.

  4. 04 · Deploy

    Tenant namespace up.

  5. 05 · Healthy live

    Readiness + healthcheck.

Console · 03b three pages, one console

Watch every preview come up green.

Three real pages from the console you open after a push: the deployment view that confirms a PR shipped, the live build logs that show what happened, and the per-repo timeline of every open PR and its preview URL — the link you'll hand to reviewers. Same code paths as the live product, rendered against mock data.

Dispatch 5d764083 test-branch PR #16
Commit
e085dee
live
on test-branch Pull request TTL 6h 0m
Started 5/18/2026, 8:02:20 PM · elapsed 2h 20m
Open service 3
Phase ladder Build 12s Deploy 4s Live 2h 20m Expand
Overview
Logs
Events
Shell
Spec
Commit
e085dee17639
test-branch
Trigger
Pull request
Elapsed
2h 20m
in progress
Services live
3
api · web · worker
Services 3 services
api Public
registry.app.slipway.sh/acme/api:e085dee :8081
web Public
registry.app.slipway.sh/acme/web:e085dee :8080
worker Public
traefik/whoami:latest :80
Manifest · 04 slipway.yaml

One file at the root.

Drop a manifest in your repo. Reference secrets and variables inline. Every push picks it up, freezes a snapshot, and runs the build it describes — no drift between what you wrote and what shipped.

slipway.yaml frozen at deploy utf-8
version: 1

services:
  web:
    build: { context: ., dockerfile: Dockerfile }
    port: 8080
    public: true
    env:
      DATABASE_URL: ${secret.DATABASE_URL}
      STRIPE_KEY:   ${secret.org.STRIPE_KEY}
      LOG_LEVEL:    ${var.LOG_LEVEL}
    healthcheck: { path: /healthz }

  worker:
    build: { context: ., target: worker }
    env:
      QUEUE_URL: ${secret.QUEUE_URL}

release:
  service: web
  command: ["./bin/migrate"]
What it expresses
  • services

    Any number, built in parallel.

  • env

    ${secret.X}, ${var.X}, repo→org fallback.

  • build.args

    Build-time secrets, never on the pod CLI.

  • public

    Optional Ingress at <svc>-<dep>.apps.slipway.sh.

  • release

    One-shot Job — migrations, seeds — must pass to deploy.

  • healthcheck

    HTTP probe gates the cutover. No flickering rollouts.

Capabilities · 05 standard equipment

Everything you'd build anyway, already built.

A URL per pull request

Every open PR brings up an isolated environment on its head SHA. Reviewers click a link, not a Loom.

Real isolation per PR

Every environment is fully sandboxed — its own network, its own resource budget, no cross-PR collisions. Built on Kubernetes; you never have to think about it.

Secrets & variables

Envelope-encrypted at rest, materialised into a per-deploy Secret consumed via envFrom — never in the Pod spec.

Streaming logs

Every stdout line lands in ClickHouse with a 30-day TTL. Live SSE fan-out for the in-flight tail.

Wildcard TLS, free

cert-manager + Cloudflare DNS-01 provisions a wildcard, mirrored into every tenant namespace by reflector.

Built-in registry

Images land in an in-cluster Distribution registry, served back to the kubelet over a regular Ingress.

Logbook · 06 recent dispatches · fictional

A wall of green pills is the goal.

Every deployment posts an immutable row. Replay the lifecycle by clicking through — phase timings, build logs, env diff against the previous deploy.

healthy
orbit/web
pr-412 · fix(auth): drop legacy session
deploying
orbit/api
pr-880 · feat: bulk invite endpoint
healthy
orbit/web
pr-411 · chore: bump tailwind to v4
building
orbit/billing
pr-104 · refactor: split invoice writer
healthy
orbit/landing
pr-58 · copy: shorter hero
healthy
orbit/api
pr-877 · feat: webhook signature v2
releasing
orbit/admin
pr-32 · ui: dashboards reflow
healthy
orbit/docs
pr-209 · docs: revise architecture
healthy
orbit/web
pr-412 · fix(auth): drop legacy session
deploying
orbit/api
pr-880 · feat: bulk invite endpoint
healthy
orbit/web
pr-411 · chore: bump tailwind to v4
building
orbit/billing
pr-104 · refactor: split invoice writer
healthy
orbit/landing
pr-58 · copy: shorter hero
healthy
orbit/api
pr-877 · feat: webhook signature v2
releasing
orbit/admin
pr-32 · ui: dashboards reflow
healthy
orbit/docs
pr-209 · docs: revise architecture
Numerals · 07 standing figures
90 seconds

Median cold-start, push to public URL.

30 day TTL

Log retention in ClickHouse, per line.

1 yaml

One manifest. Frozen on every push.

0 control planes

You manage repos. Slipway manages the rest.

Berth · 08 where you tie up

Pick a slip. Same dock.

Every plan gets the full lifecycle, logs, secrets, wildcard TLS, and PR previews. The tiers vary on concurrency, retention, and isolation.

Single operator

Solo

$ 30 / mo

One slip for personal projects and side experiments.

Take this berth
  • 1 concurrent environment
  • Personal account
  • 1–2h environment TTL
  • Basic stacks only
  • Shared apps domain
  • Community support
Small crews

Team

recommended
$ 120 / mo

The standard kit. Three slips, five hands, custom configs.

Take this berth
  • 3 concurrent environments
  • Up to 5 seats
  • 4–6h environment TTL
  • Custom configs
  • Org-scoped secrets
  • Slack / email alerts
  • Email support
Larger operations

Business

$ 300 / mo

Five slips, fifteen hands, SSO, an always-on option for hot envs.

Take this berth
  • 5 concurrent environments
  • Up to 15 seats
  • Always-on option
  • SAML / SSO
  • Priority support
  • 30-day log retention
  • Custom apps domain
Fleet / regulated custom

Enterprise

Dedicated infrastructure, SLAs, on-prem or air-gapped install. Sized to your compliance bar.

  • Unlimited environments
  • Dedicated infrastructure
  • SLAs
  • On-prem / air-gapped
  • SAML / SCIM SSO
  • Named engineer
  • Custom data residency
Pricing on application Book a call
Final dispatch · 09 cast off

Bring up your first preview
before this tab closes.

Install the GitHub App, point it at a repo, push a commit. The link you'll send your reviewers will resolve by the time you're back in the PR.