Migrate from Vercel
The step-by-step guide to bring a Vercel project to Pierrr, from creating the token to switching the domains.
Before you start
Check these points so the analysis passes on the first try:
- The Vercel project is linked to a repository at a code provider. A project without a Git repository cannot be migrated, and Bitbucket is not supported yet.
- That provider is connected to your Pierrr organization, with access to the repository. See Organizations to connect your code provider.
- Your plan allows one more project: the migration creates a new Pierrr project.
- The assistant is in beta, open to every organization: see Migrate to Pierrr.
Open the assistant
In the dashboard, open the Projects page, click Create a project, then choose Migrate from another host. The page that opens lists the supported hosts: on the Vercel card, click Start.
Connect Vercel with a token
Pierrr reads your project with a Vercel token you create yourself:
- In Vercel, open your account settings, Tokens section, and create a token.
- Scope it to the team that owns the project and give it a one-day expiry. This is the recommended setup: the token opens only what is needed and does not outlive the migration.
- Paste it into the assistant, then click Connect.
Pierrr uses it to read the project and writes nothing on Vercel, unless you ask for the automatic DNS switch yourself. The token is kept encrypted for 24 hours at most. It is wiped at the end of the migration, on failure, if you cancel, or after 24 hours, and it is never shown again.
Pick the project
Pick your personal account or the team, then the project to migrate. Each project shows its framework, or No Git repository when it is not linked to one. Click Analyse.
If the list is empty, pick another team, or check that the token can reach the project's team.
Read the analysis
The analysis shows what will be imported:
- The app's repository.
- The build: the Pierrr template picked for the framework, or the repository's Dockerfile.
- The app's root directory in the repository.
- The build commands, or the template's when the project defines none.
- The number of production variables.
- The project's domains.
- The detected Postgres database, with the variable that points at it and its server.
- The warnings, grouped under Before you import.
Four warnings block the import: a project without a repository, an unsupported Git provider, a repository the organization cannot reach, a framework with no Pierrr template. Fix the cause, for example by connecting the repository to the organization or adding a Dockerfile, then click Analyse again.
When the repository is not reachable from the organization, a Connect the repository to the organization button appears next to the warning.
Supported frameworks
Pierrr builds the following frameworks with one of its templates:
- Next.js, with or without output: 'standalone'.
- Single-page apps built with Vite, Create React App, Preact, Vue and Parcel.
- Static site generators: Astro in static mode, Gatsby, Docusaurus, Eleventy, VitePress and Storybook.
- Node servers: Express, NestJS, Fastify, Hono, Koa, or plain Node.
- The server-rendered frameworks: Nuxt, SvelteKit and Remix. Pierrr runs the server their build produces, rather than freezing a static version of it that would lose whatever that server does.
- Bun, FastAPI, and static sites without a framework.
A framework that is not on this list goes through when the repository has a Dockerfile in the project's root folder: Pierrr uses it as it is. The rules for a Dockerfile on Pierrr are described in Projects.
Variables
The project's production variables are imported and bound to the app.
Vercel never returns the value of variables marked sensitive. The assistant groups them under Values to re-enter, in a .env-style editor already filled with one NAME= line per variable: complete each line after the = sign. A line left empty is not imported.
Variables provided by Vercel itself, such as VERCEL_URL, do not exist on Pierrr: if your code uses them, replace them with your own variables.
The editor flags unreadable lines with their number, lists the keys not taken from the editor, and shows a Sensitive values are empty alert before the import.
Database
When the analysis detects a Postgres database, choose where the app will find its data:
- Use the project's Pierrr database, the default: Pierrr provides the connection variables, and you can copy your current database's data into it after the import.
- Keep my current database: the app keeps using the database it has today. This choice is for paid plans only.
With the project's Pierrr database, the variables Pierrr provides itself for that database, such as DATABASE_URL or DATABASE_HOST, are not overwritten by Vercel's.
What does not follow
The analysis also warns you about what has no equivalent on Pierrr:
- Vercel cron jobs.
- For a site built as static files, the serverless functions of the api/ folder: only the built site is served.
- For a site built as static files, any server-side rendering.
- Preview deployments.
- Some Vercel build settings that Pierrr does not take as is: the template's apply instead, and you can change them after the import.
Import
Check the Pierrr project name, then click Import. Pierrr creates the project and its container, imports the variables and starts the first deployment, which takes a few minutes.
A migrated app's health is checked on its home page, /, since an app coming from elsewhere does not necessarily expose a /health route.
The result screen shows the first deployment (status, duration, source with branch and commit, start time), updated by itself until it ends. A table lists each variable with its status: Imported, Provided by the Pierrr database, or Not imported when the value is missing. Follow the deployment opens its detail directly, Open the project opens the project. Check the app on its Pierrr address before going further: the Done step of the progress bar is checked as soon as the app is imported.
If the import has not moved for more than ten minutes, cancel the migration and start again; if a project was already created, check it before trying again.
Copy the database data
If you chose the project's Pierrr database, the Copy the database data block, on the result screen, copies your current Postgres database into it. Pierrr reads the connection string from the variable detected at Vercel, or you paste another one. When that variable is marked sensitive, Vercel does not return its value: paste the database's direct connection string instead. A pasted string is used for this copy only and is never stored.
A progress bar runs during the copy, and the block shows Running, Copied or Failed. Once the copy succeeds, it states Data copied from the host, with the copied size, and lists the variables now remapped to the Pierrr database.
A few rules protect your data:
- The copy runs in one block: if it stops, the project database stays as it was.
- It refuses a project database that already holds tables, unless you tick Replace the data already there.
- It refuses a source database larger than the database size your plan provides.
- The source database must accept an encrypted connection and be reachable at a public address. Prefer its direct address over a connection pooler's.
Once the copy succeeds, the imported variables that pointed at the old database, pooler addresses included, point at the Pierrr database, and the app is redeployed automatically.
The copy is a snapshot: what the app writes to the old database after the copy does not follow. For an app that writes a lot, copy the data right before switching the domains. After a failure, fix the cause then click Copy again.
Switch the domains
The Domains block takes over the addresses of your Vercel project. Click Prepare the domains: Pierrr creates a domain for each address and shows the DNS record to set.
- An A record for the bare domain, and for names that depend on no other migrated domain.
- A CNAME for www and for simple subdomains of a bare domain migrated with them.
Pierrr checks every 20 seconds and brings each address online on Pierrr as soon as its DNS points to Pierrr, HTTPS certificate included. Check now forces a check. www can only move together with its bare domain.
Each address carries one of these statuses: Waiting for DNS, DNS verified, Live on Pierrr or Not migratable.
An address marked Cannot move gives the reason: a domain already used by another organization, your plan's domain quota reached, or a www whose bare domain is not migrated.
Automatic DNS switch
If the domain uses Vercel's DNS, Pierrr can set the records for you: click Switch the DNS automatically, then confirm by typing the project name.
- The switch is only possible once the app has a successful deployment on Pierrr.
- Only the address records (A, AAAA, ALIAS, CNAME) of the migrated names change. Your email and other records stay as they are.
- The old records are kept: Go back to the previous DNS puts them back in one click, for 24 hours, while the Vercel token exists.
- Allow a few minutes of propagation, during which some visitors may still reach Vercel.
A confirmation dialog recalls three points and asks you to type the name to confirm. Afterwards, a DNS switched banner notes that propagation can take time and offers Revert to the previous DNS.
Finish the migration
When everything works on Pierrr, click Finish the migration. The Vercel token is wiped: the automatic rollback to the previous DNS is then no longer possible. Your Vercel project stays in place, delete it whenever you want.
The recommended order
To migrate without downtime, follow this order:
- Import the app.
- Check it on its Pierrr address.
- Copy the database data.
- Switch the domains.
- Finish the migration.
Until the DNS changes, Vercel keeps serving the site.
Cancel or start again
Before the import, Cancel the migration wipes the token without creating or changing anything. If the token was wiped after 24 hours, start a new migration with a new token.
The other outcomes have their own screen: The import failed with the error, Migration cancelled (token erased, nothing created) and Token expired after 24 hours.