[migrate from vercel]

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]
  1. step 1

    Add a Dockerfile to your repo root

    Vercel doesn't use Dockerfiles, so most repos won't have one. This template works for Next.js 12.3+ with `output: 'standalone'`.
    # 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"]
  2. step 2

    Set output: standalone in next.config.js

    Required for the Dockerfile above. Without it, Next.js doesn't emit a self-contained server.js.
    module.exports = {
      output: "standalone",
    }
  3. step 3

    Sign up at lander.host with Google + install the GitHub App

    Free 7-day Pro trial included. Point the GitHub App at the same repo Vercel was deploying. Pick your default branch.
  4. step 4

    Import env vars from Vercel

    Run `vercel env pull .env.production` locally to dump your Vercel env vars. Paste them into Lander dashboard at /dashboard/environments/<id>/settings -> Env vars.
    vercel env pull .env.production
  5. step 5

    Push to deploy

    Lander 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.
  6. step 6

    Flip your custom domain CNAME

    Once 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.
  7. step 7

    Cancel Vercel

    After confirming Lander serves your custom domain correctly (~24h), cancel your Vercel subscription. They prorate the unused days.
[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).

Ready to move?

7-day Pro trial, no card required, commercial use OK$ migrate now