We default to hosting clients ourselves after launch. Sometimes a client points their custom domain at our VPS and stays for a $30–75/month retainer. Sometimes they take the repo, the Docker image, and the env list and host it themselves. Both paths are designed in from day one.
Why we do this
The first time a client asked us, ‘Can we leave?’ — six months into a hosting relationship — we said yes and meant it. They wrote the check, took the repo, and pointed their DNS elsewhere. We invoiced for the handoff and went back to the studio.
We expected to feel something about that. We didn't. We felt fine. We invoiced fine. We slept fine.
The thing we noticed in the next quarter is that the client we lost recommended us to four others. None of them have left.
What ‘designed in from day one’ actually means
It is much easier to write the code so the client can leave than to add an export path later. We do five things up front:
- We use a stack the client could hire any senior engineer to maintain — Next.js, Postgres, Stripe, Resend. Not anything proprietary.
- We ship a Dockerfile and a `docker-compose.example.yml` with every project. It runs as-is on any host that runs containers.
- We document the runbook in the repo, not in our Notion. The runbook is theirs.
- We use Supabase (or a generic Postgres) so a `pg_dump` is a complete migration.
- We never use a vendor we couldn't live without. That includes us.
What this gets us
When we propose, we hand the client a one-page scope they can take to another studio. We tell them out loud that they could take it and do exactly that. Some of them get a quote. They come back. They tell us about the quote.
When we ship, the post-launch contract is opt-in. The exit is documented. The client signs the retainer because it is good — not because leaving is hard.
The unit economics work because retention is high. Retention is high because we don't earn it by being hard to leave.
Filed by The Studio — April 22, 2026