Self-hosted does not mean unsupported. It means the framework and the operator divide responsibility differently. The matrix distinguishes features that run directly from conditions that require proxy, storage, key, packaging, or rollout work.
Matrix summary
| Feature | Node server | Standalone | Static export | Main operator condition |
|---|---|---|---|---|
| Dynamic rendering | Supported | Supported | Not supported | Run a Node.js server |
| Standalone packaging | N/A | Conditional | N/A | Copy static assets and verify traces |
| Runtime image optimization | Conditional | Conditional | Not supported by default | Provide runtime resources or a custom loader |
| Proxy | Supported | Supported | Not supported | Preserve request behavior |
| ISR and revalidation | Conditional | Conditional | Not supported | Persist or share cache state |
| Streaming and Suspense | Conditional | Conditional | N/A | Disable buffering end to end |
| Multi-instance Server Functions | Conditional | Conditional | Not supported | Share the encryption key |
| Rolling version skew | Conditional | Conditional | N/A | Set a deployment ID and retain compatible assets |
| Multi-instance invalidation | Conditional | Conditional | Not supported | Coordinate shared cache tags |
Graceful shutdown and after() |
Conditional | Conditional | N/A | Send termination signals and drain 10-30 seconds |
Node server and standalone are runtime peers
Standalone output reduces the deployed file set by tracing runtime dependencies and emitting a minimal server.js. It does not turn the application into a static site. Dynamic rendering, Route Handlers, Proxy, ISR, images, Server Functions, and after() still depend on the Node.js runtime and surrounding infrastructure.
The packaging boundary matters. Next.js does not copy public or .next/static into the standalone directory by default. Monorepos and native libraries can also require an adjusted tracing root or narrow include patterns.
Static export is a different product shape
Static export produces HTML, CSS, JavaScript, and build-time route output for a static web server. It cannot provide request-time cookies, rewrites, redirects, headers, Proxy, ISR, Server Actions, default image optimization, or dynamic handlers that inspect the request.
Use static export when those constraints match the application. Do not choose it only to avoid operating a Node.js server and then rebuild missing server behavior in an untracked collection of edge scripts.
Multi-instance is the meaningful boundary
A single persistent Node.js instance can use the default filesystem cache. Multiple instances need consistent Server Functions encryption, deployment IDs, shared cache storage, tag invalidation, compatible assets, and rollout behavior. These are architecture requirements, not provider checkboxes.
Validate the exact production artifact through every proxy and load balancer. A framework-level supported status cannot detect response buffering, missing traced files, stale cache state, insufficient image memory, or a shutdown path that kills in-flight work.