Vercel to Lander in 5 minutes.
Step-by-step migration from Vercel to Lander: Dockerfile, env vars, custom domain CNAME swap. Most Vercel-deployed Next.js apps work without modification.[why customers switch]Vercel's Hobby tier prohibits commercial use; Pro at $20/seat is per-seat priced
[what stays the same]
- ✓Your Next.js codebase (App Router + Pages Router both supported)
- ✓Server actions, ISR, middleware
- ✓Custom domain SSL (we auto-issue ACM certs after CNAME flip)
- ✓Push-from-GitHub workflow (install our GitHub App, point at the same repo)
- ✓Environment variables (paste them via Lander dashboard, no rewrite needed)
[migration steps]
- step 1Vercel doesn't use Dockerfiles, so most repos won't have one. This template works for Next.js 12.3+ with `output: 'standalone'`.
Add a Dockerfile to your repo root
# Dockerfile FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine WORKDIR /app COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public ENV PORT=80 EXPOSE 80 CMD ["node", "server.js"] - step 2Required for the Dockerfile above. Without it, Next.js doesn't emit a self-contained server.js.
Set output: standalone in next.config.js
module.exports = { output: "standalone", } - step 3Free 7-day Pro trial included. Point the GitHub App at the same repo Vercel was deploying. Pick your default branch.
Sign up at lander.host with Google + install the GitHub App
- step 4Run `vercel env pull .env.production` locally to dump your Vercel env vars. Paste them into Lander dashboard at /dashboard/environments/<id>/settings -> Env vars.
Import env vars from Vercel
vercel env pull .env.production - step 5Lander runs CodeBuild: clone -> docker build -> push to ECR -> roll out Fargate. ~4-6 min for the first deploy. Test the staging URL <slug>.app.lander.host before flipping DNS.
Push to deploy
- step 6Once you've verified the Lander deploy works, update your registrar's DNS: change CNAME from cname.vercel-dns.com to <slug>.app.lander.host. ACM cert auto-issues within ~5 min of DNS propagation.
Flip your custom domain CNAME
- step 7After confirming Lander serves your custom domain correctly (~24h), cancel your Vercel subscription. They prorate the unused days.
Cancel Vercel
[gotchas · read first]
- !Edge Runtime functions need to be ported to Node runtime. Check `runtime = 'edge'` exports — change to `runtime = 'nodejs'` and test locally.
- !Vercel's Image Optimization isn't 1:1 with Lander. Most Next.js apps work fine because next/image falls back to standard `<img>` rendering on non-Vercel hosts.
- !ISR with on-demand revalidation works but persists in the Fargate task's memory, not a shared edge cache. Multi-task setups need an external cache (Redis recommended on Pro+).
- !If you're using @vercel/blob or @vercel/postgres, swap to S3 (we bucket per env) and Postgres (set LANDER_NEEDS_DB=1).
[other migrations]