Migrate from Netlify

If your Netlify project is a static build—and most are—migration is: publish the build output, translate a couple of config files, move DNS when ready. Surge has no build minutes to meter because builds happen wherever you like; the platform's job is serving what you built, instantly and globally.

1. Publish the build output

Your netlify.toml (or the Netlify UI) names a publish directory—dist, build, _site. Build locally and publish it to a test domain:

npm run build
surge ./dist my-project.surge.sh

Check it end to end on the .surge.sh URL before touching anything else.

2. Translate the config

On Netlify On Surge
_redirects rules A ROUTER file: 301 /old /new, with :segment patterns. Paid plans.
/* /index.html 200 (SPA fallback) Name your shell 200.html—free, one file copy in your build script.
Custom headers Lucid Caching replaces cache-header tuning; HSTS and protocol enforcement live in surge config.
Password protection An AUTH file. Paid plans.
Deploy previews surge publish --preview—every revision has a permanent URL on the production CDN.
Build hooks / CI GitHub Actions in one workflow file, or any runner with Node.

The honest boundary: Surge serves static files and doesn't execute anything. Netlify Functions, form handling, and edge functions need a home of their own (an API host of your choosing)—your static front end calls them cross-origin same as before, with CORS if you're hosting the API yourself somewhere that needs it.

3. Publish to your real domain

surge ./dist example.com

The output reports waiting on dns with the records to add—your content is already on every edge node, staged, waiting for the domain. It also writes the domain to dist/CNAME; move that file to wherever your bundler copies static assets from (public/ for most) so rebuilds keep it, and every publish after this one is just surge ./dist publish.

4. Move DNS

At your registrar, point the domain at Surge—delegation recommended, plain CNAME supported. Netlify serves until propagation completes; Surge serves after; nobody sees a gap. surge example.com debug status reports live the moment the switchover is real, certificate provisioned and verified.

Afterward

The loop gets simpler: build anywhere, surge ./dist publish, done—propagated to every region before the command exits, with rollback as your safety net. No build queue between you and production, and no bill that scales with how often you ship.