It should be noted that open-next does not actually deploy the app. It only bundles everything for your IAC to deploy it.

Here is a table comparing the different options to deploy a next.js app:

FeaturesOpenNextVercelAWS AmplifyDocker Standalone
Function splittingYesYesNoNo
Multiple deployment target ¹YesYes ²NoNo
ServerlessYesYesYesNo ³
Warmer functionYesNoNoNot necessary
External middlewareYes ⁴YesNoNo
Edge runtime supportPartial Support ⁵YesEmbedded ⁶Embedded ⁶
ISRYesYesYesYes ⁷
On-Demand RevalidationYes ⁸YesNoYes ⁸
Custom serverYes ⁹NoNoYes
  1. Multiple deployment target means that you can deploy the same app to different target like some part to ECS, some part to Lambda etc...
  2. Vercel supports only serverless Node (backed by AWS Lambda) and Edge runtime (backed by cloudflare workers)
  3. You can deploy a dockerized next.js app to AWS lambda using AWS Lambda Web adapter, but some part like ISR will not work as expected
  4. OpenNext supports external middleware, but it is not enabled by default.
  5. OpenNext supports edge runtime in node, but every route needs to be deployed separately. OpenNext supports edge runtime in cloudflare workers, but only for app router api routes.
  6. Embedded means that the edge runtime is embedded inside the bundle. It emulates a fake edge runtime inside the prod environment.
  7. You might experience some inconsistencies with ISR if you have a CDN in front of your app. Next always set the cache-control header to s-maxage=REVALIDATION_TIME, stale-while-revalidate, it means that your data (json or rsc) and your html might be out of sync.
  8. You need to invalidate the CDN manually. For OpenNext, here is an example for cloudfront
  9. OpenNext supports custom server, but it is not enabled by default. You can have a custom server even in a serverless environment.