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.
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.
push a commit → get a url → send it to your reviewer
Your laptop runs a different node, a different libc, half your env, none of your data. The bug only shows up after merge.
One staging environment per team is a serialization point. Whoever pushes last owns the bake. Everyone else waits.
Reviewers want to click around. A Loom is not a click target. A link is the smallest unit of useful feedback.
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.
GitHub webhook lands.
Kaniko job, in-cluster.
Optional one-shot Job.
Tenant namespace up.
Readiness + healthcheck.
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.
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.
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"]
Any number, built in parallel.
${secret.X}, ${var.X}, repo→org fallback.
Build-time secrets, never on the pod CLI.
Optional Ingress at <svc>-<dep>.apps.slipway.sh.
One-shot Job — migrations, seeds — must pass to deploy.
HTTP probe gates the cutover. No flickering rollouts.
Every open PR brings up an isolated environment on its head SHA. Reviewers click a link, not a Loom.
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.
Envelope-encrypted at rest, materialised into a per-deploy Secret consumed via envFrom — never in the Pod spec.
Every stdout line lands in ClickHouse with a 30-day TTL. Live SSE fan-out for the in-flight tail.
cert-manager + Cloudflare DNS-01 provisions a wildcard, mirrored into every tenant namespace by reflector.
Images land in an in-cluster Distribution registry, served back to the kubelet over a regular Ingress.
Every deployment posts an immutable row. Replay the lifecycle by clicking through — phase timings, build logs, env diff against the previous deploy.
Median cold-start, push to public URL.
Log retention in ClickHouse, per line.
One manifest. Frozen on every push.
You manage repos. Slipway manages the rest.
Every plan gets the full lifecycle, logs, secrets, wildcard TLS, and PR previews. The tiers vary on concurrency, retention, and isolation.
One slip for personal projects and side experiments.
Take this berthThe standard kit. Three slips, five hands, custom configs.
Take this berthFive slips, fifteen hands, SSO, an always-on option for hot envs.
Take this berthDedicated infrastructure, SLAs, on-prem or air-gapped install. Sized to your compliance bar.
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.