output: 'export' removes the server entirely. next build writes an out folder of HTML, CSS and JavaScript that any file host serves — S3, GitHub Pages 29 , nginx 75 with nothing behind it. Two neighboring settings come up every time: basePath: '/my-docs-site' when the site is not at the domain root, and images: { unoptimized: true } unless you configure a custom loader.
You give up everything that needs a live request: Server Actions, cookies, the proxy, redirects, rewrites and headers(), draft mode, intercepting routes, ISR, route handlers that read the request, and the default image loader. Dynamic routes need generateStaticParams and dynamicParams: false, because nobody is left to render a value you did not enumerate; using any of the rest fails the build rather than shipping something broken. Under nginx the files are literal, so try_files $uri $uri.html $uri/ =404 makes /blog/first-post find blog/first-post.html. Export suits documentation and blogs known at build time, and nothing personalized: it is the only mode here that changes what the application can do.
Everything else
| Target | What it takes | Support |
|---|---|---|
| Node.js 2,131 host or container | A process, or the image of 5.15.5 | Complete |
| Vercel 3,061 , Bun 73,307 | Nothing (verified adapters) | Complete |
| Netlify 4,096 , Amplify 24 , Firebase 1 | The platform's own integration | Near-complete |
| Cloudflare Workers 2 | OpenNext 3,824 adapter (non-Node runtime) | Most features |
| Static host | output: 'export' | Build-time only |
Railway 17,267 , Render, Fly.io 27,739 , DigitalOcean 553 and Google Cloud Run 1 need no adapter: they run a container or a Node process, which is the entire requirement. Cloudflare 2 is the interesting case, because Workers is not Node.js, so the code must be translated rather than merely hosted — which is what OpenNext does, "an open-source initiative to make Next.js 10,514 truly portable, deployable on any platform, not just Vercel." It maintains three MIT-licensed adapters, each looked after by the platform's own team: @opennextjs/aws 4.1.5 (Lambda, via SST 452,619 ), @opennextjs/cloudflare 1.20.6, and the runtime behind Netlify's @netlify/plugin-nextjs 5.16.0. On Cloudflare you install the adapter and wrangler, then run opennextjs-cloudflare build and deploy in place of next start. Since the adapter API stabilized in Next.js 16.2 these projects no longer reverse-engineer the build output, so before assuming a feature is unavailable somewhere, check whether its adapter covers it.