Migration guide

How to deploy a v0 app to your own VPS

The code v0 produces is genuinely good and genuinely yours. What it also is, quietly, is Vercel-shaped — and that shape is what has to change.

Why this one is different

With most AI builders the hard part is getting your code and data out at all. With v0 that is not the problem: you get real Next.js, real React components, standard Tailwind, and you can copy it into your own repository whenever you like. There is no vendor holding your source hostage.

The difficulty is subtler and catches better engineers. Next.js running on Vercel and Next.js running on a rented server are not quite the same product. Several features that appear to be part of the framework are actually part of the platform, and they stop existing the moment you leave.

Nothing here is broken. It is simply that the parts someone else was running now belong to you.
The platform-shaped parts

Four features that are not really framework features.

01

Image optimization

On Vercel it is a managed service. On your server it becomes a process that needs the right image library installed and enough memory to do the work — or you turn it off and serve images yourself.

02

Incremental regeneration

Pages that rebuild themselves on a schedule assume a filesystem that persists and a single place to write to. Put two containers behind a load balancer and they quietly disagree about what is current.

03

Managed storage

Vercel’s database, blob and key-value products are ordinary services with a proprietary front door. Postgres, S3-compatible storage and Redis replace them — but the connection code has to change.

04

Scheduled jobs

Cron entries configured in the platform dashboard do not exist in your repository. They need a real scheduler, and someone has to notice when a job stops running.

Two ways to run it

Node process behind a reverse proxy

Build the app, run it as a long-lived Node process, put nginx or Caddy in front to terminate TLS and serve static files. The most conventional arrangement, the easiest to reason about, and the one most people should pick.

What it needs from you: a process manager so the app comes back after a crash or a reboot, and certificates that renew without anyone remembering to do it.

Containerised, with a standalone build

Next.js can emit a self-contained output that ships only what the app actually needs to run. The resulting image is dramatically smaller than copying the whole project in, which makes deploys faster and rollbacks cheap.

Worth the extra setup if you expect to deploy often or run more than one instance. Overkill for a single app with a handful of users — and choosing it too early is a common way to spend a week on infrastructure instead of on the product.

What has to happen before the domain moves

  1. Audit what is actually platform-specific. Every managed database, blob store, cron entry and analytics hook. This list is the migration; everything else is mechanical.
  2. Stand up the replacements. Your own Postgres, your own object storage, your own scheduler — and change the code that talks to them.
  3. Move the environment variables. They live in a dashboard, not in the repository, and there are always more than anyone remembers.
  4. Decide about image optimization. Either install what it needs and give it room, or turn it off deliberately and serve pre-sized images. Both are fine. Discovering the question in production is not.
  5. Run it on a temporary hostname first. Click through it as a real user, with TLS working, before anything points at it.
  6. Keep a rollback. The old deployment stays reachable until the new one has survived a day of real traffic.

Where it goes wrong

Or have it done

We map what is platform-specific, replace it with services you own, and hand back a running app: your repository, your database, your domain and certificates, plus a pipeline so the next deploy is one command.

From $600 — about a day of work once we have access. The engineering is rarely what takes the time; tracking down who holds the server credentials usually is. Gather those first.

Apps leaning hard on managed storage or heavy background work get quoted after we look — that is a bigger job and pretending otherwise helps nobody.

Get a quote

Tell us what your v0 app depends on

Databases, file uploads, scheduled jobs, anything managed. You get back what has to be replaced, what the real scope is, and a fixed price — usually within one business day.

No newsletter, no automated sequence. Your details are used to answer you and nothing else.