Part of Hosting by frameworkNext.js · Self-hosting

Deploy Next.js without Vercel: what you keep and what you lose.

You keep almost everything. Next.js documents next start on any Node host as supporting all its features: server rendering, Server Actions, image optimization, ISR and proxy (formerly middleware). What you give up are Vercel’s platform services: Skew Protection, its analytics dashboards, and running functions in many regions. You also take on caching and skew yourself.

Facts checked

Feature by feature

The middle column is what Next.js itself says about a self-hosted next start server. The last column is what Canner does on top, checked against our Next.js docs and the platform code.

FeatureSelf-hosted with next startOn Canner
Server rendering, Route Handlers, Server Actions †Supported. Next.js lists a Node.js server as supporting all featuresRuns as one long-lived next start process in Montréal; websockets and streaming behave as they do locally
output: "standalone" †A minimal server.js plus the traced node_modules; you copy public and .next/static yourselfOptional. If your config sets it, Canner copies both folders and runs node server.js
next/image optimization † †Works with zero configuration under next start; on glibc Linux, sharp limits its threading unless you change the allocatorWorks. The optimized-image cache in .next/cache survives deploys
ISR, revalidatePath, revalidateTag †Works on one instance with persistent disk; several instances need a shared cache handlerOne process per project, so the default disk cache is enough
Proxy (middleware.ts, renamed proxy.ts in Next.js 16) † †Works under next start; defaults to the Node.js runtimeRuns inside the same process, in Montréal, not at an edge location
Streaming, Suspense, after() †Supported; any proxy in front must not buffer responsesStreams through; nothing to configure
Version skew between deploys † †Set deploymentId; a mismatch forces a full page reloadNot automatic. Set deploymentId from CANNER_DEPLOYMENT_ID, which Canner sets during every build

† Competitor details come from each vendor’s own published pages on the dates shown; prices and plans change, so check the vendor before you decide. Server rendering, Route Handlers, Server Actions (2026-10-29) · `output: "standalone"` (2026-10-29) · `next/image` optimization (2026-10-29) · `next/image` optimization (2026-10-29) · ISR, `revalidatePath`, `revalidateTag` (2026-10-29) · Proxy (`middleware.ts`, renamed `proxy.ts` in Next.js 16) (2026-10-29) · Proxy (`middleware.ts`, renamed `proxy.ts` in Next.js 16) (2026-10-29) · Streaming, Suspense, `after()` (2026-10-29) · Version skew between deploys (2026-10-29) · Version skew between deploys (2026-10-29)

next start or output: standalone

next start runs the normal build output with your full node_modules. It is what npm start does in a fresh project and it needs nothing else. It is also the most forgiving: every file in your repo is still on disk at runtime.

output: "standalone" traces which files each route imports and copies only those into .next/standalone, with a small server.js to run them. It exists for Docker images, where a 1 GB node_modules makes every push slow. The catch is in the Next.js docs: server.js does not serve public or .next/static unless you copy them in, which is why so many standalone deploys come up with a page and no CSS.

  • Files read with `fs` at runtime (email templates, locale JSON, a data file) aren’t imported, so tracing can leave them out. The app boots and one route returns 500. Use outputFileTracingIncludes, or stay on next start.
  • On Canner you don’t need standalone; the docs call it unnecessary, since the default build is what next start expects. If your config sets it anyway, Canner copies public and .next/static, also carries over common runtime folders such as templates, locales and messages, then requests your routes before the deploy completes. If one returns a 5xx, it switches that deploy back to the full next start build.
// next.config.ts
const nextConfig = { output: "standalone" };
export default nextConfig;

// After `next build`, on a host that doesn't do this for you:
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
PORT=3000 HOSTNAME=0.0.0.0 node .next/standalone/server.js

Image optimization and sharp

Off Vercel, /_next/image is served by your own process. Next.js resizes with sharp, which ships prebuilt binaries that the package manager picks for your OS and CPU at install time. Two things go wrong in practice:

  • sharp missing on the server. You installed on macOS and copied node_modules to Linux, or your install skipped optional dependencies. Install on the target platform, from the lockfile, with optional dependencies on.
  • Memory creep under load. The sharp docs say the default glibc allocator suits long-running, multi-threaded image work poorly, and sharp limits its own concurrency when it detects glibc. Alpine (musl) isn’t affected; on Debian or Ubuntu images you can preload jemalloc.
  • On Canner, image optimization works without configuration and its cache in .next/cache carries over between deploys. Package install scripts are off by default; if the build log shows a package’s install script was skipped and that package then fails, allow it with canner.allowedBuildScripts in package.json (how builds run).

ISR and the cache on one long-lived process

Self-hosted, ISR pages and the data cache live where Next.js puts them by default: in memory (50 MB) and on the local disk of each server. Nothing is shared between servers unless you configure it.

With one server that is all you need, and it is what Canner runs: one process per project, so revalidateTag on that process invalidates the only copy there is. The trouble starts with several instances. Each has its own cache, a revalidation on one doesn’t reach the others, and the self-hosting guide has you write a cache handler backed by shared storage such as Redis. Canner has no Redis, and if you need several instances you will need another host.

For CMS-driven sites, Canner also has tag-based response caching in front of the app. Your CMS webhook purges a tag and the next visitor gets a fresh render. Every successful production deploy purges it too.

What stays on Vercel

These are Vercel products, not Next.js features, so no other host gives them to you as they are:

Vercel featureWhat it doesOff Vercel
Skew Protection †Keeps earlier deployments reachable so old tabs keep calling the build they loaded. Pro and Enterprise plansSet deploymentId to force a reload on mismatch and handle failed Server Actions in the client
Speed Insights and Web Analytics †Core Web Vitals and visitor data in the Vercel dashboardUse another analytics tool, or report web vitals yourself with useReportWebVitals
Vercel Functions in many regions †Choose execution regions, including Montréal (yul1) since January 2026, behind a global CDNCanner runs in one region, Montréal, with no edge network for rendering

† Competitor details come from each vendor’s own published pages on the dates shown; prices and plans change, so check the vendor before you decide. Skew Protection (2026-10-29) · Speed Insights and Web Analytics (2026-10-29) · Vercel Functions in many regions (2026-10-29)

When to stay on Vercel

  • Your users are worldwide and latency matters. Vercel renders close to them. Canner has one region, Montréal, with no failover.
  • You need many instances behind a load balancer. Canner runs one process per project. Scaling out means a shared cache handler, the same encryption key and the same build everywhere.
  • You depend on Skew Protection for long sessions, such as a checkout or an exam that must not reload mid-way.
  • Otherwise, a Next.js app with a Postgres database runs the same on one Node process. On Canner that is a git push, with the database and your data in Quebec; pricing lists what each plan includes.

Questions

Can I deploy Next.js without Vercel?

Yes. Next.js runs on any host that can run Node.js with next build and next start, and its deployment docs say a Node.js server supports every feature. Docker and static export are the other options; static export drops anything that needs a server.

Do I need output: standalone to self-host Next.js?

No. It shrinks a Docker image by copying only the files your routes use. Plain next start works on any Node host and is less likely to miss a file read at runtime.

Does ISR work when self-hosting Next.js?

Yes, on a single instance with persistent disk, which is the default setup. With several instances you need a custom cache handler on shared storage so a revalidation reaches all of them.

Does Vercel have a Canadian region?

Yes. Vercel announced its Montréal region, yul1, on January 20, 2026, as an execution region for Vercel Functions. Vercel itself remains a US company.

Run Next.js as one process, in Montréal.

Push your repo; Canner runs next build and next start and puts a Postgres database next to it.