From 1d2302c56c7bf5abb2fe2659c6edf826bd3f6b45 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario@cloudflare.com>
Date: Fri, 27 Sep 2024 16:37:17 +0100
Subject: [PATCH 001/140] update the create cloudflare command ofr creating a
 new Next.js application

---
 pages/cloudflare/examples.mdx    | 3 +--
 pages/cloudflare/get-started.mdx | 3 +--
 pages/cloudflare/index.mdx       | 2 +-
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index 24e44f0..aba8420 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -6,8 +6,7 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/11040899018/npm-package-create-cloudflare-6830 --no-auto-update --experimental --framework next
-
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
 ### Basic starter projects
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 3a53cd3..8a306b2 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -8,8 +8,7 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/11040899018/npm-package-create-cloudflare-6830 --no-auto-update --experimental --framework next
-
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
 #### Existing Next.js apps
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 4781efb..4cf96fc 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -18,7 +18,7 @@ You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/11040899018/npm-package-create-cloudflare-6830 --no-auto-update --experimental --framework next
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
 ##### Existing Next.js apps

From d271ed84a899386c85b4fca40c13bfc3b7d1b172 Mon Sep 17 00:00:00 2001
From: Dani Haro <47931084+daniharo@users.noreply.github.com>
Date: Fri, 27 Sep 2024 17:37:46 +0200
Subject: [PATCH 002/140] fix broken link to Node.js APIs in cloudflare

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 4781efb..cc6b6c3 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -27,7 +27,7 @@ Follow the guide [here](/cloudflare/get-started) to use [@opennextjs/cloudflare]
 
 ### Supported Next.js runtimes
 
-Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app can use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
+Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app can use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
 
 This is an important difference from `@cloudflare/next-on-pages`, which only supports the "Edge" runtime. The Edge Runtime code in Next.js [intentionally constrains which APIs from Node.js can be used](https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/plugins/middleware-plugin.ts#L820), and the "Edge" runtime does not support all Next.js features.
 

From 1e423bbee9ca7de277f52eaf24f6c3ab51d685b2 Mon Sep 17 00:00:00 2001
From: Jason Silberman <jason@jsilb.com>
Date: Mon, 30 Sep 2024 11:21:00 -0400
Subject: [PATCH 003/140] Update get-started.mdx

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 8a306b2..e58bc0d 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -62,7 +62,7 @@ Add the following to the scripts field of your `package.json` file:
 
 - `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running `next build` behind the scenes, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 - `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
-- `npm run preview:worker`: Runs `build:worker` and then `preview:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
 
 ### 4. Add caching with Workers KV

From 65147b7f2782dcddce1a2b8db5e17c20544ae900 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario@cloudflare.com>
Date: Tue, 1 Oct 2024 19:00:31 +0100
Subject: [PATCH 004/140] document that the Pages router is not supported by
 the cloudflare adapter

---
 pages/cloudflare/index.mdx | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index a618279..7cc19e5 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -39,14 +39,17 @@ To help improve compatibility, we encourage you to [report bugs](https://github.
 
 ### Supported Next.js features
 
-- [x] [App Router](https://nextjs.org/docs/app) & [Pages Router](https://nextjs.org/docs/pages)
+- [x] [App Router](https://nextjs.org/docs/app)
 - [x] [API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes)
 - [x] [Dynamic routes](https://nextjs.org/docs/pages/building-your-application/routing/dynamic-routes)
 - [x] [Static Site Generation (SSG)](https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation)
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/pages/building-your-application/rendering/server-side-rendering)
 - [x] [Incremental Static Regeneration<sup>1</sup> (ISR)](https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration)
 
-<sup>1</sup> "Manual" revalidation is not supported (i.e. [`revalidateTag()`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) or [`revalidatePath()`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath))
+<sup>1</sup> The [Pages Router](https://nextjs.org/docs/pages) is not currently supported as the App Router has been prioritized given the fact that it is the officially recommended one.
+ Support for the Pages Router might be added in the future if there is demand for it.
+
+<sup>2</sup> "Manual" revalidation is not supported (i.e. [`revalidateTag()`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) or [`revalidatePath()`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath))
 
 ### Not Yet Supported Next.js features
 

From 54e79a3d6fb1cd257d6715579bf95241460aa13b Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario@cloudflare.com>
Date: Tue, 1 Oct 2024 19:08:06 +0100
Subject: [PATCH 005/140] fix incorrect Next.js docs links in Cloudflare docs

---
 pages/cloudflare/index.mdx | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 7cc19e5..9414bae 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -40,11 +40,11 @@ To help improve compatibility, we encourage you to [report bugs](https://github.
 ### Supported Next.js features
 
 - [x] [App Router](https://nextjs.org/docs/app)
-- [x] [API routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes)
-- [x] [Dynamic routes](https://nextjs.org/docs/pages/building-your-application/routing/dynamic-routes)
-- [x] [Static Site Generation (SSG)](https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation)
-- [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/pages/building-your-application/rendering/server-side-rendering)
-- [x] [Incremental Static Regeneration<sup>1</sup> (ISR)](https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration)
+- [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
+- [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
+- [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
+- [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
+- [x] [Incremental Static Regeneration<sup>1</sup> (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 
 <sup>1</sup> The [Pages Router](https://nextjs.org/docs/pages) is not currently supported as the App Router has been prioritized given the fact that it is the officially recommended one.
  Support for the Pages Router might be added in the future if there is demand for it.
@@ -55,7 +55,7 @@ To help improve compatibility, we encourage you to [report bugs](https://github.
 
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [ ] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
-- [ ] [Image optimization](https://nextjs.org/docs/pages/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [ ] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [ ] [Experimental streaming support](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 
 ### How @opennextjs/cloudflare Works

From 999a520243b7372c8de3fabb0466b2928ba2a687 Mon Sep 17 00:00:00 2001
From: Brendan Irvine-Broque <birvine-broque@cloudflare.com>
Date: Tue, 1 Oct 2024 21:47:01 +0200
Subject: [PATCH 006/140] Copy changes to Pages Router docs

---
 pages/cloudflare/index.mdx | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 9414bae..e7a70de 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -46,13 +46,13 @@ To help improve compatibility, we encourage you to [report bugs](https://github.
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Incremental Static Regeneration<sup>1</sup> (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 
-<sup>1</sup> The [Pages Router](https://nextjs.org/docs/pages) is not currently supported as the App Router has been prioritized given the fact that it is the officially recommended one.
- Support for the Pages Router might be added in the future if there is demand for it.
-
-<sup>2</sup> "Manual" revalidation is not supported (i.e. [`revalidateTag()`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) or [`revalidatePath()`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath))
+<sup>1</sup> "Manual" revalidation is not supported (i.e. [`revalidateTag()`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) or [`revalidatePath()`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath))
 
 ### Not Yet Supported Next.js features
 
+The following Next.js features are not yet supported — but we welcome both contributions and feedback! Tell us what you'd like to see, or what you'd like to add support for:
+
+- [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [ ] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [ ] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
@@ -64,4 +64,4 @@ The OpenNext Cloudflare adapter works by taking the Next.js build output and tra
 
 When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx cloudflare` the adapter first builds your app by running `next build`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 
-You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
\ No newline at end of file
+You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.

From 351115ff919241b155be98cfeba1a1a14e3ae5cb Mon Sep 17 00:00:00 2001
From: Brendan Irvine-Broque <birvine-broque@cloudflare.com>
Date: Tue, 1 Oct 2024 21:50:47 +0200
Subject: [PATCH 007/140] Fix links and clarify warning for Next.js <> Workers
 and Pages

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index e7a70de..be9c2f5 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -8,7 +8,7 @@ The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudfl
 <Callout>
 [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
 
-You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features between @opennextjs/cloudflare and @cloudflare/next-on-pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
+You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
 </Callout>
 
 ### Get Started

From d0930a304b296beba296391914eb0970269b0fca Mon Sep 17 00:00:00 2001
From: Tadhg Lewis <tadhg.lewis@outlook.com>
Date: Fri, 4 Oct 2024 16:18:31 +1000
Subject: [PATCH 008/140] Update get-started.mdx

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index e58bc0d..9958066 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -40,7 +40,7 @@ main = ".worker-next/index.mjs"
 name = "my-app"
 compatibility_date = "2024-09-23"
 compatibility_flags = ["nodejs_compat"]
-experimental_assets = { directory = ".worker-next/assets", binding = "ASSETS" }
+assets = { directory = ".worker-next/assets", binding = "ASSETS" }
 ```
 
 <Callout>

From 948f2a623b47812e20ee7c8f44b59e0d58a58f2d Mon Sep 17 00:00:00 2001
From: James <james@eli.cx>
Date: Mon, 7 Oct 2024 23:49:34 +0100
Subject: [PATCH 009/140] remove cloudflare pages support in cloudflare docs

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index be9c2f5..2c93355 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -3,7 +3,7 @@ import { Callout } from 'nextra/components';
 
 ## Cloudflare
 
-The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) and [Cloudflare Pages](https://developers.cloudflare.com/pages), using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
+The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers), using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
 
 <Callout>
 [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.

From f4e4f7022cb2fe2f03c9d0a664227b1cddcc87da Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Tue, 8 Oct 2024 07:57:51 +0100
Subject: [PATCH 010/140] move ISR to unsupported in Cloudflare adaptor (#22)

---
 pages/cloudflare/index.mdx | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index be9c2f5..2354c4d 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -9,6 +9,7 @@ The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudfl
 [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
 
 You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
+
 </Callout>
 
 ### Get Started
@@ -44,15 +45,13 @@ To help improve compatibility, we encourage you to [report bugs](https://github.
 - [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
 - [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
-- [x] [Incremental Static Regeneration<sup>1</sup> (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
-
-<sup>1</sup> "Manual" revalidation is not supported (i.e. [`revalidateTag()`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) or [`revalidatePath()`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath))
 
 ### Not Yet Supported Next.js features
 
 The following Next.js features are not yet supported — but we welcome both contributions and feedback! Tell us what you'd like to see, or what you'd like to add support for:
 
 - [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
+- [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [ ] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [ ] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))

From 2ab8d94a6dac2dfcf50ebfc2098bfd629df22e87 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Wed, 9 Oct 2024 09:51:39 +0100
Subject: [PATCH 011/140] Update pages/cloudflare/index.mdx

Co-authored-by: Dario Piotrowicz <dario.piotrowicz@gmail.com>
---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 2c93355..b447c41 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -3,7 +3,7 @@ import { Callout } from 'nextra/components';
 
 ## Cloudflare
 
-The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers), using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
+The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
 
 <Callout>
 [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.

From c87cb62c9e093e52a6f26bc90d532637f21c1541 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Sat, 12 Oct 2024 22:31:34 +0100
Subject: [PATCH 012/140] add kv cache name env var to docs + fix a couple
 errors (#24)

---
 pages/cloudflare/caching.mdx     | 10 ++++------
 pages/cloudflare/get-started.mdx | 26 ++++----------------------
 2 files changed, 8 insertions(+), 28 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 70072ad..b50eeab 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -15,24 +15,22 @@ Workers KV is eventually consistent, which means that it can take up to 60 secon
 
 ### How to enable caching
 
-`opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
+`@opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
 
 To enable caching, you must:
 
 #### 1. Create a KV namespace
 
 ```
-npx wrangler@latest kv namespace create NEXT_CACHE_WORKERS_KV
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 ```
 
 #### 2. Add the KV namespace to your Worker
 
+The binding name used in your app's worker will be `NEXT_CACHE_WORKERS_KV` by default. This is configurable and can be changed by setting the `__OPENNEXT_KV_BINDING_NAME` build-time environment variable.
+
 ```
 [[kv_namespaces]]
 binding = "NEXT_CACHE_WORKERS_KV"
 id = "<YOUR_NAMESPACE_ID>"
 ```
-
-### 3. Set the name of the binding to `NEXT_CACHE_WORKERS_KV`
-
-As shown above, the name of the binding that you configure for the KV namespace must be set to `NEXT_CACHE_WORKERS_KV`.
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 9958066..84a841d 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -47,7 +47,7 @@ assets = { directory = ".worker-next/assets", binding = "ASSETS" }
 As shown above, you must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare.
 </Callout>
 
-`wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](/workers/runtime-apis/bindings/).
+`wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
 ##### 3. Update `package.json`
 
@@ -67,27 +67,7 @@ Add the following to the scripts field of your `package.json` file:
 
 ### 4. Add caching with Workers KV
 
-`opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
-
-To enable caching, you must:
-
-##### Create a KV namespace
-
-```
-npx wrangler@latest kv namespace create NEXT_CACHE_WORKERS_KV
-```
-
-##### Add the KV namespace to your Worker
-
-```
-[[kv_namespaces]]
-binding = "NEXT_CACHE_WORKERS_KV"
-id = "<YOUR_NAMESPACE_ID>"
-```
-
-#### Set the name of the binding to `NEXT_CACHE_WORKERS_KV`
-
-As shown above, the name of the binding that you configure for the KV namespace must be set to `NEXT_CACHE_WORKERS_KV`.
+See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
 
 ### 5. Remove `@cloudflare/next-on-pages` (if necessary)
 
@@ -116,6 +96,7 @@ In `package.json`:
 "devDependencies": {
 -    "@cloudflare/next-on-pages": "*",
 ```
+
 (remember to also remove [eslint-plugin-next-on-pages](https://www.npmjs.com/package/eslint-plugin-next-on-pages) from your `.eslintrc.js` file)
 
 You no longer need to call `setupDevPlatform()` in your `next.config.mjs` file:
@@ -129,6 +110,7 @@ const nextConfig = {};
 - if (process.env.NODE_ENV === 'development') {
 -   await setupDevPlatform();
 - }
+```
 
 And you'll want to replace any uses of `getRequestContext` from `@cloudflare/next-on-pages` with `getCloudflareContext` from `@opennextjs/cloudflare`:
 

From 8de3e5bbce7167c3e08e8ad6cff8a5e4ea0223d8 Mon Sep 17 00:00:00 2001
From: Sean C Davis <scdavis41@gmail.com>
Date: Wed, 23 Oct 2024 14:53:57 -0400
Subject: [PATCH 013/140] Netlify Next.js Adapter (#27)

Co-authored-by: Philippe Serhal <philippe.serhal@gmail.com>
---
 pages/_meta.json         |  3 +-
 pages/index.mdx          |  3 +-
 pages/netlify/_meta.json |  4 ++
 pages/netlify/forms.mdx  | 79 ++++++++++++++++++++++++++++++++
 pages/netlify/index.mdx  | 97 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 184 insertions(+), 2 deletions(-)
 create mode 100644 pages/netlify/_meta.json
 create mode 100644 pages/netlify/forms.mdx
 create mode 100644 pages/netlify/index.mdx

diff --git a/pages/_meta.json b/pages/_meta.json
index 6375005..43f637a 100644
--- a/pages/_meta.json
+++ b/pages/_meta.json
@@ -1,5 +1,6 @@
 {
   "index": "Overview",
   "aws": "AWS",
-  "cloudflare": "Cloudflare"
+  "cloudflare": "Cloudflare",
+  "netlify": "Netlify"
 }
diff --git a/pages/index.mdx b/pages/index.mdx
index 6bf21c2..b52b10c 100644
--- a/pages/index.mdx
+++ b/pages/index.mdx
@@ -1,4 +1,4 @@
-import { SITE } from '../config';
+import { SITE } from "../config";
 
 # OpenNext
 
@@ -18,6 +18,7 @@ OpenNext is currently backed by:
 
 1. [SST](https://sst.dev) community, maintains the [AWS](aws) adapter
 2. [Cloudflare](https://developers.cloudflare.com/) team, maintains the [Cloudflare](cloudflare) adapter
+3. [Netlify](https://www.netlify.com/) team, maintains the [Netlify](netlify) adapter
 
 If you'd like to join the effort, connect with us on [Discord](https://discord.gg/opennextjs).
 
diff --git a/pages/netlify/_meta.json b/pages/netlify/_meta.json
new file mode 100644
index 0000000..abb54ab
--- /dev/null
+++ b/pages/netlify/_meta.json
@@ -0,0 +1,4 @@
+{
+  "index": "Overview",
+  "forms": "Netlify Forms"
+}
diff --git a/pages/netlify/forms.mdx b/pages/netlify/forms.mdx
new file mode 100644
index 0000000..fb2b9b6
--- /dev/null
+++ b/pages/netlify/forms.mdx
@@ -0,0 +1,79 @@
+# Using Netlify Forms with Next.js
+
+Netlify Forms use [automatic detection of form tag attributes](https://docs.netlify.com/get-started/#set-up-netlify-forms) (example: `data-netlify`) at deploy time by scanning any static HTML files present or generated during the build.
+
+As a security and anti-spam measure, only form and field names that Netlify detects at deployment are recognized by Netlify. When submitting a form, the form target URL must also be a static file.
+
+However, modern Next.js versions do not generate fully-static HTML pages because any page can be revalidated at runtime. Instead, relevant pages are pre-rendered at build time, and then stored in Next.js’s cache for serving. This means that your Next.js pages, including any form tags and attributes, are not written to static HTML files at deployment, and therefore cannot be the form’s target page. Attributes related to Netlify Forms set in these pages have no effect.
+
+## Workaround for Netlify Forms
+
+Here's one way to work around this limitation:
+
+1. Create a new HTML file in the `public` directory of your site. This file would be used for deploy-time form detection only. It can have any name, for example `public/__forms.html`.
+2. In that file, add form tags for all your Netlify forms and fields. In the below example, note that only the bare minimum is needed, as users would not see this HTML page at all.
+
+   ```html
+   <html>
+     <head></head>
+     <body>
+       <form name="feedback" data-netlify="true" hidden>
+         <input type="hidden" name="form-name" value="feedback" />
+         <input name="name" type="text" />
+         <input name="email" type="text" />
+         <input name="message" type="text" />
+       </form>
+     </body>
+   </html>
+   ```
+
+3. In your dynamic page or form component, handle the submission by serving a `POST` request to the static HTML file you’ve created above (using the example above: `/__forms`).
+
+4. Once the request is completed, you should show a success notification or navigate to another page. Here’s a simplified example of the form component:
+
+   ```jsx
+   "use client";
+
+   export function FeedbackForm() {
+     const handleFormSubmit = async (event) => {
+       event.preventDefault();
+       const formData = new FormData(event.target);
+       await fetch("/__forms.html", {
+         method: "POST",
+         headers: { "Content-Type": "application/x-www-form-urlencoded" },
+         body: new URLSearchParams(formData).toString(),
+       });
+       // Success and error handling ...
+     };
+
+     return (
+       <form name="feedback" onSubmit={handleFormSubmit}>
+         <input type="hidden" name="form-name" value="feedback" />
+         <input name="name" type="text" placeholder="Name" required />
+         <input name="email" type="text" placeholder="Email (optional)" />
+         <button type="submit">Submit</button>
+       </form>
+     );
+   }
+   ```
+
+## Live demo
+
+For a more complete example which includes handling of submission states (success, error or pending), visit the [live demo](https://nextjs-platform-starter.netlify.app/classics) or explore the code for the [form component](https://github.com/netlify-templates/next-platform-starter/blob/main/components/feedback-form.jsx) and the [required static file](https://github.com/netlify-templates/next-platform-starter/blob/main/public/__forms.html).
+
+## Prevent silent failures
+
+To prevent silent failures of form detection or submission, we now trigger an intentional build failure when suspecting your code is incompatible:
+
+```txt
+@netlify/plugin-nextjs@5 requires migration steps to support Netlify Forms. Refer to https://ntl.fyi/next-runtime-forms-migration for migration example.
+```
+
+This failure is triggered when both of the following conditions are met:
+
+- The adapter has found usage of `netlify` or `data-netlify` form attributes in your React code (which have no effect).
+- No static HTML file was found in your `public` directory having form attributes (thus marking that you’ve implemented the approach laid out above).
+
+### Skip the check
+
+If you believe that a check failure is incorrect or would like to defer handling the issue to a later time, you can skip this check by adding a `NETLIFY_NEXT_VERIFY_FORMS` environment variable to your site, with the value `false`.
diff --git a/pages/netlify/index.mdx b/pages/netlify/index.mdx
new file mode 100644
index 0000000..cd301f5
--- /dev/null
+++ b/pages/netlify/index.mdx
@@ -0,0 +1,97 @@
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
+
+# Next.js on Netlify
+
+<a href="https://runtime-e2e-report.netlify.app/" target="_blank">
+  <img
+    src="https://runtime-e2e-report.netlify.app/badge"
+    width="185"
+    height="25"
+    style={{ borderRadius: 0, marginTop: "1rem" }}
+    alt="Netlify Next.js adapter v5 test status"
+  />
+</a>
+
+Netlify's Next.js adapter automatically configures Netlify sites with key functionality, including cache control, on-demand revalidation, and image optimization.
+
+The adapter provisions serverless and edge functions as appropriate to handle your site’s server-side functionality (such as SSR, ISR and PPR pages, API endpoints, Server Actions, Edge Middleware, etc.), ensuring that functionality works out-of-the-box.
+
+We automatically verify compatibility with the latest stable version of Next.js, using the comprehensive end-to-end tests of the framework itself. To access up-to-date test results, use the badge above.
+
+## Get started
+
+The easiest way to get started is to deploy our Next.js platform starter template to your Netlify account. Use the button below to get started.
+
+[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/netlify-templates/next-platform-starter)
+
+### Prerequisites
+
+- Next.js version 13.5 and later (up to the latest stable version)
+- [Node 18.x or later](https://docs.netlify.com/configure-builds/manage-dependencies/#node-js-and-javascript)
+- The latest version of [Netlify CLI](https://docs.netlify.com/cli/get-started/)
+
+## Key features
+
+- **App Router:** Netlify fully supports the Next.js App Router, which supports more powerful nested layouts and React’s latest features, such as Server Components and Streaming.
+
+- **Automatic fine-grained caching:** thehe adapter uses fine-grained caching on Netlify to support the Next.js Full Route Cache and Data Cache. This means that static page responses are automatically cached at the edge and can be revalidated by path or by tag.
+
+- **On-demand and time-based revalidation:** both the App Router and Pages Router support on-demand and time-based revalidation, allowing you to revalidate and regenerate content at any time after a deploy.
+
+- **Image optimization:** the `next/image` component uses [Netlify Image CDN](https://docs.netlify.com/image-cdn/overview/) by default to ensure your images are optimized and served in the most efficient format.
+
+Note that while we also generally support experimental features (for example, Partial Prerendering) from their early stages, such features are not considered stable yet at the framework level.
+
+## Automatic framework detection
+
+Netlify automatically detects that you're using Next.js and provisions your site with the most up-to-date adapter.
+
+### Pin a specific adapter version
+
+To pin the Netlify Next.js adapter to a specific version, read [the Netlify docs](https://docs.netlify.com/frameworks/next-js/overview/).
+
+### Suggested configuration values
+
+When you [link a repository](https://docs.netlify.com/welcome/add-new-site/#import-from-an-existing-repository) for a Next.js project, Netlify provides a suggested build command and publish directory: `next build` and `.next`.
+
+If you’re using the CLI to run [Netlify Dev](https://docs.netlify.com/cli/local-development/) for a local development environment, Netlify suggests a dev command and port: `next` and `3000`.
+
+You can override suggested values or set them in a configuration file instead, but suggested values from automatic framework detection may help simplify the process of setting up a Next.js site on Netlify.
+
+For manual configuration, check out the [typical build settings](https://docs.netlify.com/frameworks/#next-js) for Next.js.
+
+## Limitations
+
+Currently, Netlify's Next.js adapter has the following limitations:
+
+- **SSR pages set to the `edge` runtime will run in your [functions region](https://docs.netlify.com/functions/optional-configuration/#region).** If edge-level performance is critical, we advise that you use static pages with edge functions instead. They are rendered at the origin, but are then cached at the edge and can be revalidated on demand.
+
+- **Rewrites in your Next.js configuration can’t point to static files in the `public` directory.** If you create `beforeFiles` rewrites in your `next.config.js`, they can’t point to static files in your site’s `public` directory. You can use middleware rewrites as an alternative.
+
+- **Netlify Forms compatibility:** Using Netlify Forms with the current adapter [requires a workaround](/netlify/forms).
+
+### pnpm support
+
+If you’re planning to use pnpm with Next.js to manage dependencies, you must do one of the following:
+
+- Set a `PNPM_FLAGS` [environment variable](https://docs.netlify.com/environment-variables/get-started/#create-environment-variables) with a value of `--shamefully-hoist`. This appends a `--shamefully-hoist` argument to the `pnpm install` command that Netlify runs.
+- [Enable public hoisting](https://pnpm.io/npmrc#public-hoist-pattern) by adding an `.npmrc` file in the root of your project with this content:
+
+  ```bash
+  public-hoist-pattern[]=*
+  ```
+
+Learn more about using [pnpm on Netlify](https://docs.netlify.com/configure-builds/manage-dependencies/#pnpm).
+
+## Troubleshooting
+
+The OpenNext docs are specifically about using Netlify's Next.js adapter v5 and later. For older versions of the adapter, refer to the [Netlify docs](https://docs.netlify.com/frameworks/next-js/overview/).
+
+If you need help with any version of the adapter, visit [our support page](https://www.netlify.com/support) for various methods of finding answers and getting help.
+
+### More resources
+
+- [Typical Next.js build settings](https://docs.netlify.com/frameworks/#next-js)
+- [Next.js framework documentation](https://nextjs.org/docs/getting-started)
+- [Connect JavaScript client](https://docs.netlify.com/connect/access-data/#use-the-connect-client) - the recommended library for querying Connect data layer APIs in Next.js cached SSR sites.

From a70c507303306832f412bdb8967ee5b1be97d9ed Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Sun, 27 Oct 2024 16:00:55 +0100
Subject: [PATCH 014/140] add poweredByHeader in docs (#26)

---
 pages/aws/config.mdx | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/pages/aws/config.mdx b/pages/aws/config.mdx
index 70ab0e1..66863e7 100644
--- a/pages/aws/config.mdx
+++ b/pages/aws/config.mdx
@@ -24,3 +24,13 @@ If you want to take a look at some simple configuration examples, you can check
 For more advanced use cases, you can check [how to implement custom overrides](/aws/config/custom_overrides).
 
 If you want to look at a full example, you can check [the full example](/aws/config/full_example).
+
+
+### Opt out of default poweredByHeader
+
+By default Next.js will add the [`x-powered-by`]((https://nextjs.org/docs/app/api-reference/next-config-js/poweredByHeader)) header. OpenNext will also add a header `x-opennext`. To opt-out of this, open `next.config.js` and disable the poweredByHeader property in the configuration:
+```ts
+module.exports = {
+  poweredByHeader: false,
+}
+```
\ No newline at end of file

From 4371529bf1e103136e63e4dba67342c357cc616e Mon Sep 17 00:00:00 2001
From: zack wilder <zwilder@gmail.com>
Date: Mon, 4 Nov 2024 10:13:02 -0500
Subject: [PATCH 015/140] Update index.mdx (#29)

---
 pages/index.mdx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pages/index.mdx b/pages/index.mdx
index b52b10c..3dfb914 100644
--- a/pages/index.mdx
+++ b/pages/index.mdx
@@ -2,13 +2,13 @@ import { SITE } from "../config";
 
 # OpenNext
 
-Next.js, unlike Remix, Astro, or the other modern frontends, doesn't have a way to self-host across different platforms. You can run it as a Node.js application. But this doesn't work the same way as it does on Vercel.
+Next.js, unlike Remix, Astro, or the other modern frontends, doesn't have a way to self-host across different platforms. You can run it as a Node.js application, but this doesn't work the same way as it does on Vercel.
 
 ---
 
-There have been several attempts to fix this over the years. Broadly falling into two categories; open source framework specific implementations, or closed source product specific implementations.
+There have been several attempts to fix this over the years, broadly falling into two categories: open source framework specific implementations, or closed source product specific implementations.
 
-These can be really hard to maintain separately as Next.js is constantly being updated.
+These can be really hard to maintain separately because Next.js is constantly being updated.
 
 OpenNext is an initiative to bring all these efforts together.
 
@@ -24,6 +24,6 @@ If you'd like to join the effort, connect with us on [Discord](https://discord.g
 
 ---
 
-OpenNext aims to support all Next.js features. And is widely deployed in production across multiple platforms.
+OpenNext aims to support all Next.js features and is widely deployed in production across multiple platforms.
 
 [NHS England](https://github.com/nhs-england-tools/terraform-aws-opennext), [Udacity](https://engineering.udacity.com/deploying-next-js-on-the-edge-with-sst-is-sst-the-game-changer-its-claimed-to-be-1f05a0abc27c), [Gymshark UK](https://uk.gymshark.com), [SST](https://sst.dev), [Cloudflare](https://www.cloudflare.com)

From f551bb440d384ee3bdb17f3a7184039f2f3b0ab8 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Fri, 8 Nov 2024 13:10:39 +0000
Subject: [PATCH 016/140] add link to bindings doc in the getting started local
 dev section (#30)

---
 pages/cloudflare/get-started.mdx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 84a841d..3e47e5e 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -123,6 +123,8 @@ And you'll want to replace any uses of `getRequestContext` from `@cloudflare/nex
 
 You can continue to run `next dev` when developing locally.
 
+During local development, you can access local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
 In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
 ##### 7. Deploy to Cloudflare Workers

From f22d23688ba02ac296cb1ae73bf1a08e1147a5d6 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Fri, 8 Nov 2024 14:54:16 +0000
Subject: [PATCH 017/140] Update ordering of Cloudflare pages (#31)

---
 pages/cloudflare/_meta.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index ca0a2a6..2c667df 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -1,3 +1,8 @@
 {
-  "index": "Overview"
+  "index": "Overview",
+  "get-started": "",
+  "bindings": "",
+  "caching": "",
+  "examples": "",
+  "troubleshooting": ""
 }

From b9f4f2281188ef9a3ff7dec4676725de6ab63db4 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Tue, 12 Nov 2024 14:31:36 +0100
Subject: [PATCH 018/140] Improve aws config docs (#28)

---
 pages/aws/config/_meta.json    |   1 +
 pages/aws/config/reference.mdx | 273 +++++++++++++++++++++++++++++++++
 2 files changed, 274 insertions(+)
 create mode 100644 pages/aws/config/reference.mdx

diff --git a/pages/aws/config/_meta.json b/pages/aws/config/_meta.json
index 4163e4c..662c997 100644
--- a/pages/aws/config/_meta.json
+++ b/pages/aws/config/_meta.json
@@ -1,6 +1,7 @@
 {
   "simple_example": "Simple Example",
   "custom_overrides": "Custom Overrides",
+  "reference": "Reference",
   "full_example": "Full Example",
   "nx": "Nx Monorepo"
 }
\ No newline at end of file
diff --git a/pages/aws/config/reference.mdx b/pages/aws/config/reference.mdx
new file mode 100644
index 0000000..912547a
--- /dev/null
+++ b/pages/aws/config/reference.mdx
@@ -0,0 +1,273 @@
+Every option that you can use in `open-next.config.ts` will be listed here. This is the configuration file that you can use to customize the build.
+You can look at the [full example](full_example) to see how you can use these options.
+
+import { Tabs } from 'nextra/components'
+
+<Tabs items={['Server Options', 'General Build Options']}>
+<Tabs.Tab>
+  Servers here refers to all the different build outputs (Lambda, Node, Deno etc). Each server can have its own options. This also includes some server/function that only need to run at build time.
+
+  Each server config will be under it's own key in the config object. Here are all the servers that you can configure:
+
+  - Default Server - Key: `default` This is the default server, similar to the server-function in open-next v2
+  - Splitted Server - Key: `functions` This is only used if you want to split the server into multiple servers. This is a special case, under this key you will define every splitted server.
+  - External middleware - Key: `middleware` If you want to deploy your middleware separately from the default servers or functions, you can use this key.
+  - Revalidate Function - Key: `revalidate` This is a special server that will handle the revalidation queue.
+  - Image Optimization Server - Key: `imageOptimization` This server will handle `_next/image` optimization.
+  - Warmer Function - Key: `warmer` This server is meant to be used as a warmer for the lambda function.
+  - Initialization Function - Key: `initializationFunction` This is a special server that will run at build time to initialize the cache. By default it only initialize the tag cache.
+
+  <Tabs items={['Common Options','Default Server', 'Splitted Server', 'External middleware','Image Optimization server', 'Revalidate function', 'Warmer function', 'Initialization Function']}>
+    <Tabs.Tab>
+
+      All these servers share some common options that you can use to customize them.
+
+      ### `minify`
+
+      This will try to minify the output of the server including node_modules. It is a boolean and by default, it is set to `false`.
+      It could lead to some issues with some packages, so it is recommended to test your app with this option before deploying it.
+
+      We will likely not fix issues related to this option, as it is usually library specific.
+
+      ### `override`
+
+      This is where you will be able to override some part of the server. For all of them you can provide what we call a `LazyLoadedOverride` which is a function that will return the override. For some example look at some [Custom overrides](custom_overrides).
+      All servers have some default override that you can override
+
+      TODO: Add all the types for the custom LazyLoadedOverride here. In the meantime, just look at the [source file](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/types/open-next.ts)
+
+      ---
+
+      #### `wrapper`
+
+      This is the entrypoint of the server. 
+      Be aware that it might not be enough to change this to make it work on said platform. This is only the entrypoint, you might need to change other parts of the server to make it work on the platform.
+
+      Possible values are: `aws-lambda`, `aws-lambda-streaming`, `node`, `cloudflare`, `dummy` or a `LazyLoadedOverride` that will return the wrapper.
+
+      #### `converter`
+
+      This is the converter that will be used to convert the input and output for the server.
+
+      Possible values are: `aws-apigw-v2`, `aws-apigw-v1`, `aws-cloudfront`, `edge`, `node`, `sqs-revalidate`, `dummy` or a `LazyLoadedOverride` that will return the converter.
+
+      #### `install`
+
+      Install options for the server. This is used to install additional packages to this server
+
+      For image optimization, it will install sharp by default
+
+      ##### `packages` - Mandatory
+
+      This is an array of packages that will be installed in the server. It is an array of string.
+      Installing stuff on the default server (or one of the splitted one) might require some extra config on Next side to avoid duplicates
+
+      ##### `arch`
+
+      This is the architecture of the server. It is a string and by default, it is set to `x64`.
+
+      Possible values are: `x64`, `arm64`
+
+      TODO: Add the other options and explain how to install packages on the default or splitted server functions
+
+    </Tabs.Tab>
+    <Tabs.Tab>
+      ### `runtime`
+
+      Runtime used for the server. The default server only support `node` or `deno`.
+
+      The `edge` runtime can only be used for splitted server and only support one route per server.
+      This also requires the route to be using the edge runtime from Next.js.
+
+      Possible values are: `node`, `deno`, `edge`
+
+      ### `placement`
+
+      Option to determine where the server will be deployed. On a single region or on multiple regions at the edge.
+      
+      This options does not have any effect on the build output, but is just an indication for IAC tools to know where to deploy the server.
+
+      Possible values are: `regional`, `global`
+
+      ### `experimentalBundledNextServer`
+      Bundle Next server into a single file.
+      This results in a way smaller bundle but it might break for some cases.
+      
+      This option is deprecated and doesn't work for Next 14.2+.
+
+      ### `override`
+
+      For both default and splitted server, in addition to `override` in the common options, you can also use the following options:
+
+      #### `incrementalCache`
+
+      Add possibility to override the default s3 cache. Used for fetch cache and html/rsc/json cache.
+
+      Possible values are: `s3`, `s3-lite`, `dummy` or a `LazyLoadedOverride` that will return the incremental cache.
+
+      #### `tagCache`
+
+      Add possibility to override the default tag cache. Used for revalidateTags and revalidatePath.
+
+      Possible values are: `dynamodb`, `dynamodb-lite`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
+
+      #### `queue`
+
+      Add possibility to override the default queue. Used for ISR revalidation requests.
+
+      Possible values are: `sqs`, `sqs-lite`, `dummy` or a `LazyLoadedOverride` that will return the queue.
+    </Tabs.Tab>
+    <Tabs.Tab>
+      Every splitted server will have the same options as the default server. In addition to that, you can use the following options:
+
+      ### `routes` - Mandatory
+
+      Here you should specify all the routes you want to use.
+      For app routes, you should use the `app/${name}/route` format or `app/${name}/page` for pages.
+      For pages, you should use the `page/${name}` format.
+
+      For example:
+      ```ts
+      routes: ["app/api/test/route", "app/page", "pages/admin"]
+      ```
+
+      ### `patterns` - Mandatory
+
+      Specify the patterns that will be used to match the routes. It is an array of string.
+      It needs to be cloudfront compatible.
+
+      For example:
+      ```ts
+      patterns: [
+        // This one will match all the routes that start with /api/
+        "/api/*",
+        // For a single route, this one will only match /page
+        "/page",
+      ]
+      ```
+
+    </Tabs.Tab>
+    <Tabs.Tab>
+      ### `external` - Mandatory
+      Only possible value is true. This is used to specify that this server is an external middleware.
+
+      ### `override`
+
+      It uses the same options as the default server. `incrementalCache`, `tagCache` and `queue` are only used when `enableCacheInterception` is set to true.
+
+      ### `originResolver`
+
+      Origin resolver is used to resolve the origin for internal rewrite. By default, it uses the pattern-env origin resolver.
+      
+      Possible values are: `pattern-env`, `dummy` or a `LazyLoadedOverride` that will return the origin resolver.
+    </Tabs.Tab>
+    <Tabs.Tab>
+      Image optimization server is a special server that will handle the `_next/image` optimization. Besides the common options, you can use the following options:
+
+      ### `loader`
+      The image loader is used to load the image from the source.
+
+      Possible values are: `s3`, `host`, `dummy` or a `LazyLoadedOverride` that will return the loader.
+    </Tabs.Tab>
+    <Tabs.Tab>
+      Revalidate doesn't have any specific options. It only uses the common options.
+    </Tabs.Tab>
+    <Tabs.Tab>
+      Warmer is a special server that will be used to warm the lambda function. Besides the common options, you can use the following options:
+
+      ### `invokeFunction`
+
+      By default, works for lambda only.
+      If you override this, you'll need to handle the warmer event in the wrapper
+
+      Possible values are: `aws-lambda`, `dummy` or a `LazyLoadedOverride` that will return the invoke function.
+    </Tabs.Tab>
+    <Tabs.Tab>
+    Initialization function is a special server that will run at build time to initialize the cache. By default, it only initializes the tag cache. Besides the common options, you can use the following options:
+
+    ### `tagCache`
+
+    Add possibility to override the default tag cache used for the initialization function.
+
+    Possible values are: `dynamodb`, `dynamodb-lite`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
+  </Tabs.Tab>
+  </Tabs>
+
+</Tabs.Tab>
+<Tabs.Tab>
+These options are at the top level of your config object.
+
+### `buildCommand`
+
+This is the command that will be run to build your Next.js app. By default, it tries to find your package manager and will run `npm run build`. It supports npm, pnpm, yarn (not pnp) and bun.
+
+If you want to specify a different command, you can do so here.
+
+### `appPath`
+
+The path to the root of the Next.js app's source code. This path is relative from the current process.cwd(). *
+
+By default, it is set to `.`
+
+### `buildOutputPath`
+
+The path to the target folder of build output from the `buildCommand` option (the path which will contain the `.next` and `.open-next` folders). This path is relative from the current process.cwd()
+
+By default, it is set to `.`
+
+### `packageJsonPath`
+
+The path to the package.json file of the Next.js app. This path is relative from the current process.cwd().
+
+### `edgeExternals` - Advanced usage
+
+If you use the edge runtime somewhere (either in the middleware or in the functions), we compile 2 versions of the open-next.config.ts file. One for the node runtime and one for the edge runtime.
+
+This option allows you to specify the externals for the edge runtime used in esbuild for the compilation of open-next.config.ts
+It is especially useful if you use some custom overrides only in node
+
+### `dangerous`
+
+These are options that you should only use if you know what you are doing. It can break your app at runtime if not used correctly.
+It is also the place where you could find some experimental features.
+
+---
+
+
+#### `disableTagCache`
+
+This will disable the tag cache. You can disable it safely if you only use page router.
+It is used for `revalidateTag` and `revalidatePath`.
+It's a boolean and by default, it is set to `false`.
+
+
+#### `disableIncrementalCache`
+
+This will disable the incremental cache. It is generally not recommended, as this is necessary for ISR **AND** SSG routes as well as the fetch cache.
+It's a boolean and by default, it is set to `false`.
+
+#### `enableCacheInterception` - Experimental
+
+This will enable cache interception. It will allow you to intercept the cache system directly inside OpenNext routing layer and serve the page directly from the cache without going through `NextServer`. 
+
+If the cache interception fail, the request will be forwarded to the `NextServer` as usual.
+
+#### `headersAndCookiesPriority`
+
+Function to determine which headers or cookies takes precedence.
+By default, the middleware headers and cookies will override the handler headers and cookies.
+
+This is executed for every request and after next config headers and middleware has executed.
+Here is a very simple example of how you can use it:
+
+```ts
+// In this case, if the request starts with /api, the middleware headers and cookies will take precedence otherwise the handler headers and cookies will take precedence
+headersAndCookiesPriority: (event) => {
+  if (event.rawPath.startsWith('/api')) {
+    return 'middleware';
+  }
+  return 'handler';
+},
+```
+</Tabs.Tab>
+</Tabs>
\ No newline at end of file

From 61d651bf6f34f6f170bc746664ede00f7080baa0 Mon Sep 17 00:00:00 2001
From: Agustinus Nathaniel <berserk.nate@gmail.com>
Date: Mon, 18 Nov 2024 21:40:36 +0700
Subject: [PATCH 019/140] docs(netlify): fix typo (#33)

---
 pages/netlify/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/netlify/index.mdx b/pages/netlify/index.mdx
index cd301f5..99d1fb5 100644
--- a/pages/netlify/index.mdx
+++ b/pages/netlify/index.mdx
@@ -35,7 +35,7 @@ The easiest way to get started is to deploy our Next.js platform starter templat
 
 - **App Router:** Netlify fully supports the Next.js App Router, which supports more powerful nested layouts and React’s latest features, such as Server Components and Streaming.
 
-- **Automatic fine-grained caching:** thehe adapter uses fine-grained caching on Netlify to support the Next.js Full Route Cache and Data Cache. This means that static page responses are automatically cached at the edge and can be revalidated by path or by tag.
+- **Automatic fine-grained caching:** the adapter uses fine-grained caching on Netlify to support the Next.js Full Route Cache and Data Cache. This means that static page responses are automatically cached at the edge and can be revalidated by path or by tag.
 
 - **On-demand and time-based revalidation:** both the App Router and Pages Router support on-demand and time-based revalidation, allowing you to revalidate and regenerate content at any time after a deploy.
 

From c0d3199bbcebb6c995a3b34cca9a4823d9f76888 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 26 Nov 2024 11:14:39 +0100
Subject: [PATCH 020/140] sync aws doc with code (#34)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/aws/config/custom_overrides.mdx         | 38 ++++++++---------
 pages/aws/config/full_example.mdx             | 28 ++++++-------
 pages/aws/config/nx.mdx                       | 42 +++++++++----------
 pages/aws/config/simple_example.mdx           | 14 +++----
 pages/aws/contribute.mdx                      |  4 +-
 pages/aws/contribute/local_run.mdx            | 20 ++++-----
 .../aws/inner_workings/cache_interception.mdx |  4 +-
 7 files changed, 75 insertions(+), 75 deletions(-)

diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index 7e319a9..faac2ca 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -3,7 +3,7 @@ import { Callout } from 'nextra/components'
 In some cases the simple example is not enough, and you want to add more customization to your server. This is where the lazy loaded overrides come in. You can override any part of the server by providing a function that returns a promise that resolves to the override object. This is useful when you want to add custom logic to your server, like adding a custom queue, or adding a custom converter.
 
 <Callout>
-Be careful if you use the edge runtime (either in a function or by using the external middleware), we do 2 compilations of the `open-next.config.ts`, one for node and one for the edge runtime. If you're using some custom overrides, you likely want to add 
+Be careful if you use the edge runtime (either in a function or by using the external middleware), we do 2 compilations of the `open-next.config.ts`, one for node and one for the edge runtime. If you're using some custom overrides, you likely want to add
 ```ts
 edgeExternals: ['./customWrapper', './anyOtherOverrideUsed']
 ```
@@ -13,14 +13,14 @@ to your `open-next.config.ts` to avoid the edge runtime to try to compile overri
 
 ## Custom converter
 
-Sometimes you might want to modify the object received by OpenNext. For example `Config.YOUR_SECRET_KEY` from sst cannot be used in the middleware, so you might want to add it to the headers. This is where the custom converter comes in. You can add a custom converter to modify the object before it is passed to OpenNext. 
+Sometimes you might want to modify the object received by OpenNext. For example `Config.YOUR_SECRET_KEY` from sst cannot be used in the middleware, so you might want to add it to the headers. This is where the custom converter comes in. You can add a custom converter to modify the object before it is passed to OpenNext.
 
 You'll still have to use a fallback value during dev as this is not used by the dev server.
 
 ```ts
 // customConverter.ts
-import converter from 'open-next/converters/aws-apigw-v2.js'
-import type { Converter } from 'open-next/types/open-next'
+import converter from '@opennextjs/aws/overrides/converters/aws-apigw-v2.js'
+import type { Converter } from '@opennextjs/aws/types/overrides.js'
 import { Config } from 'sst/node/Config'
 const mySecretKey = Config.YOUR_SECRET_KEY
 
@@ -28,7 +28,7 @@ export default {
   convertFrom: async (event) => {
     const result = await converter.convertFrom(event)
     return {
-      ...result, 
+      ...result,
       headers: {
         ...result.headers,
         'inserted-in-converter': '1',
@@ -52,7 +52,7 @@ export default {
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from 'open-next/types/open-next'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
 
 const config = {
   default: {
@@ -70,7 +70,7 @@ Here we provide a few examples for some custom wrapper.
 
 ```ts
 // customWrapper.ts
-import defaultWrapper from 'open-next/wrappers/aws-lambda.js'
+import defaultWrapper from '@opennextjs/aws/overrides/wrappers/aws-lambda.js'
 
 //Here you can define some globals
 declare global {
@@ -88,7 +88,7 @@ export default defaultWrapper
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from 'open-next/types/open-next'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
 const config = {
   default: {
     override: {
@@ -106,8 +106,8 @@ import { NextResponse } from 'next/server'
 import type { NextRequest } from 'next/server'
 
 // Here you need to mock the global if not present
-// One way to avoid issues with different implementation would be to create an api endpoint 
-// that uses the exact same logic as the global you defined earlier, 
+// One way to avoid issues with different implementation would be to create an api endpoint
+// that uses the exact same logic as the global you defined earlier,
 // and that is only available during development i.e. /api/dev/myApi
 if(!globalThis.myApi) {
   globalThis.myApi = async () => {
@@ -117,7 +117,7 @@ if(!globalThis.myApi) {
 
 export function middleware(request: NextRequest) {
   // You can also send an error in the api endpoint itself
-  // Or you could add all the dev endpoint in their own lambda 
+  // Or you could add all the dev endpoint in their own lambda
   // that you do not deploy in production
   if(request.nextUrl.pathname.startsWith('/api/dev') && process.env.NODE_ENV === 'production') {
     return NextResponse('This route is only available in development',{
@@ -129,7 +129,7 @@ export function middleware(request: NextRequest) {
 
   // ... your code here
 }
- 
+
 ```
 
 
@@ -137,8 +137,8 @@ export function middleware(request: NextRequest) {
 
 ```ts
 // customWrapper.ts
-import streamingWrapper from 'open-next/wrappers/aws-lambda.js'
-import {WrapperHandler} from 'open-next/types/open-next'
+import streamingWrapper from '@opennextjs/aws/overrides/wrappers/aws-lambda.js'
+import type { WrapperHandler } from '@opennextjs/aws/types/overrides.js'
 import middy from '@middy/core'
 import httpSecurityHeaders from '@middy/http-security-headers'
 
@@ -158,7 +158,7 @@ export default {
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from 'open-next/types/open-next'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
 const config = {
   default: {
     override: {
@@ -182,11 +182,11 @@ import type {
   APIGatewayProxyEventV2,
   APIGatewayProxyResultV2,
 } from "aws-lambda";
-import type { StreamCreator } from "open-next/http/openNextResponse";
+import type { StreamCreator } from "@opennextjs/aws/http/openNextResponse.js";
 import { Writable } from "node:stream";
 
-import { WarmerEvent, WarmerResponse } from "open-next/adapters/warmer-function";
-import type { WrapperHandler } from "open-next/types/open-next";
+import { WarmerEvent, WarmerResponse } from "@opennextjs/aws/adapters/warmer-function.js";
+import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
 
 type AwsLambdaEvent =
   | APIGatewayProxyEventV2
@@ -268,7 +268,7 @@ export default {
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from 'open-next/types/open-next'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
 const config = {
   default: {
     override: {
diff --git a/pages/aws/config/full_example.mdx b/pages/aws/config/full_example.mdx
index e0ace38..1415679 100644
--- a/pages/aws/config/full_example.mdx
+++ b/pages/aws/config/full_example.mdx
@@ -1,4 +1,4 @@
-Here is a detailed example of an `open-next.config.ts` file: 
+Here is a detailed example of an `open-next.config.ts` file:
 This file need to be at the same place as your `next.config.js` file
 
 `server` in here could refer to a lambda function, a docker container, a node server or whatever that can support running nodejs code. (Even cloudflare workers in the future)
@@ -6,12 +6,12 @@ This file need to be at the same place as your `next.config.js` file
 For more information about the options here, take a look at the [components section](/aws/components/overview).
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
 const config = {
   default: { // This is the default server, similar to the server-function in open-next v2
-    // You don't have to provide the below, by default it will generate an output 
+    // You don't have to provide the below, by default it will generate an output
     // for normal lambda as in open-next v2
-    override: { 
+    override: {
       wrapper: "aws-lambda-streaming", // This is necessary to enable lambda streaming
       // You can override any part that is a `LazyLoadedOverride` this way
       queue: () => Promise.resolve({
@@ -24,7 +24,7 @@ const config = {
   },
   // Below we define the functions that we want to deploy in a different server
   // This is only used if you want to split the server into multiple servers
-  functions: { 
+  functions: {
     ssr: {
       routes: [
         "app/api/isr/route", "app/api/sse/route", "app/api/revalidateTag/route", // app dir Api routes
@@ -37,7 +37,7 @@ const config = {
       },
       // This enables the bundled next server which is faster and reduce the size of the server
       // This is also experimental and might not work in all cases
-      experimentalBundledNextServer: true 
+      experimentalBundledNextServer: true
     },
     pageSsr: {
       routes: ["pages/pageSsr"], // For page dir routes should be in the form `pages/${route}` without the extension, it should match the filesystem
@@ -56,24 +56,24 @@ const config = {
       routes: ["app/ssr/page"],
       patterns: ["ssr"],
       override: {}
-    }    
+    }
   },
-  // By setting this, it will create another bundle for the middleware, 
-  // and the middleware will be deployed in a separate server. 
+  // By setting this, it will create another bundle for the middleware,
+  // and the middleware will be deployed in a separate server.
   // If not set middleware will be bundled inside the servers
   // It could be in lambda@edge, cloudflare workers, or anywhere else
   // By default it uses lambda@edge
   // This is not implemented in the reference construct implementation.
   // This is optional, but might be necessary if you split your app into multiple servers
   middleware: {
-    external: true 
+    external: true
   }
 
   // Optional
   imageOptimization: {
     // This is the architecture of the image, it could be x64 or arm64
     // This is necessary to bundle the proper version of sharp
-    arch: "x64", 
+    arch: "x64",
   }
 
   // If you want to override the default build command, you can do it here
@@ -83,14 +83,14 @@ const config = {
   dangerous: {
     // This will disable the tag cache
     // You can use it safely on page router, on app router it will break revalidateTag and revalidatePath
-    disableTagCache: true, 
+    disableTagCache: true,
     // This will disable the incremental cache
     // This is generally not recommended, as this is necessary for ISR AND SSG routes as well as the fetch cache
-    disableIncrementalCache: true, 
+    disableIncrementalCache: true,
   }
 
   //The path to the target folder of build output from the `buildCommand` option (the path which will contain the `.next` and `.open-next` folders). This path is relative from the current process.cwd() - Optional default to "."
-  buildOutputPath: "build", 
+  buildOutputPath: "build",
 
   //The path to the root of the Next.js app's source code. This path is relative from the current process.cwd(). - Optional default to "."
   appPath: "app",
diff --git a/pages/aws/config/nx.mdx b/pages/aws/config/nx.mdx
index a0d034a..0493b2a 100644
--- a/pages/aws/config/nx.mdx
+++ b/pages/aws/config/nx.mdx
@@ -3,14 +3,14 @@ Here's a detailed exampled of how to add open-next + SST to an existing Nx works
 
 1. install `open-next`: `pnpm add —save-dev open-next`
 
-2. Update your `apps/next-site/next.config.js` add `output: ‘standalone’`, and you want to add `experimental.outputFileTracingRoot`, it should look a little like this: 
+2. Update your `apps/next-site/next.config.js` add `output: ‘standalone’`, and you want to add `experimental.outputFileTracingRoot`, it should look a little like this:
 ```javascript
 //@ts-check
- 
+
 // eslint-disable-next-line @typescript-eslint/no-var-requires
 const { composePlugins, withNx } = require('@nx/next');
 const { join } = require('node:path');
- 
+
 /**
  * @type {import('@nx/next/plugins/with-nx').WithNxOptions}
  **/
@@ -26,18 +26,18 @@ const nextConfig = {
 +     outputFileTracingRoot: join(__dirname, '../../'),
 +   },
 };
- 
+
 const plugins = [
    // Add more Next.js plugins to this list if needed.
    withNx,
 ];
- 
+
 module.exports = composePlugins(...plugins)(nextConfig);
 ```
 
-3. Create `open-next.config.js` inside your apps root directory, it should look a little something like this: 
+3. Create `open-next.config.js` inside your apps root directory, it should look a little something like this:
 ```javascript
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 
 const config = {
   default: {},
@@ -50,13 +50,13 @@ const config = {
 export default config;
 ```
 
-4. Set up nx's targets/tasks 
+4. Set up nx's targets/tasks
 
 Now we have open-next configuration set up, you can try to run `open-next build` and depending on whether you have already built your next app or not
-it might even work. 
+it might even work.
 
 However, we don't want to rely on needing to manually running a build every time we want to deploy a change, so instead we can set up a target.
-We do this in your project's `project.json` (in this case, living at `apps/next-site/project`), we want to find the targets object and update it: 
+We do this in your project's `project.json` (in this case, living at `apps/next-site/project`), we want to find the targets object and update it:
 ```diff
 {
   "name": "next-site",
@@ -66,7 +66,7 @@ We do this in your project's `project.json` (in this case, living at `apps/next-
   "tags": [],
   "targets": {
 +    "open-next-build": { // name of the target, this is what you will call
-+      "executor": "nx:run-commands", 
++      "executor": "nx:run-commands",
 +      "dependsOn": ["build"], // this ensures that Nx will build our next app before running this command.
 +      "cache": true, // cache the output, good for if you want to use DTE/Nx cloud
 +      "outputs": ["{projectRoot}/.open-next"], // tell nx where the output lives
@@ -79,7 +79,7 @@ We do this in your project's `project.json` (in this case, living at `apps/next-
 }
 
 ```
-Next we need to add the open-next directory to our eslint's `ignorePatterns` array 
+Next we need to add the open-next directory to our eslint's `ignorePatterns` array
 ```diff
 {
   "extends": [
@@ -120,13 +120,13 @@ now, when you run `nx open-next-build next-site`, nx will automatically build th
 
 5. Deploying with SST
 
-Now, we have a built app, ready to deploy, so how do we get it onto SST/AWS ? Good question! 
+Now, we have a built app, ready to deploy, so how do we get it onto SST/AWS ? Good question!
 
 We are using `sst ion` in this example. i will assume you have already have the cli installed, (if not, check here on how!)[https://ion.sst.dev/],
 but we will not use the SST cli to init this project, because it wants to add a package.json to your next app, and it will look like it's working, but you will end up with a big far server error (all because the package.json overrides whatever nx _thinks_ there should be, and it will miss a bunch of dependencies). we will instead manually set this up:
 
 - let's add the sst package with `pnpm add sst@ion`, and the required packages for SST to work with AWS `pnpm add --save-dev aws-cdk-lib constructs @types/aws-lambda`
-- then we want to manually create an `sst.config.ts` file in `apps/next-site` that looks like this: 
+- then we want to manually create an `sst.config.ts` file in `apps/next-site` that looks like this:
 
 ```typescript
 /// <reference path="./.sst/platform/config.d.ts" />
@@ -150,7 +150,7 @@ export default $config({
 
 - now, you probably see some type errors, as SST is not initialized yet, but we can resolve this by running
 ```bash
-$ cd apps/next-site && sst install 
+$ cd apps/next-site && sst install
 ```
 
 this will resolve the type issues and initialise SST.
@@ -197,7 +197,7 @@ this will resolve the type issues and initialise SST.
 }
 ```
 
-- now, if you want to run `sst dev` you can do so with `sst dev "nx dev next-site"` similarly deploying can be done with `sst deploy`...but you probably want to set up that task chaining, again we can do that by adding a target to your app, and setting it's `dependsOn` to the `open-next-build`, here's what it might look like: 
+- now, if you want to run `sst dev` you can do so with `sst dev "nx dev next-site"` similarly deploying can be done with `sst deploy`...but you probably want to set up that task chaining, again we can do that by adding a target to your app, and setting it's `dependsOn` to the `open-next-build`, here's what it might look like:
 
 ```diff
 {
@@ -208,9 +208,9 @@ this will resolve the type issues and initialise SST.
   "tags": [],
   "targets": {
     "open-next-build": {
-      "executor": "nx:run-commands", 
+      "executor": "nx:run-commands",
       "dependsOn": ["build"],
-      "cache": true, 
+      "cache": true,
       "outputs": ["{projectRoot}/.open-next"],
       "options": {
         "cwd": "apps/next-site",
@@ -234,7 +234,7 @@ this will resolve the type issues and initialise SST.
 +          "args": ["--stage=staging"]
 +        },
 +        "dev": {
-+          "args": ["--stage=development"] 
++          "args": ["--stage=development"]
 +        }
 +      }
 +    }
@@ -244,9 +244,9 @@ this will resolve the type issues and initialise SST.
 
 ```
 
-now we can run (or if you want a custom stage, you can simply do `nx deploy next-site --stage this-is-my-stage` and it will be passed directly to the sst command). 
+now we can run (or if you want a custom stage, you can simply do `nx deploy next-site --stage this-is-my-stage` and it will be passed directly to the sst command).
 ```bash
 $ nx deploy next-site --configuration dev # using dev configuration (which sets the stage to development)
 # nx deploy next-site -c dev # OR
-# nx deploy next-site --stage my-stage # Custom Stage 
+# nx deploy next-site --stage my-stage # Custom Stage
 ```
\ No newline at end of file
diff --git a/pages/aws/config/simple_example.mdx b/pages/aws/config/simple_example.mdx
index 5fde1fe..0ba089d 100644
--- a/pages/aws/config/simple_example.mdx
+++ b/pages/aws/config/simple_example.mdx
@@ -22,7 +22,7 @@ Here you can find the most common `open-next.config.ts` file examples that you c
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
 const config = {
   default: {
     override: {
@@ -37,7 +37,7 @@ export default config;
 ## Splitting the server
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   // This is the default server, similar to the server-function in open-next v2
   // In this case we are not providing any override, so it will generate a normal lambda (i.e. no streaming)
@@ -72,7 +72,7 @@ export default config;
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {
     override: {
@@ -89,7 +89,7 @@ export default config;
 ## Running in Lambda@Edge
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {
     placement: 'global',
@@ -111,7 +111,7 @@ Be aware that this uses the exact same system for ISR/SSG as the default lambda
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   // In this case, the default server is meant to run as a classic Node server
   // To execute the server you need to run `node index.mjs` inside `.open-next/server-functions/default`
@@ -146,7 +146,7 @@ This will generate 2 server functions, the default one and the edge one. The edg
 Edge runtime function have less cold start time, but you can only deploy one route per function. They also do not have the middleware bundled in the function, so you need to use external middleware if you need it in front of the edge function.
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {},
   functions: {
@@ -169,7 +169,7 @@ With the default middleware configuration, it is bundled for a deployment in lam
 This is how you can do it:
 
 ```ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {},
   functions: {
diff --git a/pages/aws/contribute.mdx b/pages/aws/contribute.mdx
index 7c78267..eb47b23 100644
--- a/pages/aws/contribute.mdx
+++ b/pages/aws/contribute.mdx
@@ -3,7 +3,7 @@ To run `OpenNext` locally:
 1. Clone [this repository](https://github.com/opennextjs/opennextjs-aws).
 2. Build `open-next`:
    ```bash
-   cd open-next
+   cd opennextjs-aws
    pnpm build
    ```
 3. Run `open-next` in watch mode:
@@ -13,7 +13,7 @@ To run `OpenNext` locally:
 4. Now, you can make changes in `open-next` and build your Next.js app to test the changes.
    ```bash
    cd path/to/my/nextjs/app
-   path/to/open-next/packages/open-next/dist/index.js build
+   path/to/opennextjs-aws/packages/open-next/dist/index.js build
    ```
 
 It can be a bit cumbersome to need to deploy every time you want to test changes. If your change is not dependent on the wrapper or the converter, then you can create a custom `open-next.config.ts` file, you can take a look [here](/aws/contribute/local_run) for more information.
diff --git a/pages/aws/contribute/local_run.mdx b/pages/aws/contribute/local_run.mdx
index 4a46179..666532b 100644
--- a/pages/aws/contribute/local_run.mdx
+++ b/pages/aws/contribute/local_run.mdx
@@ -3,16 +3,16 @@ When making some changes to OpenNext, it can be a bit cumbersome to need to depl
 To run `OpenNext` locally:
 ```bash
 # This is to build (the config-path is needed if you use a different name than the default one)
-node /path/to/open-next/packages/open-next/dist/index.js build --config-path open-next.local.config.ts
+node /path/to/opennextjs-aws/packages/open-next/dist/index.js build --config-path open-next.local.config.ts
 # Then to run the server
 node .open-next/server-functions/default/index.mjs
 ```
 
 ```typescript
-// open-next.local.config.ts - 
-// A good practice would be to use a different name so that it doesn't conflict 
+// open-next.local.config.ts -
+// A good practice would be to use a different name so that it doesn't conflict
 // with your existing open-next.config.ts i.e. open-next.local.config.ts
-import type {OpenNextConfig} from 'open-next/types/open-next'
+import type {OpenNextConfig} from '@opennextjs/aws/types/open-next.js'
 
 const config = {
   default: {
@@ -60,13 +60,13 @@ export default config
 // dev/wrapper.ts
 // You'll need to install express
 import express from 'express'
-// The proxy is used to proxy the image optimization server 
+// The proxy is used to proxy the image optimization server
 // you don't have to use it, but image request will return 500 error
 import proxy from 'express-http-proxy'
 import { fork } from 'child_process'
 
-import type { StreamCreator } from "open-next/http/openNextResponse";
-import type { WrapperHandler } from "open-next/types/open-next";
+import type { StreamCreator } from "@opennextjs/aws/http/openNextResponse.js";
+import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
 
 const wrapper: WrapperHandler = async (handler, converter) => {
   const app = express();
@@ -120,7 +120,7 @@ export default {
 
 ```typescript
 // dev/incrementalCache.ts
-import type {IncrementalCache} from 'open-next/cache/incremental/types'
+import type { IncrementalCache } from '@opennextjs/aws/types/overrides.js'
 
 import fs from 'node:fs/promises'
 import path from 'node:path'
@@ -157,7 +157,7 @@ export default cache
 
 ```typescript
 // dev/queue.ts
-import type {Queue} from 'open-next/queue/types'
+import type { Queue } from '@opennextjs/aws/types/overrides.js'
 
 declare global {
   // This is declared in the global scope so that we can use it in the queue
@@ -168,7 +168,7 @@ declare global {
 const queue: Queue = {
   name: 'dev-queue',
   send: async (message) => {
-    const prerenderManifest  = (await import('open-next/adapters/config')).PrerenderManifest as any
+    const prerenderManifest  = (await import('@opennextjs/aws/adapters/config.js')).PrerenderManifest as any
     const revalidateId : string = prerenderManifest.preview.previewModeId
     await globalThis.internalFetch(`http://localhost:3000${message.MessageBody.url}`, {
       method: "HEAD",
diff --git a/pages/aws/inner_workings/cache_interception.mdx b/pages/aws/inner_workings/cache_interception.mdx
index d0fbb1e..d19ec18 100644
--- a/pages/aws/inner_workings/cache_interception.mdx
+++ b/pages/aws/inner_workings/cache_interception.mdx
@@ -16,7 +16,7 @@ To enable cache interception, you need to add `enableCacheInterception` option i
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from 'open-next/types/open-next';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {
   },
@@ -24,7 +24,7 @@ const config = {
     enableCacheInterception: true,
   },
 } satisfies OpenNextConfig;
- 
+
 export default config;
 
 ```

From 23e910f1277fec997900afeae15f0baaf6f38091 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Tue, 26 Nov 2024 12:14:03 +0100
Subject: [PATCH 021/140] Docs(aws): custom overrides for aws (#35)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/aws/config/_meta.json                   |  3 ++-
 pages/aws/config/overrides/_meta.json         | 11 ++++++++++
 pages/aws/config/overrides/converter.mdx      |  9 ++++++++
 pages/aws/config/overrides/image_loader.mdx   |  5 +++++
 .../config/overrides/incremental_cache.mdx    |  8 +++++++
 .../aws/config/overrides/invoke_function.mdx  |  5 +++++
 .../aws/config/overrides/origin_resolver.mdx  |  6 +++++
 .../overrides/proxy_external_request.mdx      |  3 +++
 pages/aws/config/overrides/queue.mdx          |  8 +++++++
 pages/aws/config/overrides/tag_cache.mdx      | 12 ++++++++++
 pages/aws/config/overrides/wrapper.mdx        |  9 ++++++++
 pages/aws/config/reference.mdx                | 22 ++++++++++++-------
 pages/aws/contribute/local_run.mdx            |  7 +++++-
 13 files changed, 98 insertions(+), 10 deletions(-)
 create mode 100644 pages/aws/config/overrides/_meta.json
 create mode 100644 pages/aws/config/overrides/converter.mdx
 create mode 100644 pages/aws/config/overrides/image_loader.mdx
 create mode 100644 pages/aws/config/overrides/incremental_cache.mdx
 create mode 100644 pages/aws/config/overrides/invoke_function.mdx
 create mode 100644 pages/aws/config/overrides/origin_resolver.mdx
 create mode 100644 pages/aws/config/overrides/proxy_external_request.mdx
 create mode 100644 pages/aws/config/overrides/queue.mdx
 create mode 100644 pages/aws/config/overrides/tag_cache.mdx
 create mode 100644 pages/aws/config/overrides/wrapper.mdx

diff --git a/pages/aws/config/_meta.json b/pages/aws/config/_meta.json
index 662c997..61715fd 100644
--- a/pages/aws/config/_meta.json
+++ b/pages/aws/config/_meta.json
@@ -3,5 +3,6 @@
   "custom_overrides": "Custom Overrides",
   "reference": "Reference",
   "full_example": "Full Example",
-  "nx": "Nx Monorepo"
+  "nx": "Nx Monorepo",
+  "overrides": "Overrides"
 }
\ No newline at end of file
diff --git a/pages/aws/config/overrides/_meta.json b/pages/aws/config/overrides/_meta.json
new file mode 100644
index 0000000..b936b59
--- /dev/null
+++ b/pages/aws/config/overrides/_meta.json
@@ -0,0 +1,11 @@
+{
+  "wrapper": "Wrapper",
+  "converter": "Converter",
+  "incremental_cache": "Incremental Cache",
+  "tag_cache": "Tag Cache",
+  "queue": "Revalidation Queue",
+  "image_loader": "Image Loader",
+  "proxy_external_request": "External Request Proxy",
+  "origin_resolver": "Origin Resolver",
+  "invoke_function": "Invoke Function for the warmer"
+}
\ No newline at end of file
diff --git a/pages/aws/config/overrides/converter.mdx b/pages/aws/config/overrides/converter.mdx
new file mode 100644
index 0000000..ca2e624
--- /dev/null
+++ b/pages/aws/config/overrides/converter.mdx
@@ -0,0 +1,9 @@
+This override is meant to convert request and response provided from your wrapper to the internal types that are used by OpenNext.
+
+If you want to better understand how to implement your own Converter, the easiest way would be to take a look at one of the existing [included Converter](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/converters)
+
+Couple of things to note :
+- If you use a `StreamCreator` in your wrapper, you probably don't need to do anything in the `convertTo` function.
+- If used for the default, the image optimization, or one of the splitted server the internal types will be `InternalEvent` and `InternalResult` respectively.
+- If used for the external middleware, the internal types will be `InternalEvent` and `InternalResult | MiddlewareOutputEvent` respectively.
+- For the other servers, look up their respective types in the codebase.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/image_loader.mdx b/pages/aws/config/overrides/image_loader.mdx
new file mode 100644
index 0000000..459b14c
--- /dev/null
+++ b/pages/aws/config/overrides/image_loader.mdx
@@ -0,0 +1,5 @@
+This override is used by OpenNext and more specifically by the image server to be able to load images from a custom source. Images are not bundled with the image server and are loaded from the source specified in the override.
+
+This is used for internal image only (i.e. src without host). External source are already handled by the image server.
+
+If you want to better understand how to implement your own ImageLoader, the easiest way would be to take a look at the existing [included ImageLoader](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/imageLoader).
\ No newline at end of file
diff --git a/pages/aws/config/overrides/incremental_cache.mdx b/pages/aws/config/overrides/incremental_cache.mdx
new file mode 100644
index 0000000..de287ce
--- /dev/null
+++ b/pages/aws/config/overrides/incremental_cache.mdx
@@ -0,0 +1,8 @@
+This override is used by the [`cache` adapter](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/adapters/cache.ts) that is provided by OpenNext to the NextServer. It is also used by OpenNext if `enableCacheInterception` is set to `true` in the configuration.
+
+It is used for retrieving and updating the ISR/SSG cache as well as the fetch cache used by Next.js. It does not handle anything related to cache tags (i.e. `revalidateTag` and `revalidatePath`)
+
+If you want to better understand how to implement your own IncrementalCache, the easiest way would be to take a look at the existing [included IncrementalCache](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/incrementalCache).
+
+One thing to note is that it is not used at build time, only at runtime. This means that you'll have to upload the cache yourself if you want to use the prebuilt routes/pages (And this is mandatory for ISR/SSG routes with `fallback:false`).
+All the cache files are present in the `.open-next/cache` folder. The one under `BUILD_ID` are for the ISR/SSG cache and the one under `__fetch/BUILD_ID` are for the fetch cache.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/invoke_function.mdx b/pages/aws/config/overrides/invoke_function.mdx
new file mode 100644
index 0000000..ce7e464
--- /dev/null
+++ b/pages/aws/config/overrides/invoke_function.mdx
@@ -0,0 +1,5 @@
+This override is used by OpenNext to invoke the function for warmup purposes. It is only used in the warmer server.
+
+If you want to better understand how to implement your own InvokeFunction, the easiest way would be to take a look at the existing [included InvokeFunction](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/warmer).
+
+You could override this to provide some custom logic to invoke more or less function depending on the hour for example.
diff --git a/pages/aws/config/overrides/origin_resolver.mdx b/pages/aws/config/overrides/origin_resolver.mdx
new file mode 100644
index 0000000..09737cc
--- /dev/null
+++ b/pages/aws/config/overrides/origin_resolver.mdx
@@ -0,0 +1,6 @@
+This override is used by OpenNext to resolve the origin of the request. This is for internal requests only and is needed to support the `external` middleware.
+This is only used by the external middleware.
+
+At build time, we may not know where the splitted server will be deployed, so we need to resolve the origin at runtime. This is why we need this override. The origin is resolved by this override will need to be handled by the wrapper used. At the moment, only the `aws-cloudfront` and the `cloudflare-edge` wrapper are able to do so.
+
+If you want to better understand how to implement your own OriginResolver, the easiest way would be to take a look at the existing [included OriginResolver](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/originResolver).
\ No newline at end of file
diff --git a/pages/aws/config/overrides/proxy_external_request.mdx b/pages/aws/config/overrides/proxy_external_request.mdx
new file mode 100644
index 0000000..f9e3a16
--- /dev/null
+++ b/pages/aws/config/overrides/proxy_external_request.mdx
@@ -0,0 +1,3 @@
+This override is used by OpenNext to proxy rewritten requests to external services. It is used either in the `external` middleware (if set) or in the default/splitted server if the middleware is bundled.
+
+If you want to better understand how to implement your own ProxyExternalRequest, the easiest way would be to take a look at the existing [included ProxyExternalRequest](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/proxyExternalRequest).
\ No newline at end of file
diff --git a/pages/aws/config/overrides/queue.mdx b/pages/aws/config/overrides/queue.mdx
new file mode 100644
index 0000000..359ac8c
--- /dev/null
+++ b/pages/aws/config/overrides/queue.mdx
@@ -0,0 +1,8 @@
+This override is used by OpenNext to trigger the revalidation of stale routes.
+Before sending the response to the client, OpenNext will check if the route is stale and if it is, it will call the queue override to revalidate the route.
+
+If you want to better understand how to implement your own Queue, the easiest way would be to take a look at the existing [included Queue](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/queue).
+
+Couple of things to note :
+- The default implementation use an SQS queue. This has the main advantage of being able to control the concurrency of the revalidations as well as avoiding trigerring the revalidation multiple times for the same route.
+- You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `queue` override](/aws/contribute/local_run#devqueuets).
\ No newline at end of file
diff --git a/pages/aws/config/overrides/tag_cache.mdx b/pages/aws/config/overrides/tag_cache.mdx
new file mode 100644
index 0000000..7cd278a
--- /dev/null
+++ b/pages/aws/config/overrides/tag_cache.mdx
@@ -0,0 +1,12 @@
+This override is used by the [`cache` adapter](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/adapters/cache.ts) that is provided by OpenNext to the NextServer. It is also used by OpenNext if `enableCacheInterception` is set to `true` in the configuration and by the `initializationFunction` for prepopulating the cache.
+
+It is used for the cache tags (i.e. `revalidateTag` and `revalidatePath`). It does not handle anything related to the ISR/SSG cache or the fetch cache used by Next.js.
+It's main role is to detremine if a path is stale based on the tags and also to update the tag cache when `revalidateTag` is called.
+
+The current implementation differs from the way Next.js standalone handle cache tags. In the standalone version, the cache tags are stored in a file, and every time a cache entry is accessed, it has to check for every tags if the entry is stale. This approach is very read heavy and doesn't work well with DB like DynamoDB.
+We choose to go another way. We store tags for every path that exists in the cache. This way, we can easily know if a path is stale by just checking the path instead of every tags used. This approach is more write heavy but it's a tradeoff we are willing to make.
+This also has the drawback of needing to prepopulate the cache with all the tags that are used in the application. This is done by the `initializationFunction`.
+
+We might allow to choose how cache tags are handled in the future depending on the `TagCache` implementation. If you need this feature, feel free to open an issue on the [GitHub repository](https://github.com/opennextjs/opennextjs-aws).
+
+If you want to better understand how to implement your own TagCache, the easiest way would be to take a look at the existing [included TagCache](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/tagCache).
\ No newline at end of file
diff --git a/pages/aws/config/overrides/wrapper.mdx b/pages/aws/config/overrides/wrapper.mdx
new file mode 100644
index 0000000..913edcb
--- /dev/null
+++ b/pages/aws/config/overrides/wrapper.mdx
@@ -0,0 +1,9 @@
+This is the main entrypoint of the server. It is used for every server and allow you to run either in serverless mode or as a long running server.
+
+If you want to better understand how to implement your own Wrapper, the easiest way would be to take a look at one of the existing [included Wrapper](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/wrappers).
+
+Couple of things to note :
+- If you want to use streaming (for the `node` runtime of next), you'll need to create a `StreamCreator` and pass it to the `handler`. You can find some example in the [node](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/node.ts) or [aws-lambda-streaming](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/aws-lambda-streaming.ts) wrapper.
+- If you don't use streaming (like in the default `aws-lambda` wrapper), you may still need to provide a fake `StreamCreator` to the `handler` to avoid a weird issue with Node itself (see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/aws-lambda.ts#L49-L65) for an example and a more thorough explanation).
+- If you use the `edge` runtime of Next (either for the external middleware or for an `edge` route or page), you don't need the `StreamCreator` at all.
+- If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/cloudflare.ts#L29)). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
diff --git a/pages/aws/config/reference.mdx b/pages/aws/config/reference.mdx
index 912547a..ce2cc89 100644
--- a/pages/aws/config/reference.mdx
+++ b/pages/aws/config/reference.mdx
@@ -38,14 +38,14 @@ import { Tabs } from 'nextra/components'
 
       ---
 
-      #### `wrapper`
+      #### [`wrapper`](overrides/wrapper)
 
       This is the entrypoint of the server. 
       Be aware that it might not be enough to change this to make it work on said platform. This is only the entrypoint, you might need to change other parts of the server to make it work on the platform.
 
       Possible values are: `aws-lambda`, `aws-lambda-streaming`, `node`, `cloudflare`, `dummy` or a `LazyLoadedOverride` that will return the wrapper.
 
-      #### `converter`
+      #### [`converter`](overrides/converter)
 
       This is the converter that will be used to convert the input and output for the server.
 
@@ -99,23 +99,29 @@ import { Tabs } from 'nextra/components'
 
       For both default and splitted server, in addition to `override` in the common options, you can also use the following options:
 
-      #### `incrementalCache`
+      #### [`incrementalCache`](overrides/incremental_cache)
 
       Add possibility to override the default s3 cache. Used for fetch cache and html/rsc/json cache.
 
       Possible values are: `s3`, `s3-lite`, `dummy` or a `LazyLoadedOverride` that will return the incremental cache.
 
-      #### `tagCache`
+      #### [`tagCache`](overrides/tag_cache)
 
       Add possibility to override the default tag cache. Used for revalidateTags and revalidatePath.
 
       Possible values are: `dynamodb`, `dynamodb-lite`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
 
-      #### `queue`
+      #### [`queue`](overrides/queue)
 
       Add possibility to override the default queue. Used for ISR revalidation requests.
 
       Possible values are: `sqs`, `sqs-lite`, `dummy` or a `LazyLoadedOverride` that will return the queue.
+
+      #### [`proxyExternalRequest`](overrides/proxy_external_request)
+
+      Add possibility to override the default proxy for external request (i.e. next config external rewrites or middleware rewrites). Used in the external middleware or one of the server function.
+
+      Possible values are: `node`, `fetch`, `dummy` or a `LazyLoadedOverride` that will return the proxy. Default is `node`
     </Tabs.Tab>
     <Tabs.Tab>
       Every splitted server will have the same options as the default server. In addition to that, you can use the following options:
@@ -155,7 +161,7 @@ import { Tabs } from 'nextra/components'
 
       It uses the same options as the default server. `incrementalCache`, `tagCache` and `queue` are only used when `enableCacheInterception` is set to true.
 
-      ### `originResolver`
+      ### [`originResolver`](overrides/origin_resolver)
 
       Origin resolver is used to resolve the origin for internal rewrite. By default, it uses the pattern-env origin resolver.
       
@@ -164,7 +170,7 @@ import { Tabs } from 'nextra/components'
     <Tabs.Tab>
       Image optimization server is a special server that will handle the `_next/image` optimization. Besides the common options, you can use the following options:
 
-      ### `loader`
+      ### [`loader`](overrides/image_loader)
       The image loader is used to load the image from the source.
 
       Possible values are: `s3`, `host`, `dummy` or a `LazyLoadedOverride` that will return the loader.
@@ -175,7 +181,7 @@ import { Tabs } from 'nextra/components'
     <Tabs.Tab>
       Warmer is a special server that will be used to warm the lambda function. Besides the common options, you can use the following options:
 
-      ### `invokeFunction`
+      ### [`invokeFunction`](overrides/invoke_function)
 
       By default, works for lambda only.
       If you override this, you'll need to handle the warmer event in the wrapper
diff --git a/pages/aws/contribute/local_run.mdx b/pages/aws/contribute/local_run.mdx
index 666532b..f73d733 100644
--- a/pages/aws/contribute/local_run.mdx
+++ b/pages/aws/contribute/local_run.mdx
@@ -7,7 +7,7 @@ node /path/to/opennextjs-aws/packages/open-next/dist/index.js build --config-pat
 # Then to run the server
 node .open-next/server-functions/default/index.mjs
 ```
-
+### open-next.local.config.ts
 ```typescript
 // open-next.local.config.ts -
 // A good practice would be to use a different name so that it doesn't conflict
@@ -56,6 +56,8 @@ const config = {
 export default config
 ```
 
+### dev/wrapper.ts
+
 ```typescript
 // dev/wrapper.ts
 // You'll need to install express
@@ -118,6 +120,7 @@ export default {
 };
 ```
 
+### dev/incrementalCache.ts
 ```typescript
 // dev/incrementalCache.ts
 import type { IncrementalCache } from '@opennextjs/aws/types/overrides.js'
@@ -155,6 +158,8 @@ const cache: IncrementalCache = {
 export default cache
 ```
 
+### dev/queue.ts
+
 ```typescript
 // dev/queue.ts
 import type { Queue } from '@opennextjs/aws/types/overrides.js'

From 586372a547f4c2f7554a3c6c36df8ba80a223f31 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 29 Nov 2024 14:43:45 +0100
Subject: [PATCH 022/140] update the worker free plan size limit (#36)

---
 pages/cloudflare/troubleshooting.mdx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 1c06e1e..57f9770 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -11,11 +11,11 @@ Cloudflare Workers now support the majority of functionality from Cloudflare Pag
 
 If you need to deploy to Cloudflare Pages, you can use `@cloudflare/next-on-pages`, and follow the [Cloudflare Pages guides for deploying Next.js apps](https://developers.cloudflare.com/pages/framework-guides/nextjs/).
 
-### "Your Worker exceeded the size limit of 1 MiB"
+### "Your Worker exceeded the size limit of 3 MiB"
 
-The Cloudflare Account you are deploying to is on the Workers Free plan, which [limits the size of each Worker to 1 MiB](https://developers.cloudflare.com/workers/platform/limits/#worker-size). When you subscribe to the Workers Paid plan, each Worker can be up to 10 MiB.
+The Cloudflare Account you are deploying to is on the Workers Free plan, which [limits the size of each Worker to 3 MiB](https://developers.cloudflare.com/workers/platform/limits/#worker-size). When you subscribe to the Workers Paid plan, each Worker can be up to 10 MiB.
 
-### My app fails to build when I import a specific NPM package 
+### My app fails to build when I import a specific NPM package
 
 First, make sure that the `nodejs_compat` compatibility flag is enabled, and your compatibility date is set to on or after "2024-09-23", in your `wrangler.toml` file. [Refer to the Workers docs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) for more details on Node.js support in Cloudflare Workers.
 
@@ -30,7 +30,7 @@ Some NPM packages define multiple exports. For example:
 },
 ```
 
-When you use `@opennextjs/cloudflare`, [Wrangler](https://developers.cloudflare.com/workers/wrangler/) bundles your code before running it locally, or deploying it to Cloudflare. Wrangler has to choose which export to use, when you import a module. By default, Wrangler, which uses [esbuild](https://esbuild.github.io/), handles this in a way that is not compatible with some NPM packages. 
+When you use `@opennextjs/cloudflare`, [Wrangler](https://developers.cloudflare.com/workers/wrangler/) bundles your code before running it locally, or deploying it to Cloudflare. Wrangler has to choose which export to use, when you import a module. By default, Wrangler, which uses [esbuild](https://esbuild.github.io/), handles this in a way that is not compatible with some NPM packages.
 
 You may want to modify how Wrangler resolves multiple exports, such that when you import packages, the `node` export, if present, is used. You can do do by defining the following variables in a `.env` file within the root directory of your Next.js app:
 

From af52ef07b98381130a5688c026cec6bb5699f5da Mon Sep 17 00:00:00 2001
From: AndreyMay <51962295+AndreyMay@users.noreply.github.com>
Date: Sun, 15 Dec 2024 05:58:12 -0800
Subject: [PATCH 023/140] Instrumentation + Sentry (#38)

---
 pages/aws/common_issues.mdx | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index 0209efc..49c66e7 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -62,3 +62,39 @@ If you are refreshing a dynamic/static route or going to that route directly fro
 This can also happen in app router when a client navigates via NextJS `<Link>` component.
 
 The issue might be that your having a folder or file in your `public` directory with an overlapping between the name and your route. In this case, you should rename that to something else.
+
+
+#### `cannot find module './chunks/xxxx.js'` error
+
+Dynamic imports in `instrumentation.ts` will cause this error at runtime. Remove dynamic imports to resolve.
+
+#### Sentry server side setup
+
+The config recommended by Sentry docs uses dynamic imports in `instrumentation.ts`, which causes the above error.
+
+Here's a working Sentry config which resolves the error:
+
+`instrumentation.ts`
+```typescript
+import * as Sentry from '@sentry/nextjs';
+import { initSentry } from '../sentry.server.config';
+
+export const onRequestError = Sentry.captureRequestError;
+
+export async function register() {
+  initSentry(process.env.NEXT_RUNTIME as 'nodejs' | 'edge');
+}
+```
+
+`sentry.server.config.ts`
+```typescript
+import * as Sentry from '@sentry/nextjs';
+
+export const initSentry = (runtime: 'nodejs' | 'edge') => {
+  Sentry.init({
+    dsn: 'https://...',
+
+    //...rest of your config
+  });
+};
+```

From dab4a6ff6ca9f9ec13075b4f0247583d512e7a38 Mon Sep 17 00:00:00 2001
From: Rob Stanford <me@robstanford.com>
Date: Thu, 19 Dec 2024 13:57:49 +0000
Subject: [PATCH 024/140] docs: add execution order limitation to Netlify docs
 (#40)

---
 pages/netlify/index.mdx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pages/netlify/index.mdx b/pages/netlify/index.mdx
index 99d1fb5..adde8d5 100644
--- a/pages/netlify/index.mdx
+++ b/pages/netlify/index.mdx
@@ -69,6 +69,8 @@ Currently, Netlify's Next.js adapter has the following limitations:
 
 - **Rewrites in your Next.js configuration can’t point to static files in the `public` directory.** If you create `beforeFiles` rewrites in your `next.config.js`, they can’t point to static files in your site’s `public` directory. You can use middleware rewrites as an alternative.
 
+- **Headers and Redirects are evaluated after middleware.** If you need to maintain the execution order specified in the Next.js [docs](https://nextjs.org/docs/app/building-your-application/routing/middleware#matching-paths) you will need to configure your [headers](https://docs.netlify.com/routing/headers/) and [redirects](https://docs.netlify.com/routing/redirects/) outside of Next.js using our platform primitives.
+
 - **Netlify Forms compatibility:** Using Netlify Forms with the current adapter [requires a workaround](/netlify/forms).
 
 ### pnpm support

From ad8b1eec9f0e2946c65b99243da8adef85203458 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 19 Dec 2024 16:01:40 +0100
Subject: [PATCH 025/140] sync with recent code changes (#37)

---
 pages/aws/config/custom_overrides.mdx    | 5 +----
 pages/aws/config/overrides/converter.mdx | 2 +-
 pages/aws/contribute/local_run.mdx       | 2 +-
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index faac2ca..b873753 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -182,10 +182,10 @@ import type {
   APIGatewayProxyEventV2,
   APIGatewayProxyResultV2,
 } from "aws-lambda";
-import type { StreamCreator } from "@opennextjs/aws/http/openNextResponse.js";
 import { Writable } from "node:stream";
 
 import { WarmerEvent, WarmerResponse } from "@opennextjs/aws/adapters/warmer-function.js";
+import type { StreamCreator } from "@opennextjs/aws/types/open-next.js";
 import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
 
 type AwsLambdaEvent =
@@ -248,9 +248,6 @@ const handler: WrapperHandler =
           },
         });
       },
-      onFinish: () => {
-        // Do nothing
-      },
     };
 
     const response = await handler(internalEvent, fakeStream);
diff --git a/pages/aws/config/overrides/converter.mdx b/pages/aws/config/overrides/converter.mdx
index ca2e624..8f1785f 100644
--- a/pages/aws/config/overrides/converter.mdx
+++ b/pages/aws/config/overrides/converter.mdx
@@ -5,5 +5,5 @@ If you want to better understand how to implement your own Converter, the easies
 Couple of things to note :
 - If you use a `StreamCreator` in your wrapper, you probably don't need to do anything in the `convertTo` function.
 - If used for the default, the image optimization, or one of the splitted server the internal types will be `InternalEvent` and `InternalResult` respectively.
-- If used for the external middleware, the internal types will be `InternalEvent` and `InternalResult | MiddlewareOutputEvent` respectively.
+- If used for the external middleware, the internal types will be `InternalEvent` and `InternalResult | MiddlewareResult` respectively.
 - For the other servers, look up their respective types in the codebase.
\ No newline at end of file
diff --git a/pages/aws/contribute/local_run.mdx b/pages/aws/contribute/local_run.mdx
index f73d733..ec058eb 100644
--- a/pages/aws/contribute/local_run.mdx
+++ b/pages/aws/contribute/local_run.mdx
@@ -67,7 +67,7 @@ import express from 'express'
 import proxy from 'express-http-proxy'
 import { fork } from 'child_process'
 
-import type { StreamCreator } from "@opennextjs/aws/http/openNextResponse.js";
+import type { StreamCreator } from "@opennextjs/aws/types/open-next.js";
 import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
 
 const wrapper: WrapperHandler = async (handler, converter) => {

From d0a8a11823e16b3ffd9cddb445e54c347f63c85a Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 20 Dec 2024 16:58:59 +0100
Subject: [PATCH 026/140] cloudflare: update docs for 0.3 (#41)

---
 pages/cloudflare/0.2/_meta.json       |   7 ++
 pages/cloudflare/0.2/bindings.mdx     |  65 ++++++++++++
 pages/cloudflare/0.2/caching.mdx      |  36 +++++++
 pages/cloudflare/0.2/examples.mdx     |  23 +++++
 pages/cloudflare/0.2/get-started.mdx  | 138 ++++++++++++++++++++++++++
 pages/cloudflare/0.2/index.mdx        |  66 ++++++++++++
 pages/cloudflare/_meta.json           |   4 +-
 pages/cloudflare/caching.mdx          |   8 +-
 pages/cloudflare/examples.mdx         |  11 +-
 pages/cloudflare/get-started.mdx      |  78 ++++++++++++---
 pages/cloudflare/index.mdx            |  25 +++--
 pages/cloudflare/migrate-from-0.2.mdx |  83 ++++++++++++++++
 12 files changed, 517 insertions(+), 27 deletions(-)
 create mode 100644 pages/cloudflare/0.2/_meta.json
 create mode 100644 pages/cloudflare/0.2/bindings.mdx
 create mode 100644 pages/cloudflare/0.2/caching.mdx
 create mode 100644 pages/cloudflare/0.2/examples.mdx
 create mode 100644 pages/cloudflare/0.2/get-started.mdx
 create mode 100644 pages/cloudflare/0.2/index.mdx
 create mode 100644 pages/cloudflare/migrate-from-0.2.mdx

diff --git a/pages/cloudflare/0.2/_meta.json b/pages/cloudflare/0.2/_meta.json
new file mode 100644
index 0000000..9a7cfe5
--- /dev/null
+++ b/pages/cloudflare/0.2/_meta.json
@@ -0,0 +1,7 @@
+{
+  "index": "Overview",
+  "get-started": "",
+  "bindings": "",
+  "caching": "",
+  "examples": ""
+}
\ No newline at end of file
diff --git a/pages/cloudflare/0.2/bindings.mdx b/pages/cloudflare/0.2/bindings.mdx
new file mode 100644
index 0000000..900e009
--- /dev/null
+++ b/pages/cloudflare/0.2/bindings.mdx
@@ -0,0 +1,65 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+### Bindings
+
+[Bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](https://developers.cloudflare.com/r2/) bucket.
+
+#### How to configure your Next.js app so it can access bindings
+
+Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a `wrangler.toml` file in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started).
+
+#### How to access bindings in your Next.js app
+
+You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) from any route of your Next.js app via `getCloudflareContext`:
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+	let responseText = "Hello World";
+
+	const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
+	await myKv.put("foo", "bar");
+	const foo = await myKv.get("foo");
+
+	return new Response(foo);
+}
+```
+
+#### How to add bindings to your Worker
+
+Add bindings to your Worker by [adding them to your `wrangler.toml` configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+
+## TypeScript type declarations for bindings
+
+To ensure that the `env` object from `(await getCloudflareContext()).env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
+
+```
+npx wrangler types --experimental-include-runtime
+```
+
+This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
+
+If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
+
+```bash
+npx wrangler types --experimental-include-runtime="./runtime.d.ts"
+```
+
+To ensure that your types are always up-to-date, make sure to run `wrangler types --experimental-include-runtime` after any changes to your config file.
+
+## Other Cloudflare APIs (`cf`, `ctx`)
+
+You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/get-cloudflare-context.ts):
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+
+export async function GET(request) {
+	const { env, cf, ctx } = await getCloudflareContext();
+
+	// ...
+}
+```
diff --git a/pages/cloudflare/0.2/caching.mdx b/pages/cloudflare/0.2/caching.mdx
new file mode 100644
index 0000000..cbeb544
--- /dev/null
+++ b/pages/cloudflare/0.2/caching.mdx
@@ -0,0 +1,36 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+## Caching
+
+`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data) and [revalidating](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#revalidating-data) data returned by subrequests you make in your app by calling [`fetch()`](https://developers.cloudflare.com/workers/runtime-apis/fetch/).
+
+By default, all `fetch()` subrequests made in your Next.js app are cached. Refer to the [Next.js documentation](https://nextjs.org/docs/app/building-your-application/caching#opting-out-1) for information about how to disable caching for an individual subrequest, or for an entire route.
+
+[The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
+
+<Callout>
+Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
+</Callout>
+
+### How to enable caching
+
+`@opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
+
+To enable caching, you must:
+
+#### 1. Create a KV namespace
+
+```
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
+```
+
+#### 2. Add the KV namespace to your Worker
+
+The binding name used in your app's worker will be `NEXT_CACHE_WORKERS_KV` by default. This is configurable and can be changed by setting the `__OPENNEXT_KV_BINDING_NAME` build-time environment variable.
+
+```
+[[kv_namespaces]]
+binding = "NEXT_CACHE_WORKERS_KV"
+id = "<YOUR_NAMESPACE_ID>"
+```
diff --git a/pages/cloudflare/0.2/examples.mdx b/pages/cloudflare/0.2/examples.mdx
new file mode 100644
index 0000000..2cdecbb
--- /dev/null
+++ b/pages/cloudflare/0.2/examples.mdx
@@ -0,0 +1,23 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+## Examples
+
+To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+### Basic starter projects
+
+Two basic example apps are included in the repository for `@opennextjs/cloudflare` package:
+
+- [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+
+You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
+
+### Next.js Commerce Demo
+
+The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
diff --git a/pages/cloudflare/0.2/get-started.mdx b/pages/cloudflare/0.2/get-started.mdx
new file mode 100644
index 0000000..803fbe4
--- /dev/null
+++ b/pages/cloudflare/0.2/get-started.mdx
@@ -0,0 +1,138 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+### Get Started
+
+#### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+#### Existing Next.js apps
+
+##### 1. Install @opennextjs/cloudflare
+
+First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
+
+```sh
+npm install --save-dev @opennextjs/cloudflare
+```
+
+##### 2. Install Wrangler, and add a `wrangler.toml` file
+
+Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
+
+```npm
+npm install -D wrangler@latest
+```
+
+<Callout>
+You must use Wrangler version `3.78.10` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+</Callout>
+
+Then, add a [`wrangler.toml`](https://developers.cloudflare.com/workers/wrangler/configuration/) file to the root directory of your Next.js app:
+
+```toml
+main = ".worker-next/index.mjs"
+name = "my-app"
+compatibility_date = "2024-09-23"
+compatibility_flags = ["nodejs_compat"]
+assets = { directory = ".worker-next/assets", binding = "ASSETS" }
+```
+
+<Callout>
+As shown above, you must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare.
+</Callout>
+
+`wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+
+##### 3. Update `package.json`
+
+Add the following to the scripts field of your `package.json` file:
+
+```json
+"build:worker": "cloudflare",
+"dev:worker": "wrangler dev --port 8771",
+"preview:worker": "npm run build:worker && npm run dev:worker",
+"deploy:worker": "npm run build:worker && wrangler deploy"
+```
+
+- `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running `next build` behind the scenes, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+- `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
+- `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+
+### 4. Add caching with Workers KV
+
+See the [Caching docs](/cloudflare/0.2/caching) for information on enabling Next.js caching in your OpenNext project.
+
+### 5. Remove `@cloudflare/next-on-pages` (if necessary)
+
+If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
+
+#### Remove `export const runtime = "edge";`
+
+Before deploying your app, remove the `export const runtime = "edge";` line from your `next.config.js` file. This line is not needed when using `@opennextjs/cloudflare`.
+
+#### Add `.worker-next` to `.gitignore`
+
+You should add `.worker-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
+
+#### Uninstall `@cloudflare/next-on-pages`
+
+You should uninstall `@cloudflare/next-on-pages` and remove any references to it.
+
+In `package.json`:
+
+```diff
+"scripts": {
+-    "pages:build": "npx @cloudflare/next-on-pages",
+-    "preview": "npm run pages:build && wrangler pages dev",
+-    "deploy": "npm run pages:build && wrangler pages deploy"
+
+"devDependencies": {
+-    "@cloudflare/next-on-pages": "*",
+```
+
+(remember to also remove [eslint-plugin-next-on-pages](https://www.npmjs.com/package/eslint-plugin-next-on-pages) from your `.eslintrc.js` file)
+
+You no longer need to call `setupDevPlatform()` in your `next.config.mjs` file:
+
+```diff title="next.config.mjs"
+- import { setupDevPlatform } from '@cloudflare/next-on-pages/next-dev';
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+- if (process.env.NODE_ENV === 'development') {
+-   await setupDevPlatform();
+- }
+```
+
+And you'll want to replace any uses of `getRequestContext` from `@cloudflare/next-on-pages` with `getCloudflareContext` from `@opennextjs/cloudflare`:
+
+```diff
+- import { getRequestContext } from "@cloudflare/next-on-pages";
++ import { getCloudflareContext } from "@opennextjs/cloudflare";
+```
+
+##### 6. Develop locally
+
+You can continue to run `next dev` when developing locally.
+
+During local development, you can access local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
+In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
+
+##### 7. Deploy to Cloudflare Workers
+
+Either deploy via the command line:
+
+```sh
+npm run deploy:worker
+```
+
+Or [connect a Github or Gitlab repository](https://developers.cloudflare.com/workers/ci-cd/), and Cloudflare will automatically build and deploy each pull request you merge to your production branch.
diff --git a/pages/cloudflare/0.2/index.mdx b/pages/cloudflare/0.2/index.mdx
new file mode 100644
index 0000000..02ba3dd
--- /dev/null
+++ b/pages/cloudflare/0.2/index.mdx
@@ -0,0 +1,66 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+## Cloudflare
+
+The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
+
+<Callout>
+[`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
+
+You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
+
+</Callout>
+
+### Get Started
+
+##### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+##### Existing Next.js apps
+
+Follow the guide [here](/cloudflare/0.2/get-started) to use [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) with an existing Next.js app.
+
+### Supported Next.js runtimes
+
+Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app can use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
+
+This is an important difference from `@cloudflare/next-on-pages`, which only supports the "Edge" runtime. The Edge Runtime code in Next.js [intentionally constrains which APIs from Node.js can be used](https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/plugins/middleware-plugin.ts#L820), and the "Edge" runtime does not support all Next.js features.
+
+### Supported Next.js versions
+
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch version of Next.js 13 and 14, as well as Next.js 15 when it is released. (currently a release candidate)
+
+To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
+
+### Supported Next.js features
+
+- [x] [App Router](https://nextjs.org/docs/app)
+- [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
+- [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
+- [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
+- [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
+
+### Not Yet Supported Next.js features
+
+The following Next.js features are not yet supported — but we welcome both contributions and feedback! Tell us what you'd like to see, or what you'd like to add support for:
+
+- [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
+- [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
+- [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
+- [ ] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
+- [ ] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [ ] [Experimental streaming support](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+
+### How @opennextjs/cloudflare Works
+
+The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
+
+When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx cloudflare` the adapter first builds your app by running `next build`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+
+You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index 2c667df..8d0c8fa 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -4,5 +4,7 @@
   "bindings": "",
   "caching": "",
   "examples": "",
-  "troubleshooting": ""
+  "troubleshooting": "",
+  "migrate-from-0.2": "",
+  "0.2": "Release 0.2"
 }
diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index b50eeab..50e02f3 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -3,12 +3,16 @@ import { Callout } from 'nextra/components';
 
 ## Caching
 
-`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data) and [revalidating](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#revalidating-data) data returned by subrequests you make in your app by calling [`fetch()`](https://developers.cloudflare.com/workers/runtime-apis/fetch/).
+`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
 
 By default, all `fetch()` subrequests made in your Next.js app are cached. Refer to the [Next.js documentation](https://nextjs.org/docs/app/building-your-application/caching#opting-out-1) for information about how to disable caching for an individual subrequest, or for an entire route.
 
 [The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
 
+Note that [Revalidating](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#revalidating-data) is not yet supported.
+
+Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
+
 <Callout>
 Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
 </Callout>
@@ -27,7 +31,7 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 
 #### 2. Add the KV namespace to your Worker
 
-The binding name used in your app's worker will be `NEXT_CACHE_WORKERS_KV` by default. This is configurable and can be changed by setting the `__OPENNEXT_KV_BINDING_NAME` build-time environment variable.
+The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
 
 ```
 [[kv_namespaces]]
diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index aba8420..ff0eb03 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -6,15 +6,22 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
 ```
 
+<Callout>
+The experimental template for the Next framework is still based on 0.2.
+Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
+</Callout>
+
 ### Basic starter projects
 
-Two basic example apps are included in the repository for `@opennextjs/cloudflare` package:
+Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
 
 - [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
 - [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [*`middleware`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [*`vercel-blog-starter`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
 
 You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
 
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 3e47e5e..bcce2aa 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -8,9 +8,14 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
 ```
 
+<Callout>
+The experimental template for the Next framework is still based on 0.2.
+Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
+</Callout>
+
 #### Existing Next.js apps
 
 ##### 1. Install @opennextjs/cloudflare
@@ -30,16 +35,19 @@ npm install -D wrangler@latest
 ```
 
 <Callout>
-You must use Wrangler version `3.78.10` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
 Then, add a [`wrangler.toml`](https://developers.cloudflare.com/workers/wrangler/configuration/) file to the root directory of your Next.js app:
 
 ```toml
-main = ".worker-next/index.mjs"
+main = ".open-next/worker.js"
 name = "my-app"
+
 compatibility_date = "2024-09-23"
 compatibility_flags = ["nodejs_compat"]
+
+# The binding name must be "ASSETS" when the cache is enabled
 assets = { directory = ".worker-next/assets", binding = "ASSETS" }
 ```
 
@@ -49,12 +57,57 @@ As shown above, you must enable the [`nodejs_compat` compatibility flag](https:/
 
 `wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
-##### 3. Update `package.json`
+##### 3. Add a `open-next.config.ts` file
+
+Then, add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+
+```ts
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
+import cache from "@opennextjs/cloudflare/kvCache";
+
+const config: OpenNextConfig = {
+  default: {
+    override: {
+      wrapper: "cloudflare-node",
+      converter: "edge",
+      // Set `incrementalCache` to "dummy" to disable KV cache
+      incrementalCache: async () => cache,
+      tagCache: "dummy",
+      queue: "dummy",
+    },
+  },
+
+  middleware: {
+    external: true,
+    override: {
+      wrapper: "cloudflare-edge",
+      converter: "edge",
+      proxyExternalRequest: "fetch",
+    },
+  },
+};
+
+export default config;
+```
+
+You can either install the `@opennextjs/aws` NPM package to get the types or `open-next.config.ts` to the [`exclude`](https://www.typescriptlang.org/tsconfig/#exclude) configuration key of your `tsconfig.json`.
+
+##### 4. Add a `.dev.vars` file
+
+Then, add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
+
+```text
+NEXTJS_ENV=development
+```
+
+The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
+
+##### 5. Update `package.json`
 
 Add the following to the scripts field of your `package.json` file:
 
 ```json
-"build:worker": "cloudflare",
+"build:worker": "opennextjs-cloudflare",
 "dev:worker": "wrangler dev --port 8771",
 "preview:worker": "npm run build:worker && npm run dev:worker",
 "deploy:worker": "npm run build:worker && wrangler deploy"
@@ -65,21 +118,22 @@ Add the following to the scripts field of your `package.json` file:
 - `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
 
-### 4. Add caching with Workers KV
+### 6. Add caching with Workers KV
 
 See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
 
-### 5. Remove `@cloudflare/next-on-pages` (if necessary)
+### 7. Remove `@cloudflare/next-on-pages` (if necessary)
 
 If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
 
 #### Remove `export const runtime = "edge";`
 
-Before deploying your app, remove the `export const runtime = "edge";` line from your `next.config.js` file. This line is not needed when using `@opennextjs/cloudflare`.
+Before deploying your app, remove the `export const runtime = "edge";` line from your `next.config.js` file.
+The edge runtime is not supported yet with `@opennextjs/cloudflare`.
 
-#### Add `.worker-next` to `.gitignore`
+#### Add `.open-next` to `.gitignore`
 
-You should add `.worker-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
+You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
 
 #### Uninstall `@cloudflare/next-on-pages`
 
@@ -119,7 +173,7 @@ And you'll want to replace any uses of `getRequestContext` from `@cloudflare/nex
 + import { getCloudflareContext } from "@opennextjs/cloudflare";
 ```
 
-##### 6. Develop locally
+##### 8. Develop locally
 
 You can continue to run `next dev` when developing locally.
 
@@ -127,7 +181,7 @@ During local development, you can access local versions of Cloudflare bindings a
 
 In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
-##### 7. Deploy to Cloudflare Workers
+##### 9. Deploy to Cloudflare Workers
 
 Either deploy via the command line:
 
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index a1368ed..1e3ee1f 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -19,9 +19,14 @@ You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
 ```
 
+<Callout>
+The experimental template for the Next framework is still based on 0.2.
+Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
+</Callout>
+
 ##### Existing Next.js apps
 
 Follow the guide [here](/cloudflare/get-started) to use [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) with an existing Next.js app.
@@ -34,33 +39,33 @@ This is an important difference from `@cloudflare/next-on-pages`, which only sup
 
 ### Supported Next.js versions
 
-`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch version of Next.js 13 and 14, as well as Next.js 15 when it is released. (currently a release candidate)
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch version of Next.js 13, 14, and 15.
 
 To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
 
 ### Supported Next.js features
 
+Some Next.js features are not yet supported are not fully tested.
+We will update the list as we progress towards releasing 1.0.
+
 - [x] [App Router](https://nextjs.org/docs/app)
 - [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
 - [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
 - [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
-
-### Not Yet Supported Next.js features
-
-The following Next.js features are not yet supported — but we welcome both contributions and feedback! Tell us what you'd like to see, or what you'd like to add support for:
-
+- [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
+- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
 - [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
-- [ ] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
-- [ ] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [ ] [Experimental streaming support](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 
+We welcome both contributions and feedback!
+
 ### How @opennextjs/cloudflare Works
 
 The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
 
-When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx cloudflare` the adapter first builds your app by running `next build`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running `next build`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 
 You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
diff --git a/pages/cloudflare/migrate-from-0.2.mdx b/pages/cloudflare/migrate-from-0.2.mdx
new file mode 100644
index 0000000..e5ce039
--- /dev/null
+++ b/pages/cloudflare/migrate-from-0.2.mdx
@@ -0,0 +1,83 @@
+import { SITE } from '../../config';
+import { Callout } from 'nextra/components';
+
+### Migrate from 0.2
+
+The `@opennextjs/cloudflare` adapter is now more closely intgrated with `@opennextjs/aws`.
+
+You will need to update your projects based on the 0.2 release as described in the following sections.
+
+##### 1. Update the `wrangler.toml` file
+
+The entry point is now `.open-next/worker.js`, update `wrangler.toml` accordingly:
+
+```toml
+# CHANGED: new entry point location
+main = ".open-next/worker.js"
+name = "my-app"
+
+compatibility_date = "2024-09-23"
+compatibility_flags = ["nodejs_compat"]
+
+# The binding name must be "ASSETS" when the cache is enabled
+# CHANGED: output folder location
+assets = { directory = ".open-next/assets", binding = "ASSETS" }
+```
+
+##### 2. Add a `open-next.config.ts` file
+
+Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+
+```ts
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
+import cache from "@opennextjs/cloudflare/kvCache";
+
+const config: OpenNextConfig = {
+  default: {
+    override: {
+      wrapper: "cloudflare-node",
+      converter: "edge",
+      // Set `incrementalCache` to "dummy" to disable KV cache
+      incrementalCache: async () => cache,
+      tagCache: "dummy",
+      queue: "dummy",
+    },
+  },
+
+  middleware: {
+    external: true,
+    override: {
+      wrapper: "cloudflare-edge",
+      converter: "edge",
+      proxyExternalRequest: "fetch",
+    },
+  },
+};
+
+export default config;
+```
+
+You can either install the `@opennextjs/aws` NPM package to get the types or `open-next.config.ts` to the [`exclude`](https://www.typescriptlang.org/tsconfig/#exclude) configuration key of your `tsconfig.json`.
+
+##### 3. Add a `.dev.vars` file
+
+Add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
+
+```text
+NEXTJS_ENV=development
+```
+
+The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
+
+##### 4. Update `package.json`
+
+The name of the CLI was changed to `opennextjs-cloudflare`:
+
+```json
+"build:worker": "opennextjs-cloudflare",
+```
+
+##### 5 Add `.open-next` to `.gitignore`
+
+You should change `.worker-next` to `.open-next` in your `.gitignore` file to prevent the build output from being committed to your repository.
+You can safely delete the content of the now unused `.worker-next`.
\ No newline at end of file

From ea3d65dd580d5460ad5f1c520e53ba81e2b426de Mon Sep 17 00:00:00 2001
From: Yanqi Zong <zongyanqi@gmail.com>
Date: Fri, 20 Dec 2024 23:24:44 -0800
Subject: [PATCH 027/140] docs: update cloudflare get started docs (#42)

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index bcce2aa..7cd16fd 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -48,7 +48,7 @@ compatibility_date = "2024-09-23"
 compatibility_flags = ["nodejs_compat"]
 
 # The binding name must be "ASSETS" when the cache is enabled
-assets = { directory = ".worker-next/assets", binding = "ASSETS" }
+assets = { directory = ".open-next/assets", binding = "ASSETS" }
 ```
 
 <Callout>

From 1ed07331612029c951bbea6dafc172ae374dcce0 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Mon, 6 Jan 2025 13:39:01 +0000
Subject: [PATCH 028/140] change `next build` references to the `package.json`
 `build` script (#46)

---
 pages/cloudflare/get-started.mdx | 2 +-
 pages/cloudflare/index.mdx       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 7cd16fd..eb3252a 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -113,7 +113,7 @@ Add the following to the scripts field of your `package.json` file:
 "deploy:worker": "npm run build:worker && wrangler deploy"
 ```
 
-- `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running `next build` behind the scenes, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+- `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running the `build` script in your `package.json` (Next.js apps use `next build` by default), and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare. The build command used by OpenNext can be overridden with the `buildCommand` option in your OpenNext config.
 - `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
 - `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 1e3ee1f..97bf801 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -66,6 +66,6 @@ We welcome both contributions and feedback!
 
 The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
 
-When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running `next build`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running the `build` script in your `package.json`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 
 You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.

From 2beac6f6d2cde5fb95d3a9960b01a5058a8568f1 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Tue, 7 Jan 2025 12:18:02 +0100
Subject: [PATCH 029/140] update and improve the Cloudflare adapter getting
 started guide (#45)

---
 pages/cloudflare/get-started.mdx      | 125 +++++++++++++-------------
 pages/cloudflare/migrate-from-0.2.mdx |   2 +-
 2 files changed, 62 insertions(+), 65 deletions(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index eb3252a..2d992de 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -23,46 +23,69 @@ Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3
 First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
 
 ```sh
-npm install --save-dev @opennextjs/cloudflare
+npm install --save-dev @opennextjs/cloudflare@latest
 ```
 
-##### 2. Install Wrangler, and add a `wrangler.toml` file
+##### 2. Install Wrangler
 
 Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
 
 ```npm
-npm install -D wrangler@latest
+npm install --save-dev wrangler@latest
 ```
 
 <Callout>
 You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
-Then, add a [`wrangler.toml`](https://developers.cloudflare.com/workers/wrangler/configuration/) file to the root directory of your Next.js app:
+##### 3. Create a `wrangler.json` file
 
-```toml
-main = ".open-next/worker.js"
-name = "my-app"
-
-compatibility_date = "2024-09-23"
-compatibility_flags = ["nodejs_compat"]
+<Callout type='info'>
+This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+</Callout>
 
-# The binding name must be "ASSETS" when the cache is enabled
-assets = { directory = ".open-next/assets", binding = "ASSETS" }
+A [`wrangler.json`](https://developers.cloudflare.com/workers/wrangler/configuration/) file is needed for your
+application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+
+You can create one yourself with the following content:
+```jsonc
+{
+  "main": ".open-next/worker.js",
+  "name": "my-app",
+  "compatibility_date": "2024-12-30",
+  "compatibility_flags": ["nodejs_compat"],
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+  },
+  "kv_namespaces": [
+    // Create a KV binding with the binding name "NEXT_CACHE_WORKERS_KV"
+    // to enable the KV based caching:
+    // {
+    //   "binding": "NEXT_CACHE_WORKERS_KV",
+    //   "id": "<BINDING_ID>"
+    // }
+  ],
+}
 ```
 
 <Callout>
-As shown above, you must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare.
+As shown above:
+ - You must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare
+ - The `main` and `assets` values should also not be changed unless you modify the build output result in some way
+ - You can add a binding named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching docs](/cloudflare/caching)
 </Callout>
 
-`wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+##### 4. Add an `open-next.config.ts` file
 
-##### 3. Add a `open-next.config.ts` file
+<Callout type='info'>
+This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+</Callout>
 
-Then, add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
 
 ```ts
-import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 import cache from "@opennextjs/cloudflare/kvCache";
 
 const config: OpenNextConfig = {
@@ -70,7 +93,7 @@ const config: OpenNextConfig = {
     override: {
       wrapper: "cloudflare-node",
       converter: "edge",
-      // Set `incrementalCache` to "dummy" to disable KV cache
+      // set `incrementalCache` to "dummy" to disable KV cache
       incrementalCache: async () => cache,
       tagCache: "dummy",
       queue: "dummy",
@@ -90,9 +113,11 @@ const config: OpenNextConfig = {
 export default config;
 ```
 
-You can either install the `@opennextjs/aws` NPM package to get the types or `open-next.config.ts` to the [`exclude`](https://www.typescriptlang.org/tsconfig/#exclude) configuration key of your `tsconfig.json`.
+<Callout>
+To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the `@opennextjs/aws` NPM package as a dev dependency.
+</Callout>
 
-##### 4. Add a `.dev.vars` file
+##### 5. Add a `.dev.vars` file
 
 Then, add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
 
@@ -102,7 +127,7 @@ NEXTJS_ENV=development
 
 The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
 
-##### 5. Update `package.json`
+##### 6. Update the `package.json` file
 
 Add the following to the scripts field of your `package.json` file:
 
@@ -118,62 +143,34 @@ Add the following to the scripts field of your `package.json` file:
 - `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
 
-### 6. Add caching with Workers KV
+##### 7. Add caching with Workers KV
 
 See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
 
-### 7. Remove `@cloudflare/next-on-pages` (if necessary)
-
-If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
+##### 8. Remove any `export const runtime = "edge";` if present
 
-#### Remove `export const runtime = "edge";`
+Before deploying your app, remove the `export const runtime = "edge";` line from any of your source files.
 
-Before deploying your app, remove the `export const runtime = "edge";` line from your `next.config.js` file.
 The edge runtime is not supported yet with `@opennextjs/cloudflare`.
 
-#### Add `.open-next` to `.gitignore`
+##### 9. Add `.open-next` to `.gitignore`
 
 You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
 
-#### Uninstall `@cloudflare/next-on-pages`
-
-You should uninstall `@cloudflare/next-on-pages` and remove any references to it.
-
-In `package.json`:
+##### 10. Remove `@cloudflare/next-on-pages` (if necessary)
 
-```diff
-"scripts": {
--    "pages:build": "npx @cloudflare/next-on-pages",
--    "preview": "npm run pages:build && wrangler pages dev",
--    "deploy": "npm run pages:build && wrangler pages deploy"
-
-"devDependencies": {
--    "@cloudflare/next-on-pages": "*",
-```
-
-(remember to also remove [eslint-plugin-next-on-pages](https://www.npmjs.com/package/eslint-plugin-next-on-pages) from your `.eslintrc.js` file)
-
-You no longer need to call `setupDevPlatform()` in your `next.config.mjs` file:
-
-```diff title="next.config.mjs"
-- import { setupDevPlatform } from '@cloudflare/next-on-pages/next-dev';
-
-/** @type {import('next').NextConfig} */
-const nextConfig = {};
-
-- if (process.env.NODE_ENV === 'development') {
--   await setupDevPlatform();
-- }
-```
+If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
 
-And you'll want to replace any uses of `getRequestContext` from `@cloudflare/next-on-pages` with `getCloudflareContext` from `@opennextjs/cloudflare`:
+Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) package as well as the [`eslint-plugin-next-on-pages`](https://www.npmjs.com/package/eslint-plugin-next-on-pages) package if present.
 
-```diff
-- import { getRequestContext } from "@cloudflare/next-on-pages";
-+ import { getCloudflareContext } from "@opennextjs/cloudflare";
-```
+Remove any reference of these packages from your source and configuration files.
+This includes:
+ - `setupDevPlatform()` calls in your Next.js config file
+ - `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+   (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+ - next-on-pages eslint rules set in your Eslint config file
 
-##### 8. Develop locally
+##### 11. Develop locally
 
 You can continue to run `next dev` when developing locally.
 
@@ -181,7 +178,7 @@ During local development, you can access local versions of Cloudflare bindings a
 
 In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
-##### 9. Deploy to Cloudflare Workers
+##### 12. Deploy to Cloudflare Workers
 
 Either deploy via the command line:
 
diff --git a/pages/cloudflare/migrate-from-0.2.mdx b/pages/cloudflare/migrate-from-0.2.mdx
index e5ce039..aaf01b0 100644
--- a/pages/cloudflare/migrate-from-0.2.mdx
+++ b/pages/cloudflare/migrate-from-0.2.mdx
@@ -29,7 +29,7 @@ assets = { directory = ".open-next/assets", binding = "ASSETS" }
 Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
 
 ```ts
-import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 import cache from "@opennextjs/cloudflare/kvCache";
 
 const config: OpenNextConfig = {

From 749db062b164439adc1b9dafb1584f56589c277f Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Tue, 7 Jan 2025 22:14:07 +0100
Subject: [PATCH 030/140] remove the no longer necessary Cloudflare's flarelabs
 template reference (#44)

---
 pages/cloudflare/examples.mdx    | 7 +------
 pages/cloudflare/get-started.mdx | 7 +------
 pages/cloudflare/index.mdx       | 6 +-----
 3 files changed, 3 insertions(+), 17 deletions(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index ff0eb03..22c2ae3 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -6,14 +6,9 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
-<Callout>
-The experimental template for the Next framework is still based on 0.2.
-Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
-</Callout>
-
 ### Basic starter projects
 
 Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 2d992de..e34d41b 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -8,14 +8,9 @@ import { Callout } from 'nextra/components';
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
-<Callout>
-The experimental template for the Next framework is still based on 0.2.
-Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
-</Callout>
-
 #### Existing Next.js apps
 
 ##### 1. Install @opennextjs/cloudflare
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 97bf801..ed94138 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -19,13 +19,9 @@ You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
 
 ```
-npm create cloudflare@latest -- --template https://github.com/flarelabs-net/workers-next
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
-<Callout>
-The experimental template for the Next framework is still based on 0.2.
-Use the template from `flarelabs-net/workers-next` as indicated above to use 0.3.
-</Callout>
 
 ##### Existing Next.js apps
 

From d534771dbf06960a461fba216c1f0297e009a244 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Thu, 9 Jan 2025 10:44:51 +0000
Subject: [PATCH 031/140] remove v13 from supported versions (#47)

---
 pages/cloudflare/index.mdx | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index ed94138..00e8aa1 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -22,20 +22,19 @@ To create a new Next.js app, pre-configured to run on Cloudflare using @opennext
 npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
-
 ##### Existing Next.js apps
 
 Follow the guide [here](/cloudflare/get-started) to use [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) with an existing Next.js app.
 
 ### Supported Next.js runtimes
 
-Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app can use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
+Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app should use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
 
 This is an important difference from `@cloudflare/next-on-pages`, which only supports the "Edge" runtime. The Edge Runtime code in Next.js [intentionally constrains which APIs from Node.js can be used](https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/plugins/middleware-plugin.ts#L820), and the "Edge" runtime does not support all Next.js features.
 
 ### Supported Next.js versions
 
-`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch version of Next.js 13, 14, and 15.
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 14 and 15.
 
 To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
 

From e1881223876469f93ade5a3af07fc8a242e46299 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Mon, 13 Jan 2025 21:05:44 +0000
Subject: [PATCH 032/140] add warnings in the aws and cloudflare docs regarding
 the limited windows support (#49)

---
 pages/aws/index.mdx        |  7 +++++++
 pages/cloudflare/index.mdx |  5 +++++
 shared/WindowsSupport.mdx  | 12 ++++++++++++
 3 files changed, 24 insertions(+)
 create mode 100644 shared/WindowsSupport.mdx

diff --git a/pages/aws/index.mdx b/pages/aws/index.mdx
index 6b741e8..3290d80 100644
--- a/pages/aws/index.mdx
+++ b/pages/aws/index.mdx
@@ -1,5 +1,6 @@
 import { SITE } from '../../config';
 import { Callout } from 'nextra/components';
+import WindowsSupport from '../../shared/WindowsSupport.mdx';
 
 <Callout>
 This docs is for the V3 of OpenNext. If you are looking for the V2 docs, you can find them [here](/aws/v2).
@@ -44,4 +45,10 @@ OpenNext aims to support all Next.js 14 features. Some features are work in prog
 
 ---
 
+<Callout type='info'>
+    <WindowsSupport />
+</Callout>
+
+---
+
 [Get started](/aws/get_started) with deploying your app with OpenNext and your favorite framework.
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 00e8aa1..58a42ae 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -1,5 +1,6 @@
 import { SITE } from '../../config';
 import { Callout } from 'nextra/components';
+import WindowsSupport from '../../shared/WindowsSupport.mdx';
 
 ## Cloudflare
 
@@ -57,6 +58,10 @@ We will update the list as we progress towards releasing 1.0.
 
 We welcome both contributions and feedback!
 
+### Windows support
+
+<WindowsSupport />
+
 ### How @opennextjs/cloudflare Works
 
 The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
diff --git a/shared/WindowsSupport.mdx b/shared/WindowsSupport.mdx
new file mode 100644
index 0000000..647b7d1
--- /dev/null
+++ b/shared/WindowsSupport.mdx
@@ -0,0 +1,12 @@
+OpenNext can be used on Windows systems but Windows full support is not guaranteed because:
+ - historically the Next.js tooling itself has had Windows support issues
+   (and OpenNext is built on these tools)
+ - the OpenNext team has limited capacity and fully supporting Windows (given the point above)
+   has been determined to be a lower priority, thus the effort and testing on Windows is limited
+
+Given the above, you can develop your application under Windows at your own risk. If you don't have an alternative we
+recommend either:
+ - running OpenNext using [WSL2](https://learn.microsoft.com/en-us/windows/wsl/),
+ - in a Linux Virtual Machine or
+ - develop your application using the standard Next.js tooling and deploy it using OpenNext in CI/CD systems such
+   as [GitHub Actions](https://github.com/features/actions) that run linux/MacOS environments
\ No newline at end of file

From b1ab51d365e60e691ae29fd2b25bc53957f66a3c Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Tue, 14 Jan 2025 12:22:52 +0000
Subject: [PATCH 033/140] remove all references to `wrangler.toml` (#48)

---
 pages/cloudflare/bindings.mdx        | 4 ++--
 pages/cloudflare/get-started.mdx     | 6 +++---
 pages/cloudflare/troubleshooting.mdx | 3 ++-
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index 6efd272..dfd8aee 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -7,7 +7,7 @@ import { Callout } from 'nextra/components';
 
 #### How to configure your Next.js app so it can access bindings
 
-Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a `wrangler.toml` file in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started).
+Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started#3-create-a-wranglerjson-file).
 
 #### How to access bindings in your Next.js app
 
@@ -29,7 +29,7 @@ export async function GET(request) {
 
 #### How to add bindings to your Worker
 
-Add bindings to your Worker by [adding them to your `wrangler.toml` configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+Add bindings to your Worker by adding them to your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
 
 ## TypeScript type declarations for bindings
 
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index e34d41b..8817ae9 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -33,16 +33,16 @@ npm install --save-dev wrangler@latest
 You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
-##### 3. Create a `wrangler.json` file
+##### 3. Create a wrangler configuration file
 
 <Callout type='info'>
 This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
 </Callout>
 
-A [`wrangler.json`](https://developers.cloudflare.com/workers/wrangler/configuration/) file is needed for your
+A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
 application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
-You can create one yourself with the following content:
+You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
 ```jsonc
 {
   "main": ".open-next/worker.js",
diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 57f9770..f792339 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -17,7 +17,8 @@ The Cloudflare Account you are deploying to is on the Workers Free plan, which [
 
 ### My app fails to build when I import a specific NPM package
 
-First, make sure that the `nodejs_compat` compatibility flag is enabled, and your compatibility date is set to on or after "2024-09-23", in your `wrangler.toml` file. [Refer to the Workers docs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) for more details on Node.js support in Cloudflare Workers.
+First, make sure that the `nodejs_compat` compatibility flag is enabled, and your compatibility date is set to on or after "2024-09-23", in your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+Refer to the [Node.js Workers docs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) for more details on Node.js support in Cloudflare Workers.
 
 Some NPM packages define multiple exports. For example:
 

From 4f91a0a440459fdee9d20f83ec38ac61f27f2ca8 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 14 Jan 2025 14:33:20 +0100
Subject: [PATCH 034/140] doc(cloudflare): updates (#50)

---
 pages/cloudflare/caching.mdx     | 15 +++++++++++----
 pages/cloudflare/get-started.mdx |  8 +++++---
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 50e02f3..93411f3 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -33,8 +33,15 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 
 The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
 
-```
-[[kv_namespaces]]
-binding = "NEXT_CACHE_WORKERS_KV"
-id = "<YOUR_NAMESPACE_ID>"
+```jsonc
+// wrangler.json
+{
+  // ...
+  "kv_namespaces": [
+    {
+      "binding": "NEXT_CACHE_WORKERS_KV",
+      "id": "<BINDING_ID>"
+    }
+  ]
+}
 ```
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 8817ae9..ccb2907 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -129,14 +129,16 @@ Add the following to the scripts field of your `package.json` file:
 ```json
 "build:worker": "opennextjs-cloudflare",
 "dev:worker": "wrangler dev --port 8771",
-"preview:worker": "npm run build:worker && npm run dev:worker",
-"deploy:worker": "npm run build:worker && wrangler deploy"
+"preview": "npm run build:worker && npm run dev:worker",
+"deploy": "npm run build:worker && wrangler deploy",
+"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
 ```
 
 - `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running the `build` script in your `package.json` (Next.js apps use `next build` by default), and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare. The build command used by OpenNext can be overridden with the `buildCommand` option in your OpenNext config.
 - `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
-- `npm run preview:worker`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run preview`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+- `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
 
 ##### 7. Add caching with Workers KV
 

From 8165bc649176530e8c7571043d94061975a45354 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Fri, 17 Jan 2025 16:11:51 +0100
Subject: [PATCH 035/140] Docs for aws 3.4 (#51)

---
 pages/aws/config/overrides/_meta.json         |   3 +-
 .../overrides/automatic_cdn_invalidation.mdx  |  34 ++++
 pages/aws/config/overrides/image_loader.mdx   |  30 ++-
 .../config/overrides/incremental_cache.mdx    |  65 +++++-
 pages/aws/config/overrides/queue.mdx          |  36 +++-
 pages/aws/config/overrides/tag_cache.mdx      |  32 ++-
 pages/aws/config/overrides/wrapper.mdx        |  59 ++++++
 pages/aws/contribute/local_run.mdx            | 186 +++---------------
 8 files changed, 276 insertions(+), 169 deletions(-)
 create mode 100644 pages/aws/config/overrides/automatic_cdn_invalidation.mdx

diff --git a/pages/aws/config/overrides/_meta.json b/pages/aws/config/overrides/_meta.json
index b936b59..5e89222 100644
--- a/pages/aws/config/overrides/_meta.json
+++ b/pages/aws/config/overrides/_meta.json
@@ -7,5 +7,6 @@
   "image_loader": "Image Loader",
   "proxy_external_request": "External Request Proxy",
   "origin_resolver": "Origin Resolver",
-  "invoke_function": "Invoke Function for the warmer"
+  "invoke_function": "Invoke Function for the warmer",
+  "automatic_cdn_invalidation": "Automatic CDN Invalidation"
 }
\ No newline at end of file
diff --git a/pages/aws/config/overrides/automatic_cdn_invalidation.mdx b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
new file mode 100644
index 0000000..268c8dc
--- /dev/null
+++ b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
@@ -0,0 +1,34 @@
+import {Callout} from 'nextra/components'
+
+Available since `@opennextjs/aws` 3.4.0
+
+This override is used by OpenNext when routes have been On-Demand revalidated and the CDN needs to be updated. It is not called for ISR revalidation.
+It will be called for `revalidatePath`, `revalidateTag` and `res.revalidate()`.
+
+If you want to better understand how to implement your own Automatic CDN Invalidation, the easiest way would be to take a look at the existing [included Automatic CDN Invalidation](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/cdnInvalidation)
+
+## Included Automatic CDN Invalidation
+
+### dummy
+
+The Dummy AutomaticCDNInvalidation is a dummy implementation that will do nothing. It is the default implementation.
+
+### cloudfront
+
+<Callout type='warning'>
+Cloudfront invalidation can be very expensive. Manual CloudFront path invalidation incurs costs. According to the [AWS CloudFront pricing page](https://aws.amazon.com/cloudfront/pricing/):
+
+> No additional charge for the first 1,000 paths requested for invalidation each month. Thereafter, $0.005 per path requested for invalidation.
+
+This implementation will send an invalidation request for every route that needs to be invalidated (the request invalidates 2 paths, one for the route itself and one for the data route).
+
+Tag cache invalidation could end up triggering thousands of invalidation requests.
+
+Only use this implementation if you are aware of the costs and are willing to pay for it.
+</Callout>
+
+The CloudFront Automatic CDN Invalidation will invalidate the cache of the CloudFront distribution.
+
+##### Requirements
+
+- You need to provide the `CLOUDFRONT_DISTRIBUTION_ID` environment variable to your server.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/image_loader.mdx b/pages/aws/config/overrides/image_loader.mdx
index 459b14c..2520cdf 100644
--- a/pages/aws/config/overrides/image_loader.mdx
+++ b/pages/aws/config/overrides/image_loader.mdx
@@ -2,4 +2,32 @@ This override is used by OpenNext and more specifically by the image server to b
 
 This is used for internal image only (i.e. src without host). External source are already handled by the image server.
 
-If you want to better understand how to implement your own ImageLoader, the easiest way would be to take a look at the existing [included ImageLoader](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/imageLoader).
\ No newline at end of file
+If you want to better understand how to implement your own ImageLoader, the easiest way would be to take a look at the existing [included ImageLoader](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/imageLoader).
+
+## Included ImageLoader
+
+### s3
+
+The S3 ImageLoader will load images from an S3 bucket. It is used by default if you don't provide any ImageLoader in your configuration.
+It uses the `@aws-sdk/client-s3` to interact with S3.
+
+##### Requirements
+
+- You need to provide the `BUCKET_KEY_PREFIX`, `BUCKET_NAME` environment variables to your server.
+
+### host
+
+The Host ImageLoader will load images from the host.
+This implementation will directly fetch the image from the host.
+
+##### Requirements
+
+The host should be provided in the headers of the request, either in the `X-Forwarded-Host` or the `Host` header.
+
+### fs-dev
+
+The FsDev ImageLoader is a simple implementation that loads images from the `.open-next/assets` folder and interact with it using the filesystem. It is useful for development purposes only.
+
+### dummy
+
+The Dummy ImageLoader is a dummy implementation that will throw an exception. It should not be used.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/incremental_cache.mdx b/pages/aws/config/overrides/incremental_cache.mdx
index de287ce..0e9ca3d 100644
--- a/pages/aws/config/overrides/incremental_cache.mdx
+++ b/pages/aws/config/overrides/incremental_cache.mdx
@@ -1,3 +1,5 @@
+import { Callout } from 'nextra/components';
+
 This override is used by the [`cache` adapter](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/adapters/cache.ts) that is provided by OpenNext to the NextServer. It is also used by OpenNext if `enableCacheInterception` is set to `true` in the configuration.
 
 It is used for retrieving and updating the ISR/SSG cache as well as the fetch cache used by Next.js. It does not handle anything related to cache tags (i.e. `revalidateTag` and `revalidatePath`)
@@ -5,4 +7,65 @@ It is used for retrieving and updating the ISR/SSG cache as well as the fetch ca
 If you want to better understand how to implement your own IncrementalCache, the easiest way would be to take a look at the existing [included IncrementalCache](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/incrementalCache).
 
 One thing to note is that it is not used at build time, only at runtime. This means that you'll have to upload the cache yourself if you want to use the prebuilt routes/pages (And this is mandatory for ISR/SSG routes with `fallback:false`).
-All the cache files are present in the `.open-next/cache` folder. The one under `BUILD_ID` are for the ISR/SSG cache and the one under `__fetch/BUILD_ID` are for the fetch cache.
\ No newline at end of file
+All the cache files are present in the `.open-next/cache` folder. The one under `BUILD_ID` are for the ISR/SSG cache and the one under `__fetch/BUILD_ID` are for the fetch cache.
+
+## Included IncrementalCache
+
+### s3
+
+The S3 IncrementalCache will store fetch and ISR/SSG cache in an S3 bucket. It is used by default if you don't provide any IncrementalCache in your configuration.
+It uses the `@aws-sdk/client-s3` to interact with S3.
+
+##### Requirements
+
+- You need to provide the `CACHE_BUCKET_REGION`, `CACHE_BUCKET_KEY_PREFIX`, `CACHE_BUCKET_NAME` environment variables to your server.
+
+### s3-lite
+
+The S3Lite IncrementalCache will store fetch and ISR/SSG cache in an S3 bucket
+This implementation is a lighter version of the `s3` IncrementalCache as it uses `aws4fetch` to interact with S3.
+
+##### Requirements
+
+- You need to provide the `CACHE_BUCKET_REGION`, `CACHE_BUCKET_KEY_PREFIX`, `CACHE_BUCKET_NAME`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
+
+### dummy
+
+The Dummy IncrementalCache is a dummy implementation that throws exceptions for every method. It should not be used unless you want to disable the cache.
+
+### fs-dev
+
+The FsDev IncrementalCache is a simple implementation that stores the cache in the `.open-next/cache` folder and interact with it using the filesystem. It is useful for development purposes only.
+
+##### Requirements
+
+It needs to run on the local filesystem, and expect to be run from the OpenNext output.
+
+### multi-tier-ddb-s3
+
+<Callout type='warning'>
+Because of how it works, this implementation is only eventually consistent and errors during update could cause inconsistencies between the local cache in some instances and the S3 cache.
+
+It could also end up being slower (and more expensive) than simpler implementations if used in a low traffic serverless environment.
+</Callout>
+
+The MultiTierDdbS3 IncrementalCache is a more complex implementation. 
+Cache are stored in a local In Memory LRU cache as well as in S3. DynamoDB is used to keep local cache in sync between multiple instances of the server.
+It uses `aws4fetch` to interact with S3 and DynamoDB.
+
+##### How does it work
+
+On get :
+1. When a cache is requested, it first checks the local cache. If the cache is not found, it will fetch it from S3 and store it in the local cache.
+2. If the local cache exist for this key, it will check metadata in DynamoDB to see if the cache is still valid. If it is not, it will fetch the cache from S3 and store it in the local cache.
+3. If the local cache is valid, it will return it.
+
+On update :
+1. When a cache is updated, it will first try to update the cache in S3.
+2. If the update is successful, it will update the metadata in DynamoDB.
+3. Finally, it will update the local cache.
+
+##### Requirements
+
+- You need to provide the `CACHE_BUCKET_REGION`, `CACHE_BUCKET_KEY_PREFIX`, `CACHE_BUCKET_NAME`, `CACHE_DYNAMO_TABLE`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN`, `OPEN_NEXT_LOCAL_CACHE_TTL_MS` (optional), `OPEN_NEXT_LOCAL_CACHE_SIZE`(optional) environment variables to your server.
+- DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
\ No newline at end of file
diff --git a/pages/aws/config/overrides/queue.mdx b/pages/aws/config/overrides/queue.mdx
index 359ac8c..c081ca3 100644
--- a/pages/aws/config/overrides/queue.mdx
+++ b/pages/aws/config/overrides/queue.mdx
@@ -1,3 +1,5 @@
+import {Callout} from 'nextra/components'
+
 This override is used by OpenNext to trigger the revalidation of stale routes.
 Before sending the response to the client, OpenNext will check if the route is stale and if it is, it will call the queue override to revalidate the route.
 
@@ -5,4 +7,36 @@ If you want to better understand how to implement your own Queue, the easiest wa
 
 Couple of things to note :
 - The default implementation use an SQS queue. This has the main advantage of being able to control the concurrency of the revalidations as well as avoiding trigerring the revalidation multiple times for the same route.
-- You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `queue` override](/aws/contribute/local_run#devqueuets).
\ No newline at end of file
+- You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `queue` override](/aws/contribute/local_run#devqueuets).
+
+## Included Queue
+
+### sqs
+
+The SQS Queue will send a message to an SQS queue for each route that needs to be revalidated. It is used by default if you don't provide any Queue in your configuration.
+It uses the `@aws-sdk/client-sqs` to interact with SQS.
+
+#### Requirements
+
+- You need to provide the `QUEUE_URL` environment variable to your server.
+
+### sqs-lite
+
+The SQSLite Queue will send a message to an SQS queue for each route that needs to be revalidated.
+This implementation is a lighter version of the `sqs` Queue as it uses `aws4fetch` to interact with SQS.
+
+#### Requirements
+
+- You need to provide the `QUEUE_URL`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
+
+### direct
+
+The Direct Queue will directly trigger the revalidation of the route in the Queue override itself. It is useful for development purposes and when you don't want to use a queue.
+
+<Callout type='warning'>
+Be careful with this implementation as it could lead to multiple revalidations of the same route.
+</Callout>
+
+### dummy
+
+The Dummy Queue is a dummy implementation that will throw an exception. It should not be used unless you want to disable ISR.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/tag_cache.mdx b/pages/aws/config/overrides/tag_cache.mdx
index 7cd278a..47575dd 100644
--- a/pages/aws/config/overrides/tag_cache.mdx
+++ b/pages/aws/config/overrides/tag_cache.mdx
@@ -9,4 +9,34 @@ This also has the drawback of needing to prepopulate the cache with all the tags
 
 We might allow to choose how cache tags are handled in the future depending on the `TagCache` implementation. If you need this feature, feel free to open an issue on the [GitHub repository](https://github.com/opennextjs/opennextjs-aws).
 
-If you want to better understand how to implement your own TagCache, the easiest way would be to take a look at the existing [included TagCache](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/tagCache).
\ No newline at end of file
+If you want to better understand how to implement your own TagCache, the easiest way would be to take a look at the existing [included TagCache](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/tagCache).
+
+## Included TagCache
+
+### dynamodb
+
+The DynamoDB TagCache will store the cache tags in a DynamoDB table. It is used by default if you don't provide any TagCache in your configuration.
+It uses the `@aws-sdk/client-dynamodb` to interact with DynamoDB.
+
+##### Requirements
+
+- You need to provide the `CACHE_DYNAMO_TABLE`, `CACHE_BUCKET_REGION` environment variable to your server.
+- DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
+
+### dynamodb-lite
+
+The DynamoDBLite TagCache will store the cache tags in a DynamoDB table.
+This implementation is a lighter version of the `dynamodb` TagCache as it uses `aws4fetch` to interact with DynamoDB.
+
+##### Requirements
+
+- You need to provide the `CACHE_DYNAMO_TABLE`, `CACHE_BUCKET_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
+- DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
+
+### dummy
+
+The Dummy TagCache is a dummy implementation that will throw an exception. It should not be used unless you want to disable cache tags.
+
+### fs-dev
+
+The FsDev TagCache is a simple implementation that stores the cache tags in a file in the `.open-next/cache` folder and interact with it using the filesystem. It is useful for development purposes only.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/wrapper.mdx b/pages/aws/config/overrides/wrapper.mdx
index 913edcb..3d81b00 100644
--- a/pages/aws/config/overrides/wrapper.mdx
+++ b/pages/aws/config/overrides/wrapper.mdx
@@ -7,3 +7,62 @@ Couple of things to note :
 - If you don't use streaming (like in the default `aws-lambda` wrapper), you may still need to provide a fake `StreamCreator` to the `handler` to avoid a weird issue with Node itself (see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/aws-lambda.ts#L49-L65) for an example and a more thorough explanation).
 - If you use the `edge` runtime of Next (either for the external middleware or for an `edge` route or page), you don't need the `StreamCreator` at all.
 - If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/cloudflare.ts#L29)). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
+
+
+## Included Wrappers
+
+### aws-lambda
+
+The `aws-lambda` Wrapper is the default wrapper for AWS Lambda. It is used by default if you don't provide any Wrapper in your configuration.
+
+#### Features
+- [ ] Streaming
+- [ ] Proper support for `waitUntil`
+
+### aws-lambda-streaming
+
+The `aws-lambda-streaming` Wrapper is a wrapper that allows you to use streaming in AWS Lambda. Streaming must be enabled for this lambda.
+
+#### Features
+- [x] Streaming
+- [x] Proper support for `waitUntil`
+
+### cloudflare-edge
+
+The `cloudflare-edge` Wrapper is the wrapper for Cloudflare Workers. It should be used for the external middleware and for the `edge` runtime of Next.
+
+#### Features
+- [x] Streaming
+- [x] Proper support for `waitUntil`
+
+### cloudflare-node
+
+The `cloudflare-node` Wrapper is the wrapper for Cloudflare Workers. It should be used only with the `node` runtime of Next and if you use `@opennextjs/cloudflare`.
+
+#### Features
+- [x] Streaming
+- [x] Proper support for `waitUntil`
+
+### node
+
+The `node` Wrapper is the wrapper for classic Node.js Server. This one is a long running server.
+
+#### Features
+- [x] Streaming
+- [x] Proper support for `waitUntil`
+
+### express-dev
+
+The `express-dev` Wrapper is the wrapper for a classic Express server. It is a long running process and should be used for development purposes only.
+
+#### Features
+- [x] Streaming
+- [x] Proper support for `waitUntil`
+
+### dummy
+
+The `dummy` Wrapper is a dummy implementation that will just forward the event and `StreamCreator` to the handler.
+
+#### Features
+- [ ] Streaming
+- [ ] Proper support for `waitUntil`
\ No newline at end of file
diff --git a/pages/aws/contribute/local_run.mdx b/pages/aws/contribute/local_run.mdx
index ec058eb..970a2cf 100644
--- a/pages/aws/contribute/local_run.mdx
+++ b/pages/aws/contribute/local_run.mdx
@@ -1,4 +1,5 @@
-When making some changes to OpenNext, it can be a bit cumbersome to need to deploy every time you want to test changes. If your change is not dependent on the wrapper or the converter, then you can create a custom `open-next.config.ts` file (you can use another name so that it doesn't conflict with your existing `open-next.config.ts`). Here is an example with a bunch of custom overrides:
+When making some changes to OpenNext, it can be a bit cumbersome to need to deploy every time you want to test changes. If your change is not dependent on the wrapper or the converter, then you can create a custom `open-next.config.ts` file (you can use another name so that it doesn't conflict with your existing `open-next.config.ts`). 
+
 
 To run `OpenNext` locally:
 ```bash
@@ -12,179 +13,36 @@ node .open-next/server-functions/default/index.mjs
 // open-next.local.config.ts -
 // A good practice would be to use a different name so that it doesn't conflict
 // with your existing open-next.config.ts i.e. open-next.local.config.ts
-import type {OpenNextConfig} from '@opennextjs/aws/types/open-next.js'
+// You could also customize it by using custom overrides if you need to.
+import type {OpenNextConfig} from "@opennextjs/aws/types/open-next.js"
 
-const config = {
+export default {
   default: {
-    override:{
-      // We use a custom wrapper so that we can use static assets and image optimization locally
-      wrapper: () => import('./dev/wrapper').then(m => m.default),
-      // ISR and SSG won't work properly locally without this - Remove if you only need SSR
-      incrementalCache: () => import('./dev/incrementalCache').then(m => m.default),
-      // ISR requires a queue to work properly - Remove if you only need SSR or SSG
-      queue: () => import('./dev/queue').then(m => m.default),
-      converter: 'node',
+    override: {
+      wrapper: "express-dev",
+      converter: "node",
+      incrementalCache: "fs-dev",
+      queue: "direct",
+      tagCache: "fs-dev"
     }
   },
-  // You don't need this part if you don't use image optimization or don't need it in your test
+
   imageOptimization: {
-    // Image optimization only work on linux, and you have to use the correct architecture for your system
-    arch: 'x64',
     override: {
-      wrapper: 'node',
-      converter: 'node',
+      wrapper: "dummy",
+      converter: "dummy"
+    },
+    loader: "fs-dev",
+    // This part is not needed on arm linux, and image optimization will only work in linux
+    install: {
+      arch: "x64",
+      packages: ["sharp"]
     }
-    // If you need to test with local assets, you'll have to override the imageLoader as well
   },
 
-  dangerous: {
-    // We disable the cache tags as it will usually not be needed locally for testing
-    // It's only used for next/cache revalidateTag and revalidatePath
-    // If you need it you'll have to override the tagCache as well
-    disableTagCache: true,
-
-
-    // You can uncomment this line if you only need to test SSR
-    //disableIncrementalCache: true,
-  },
-  // You can override the build command so that you don't have to rebuild the app every time
-  // You need to have run the default build command at least once
-  buildCommand: 'echo "no build command"',
-  edgeExternals: ['./dev/wrapper', './dev/incrementalCache', './dev/queue'],
+  // You can override the build command here so that you don't have to rebuild next every time you make a change
+  //buildCommand: "echo 'No build command'",
 } satisfies OpenNextConfig
 
 export default config
 ```
-
-### dev/wrapper.ts
-
-```typescript
-// dev/wrapper.ts
-// You'll need to install express
-import express from 'express'
-// The proxy is used to proxy the image optimization server
-// you don't have to use it, but image request will return 500 error
-import proxy from 'express-http-proxy'
-import { fork } from 'child_process'
-
-import type { StreamCreator } from "@opennextjs/aws/types/open-next.js";
-import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
-
-const wrapper: WrapperHandler = async (handler, converter) => {
-  const app = express();
-  // To serve static assets
-  app.use(express.static('../../assets'))
-
-  //Launch image server fork
-  fork('../../image-optimization-function/index.mjs', [], {
-    env: {
-      NODE_ENV: 'development',
-      PORT: '3001',
-    }
-  })
-  app.use('/_next/image', proxy('localhost:3001'))
-
-  app.all('*', async (req, res) => {
-    const internalEvent = await converter.convertFrom(req);
-    const _res : StreamCreator = {
-      writeHeaders: (prelude) => {
-        res.writeHead(prelude.statusCode, prelude.headers);
-        res.uncork();
-        return res;
-      },
-      onFinish: () => {
-        // Is it necessary to do something here?
-      },
-    };
-    await handler(internalEvent, _res);
-  });
-
-  const server = app.listen(parseInt(process.env.PORT ?? "3000", 10), ()=> {
-    console.log(`Server running on port ${process.env.PORT ?? 3000}`);
-  })
-
-
-  app.on('error', (err) => {
-    console.error('error', err);
-  });
-
-  return () => {
-    server.close();
-  };
-};
-
-export default {
-  wrapper,
-  name: "dev-node",
-  supportStreaming: true,
-};
-```
-
-### dev/incrementalCache.ts
-```typescript
-// dev/incrementalCache.ts
-import type { IncrementalCache } from '@opennextjs/aws/types/overrides.js'
-
-import fs from 'node:fs/promises'
-import path from 'node:path'
-
-const buildId = process.env.NEXT_BUILD_ID
-const basePath= path.resolve(process.cwd(), `../../cache/${buildId}`)
-
-const getCacheKey = (key: string) => {
-  return path.join(basePath, `${key}.cache`)
-}
-
-const cache: IncrementalCache = {
-  name: 'dev-fs',
-  get: async (key: string) => {
-    const fileData = await fs.readFile(getCacheKey(key), 'utf-8')
-    const data = JSON.parse(fileData)
-    const {mtime} = await fs.stat(getCacheKey(key))
-    return {
-      value: data,
-      lastModified: mtime.getTime(),
-    }
-  },
-  set: async (key, value, isFetch) => {
-    const data = JSON.stringify(value)
-    await fs.writeFile(getCacheKey(key), data)
-  },
-  delete: async (key) => {
-    await fs.rm(getCacheKey(key))
-  }
-}
-
-export default cache
-```
-
-### dev/queue.ts
-
-```typescript
-// dev/queue.ts
-import type { Queue } from '@opennextjs/aws/types/overrides.js'
-
-declare global {
-  // This is declared in the global scope so that we can use it in the queue
-  // We need to use this one as next overrides the global fetch
-  var internalFetch: typeof fetch
-}
-
-const queue: Queue = {
-  name: 'dev-queue',
-  send: async (message) => {
-    const prerenderManifest  = (await import('@opennextjs/aws/adapters/config.js')).PrerenderManifest as any
-    const revalidateId : string = prerenderManifest.preview.previewModeId
-    await globalThis.internalFetch(`http://localhost:3000${message.MessageBody.url}`, {
-      method: "HEAD",
-      headers: {
-        "x-prerender-revalidate": revalidateId,
-        "x-isr": "1",
-      },
-    },)
-    console.log('sending message', message)
-  },
-}
-
-export default queue
-```

From 29393e43c406dad06201020f965f94bba0ce7fd9 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 17 Jan 2025 16:41:10 +0100
Subject: [PATCH 036/140] doc: Composable Caching is not supported yet (#52)

---
 pages/aws/comparison.mdx   | 38 +++++++++++++++++++-------------------
 pages/aws/index.mdx        |  5 +++--
 pages/cloudflare/index.mdx |  3 ++-
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/pages/aws/comparison.mdx b/pages/aws/comparison.mdx
index f03a52c..1f0a522 100644
--- a/pages/aws/comparison.mdx
+++ b/pages/aws/comparison.mdx
@@ -1,25 +1,25 @@
-It should be noted that open-next does not actually deploy the app. It only bundles everything for your IAC to deploy it. 
+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:
 
-| Features | OpenNext | Vercel | AWS Amplify | Docker Standalone |
-| --- | --- | --- | --- | --- |
-| **Function splitting** | Yes | Yes | No | No |
-| **Multiple deployment target** ¹ | Yes | Yes ² | No | No |
-| **Serverless** | Yes | Yes | Yes | No ³ |
-| **Warmer function** | Yes | No | No | Not necessary |
-| **External middleware** | Yes ⁴ | Yes | No | No |
-| **Edge runtime support** | Partial Support ⁵ | Yes | Embedded ⁶ | Embedded ⁶ |
-| **ISR** | Yes | Yes | Yes | Yes ⁷ |
-| **On-Demand Revalidation** | Yes ⁸ | Yes | No | Yes ⁸ |
-| **Custom server** | Yes ⁹ | No | No | Yes |
+| Features                         | OpenNext          | Vercel | AWS Amplify | Docker Standalone |
+| -------------------------------- | ----------------- | ------ | ----------- | ----------------- |
+| **Function splitting**           | Yes               | Yes    | No          | No                |
+| **Multiple deployment target** ¹ | Yes               | Yes ²  | No          | No                |
+| **Serverless**                   | Yes               | Yes    | Yes         | No ³              |
+| **Warmer function**              | Yes               | No     | No          | Not necessary     |
+| **External middleware**          | Yes ⁴             | Yes    | No          | No                |
+| **Edge runtime support**         | Partial Support ⁵ | Yes    | Embedded ⁶  | Embedded ⁶        |
+| **ISR**                          | Yes               | Yes    | Yes         | Yes ⁷             |
+| **On-Demand Revalidation**       | Yes ⁸             | Yes    | No          | Yes ⁸             |
+| **Custom server**                | Yes ⁹             | No     | No          | Yes               |
 
 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)
-2. 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
-3. OpenNext supports external middleware, but it is not enabled by default.
-4. 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.
-5. Embedded means that the edge runtime is embedded inside the bundle. It emulates a fake edge runtime inside the prod environment.
-6. 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.
-7. You need to invalidate the CDN manually. For OpenNext, here is an example for cloudfront
-8. OpenNext supports custom server, but it is not enabled by default. You can have a custom server even in a serverless environment.
\ No newline at end of file
+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.
diff --git a/pages/aws/index.mdx b/pages/aws/index.mdx
index 3290d80..39d6e43 100644
--- a/pages/aws/index.mdx
+++ b/pages/aws/index.mdx
@@ -28,7 +28,7 @@ We need your help keeping it up to date and feature complete. Make sure to [**jo
 
 ---
 
-OpenNext aims to support all Next.js 14 features. Some features are work in progress. Please open a [new issue](https://github.com/opennextjs/opennextjs-aws/issues/new) to let us know!
+OpenNext aims to support all Next.js 15 features. Some features are work in progress. Please open a [new issue](https://github.com/opennextjs/opennextjs-aws/issues/new) to let us know!
 
 - [x] App & Pages Router
 - [x] API routes
@@ -41,7 +41,8 @@ OpenNext aims to support all Next.js 14 features. Some features are work in prog
 - [x] [NextAuth.js](https://next-auth.js.org)
 - [x] [Running in lambda@edge](/aws/config/simple_example#running-in-lambdaedge)
 - [x] [No cold start](/aws/inner_workings/components/warmer)
-- [x] Experimental streaming support
+- [x] Support for after
+- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
 ---
 
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 58a42ae..580a8dc 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -54,7 +54,8 @@ We will update the list as we progress towards releasing 1.0.
 - [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
 - [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
-- [ ] [Experimental streaming support](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+- [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
 We welcome both contributions and feedback!
 

From fa42384274a957ed4da3cd80bad5667dc8f33228 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 21 Jan 2025 11:28:49 +0100
Subject: [PATCH 037/140] Add schema to wrangler.json (#53)

---
 pages/cloudflare/get-started.mdx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index ccb2907..4a3a37a 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -45,6 +45,7 @@ application to be previewed and deployed, it is also where you configure your Wo
 You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
 ```jsonc
 {
+  "$schema": "node_modules/wrangler/config-schema.json",
   "main": ".open-next/worker.js",
   "name": "my-app",
   "compatibility_date": "2024-12-30",

From 414bc8543cdc36ab76bdd14bd7cc7eae1287a177 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Fri, 24 Jan 2025 21:28:17 +0000
Subject: [PATCH 038/140] add missing backticks to `@opennextjs/cloudflare`
 references (#56)

---
 pages/cloudflare/examples.mdx    | 2 +-
 pages/cloudflare/get-started.mdx | 2 +-
 pages/cloudflare/index.mdx       | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index 22c2ae3..ca3c6bd 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -3,7 +3,7 @@ import { Callout } from 'nextra/components';
 
 ## Examples
 
-To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```
 npm create cloudflare@latest -- my-next-app --framework=next --experimental
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 4a3a37a..b93a4b3 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -5,7 +5,7 @@ import { Callout } from 'nextra/components';
 
 #### New apps
 
-To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```
 npm create cloudflare@latest -- my-next-app --framework=next --experimental
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 580a8dc..4156bbd 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -17,7 +17,7 @@ You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 
 ##### New apps
 
-To create a new Next.js app, pre-configured to run on Cloudflare using @opennextjs/cloudflare, run:
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```
 npm create cloudflare@latest -- my-next-app --framework=next --experimental
@@ -63,10 +63,10 @@ We welcome both contributions and feedback!
 
 <WindowsSupport />
 
-### How @opennextjs/cloudflare Works
+### How `@opennextjs/cloudflare` Works
 
 The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
 
 When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running the `build` script in your `package.json`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 
-You can view the code for @opennextjs/cloudflare [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
+You can view the code for `@opennextjs/cloudflare` [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.

From 032edf97efd81ea0e2e8bab64e4377311848b30c Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Fri, 24 Jan 2025 21:28:31 +0000
Subject: [PATCH 039/140] remove doc comment in Cloudflare get started telling
 people to use the app router instead of the pages one (#55)

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 4156bbd..0457ca1 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -51,7 +51,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
-- [ ] [Pages Router](https://nextjs.org/docs/pages) (you should use the App Router instead, which was introduced in Next.js 13)
+- [ ] [Pages Router](https://nextjs.org/docs/pages)
 - [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)

From 3ad453ff1c4ea3de2dacf7678e90e3a0c9ef9b7f Mon Sep 17 00:00:00 2001
From: Lubomir Georgiev <lubomir.georgiev.georgiev@gmail.com>
Date: Thu, 23 Jan 2025 14:59:30 +0200
Subject: [PATCH 040/140] doc(cloudflare): Add a SaaS template to the examples
 page

---
 pages/cloudflare/examples.mdx | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index ca3c6bd..fddad40 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -23,3 +23,33 @@ You can use these to understand how to configure your Next.js app to use `@openn
 ### Next.js Commerce Demo
 
 The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
+
+### Fully-featured SaaS starter kit
+
+The [Cloudflare Workers SaaS template](https://github.com/LubomirGeorgiev/cloudflare-workers-nextjs-saas-template) is a fully-featured SaaS app that works with `@opennextjs/cloudflare` and utilizes lots of other Cloudflare services.
+Here is a list of some of the features it includes:
+
+- Custom authentication with password and Google SSO
+    - Session storage in Cloudflare KV
+    - Drizzle ORM and Cloudflare D1
+    - Forgot password
+    - Change password
+    - Change user settings
+- Shadcn for the UI
+- Light/Dark Theme
+- Loading states and animations
+- Toast alerts and notifications
+- Landing page
+- SEO optimization
+- Protection with Cloudflare Turnstile Captcha
+- Transactional email templates with react-email and integration with Resend and Brevo
+- Rate Limiting with Cloudflare KV to prevent abuse
+- Validation for all user actions with react-zsa and zod
+- Completely type safe
+- Comprehensive eslint config
+- Integrated with Cursor AI
+- .cursorrules
+- A markdown project documentation that Cursor can refer to for more context and better responses
+- Detailed documentation for local development and production deployment
+- Automatic deployment using Github Actions and the Wrangler CLI
+- And more...

From 63c942e8896c3442a290439871a2717895c59442 Mon Sep 17 00:00:00 2001
From: Lubomir Georgiev <lubomir.georgiev.georgiev@gmail.com>
Date: Thu, 23 Jan 2025 20:23:48 +0200
Subject: [PATCH 041/140] doc(cloudflare): Shorten the features list of the
 SaaS template example

---
 pages/cloudflare/examples.mdx | 39 ++++++++++++++++-------------------
 1 file changed, 18 insertions(+), 21 deletions(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index fddad40..c9191e7 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -30,26 +30,23 @@ The [Cloudflare Workers SaaS template](https://github.com/LubomirGeorgiev/cloudf
 Here is a list of some of the features it includes:
 
 - Custom authentication with password and Google SSO
-    - Session storage in Cloudflare KV
-    - Drizzle ORM and Cloudflare D1
-    - Forgot password
-    - Change password
-    - Change user settings
-- Shadcn for the UI
-- Light/Dark Theme
-- Loading states and animations
-- Toast alerts and notifications
-- Landing page
-- SEO optimization
-- Protection with Cloudflare Turnstile Captcha
+  - Session storage in Cloudflare KV
+  - Forgot password
+  - Change password
+  - Change user settings
+- Security
+  - Protection with Cloudflare Turnstile Captcha
+  - Rate Limiting with Cloudflare KV to prevent abuse
+  - Validation for all user actions with react-zsa and zod
+- Database: Drizzle ORM and Cloudflare D1
+- UI: Shadcn, Tailwind CSS and Hero UI (formely NextUI)
 - Transactional email templates with react-email and integration with Resend and Brevo
-- Rate Limiting with Cloudflare KV to prevent abuse
-- Validation for all user actions with react-zsa and zod
-- Completely type safe
-- Comprehensive eslint config
-- Integrated with Cursor AI
-- .cursorrules
-- A markdown project documentation that Cursor can refer to for more context and better responses
-- Detailed documentation for local development and production deployment
-- Automatic deployment using Github Actions and the Wrangler CLI
+- Dev Experience
+  - Completely type safe
+  - Comprehensive eslint config
+  - Integrated with Cursor AI
+    - .cursorrules
+    - A markdown project documentation that Cursor can refer to for more context and better responses
+  - Detailed documentation for local development and production deployment
+  - Automatic deployment using Github Actions and the Wrangler CLI
 - And more...

From 704182acc27dc1d005053ca3cb6fcd32f86da1b1 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 27 Jan 2025 09:07:08 +0100
Subject: [PATCH 042/140] fixup! create a "Community projects" section

---
 pages/cloudflare/_meta.json    |  1 +
 pages/cloudflare/community.mdx | 31 +++++++++++++++++++++++++++++++
 pages/cloudflare/examples.mdx  | 27 ---------------------------
 3 files changed, 32 insertions(+), 27 deletions(-)
 create mode 100644 pages/cloudflare/community.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index 8d0c8fa..a1ffc43 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -4,6 +4,7 @@
   "bindings": "",
   "caching": "",
   "examples": "",
+  "community": "Community projects",
   "troubleshooting": "",
   "migrate-from-0.2": "",
   "0.2": "Release 0.2"
diff --git a/pages/cloudflare/community.mdx b/pages/cloudflare/community.mdx
new file mode 100644
index 0000000..212a898
--- /dev/null
+++ b/pages/cloudflare/community.mdx
@@ -0,0 +1,31 @@
+import { SITE } from '../../config';
+import { Callout } from 'nextra/components';
+
+## Projects from the community
+
+### Fully-featured SaaS starter kit
+
+The [Cloudflare Workers SaaS template](https://github.com/LubomirGeorgiev/cloudflare-workers-nextjs-saas-template) is a fully-featured SaaS app that works with `@opennextjs/cloudflare` and utilizes lots of other Cloudflare services.
+Here is a list of some of the features it includes:
+
+- Custom authentication with password and Google SSO
+  - Session storage in Cloudflare KV
+  - Forgot password
+  - Change password
+  - Change user settings
+- Security
+  - Protection with Cloudflare Turnstile Captcha
+  - Rate Limiting with Cloudflare KV to prevent abuse
+  - Validation for all user actions with react-zsa and zod
+- Database: Drizzle ORM and Cloudflare D1
+- UI: Shadcn, Tailwind CSS and Hero UI (formely NextUI)
+- Transactional email templates with react-email and integration with Resend and Brevo
+- Dev Experience
+  - Completely type safe
+  - Comprehensive eslint config
+  - Integrated with Cursor AI
+    - .cursorrules
+    - A markdown project documentation that Cursor can refer to for more context and better responses
+  - Detailed documentation for local development and production deployment
+  - Automatic deployment using Github Actions and the Wrangler CLI
+- And more...
diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index c9191e7..ca3c6bd 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -23,30 +23,3 @@ You can use these to understand how to configure your Next.js app to use `@openn
 ### Next.js Commerce Demo
 
 The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
-
-### Fully-featured SaaS starter kit
-
-The [Cloudflare Workers SaaS template](https://github.com/LubomirGeorgiev/cloudflare-workers-nextjs-saas-template) is a fully-featured SaaS app that works with `@opennextjs/cloudflare` and utilizes lots of other Cloudflare services.
-Here is a list of some of the features it includes:
-
-- Custom authentication with password and Google SSO
-  - Session storage in Cloudflare KV
-  - Forgot password
-  - Change password
-  - Change user settings
-- Security
-  - Protection with Cloudflare Turnstile Captcha
-  - Rate Limiting with Cloudflare KV to prevent abuse
-  - Validation for all user actions with react-zsa and zod
-- Database: Drizzle ORM and Cloudflare D1
-- UI: Shadcn, Tailwind CSS and Hero UI (formely NextUI)
-- Transactional email templates with react-email and integration with Resend and Brevo
-- Dev Experience
-  - Completely type safe
-  - Comprehensive eslint config
-  - Integrated with Cursor AI
-    - .cursorrules
-    - A markdown project documentation that Cursor can refer to for more context and better responses
-  - Detailed documentation for local development and production deployment
-  - Automatic deployment using Github Actions and the Wrangler CLI
-- And more...

From 14a58d949b27bcae103df38c77141b4f7b376150 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 27 Jan 2025 09:12:05 +0100
Subject: [PATCH 043/140] doc(cloudflare): Add a SaaS template to the examples
 page (#58)

Co-authored-by: Lubomir Georgiev <lubomir.georgiev.georgiev@gmail.com>

From 986c90422ecb96c2f59853522aa01c34fb349a86 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Mon, 27 Jan 2025 18:04:43 +0000
Subject: [PATCH 044/140] cloudflare: update docs to 0.4 (#57)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/0.3/_meta.json               |   7 +
 pages/cloudflare/0.3/bindings.mdx             |  65 ++++++
 pages/cloudflare/0.3/caching.mdx              |  47 +++++
 pages/cloudflare/0.3/examples.mdx             |  25 +++
 pages/cloudflare/0.3/get-started.mdx          | 187 ++++++++++++++++++
 pages/cloudflare/0.3/index.mdx                |  72 +++++++
 pages/cloudflare/_meta.json                   |   4 +-
 pages/cloudflare/bindings.mdx                 |   6 +-
 pages/cloudflare/get-started.mdx              |  24 ++-
 ...om-0.2.mdx => migrate-from-0.2-to-0.3.mdx} |   4 +-
 pages/cloudflare/migrate-from-0.3-to-0.4.mdx  |  38 ++++
 11 files changed, 471 insertions(+), 8 deletions(-)
 create mode 100644 pages/cloudflare/0.3/_meta.json
 create mode 100644 pages/cloudflare/0.3/bindings.mdx
 create mode 100644 pages/cloudflare/0.3/caching.mdx
 create mode 100644 pages/cloudflare/0.3/examples.mdx
 create mode 100644 pages/cloudflare/0.3/get-started.mdx
 create mode 100644 pages/cloudflare/0.3/index.mdx
 rename pages/cloudflare/{migrate-from-0.2.mdx => migrate-from-0.2-to-0.3.mdx} (98%)
 create mode 100644 pages/cloudflare/migrate-from-0.3-to-0.4.mdx

diff --git a/pages/cloudflare/0.3/_meta.json b/pages/cloudflare/0.3/_meta.json
new file mode 100644
index 0000000..53a20a0
--- /dev/null
+++ b/pages/cloudflare/0.3/_meta.json
@@ -0,0 +1,7 @@
+{
+  "index": "Overview",
+  "get-started": "",
+  "bindings": "",
+  "caching": "",
+  "examples": ""
+}
diff --git a/pages/cloudflare/0.3/bindings.mdx b/pages/cloudflare/0.3/bindings.mdx
new file mode 100644
index 0000000..ee412f0
--- /dev/null
+++ b/pages/cloudflare/0.3/bindings.mdx
@@ -0,0 +1,65 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+### Bindings
+
+[Bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](https://developers.cloudflare.com/r2/) bucket.
+
+#### How to configure your Next.js app so it can access bindings
+
+Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started#3-create-a-wranglerjson-file).
+
+#### How to access bindings in your Next.js app
+
+You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) from any route of your Next.js app via `getCloudflareContext`:
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+	let responseText = "Hello World";
+
+	const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
+	await myKv.put("foo", "bar");
+	const foo = await myKv.get("foo");
+
+	return new Response(foo);
+}
+```
+
+#### How to add bindings to your Worker
+
+Add bindings to your Worker by adding them to your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+
+## TypeScript type declarations for bindings
+
+To ensure that the `env` object from `(await getCloudflareContext()).env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
+
+```
+npx wrangler types --experimental-include-runtime
+```
+
+This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
+
+If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
+
+```bash
+npx wrangler types --experimental-include-runtime="./runtime.d.ts"
+```
+
+To ensure that your types are always up-to-date, make sure to run `wrangler types --experimental-include-runtime` after any changes to your config file.
+
+## Other Cloudflare APIs (`cf`, `ctx`)
+
+You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/get-cloudflare-context.ts):
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+
+export async function GET(request) {
+	const { env, cf, ctx } = await getCloudflareContext();
+
+	// ...
+}
+```
diff --git a/pages/cloudflare/0.3/caching.mdx b/pages/cloudflare/0.3/caching.mdx
new file mode 100644
index 0000000..5e4688e
--- /dev/null
+++ b/pages/cloudflare/0.3/caching.mdx
@@ -0,0 +1,47 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+## Caching
+
+`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
+
+By default, all `fetch()` subrequests made in your Next.js app are cached. Refer to the [Next.js documentation](https://nextjs.org/docs/app/building-your-application/caching#opting-out-1) for information about how to disable caching for an individual subrequest, or for an entire route.
+
+[The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
+
+Note that [Revalidating](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#revalidating-data) is not yet supported.
+
+Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
+
+<Callout>
+Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
+</Callout>
+
+### How to enable caching
+
+`@opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
+
+To enable caching, you must:
+
+#### 1. Create a KV namespace
+
+```
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
+```
+
+#### 2. Add the KV namespace to your Worker
+
+The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
+
+```jsonc
+// wrangler.json
+{
+  // ...
+  "kv_namespaces": [
+    {
+      "binding": "NEXT_CACHE_WORKERS_KV",
+      "id": "<BINDING_ID>"
+    }
+  ]
+}
+```
diff --git a/pages/cloudflare/0.3/examples.mdx b/pages/cloudflare/0.3/examples.mdx
new file mode 100644
index 0000000..deafb82
--- /dev/null
+++ b/pages/cloudflare/0.3/examples.mdx
@@ -0,0 +1,25 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+## Examples
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+### Basic starter projects
+
+Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
+
+- [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [*`middleware`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [*`vercel-blog-starter`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
+
+You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
+
+### Next.js Commerce Demo
+
+The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
diff --git a/pages/cloudflare/0.3/get-started.mdx b/pages/cloudflare/0.3/get-started.mdx
new file mode 100644
index 0000000..b3b5668
--- /dev/null
+++ b/pages/cloudflare/0.3/get-started.mdx
@@ -0,0 +1,187 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+
+### Get Started
+
+#### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+#### Existing Next.js apps
+
+##### 1. Install @opennextjs/cloudflare
+
+First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
+
+```sh
+npm install --save-dev @opennextjs/cloudflare@latest
+```
+
+##### 2. Install Wrangler
+
+Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
+
+```npm
+npm install --save-dev wrangler@latest
+```
+
+<Callout>
+You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+</Callout>
+
+##### 3. Create a wrangler configuration file
+
+<Callout type='info'>
+This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+</Callout>
+
+A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
+application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+
+You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
+```jsonc
+{
+  "$schema": "node_modules/wrangler/config-schema.json",
+  "main": ".open-next/worker.js",
+  "name": "my-app",
+  "compatibility_date": "2024-12-30",
+  "compatibility_flags": ["nodejs_compat"],
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+  },
+  "kv_namespaces": [
+    // Create a KV binding with the binding name "NEXT_CACHE_WORKERS_KV"
+    // to enable the KV based caching:
+    // {
+    //   "binding": "NEXT_CACHE_WORKERS_KV",
+    //   "id": "<BINDING_ID>"
+    // }
+  ],
+}
+```
+
+<Callout>
+As shown above:
+ - You must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare
+ - The `main` and `assets` values should also not be changed unless you modify the build output result in some way
+ - You can add a binding named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching docs](/cloudflare/caching)
+</Callout>
+
+##### 4. Add an `open-next.config.ts` file
+
+<Callout type='info'>
+This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+</Callout>
+
+Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+
+```ts
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
+import cache from "@opennextjs/cloudflare/kvCache";
+
+const config: OpenNextConfig = {
+  default: {
+    override: {
+      wrapper: "cloudflare-node",
+      converter: "edge",
+      // set `incrementalCache` to "dummy" to disable KV cache
+      incrementalCache: async () => cache,
+      tagCache: "dummy",
+      queue: "dummy",
+    },
+  },
+
+  middleware: {
+    external: true,
+    override: {
+      wrapper: "cloudflare-edge",
+      converter: "edge",
+      proxyExternalRequest: "fetch",
+    },
+  },
+};
+
+export default config;
+```
+
+<Callout>
+To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the `@opennextjs/aws` NPM package as a dev dependency.
+</Callout>
+
+##### 5. Add a `.dev.vars` file
+
+Then, add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
+
+```text
+NEXTJS_ENV=development
+```
+
+The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
+
+##### 6. Update the `package.json` file
+
+Add the following to the scripts field of your `package.json` file:
+
+```json
+"build:worker": "opennextjs-cloudflare",
+"dev:worker": "wrangler dev --port 8771",
+"preview": "npm run build:worker && npm run dev:worker",
+"deploy": "npm run build:worker && wrangler deploy",
+"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
+```
+
+- `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running the `build` script in your `package.json` (Next.js apps use `next build` by default), and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare. The build command used by OpenNext can be overridden with the `buildCommand` option in your OpenNext config.
+- `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
+- `npm run preview`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+- `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
+
+##### 7. Add caching with Workers KV
+
+See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
+
+##### 8. Remove any `export const runtime = "edge";` if present
+
+Before deploying your app, remove the `export const runtime = "edge";` line from any of your source files.
+
+The edge runtime is not supported yet with `@opennextjs/cloudflare`.
+
+##### 9. Add `.open-next` to `.gitignore`
+
+You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
+
+##### 10. Remove `@cloudflare/next-on-pages` (if necessary)
+
+If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
+
+Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) package as well as the [`eslint-plugin-next-on-pages`](https://www.npmjs.com/package/eslint-plugin-next-on-pages) package if present.
+
+Remove any reference of these packages from your source and configuration files.
+This includes:
+ - `setupDevPlatform()` calls in your Next.js config file
+ - `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+   (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+ - next-on-pages eslint rules set in your Eslint config file
+
+##### 11. Develop locally
+
+You can continue to run `next dev` when developing locally.
+
+During local development, you can access local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
+In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
+
+##### 12. Deploy to Cloudflare Workers
+
+Either deploy via the command line:
+
+```sh
+npm run deploy:worker
+```
+
+Or [connect a Github or Gitlab repository](https://developers.cloudflare.com/workers/ci-cd/), and Cloudflare will automatically build and deploy each pull request you merge to your production branch.
diff --git a/pages/cloudflare/0.3/index.mdx b/pages/cloudflare/0.3/index.mdx
new file mode 100644
index 0000000..3c5e7c3
--- /dev/null
+++ b/pages/cloudflare/0.3/index.mdx
@@ -0,0 +1,72 @@
+import { SITE } from '../../../config';
+import { Callout } from 'nextra/components';
+import WindowsSupport from '../../../shared/WindowsSupport.mdx';
+
+## Cloudflare
+
+The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
+
+<Callout>
+[`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
+
+You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
+
+</Callout>
+
+### Get Started
+
+##### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+##### Existing Next.js apps
+
+Follow the guide [here](/cloudflare/get-started) to use [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) with an existing Next.js app.
+
+### Supported Next.js runtimes
+
+Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app should use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
+
+This is an important difference from `@cloudflare/next-on-pages`, which only supports the "Edge" runtime. The Edge Runtime code in Next.js [intentionally constrains which APIs from Node.js can be used](https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/plugins/middleware-plugin.ts#L820), and the "Edge" runtime does not support all Next.js features.
+
+### Supported Next.js versions
+
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 14 and 15.
+
+To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
+
+### Supported Next.js features
+
+Some Next.js features are not yet supported are not fully tested.
+We will update the list as we progress towards releasing 1.0.
+
+- [x] [App Router](https://nextjs.org/docs/app)
+- [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
+- [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
+- [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
+- [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
+- [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
+- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [ ] [Pages Router](https://nextjs.org/docs/pages)
+- [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
+- [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
+- [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
+
+We welcome both contributions and feedback!
+
+### Windows support
+
+<WindowsSupport />
+
+### How `@opennextjs/cloudflare` Works
+
+The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
+
+When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running the `build` script in your `package.json`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+
+You can view the code for `@opennextjs/cloudflare` [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index a1ffc43..d0150a0 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -6,6 +6,8 @@
   "examples": "",
   "community": "Community projects",
   "troubleshooting": "",
-  "migrate-from-0.2": "",
+  "migrate-from-0.3-to-0.4": "Migrate from 0.3",
+  "0.3": "Release 0.3",
+  "migrate-from-0.2-to-0.3": "",
   "0.2": "Release 0.2"
 }
diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index dfd8aee..48dbbfe 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -19,7 +19,7 @@ import { getCloudflareContext } from "@opennextjs/cloudflare";
 export async function GET(request) {
 	let responseText = "Hello World";
 
-	const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
+	const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
 	await myKv.put("foo", "bar");
 	const foo = await myKv.get("foo");
 
@@ -33,7 +33,7 @@ Add bindings to your Worker by adding them to your [wrangler configuration file]
 
 ## TypeScript type declarations for bindings
 
-To ensure that the `env` object from `(await getCloudflareContext()).env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
+To ensure that the `env` object from `getCloudflareContext().env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
 
 ```
 npx wrangler types --experimental-include-runtime
@@ -58,7 +58,7 @@ import { getCloudflareContext } from "@opennextjs/cloudflare";
 
 
 export async function GET(request) {
-	const { env, cf, ctx } = await getCloudflareContext();
+	const { env, cf, ctx } = getCloudflareContext();
 
 	// ...
 }
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index b93a4b3..c35d63c 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -172,9 +172,29 @@ This includes:
 
 You can continue to run `next dev` when developing locally.
 
-During local development, you can access local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+Modify your Next.js configuration file to import and call the `initOpenNextCloudflareForDev` utility
+from the `@cloudflare/next-on-pages` package. This makes sure that the Next.js dev server can optimally integrate with the open-next
+cloudflare adapter and it is necessary for using bindings during local development.
 
-In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime, rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
+This is an example of a Next.js configuration file calling the utility:
+```js
+// next.config.mjs
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+
+initOpenNextCloudflareForDev();
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+export default nextConfig;
+```
+
+After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local
+development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
+In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime,
+rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
 ##### 12. Deploy to Cloudflare Workers
 
diff --git a/pages/cloudflare/migrate-from-0.2.mdx b/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
similarity index 98%
rename from pages/cloudflare/migrate-from-0.2.mdx
rename to pages/cloudflare/migrate-from-0.2-to-0.3.mdx
index aaf01b0..68160a6 100644
--- a/pages/cloudflare/migrate-from-0.2.mdx
+++ b/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
@@ -1,7 +1,7 @@
 import { SITE } from '../../config';
 import { Callout } from 'nextra/components';
 
-### Migrate from 0.2
+### Migrate from 0.2 to 0.3
 
 The `@opennextjs/cloudflare` adapter is now more closely intgrated with `@opennextjs/aws`.
 
@@ -80,4 +80,4 @@ The name of the CLI was changed to `opennextjs-cloudflare`:
 ##### 5 Add `.open-next` to `.gitignore`
 
 You should change `.worker-next` to `.open-next` in your `.gitignore` file to prevent the build output from being committed to your repository.
-You can safely delete the content of the now unused `.worker-next`.
\ No newline at end of file
+You can safely delete the content of the now unused `.worker-next`.
diff --git a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
new file mode 100644
index 0000000..81c9df5
--- /dev/null
+++ b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
@@ -0,0 +1,38 @@
+import { SITE } from '../../config';
+import { Callout } from 'nextra/components';
+
+### Migrate from 0.3 (to 0.4)
+
+The `@opennextjs/cloudflare@0.4.0` introduced a new `initOpenNextCloudflareForDev` utility and made `getCloudflareContext` synchronous,
+we'll explore those two differences below, and how they effect applications built using `0.3.x` versions of the adapter.
+
+##### `initOpenNextCloudflareForDev`
+
+`initOpenNextCloudflareForDev` is a new utility that needs to be added to the Next.js configuration file in order to integrate the adapter
+with the Next.js dev server. If you don't plan on using the `next dev` command you can skip this section, otherwise update your Next.js
+configuration file to import and call the utility.
+
+Example:
+```js
+// next.config.mjs
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+
+initOpenNextCloudflareForDev();
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+export default nextConfig;
+```
+
+##### Synchronous `getCloudflareContext` synchronous
+
+`getCloudflareContext` is now synchronous.
+a promise that resolves to it.
+
+This means that if you had code that `await`ed `getCloudflareContext()` calls, such `await`s are no longer necessary and
+can be removed.
+
+If your application is instead combining the result of `getCloudflareContext()` with on Ecmascript Promises APIs such as
+`then`, `catch` and `finally` those need to be removed since the function's result, as mentioned is no longer a promise.

From 88dbbca79a148ee9cdfb6484042ac1633aa43b81 Mon Sep 17 00:00:00 2001
From: Leander Iversen <leander@leanderiversen.co.uk>
Date: Wed, 29 Jan 2025 12:50:20 +0000
Subject: [PATCH 045/140] Fix reference to OpenNextConfig type in streaming
 example (#59)

---
 pages/aws/config/simple_example.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/aws/config/simple_example.mdx b/pages/aws/config/simple_example.mdx
index 0ba089d..6a3dbe0 100644
--- a/pages/aws/config/simple_example.mdx
+++ b/pages/aws/config/simple_example.mdx
@@ -22,7 +22,7 @@ Here you can find the most common `open-next.config.ts` file examples that you c
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
 const config = {
   default: {
     override: {

From 511a541d62a8af237a2e0f6be9d8b4b3c915ef46 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 31 Jan 2025 11:15:21 +0100
Subject: [PATCH 046/140] Mark PPR as supported on cloudflare (#60)

---
 pages/cloudflare/index.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 0457ca1..63644f8 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -51,10 +51,10 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
+- [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 - [ ] [Pages Router](https://nextjs.org/docs/pages)
 - [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
-- [ ] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
-- [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
 We welcome both contributions and feedback!

From 3a8c94824c379d7acfab5bfe93eb628da1a60381 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Sat, 1 Feb 2025 07:03:09 +0100
Subject: [PATCH 047/140] Bump actions in GH workflows (#63)

---
 .github/workflows/check.yml  | 2 +-
 .github/workflows/nextjs.yml | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index 1aa9b11..2a2fc68 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -10,6 +10,6 @@ jobs:
         runs-on: ubuntu-latest
         steps:
             - name: Checkout
-              uses: actions/checkout@v3
+              uses: actions/checkout@v4
             - uses: oven-sh/setup-bun@v2
             - uses: ./.github/actions/build-docs
diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml
index da5cb73..f0fe1d8 100644
--- a/.github/workflows/nextjs.yml
+++ b/.github/workflows/nextjs.yml
@@ -32,10 +32,10 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - uses: oven-sh/setup-bun@v2
       - name: Setup Pages
-        uses: actions/configure-pages@v2
+        uses: actions/configure-pages@v4
         with:
           # Automatically inject basePath in your Next.js configuration file and disable
           # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized).
@@ -50,7 +50,7 @@ jobs:
       - name: Static HTML export with Next.js
         run: bun next export
       - name: Upload artifact
-        uses: actions/upload-pages-artifact@v1
+        uses: actions/upload-pages-artifact@v3
         with:
           path: ./${{ env.working-directory }}/out
 
@@ -64,4 +64,4 @@ jobs:
     steps:
       - name: Deploy to GitHub Pages
         id: deployment
-        uses: actions/deploy-pages@v1
+        uses: actions/deploy-pages@v4

From 6d3a2b6fe9125919a5555b27be841dd4cba69530 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Sat, 1 Feb 2025 07:50:18 +0100
Subject: [PATCH 048/140] cloudflare: fix package name (#65)

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index c35d63c..ad5fbf1 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -173,7 +173,7 @@ This includes:
 You can continue to run `next dev` when developing locally.
 
 Modify your Next.js configuration file to import and call the `initOpenNextCloudflareForDev` utility
-from the `@cloudflare/next-on-pages` package. This makes sure that the Next.js dev server can optimally integrate with the open-next
+from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev server can optimally integrate with the open-next
 cloudflare adapter and it is necessary for using bindings during local development.
 
 This is an example of a Next.js configuration file calling the utility:

From a68951fc975ed6471d06a680ac57cc0f5b6af293 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Sat, 1 Feb 2025 08:36:25 +0100
Subject: [PATCH 049/140] Add HowTo NextAuth on cloudflare (#61)

Co-authored-by: Dario Piotrowicz <dario.piotrowicz@gmail.com>
---
 pages/cloudflare/_meta.json          |  1 +
 pages/cloudflare/howtos/NextAuth.mdx | 31 ++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 pages/cloudflare/howtos/NextAuth.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index d0150a0..aff2153 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -3,6 +3,7 @@
   "get-started": "",
   "bindings": "",
   "caching": "",
+  "howtos": "How-Tos",
   "examples": "",
   "community": "Community projects",
   "troubleshooting": "",
diff --git a/pages/cloudflare/howtos/NextAuth.mdx b/pages/cloudflare/howtos/NextAuth.mdx
new file mode 100644
index 0000000..7c7fa0f
--- /dev/null
+++ b/pages/cloudflare/howtos/NextAuth.mdx
@@ -0,0 +1,31 @@
+
+## [NextAuth.js](https://next-auth.js.org/)
+
+NextAuth.js is an open-source authentication solution for Next.js applications.
+
+### Solving a broken build
+
+NextAuth.js relies on [`createCipheriv`](https://nodejs.org/docs/v22.13.1/api/crypto.html#cryptocreatecipherivalgorithm-key-iv-options) from [`node:crypto`](https://nodejs.org/docs/v22.13.1/api/crypto.html).
+
+`createCipheriv` is not currently implemented by the workerd runtime so apps using NextAuth.js with the default configuration break at build time.
+
+However you can configure NextAuth.js to use custom implementations of the `encode` and `decode` functions that do not use the unimplemented Node APIs. Implementations built on top of [`SubtleCrypto`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto) can run on workerd.
+
+The NextAuth.js configuration file should look like:
+
+```js
+import { encode, decode } from "@/lib/webcrypto";
+
+export const NEXT_AUTH_CONFIG = {
+  // ...
+  jwt: {
+    encode,
+    decode,
+  },
+};
+```
+
+Kudos to Arnav Gupta ([`@arnavgupta00`](https://github.com/arnavgupta00)) for coming up with the solution.
+You can find an example of this on his [example repository](https://github.com/arnavgupta00/deployment-cf-workers-prisma-nextauth).
+
+Related issues: [`workers-sdk#206`](https://github.com/opennextjs/opennextjs-cloudflare/issues/206) and [`workerd#3277`](https://github.com/cloudflare/workerd/issues/3277).

From c7be49c6880bc75f37220a659705139bc525b5d4 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 5 Feb 2025 12:42:20 +0100
Subject: [PATCH 050/140] update cloudflare docs (#68)

Co-authored-by: Alex Patterson <alex@codingcat.dev>
---
 pages/cloudflare/get-started.mdx | 14 +++++---------
 pages/cloudflare/index.mdx       |  2 +-
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index ad5fbf1..8f20c2c 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -128,16 +128,12 @@ The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.
 Add the following to the scripts field of your `package.json` file:
 
 ```json
-"build:worker": "opennextjs-cloudflare",
-"dev:worker": "wrangler dev --port 8771",
-"preview": "npm run build:worker && npm run dev:worker",
-"deploy": "npm run build:worker && wrangler deploy",
+"preview": "opennextjs-cloudflare && wrangler dev",
+"deploy": "opennextjs-cloudflare && wrangler deploy",
 "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
 ```
 
-- `npm run build:worker`: Runs the [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter. This first builds your app by running the `build` script in your `package.json` (Next.js apps use `next build` by default), and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare. The build command used by OpenNext can be overridden with the `buildCommand` option in your OpenNext config.
-- `npm run dev:worker`: Takes the output generated by `build:worker` and runs it locally in [workerd](https://github.com/cloudflare/workerd), the open-source Workers Runtime, allowing you to run the app locally in the same environment that it will run in production. If you instead run `next dev`, your app will run in Node.js, which is a different JavaScript runtime from the Workers runtime, with differences in behavior and APIs.
-- `npm run preview`: Runs `build:worker` and then `dev:worker`, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run preview`: Builds your app and serves it locally, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
 - `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
 
@@ -193,7 +189,7 @@ export default nextConfig;
 After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local
 development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
 
-In step 3, we also added the `npm run preview:worker`, which allows you to quickly preview your app running locally in the Workers runtime,
+In step 3, we also added the `npm run preview`, which allows you to quickly preview your app running locally in the Workers runtime,
 rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
 ##### 12. Deploy to Cloudflare Workers
@@ -201,7 +197,7 @@ rather than in Node.js. This allows you to test changes in the same runtime as y
 Either deploy via the command line:
 
 ```sh
-npm run deploy:worker
+npm run deploy
 ```
 
 Or [connect a Github or Gitlab repository](https://developers.cloudflare.com/workers/ci-cd/), and Cloudflare will automatically build and deploy each pull request you merge to your production branch.
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 63644f8..e5c3a9c 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -52,8 +52,8 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
+- [x] [Pages Router](https://nextjs.org/docs/pages)
 - [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
-- [ ] [Pages Router](https://nextjs.org/docs/pages)
 - [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 

From eb005a63c82b1b36af14f3c89a31b9760bb3fff5 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Mon, 10 Feb 2025 15:05:31 +0000
Subject: [PATCH 051/140] rename kvCache to kv-cache (#70)

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 8f20c2c..7252fd4 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -82,7 +82,7 @@ Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the ro
 
 ```ts
 import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
-import cache from "@opennextjs/cloudflare/kvCache";
+import cache from "@opennextjs/cloudflare/kv-cache";
 
 const config: OpenNextConfig = {
   default: {

From b9895550083a4890d7babf3dbb08166a79be093e Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 11 Feb 2025 12:31:36 +0100
Subject: [PATCH 052/140] cloudflare: clarify supported version (#73)

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index e5c3a9c..07d577f 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -35,7 +35,7 @@ This is an important difference from `@cloudflare/next-on-pages`, which only sup
 
 ### Supported Next.js versions
 
-`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 14 and 15.
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 15 and the latest minor of Next.js 14.
 
 To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
 

From f5312a47a7d0a45fac1782132ec39cf252b1e6a0 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 11 Feb 2025 12:34:07 +0100
Subject: [PATCH 053/140] doc(cloudflare) add an HowTo for Stripe (#72)

---
 pages/cloudflare/howtos/_meta.json    |  4 ++++
 pages/cloudflare/howtos/stripeAPI.mdx | 16 ++++++++++++++++
 2 files changed, 20 insertions(+)
 create mode 100644 pages/cloudflare/howtos/_meta.json
 create mode 100644 pages/cloudflare/howtos/stripeAPI.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
new file mode 100644
index 0000000..1676dce
--- /dev/null
+++ b/pages/cloudflare/howtos/_meta.json
@@ -0,0 +1,4 @@
+{
+  "NextAuth": "NextAuth",
+  "stripeAPI": "Stripe API"
+}
diff --git a/pages/cloudflare/howtos/stripeAPI.mdx b/pages/cloudflare/howtos/stripeAPI.mdx
new file mode 100644
index 0000000..621cecf
--- /dev/null
+++ b/pages/cloudflare/howtos/stripeAPI.mdx
@@ -0,0 +1,16 @@
+
+## [Stripe API](https://www.npmjs.com/package/stripe)
+
+When [creating a Stripe object](https://docs.stripe.com/js/initializing), the default http client implementation is based on `node:https` which is not implemented on Workers.
+
+However you can use an http client based on fetch ([`FetchHttpClient`](https://github.com/stripe/stripe-node/blob/54d423e5d1118dc35c4b76260889826003e00e9f/src/net/FetchHttpClient.ts)) via the `httpClient` option:
+
+```ts
+import Stripe from "stripe";
+
+const stripe = Stripe(STRIPE_API_KEY, {
+  // Cloudflare Workers use the Fetch API for their API requests.
+  httpClient: Stripe.createFetchHttpClient()
+});
+```
+

From b4b3113265d4dba92c32f493dd14eb9ac5d4a3a2 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Wed, 12 Feb 2025 14:48:16 +0000
Subject: [PATCH 054/140] update cloudflare docs for memory queue (#74)

---
 pages/cloudflare/caching.mdx | 37 ++++++++++++++++++++++++++++++------
 pages/cloudflare/index.mdx   |  2 +-
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 93411f3..356af4f 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -9,8 +9,6 @@ By default, all `fetch()` subrequests made in your Next.js app are cached. Refer
 
 [The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
 
-Note that [Revalidating](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#revalidating-data) is not yet supported.
-
 Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
 
 <Callout>
@@ -19,17 +17,19 @@ Workers KV is eventually consistent, which means that it can take up to 60 secon
 
 ### How to enable caching
 
-`@opennextjs/cloudflare` uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
+`@opennextjs/cloudflare` supports multiple caching mechanisms through a project's OpenNext configuration.
+
+#### Incremental Static Regeneration (ISR)
 
-To enable caching, you must:
+The ISR adapter for Cloudflare uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
 
-#### 1. Create a KV namespace
+##### 1. Create a KV namespace
 
 ```
 npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 ```
 
-#### 2. Add the KV namespace to your Worker
+##### 2. Add the KV namespace to your Worker
 
 The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
 
@@ -45,3 +45,28 @@ The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
   ]
 }
 ```
+
+#### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue.
+
+The memory queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests on a per-isolate basis. There might still be duplicate requests under high traffic or across regions.
+
+```ts
+// open-next.config.ts
+import incrementalCache from "@opennextjs/cloudflare/kv-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+
+const config: OpenNextConfig = {
+  default: {
+    override: {
+      // ...
+      incrementalCache: () => incrementalCache,
+      queue: () => memoryQueue,
+    },
+  },
+  // ...
+};
+
+export default config;
+```
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 07d577f..8cdbca7 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -53,8 +53,8 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
+- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
-- [ ] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
 We welcome both contributions and feedback!

From ed16d3ede60206ea747e8c64fb04689825b82d10 Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 24 Feb 2025 13:16:32 +0100
Subject: [PATCH 055/140] refactor: custom overrides (#77)

---
 pages/aws/config/custom_overrides.mdx | 153 ++++++++++++++++++++++++--
 1 file changed, 145 insertions(+), 8 deletions(-)

diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index b873753..d255abb 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -13,7 +13,7 @@ to your `open-next.config.ts` to avoid the edge runtime to try to compile overri
 
 ## Custom converter
 
-Sometimes you might want to modify the object received by OpenNext. For example `Config.YOUR_SECRET_KEY` from sst cannot be used in the middleware, so you might want to add it to the headers. This is where the custom converter comes in. You can add a custom converter to modify the object before it is passed to OpenNext.
+Sometimes you might want to modify the object received by OpenNext. For example `Config.YOUR_SECRET_KEY` from SST cannot be used in the middleware, so you might want to add it to the headers. This is where the custom converter comes in. You can add a custom converter to modify the object before it is passed to OpenNext.
 
 You'll still have to use a fallback value during dev as this is not used by the dev server.
 
@@ -276,19 +276,156 @@ const config = {
 ```
 
 ## Custom Incremental cache
-TODO
 
-## Custom queue
-TODO
+You can take inspiration from our [`fs-dev`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/incrementalCache/fs-dev.ts) override which uses the file system to store the incremental cache. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+const config = {
+  default: {
+    override: {
+      // can be any of our included ones or your own custom override
+      incrementalCache: () => import('./customIncrementalCache').then((mod) => mod.default),
+    },
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/incrementalCache) ones are `'s3' | 's3-lite' | 'multi-tier-ddb-s3' | 'fs-dev' | 'dummy'`
+
+## Custom Queue
+
+By default it will use SQS queue to revalidate stale routes. You can read more about this [here](/aws/config/overrides/queue). To create your own custom override you can take inspiration by looking at our [included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/queue) implementations. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+const config = {
+  default: {
+    override: {
+      // can be any of our included ones or your own custom override
+      queue: () => import('./customQueue').then((mod) => mod.default),
+    },
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/queue) ones are `'sqs' | 'sqs-lite' | 'direct' | 'dummy'`
 
 ## Custom Tag cache
-TODO
+
+To override the tag cache you can take inspiration by looking at the [`fs-dev`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/tagCache/fs-dev.ts) override that uses the filesystem. You can read more about this override [here](/aws/config/overrides/tag_cache). You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+const config = {
+  default: {
+    override: {
+      // can be any of our included ones or your own custom override
+      tagCache: () => import('./customTagCache').then((mod) => mod.default),
+    },
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/tagCache) ones are `'dynamodb' | 'dynamodb-lite' | 'fs-dev' | 'dummy'`
 
 ## Custom Origin Resolver
-TODO
+
+This override is only used internally by OpenNext to resolve the origin of the request if you have an `external` middleware. You can take inspiration from looking at our included [`pattern-env`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/originResolver/pattern-env.ts) override. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+const config = {
+  default: {},
+  middleware: {
+    // must be true for the originResolver to be used
+    external: true,
+    // can be any of our included ones or your own custom override
+    originResolver: () => import('./customOriginResolver').then((mod) => mod.default),
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/originResolver) ones are `'pattern-env' | 'dummy'`
 
 ## Custom Image Loader
-TODO
+
+This override is used in the image optimization server to load an image from a custom source. You can look at our implemention of using the file system [here](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/imageLoader/fs-dev.ts). You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+const config = {
+  default: {},
+  imageOptimization: {
+    loader: () => import('./customImageLoader').then((mod) => mod.default),
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/imageLoader) ones are `'s3' | 's3-lite' | 'host' | 'fs-dev' | 'dummy'`
 
 ## Custom Warmer Invoke
-TODO
\ No newline at end of file
+
+To have a custom override for the warmer invoke you can take inspiration by looking at our [`aws-lambda`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/warmer/aws-lambda.ts) override. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+const config = {
+  default: {},
+  warmer: {
+    invokeFunction: () => import('./customWarmer').then((mod) => mod.default),
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/warmer) ones are `'aws-lambda' | 'dummy'`
+
+## Custom CDN Invalidation
+
+To have a custom override for the CDN Invalidation you can take inspiration by looking at our [`cloudfront`](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/cdnInvalidation/cloudfront.ts) override. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+const config = {
+  default: {
+    override: {
+      cdnInvalidation: () => import('./customCdnInvalidation').then((mod) => mod.default),
+    }
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/cdnInvalidation) ones are `'cloudfront' | 'dummy'`
+
+## Custom External Request Proxy
+
+This is used by OpenNext to proxy rewritten requests to external services. You can read more about it [here](/aws/config/overrides/proxy_external_request). To have a custom override for the External Request Proxy you can take inspiration by looking at our [`fetch`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/proxyExternalRequest/fetch.ts) override. You need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+const config = {
+  default: {
+    override: {
+      proxyExternalRequest: () => import('./customProxyExternalRequest').then((mod) => mod.default),
+    }
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/proxyExternalRequest) ones are `'fetch' | 'node' | 'dummy'`

From b77a1d024d603e72e1edb64991c8b23aad61c0e0 Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 24 Feb 2025 14:06:24 +0100
Subject: [PATCH 056/140] refactor: get started, config and simple example
 (#76)

Co-authored-by: khuezy <khuezy.nguyen@gmail.com>
Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/aws/config.mdx                |  2 +-
 pages/aws/config/simple_example.mdx | 20 ++++++--------------
 pages/aws/get_started.mdx           |  4 ++--
 3 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/pages/aws/config.mdx b/pages/aws/config.mdx
index 66863e7..f5cebda 100644
--- a/pages/aws/config.mdx
+++ b/pages/aws/config.mdx
@@ -28,7 +28,7 @@ If you want to look at a full example, you can check [the full example](/aws/con
 
 ### Opt out of default poweredByHeader
 
-By default Next.js will add the [`x-powered-by`]((https://nextjs.org/docs/app/api-reference/next-config-js/poweredByHeader)) header. OpenNext will also add a header `x-opennext`. To opt-out of this, open `next.config.js` and disable the poweredByHeader property in the configuration:
+By default Next.js will add the [`x-powered-by`](https://nextjs.org/docs/app/api-reference/config/next-config-js/poweredByHeader) header. OpenNext will also add a header `x-opennext`. To opt-out of this, open `next.config.js` and disable the poweredByHeader property in the configuration:
 ```ts
 module.exports = {
   poweredByHeader: false,
diff --git a/pages/aws/config/simple_example.mdx b/pages/aws/config/simple_example.mdx
index 6a3dbe0..77d3b0c 100644
--- a/pages/aws/config/simple_example.mdx
+++ b/pages/aws/config/simple_example.mdx
@@ -4,19 +4,7 @@ Here you can find the most common `open-next.config.ts` file examples that you c
 
 ## Streaming with lambda
 
-<Callout type="warning" emoji="⚠️">
-  AWS has a bunch of different implementations of streaming in production. You
-  might be lucky and have a fully working one, but you might have one that are
-  not suitable for production. Be aware that there is nothing to do to prevent
-  AWS from breaking your deployment (same code and same runtime might break from
-  one day to another) [Thread
-  1](https://discord.com/channels/983865673656705025/1230482660913184800)
-  [Thread
-  2](https://discord.com/channels/983865673656705025/1249368592558985247) <br />{' '}
-  <br /> On some AWS accounts the response can hang if the body is empty. There
-  is a workaround for that on OpenNext 3.0.3+, setting environment variable
-  `OPEN_NEXT_FORCE_NON_EMPTY_RESPONSE` to `"true"`. This will ensure that the
-  stream body is not empty. <br /> <br />
+<Callout type="info" emoji="ℹ️">
   If you have an issue with streaming send a message on [discord](https://discord.com/channels/1283128968140161065/1286094576788177059)
   and contact AWS support to let them know of the issue.
 </Callout>
@@ -34,6 +22,10 @@ const config = {
 export default config;
 ```
 
+Be aware that there has been some issues in the past with AWS breaking streaming from one day to another. This seems to be resolved now.
+[Thread 1](https://discord.com/channels/983865673656705025/1230482660913184800)
+[Thread 2](https://discord.com/channels/983865673656705025/1249368592558985247)
+
 ## Splitting the server
 
 ```ts
@@ -105,7 +97,7 @@ export default config;
 ## Bundle for a classic Node server (With function splitting)
 
 <Callout type="info" emoji="i">
-This is not implemented in sst yet. You'll have to use your own IAC construct to deploy this.
+This is not implemented in SST yet. You'll have to use your own IAC construct to deploy this.
 
 Be aware that this uses the exact same system for ISR/SSG as the default lambda setup. So it will have to have all the proper permissions and env variable to interact with S3, DynamoDB and SQS (Or whatever you override it with). You can see [here](/aws/inner_workings/components/server/node#special-overrides) for more details
 </Callout>
diff --git a/pages/aws/get_started.mdx b/pages/aws/get_started.mdx
index 5c715ad..2aab40c 100644
--- a/pages/aws/get_started.mdx
+++ b/pages/aws/get_started.mdx
@@ -12,7 +12,7 @@ For more information, check out the SST docs: https://sst.dev/docs/start/aws/nex
 
 ### Other Frameworks
 
-The OpenNext community has contributed deployment options for a few other frameworks.
+The OpenNext community has contributed deployment options for a few other frameworks. Many of these are no longer maintained, so newer versions of OpenNext may not be supported.
 
 - CDK (TS): https://github.com/jetbridge/cdk-nextjs
 - CDK (TS, Java, Go, Py, .NET): https://github.com/datasprayio/open-next-cdk
@@ -24,7 +24,7 @@ The OpenNext community has contributed deployment options for a few other framew
 To use these, you'll need to run the following inside your Next.js app.
 
 ```bash
-$ npx open-next@latest build
+$ npx @opennextjs/aws@latest build
 ```
 
 If you are using OpenNext to deploy using a framework that is not listed here, please let us know so we can add it to the list.

From 6d4b9c5819e8c1df653dc21296929a827198e8d4 Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 24 Feb 2025 14:11:59 +0100
Subject: [PATCH 057/140] refactor: full example, reference and nx (#78)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/aws/config/full_example.mdx | 172 +++++++++++++++++++++---------
 pages/aws/config/nx.mdx           |  10 +-
 pages/aws/config/reference.mdx    |  62 ++++++++---
 3 files changed, 173 insertions(+), 71 deletions(-)

diff --git a/pages/aws/config/full_example.mdx b/pages/aws/config/full_example.mdx
index 1415679..b99e963 100644
--- a/pages/aws/config/full_example.mdx
+++ b/pages/aws/config/full_example.mdx
@@ -1,24 +1,40 @@
-Here is a detailed example of an `open-next.config.ts` file:
-This file need to be at the same place as your `next.config.js` file
+Here is a detailed example of an `open-next.config.ts` file. This file need to be at the same place as your `next.config.js` file
 
-`server` in here could refer to a lambda function, a docker container, a node server or whatever that can support running nodejs code. (Even cloudflare workers in the future)
+`server` in here could refer to a lambda function, a docker container, a node server or whatever that can support running nodejs code. Even Cloudflare workers (require to use `@opennextjs/cloudflare`).
 
-For more information about the options here, take a look at the [components section](/aws/components/overview).
+For more information about the options here, take a look at the [reference section](/aws/config/reference).
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
 const config = {
-  default: { // This is the default server, similar to the server-function in open-next v2
+  default: {
+    // This is the default server, similar to the server-function in open-next v2
     // You don't have to provide the below, by default it will generate an output
     // for normal lambda as in open-next v2
     override: {
-      wrapper: "aws-lambda-streaming", // This is necessary to enable lambda streaming
+      // This is necessary to enable lambda streaming, defaults to aws-lambda
+      wrapper: 'aws-lambda-streaming',
+      // Convert the input and output of the server, defaults to aws-apigw-v2
+      converter: 'aws-apigw-v2',
+      // Used for fetch cache and html/rsc/json cache, defaults to s3
+      incrementalCache: 's3',
+      // Used for external rewrites, defaults to node
+      proxyExternalRequest: 'node',
+      tagCache: 'dynamodb', // Used for revalidatePath and revalidateTag, defaults to dynamodb
       // You can override any part that is a `LazyLoadedOverride` this way
-      queue: () => Promise.resolve({
-        send: async (message) => {
-          //Your custom code here
-        }
-      })
+      queue: () =>
+        Promise.resolve({
+          send: async (message) => {
+            //Your custom code here
+          },
+        }),
+    },
+    // this will install sharp to your default server function
+    // only for example purposes, you most likely should not use this
+    // this can be used on every server to install additional packages
+    install: {
+      packages: ['sharp@0.33.5'],
+      arch: 'arm64',
     },
     minify: true, // This will minify the output
   },
@@ -27,36 +43,44 @@ const config = {
   functions: {
     ssr: {
       routes: [
-        "app/api/isr/route", "app/api/sse/route", "app/api/revalidateTag/route", // app dir Api routes
-        "app/route1/page", "app/route2/page", // app dir pages
-        "pages/route3" // page dir pages
-        ], // For app dir, you need to include route|page, no need to include layout or loading
-      patterns: ['api/*', 'route1', 'route2', 'route3'], // patterns needs to be in a cloudfront compatible format, this will be used to generate the output
+        'app/api/isr/route',
+        'app/api/sse/route',
+        'app/api/revalidateTag/route', // app dir Api routes
+        'app/route1/page',
+        'app/route2/page', // app dir pages
+        'pages/route3', // page dir pages
+      ], // For app dir, you need to include route|page, no need to include layout or loading
+      // patterns needs to be in a cloudfront compatible format
+      // this will be used to generate the output
+      patterns: ['api/*', 'route1', 'route2', 'route3'],
       override: {
-        wrapper: "aws-lambda-streaming",
+        wrapper: 'aws-lambda-streaming',
       },
       // This enables the bundled next server which is faster and reduce the size of the server
       // This is also experimental and might not work in all cases
-      experimentalBundledNextServer: true
+      experimentalBundledNextServer: true, // deprecated and not supported in next 14.2+
     },
     pageSsr: {
-      routes: ["pages/pageSsr"], // For page dir routes should be in the form `pages/${route}` without the extension, it should match the filesystem
+      // For page dir routes should be in the form `pages/${route}` without the extension
+      // It should match the filesystem
+      routes: ['pages/pageSsr'],
       // BUILD_ID is a special case, it will be replaced with the actual build id
-      patterns: [ 'pageSsr', "_next/data/BUILD_ID/pageSsr.json"],
+      patterns: ['pageSsr', '_next/data/BUILD_ID/pageSsr.json'],
       override: {
-        wrapper: "node",
-        converter: "node",
-        // This is necessary to generate the dockerfile and for the implementation to know that it needs to deploy on docker
+        wrapper: 'node',
+        converter: 'node',
+        // This is necessary to generate the dockerfile and 
+        // for the implementation to know that it needs to deploy on docker
         // You can also provide a string here which will be used to create the dockerfile
         generateDockerfile: true,
       },
     },
     edge: {
-      runtime: "edge",
-      routes: ["app/ssr/page"],
-      patterns: ["ssr"],
-      override: {}
-    }
+      runtime: 'edge',
+      routes: ['app/ssr/page'],
+      patterns: ['ssr'],
+      override: {},
+    },
   },
   // By setting this, it will create another bundle for the middleware,
   // and the middleware will be deployed in a separate server.
@@ -66,19 +90,48 @@ const config = {
   // This is not implemented in the reference construct implementation.
   // This is optional, but might be necessary if you split your app into multiple servers
   middleware: {
-    external: true
-  }
-
+    external: true,
+  },
   // Optional
   imageOptimization: {
-    // This is the architecture of the image, it could be x64 or arm64
+    loader: "s3-lite", // Can be overridden with a LazyLoadedOverride
     // This is necessary to bundle the proper version of sharp
-    arch: "x64",
-  }
-
+    // You can customize this to your needs
+    // By default it will install with these options:
+    install: {
+      packages: ['sharp@0.32.6'],
+      arch: 'arm64',
+      nodeVersion: '18',
+      libc: 'glibc',
+    },
+  },
+  // Initialization function is a special server that will run at build time to initialize the cache.
+  // By default, it only initializes the tag cache. Besides the common options, you can use the following options:
+  initializationFunction: {
+    tagCache: 'dynamodb-lite', // Can be overridden with a LazyLoadedOverride
+  },
+  // Override the default revalidate function
+  // By default, works for lambda and on SQS event.
+  // Supports only node runtime
+  revalidate: {
+    override: {
+      wrapper: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
+      converter: 'aws-apigw-v2', // Can be overridden with a LazyLoadedOverride
+    },
+  },
+  // Override the default warmer
+  // By default, works for lambda only.
+  // If you override this, you'll need to handle the warmer event in the wrapper
+  warmer: {
+    invokeFunction: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
+    override: {
+      wrapper: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
+      converter: 'aws-apigw-v2', // Can be overridden with a LazyLoadedOverride
+    },
+  },
   // If you want to override the default build command, you can do it here
   // By default it uses `npm run build`
-  buildCommand: "echo 'hello world'",
+  buildCommand: "echo 'skipping build'",
 
   dangerous: {
     // This will disable the tag cache
@@ -87,19 +140,38 @@ const config = {
     // This will disable the incremental cache
     // This is generally not recommended, as this is necessary for ISR AND SSG routes as well as the fetch cache
     disableIncrementalCache: true,
-  }
-
-  //The path to the target folder of build output from the `buildCommand` option (the path which will contain the `.next` and `.open-next` folders). This path is relative from the current process.cwd() - Optional default to "."
-  buildOutputPath: "build",
-
-  //The path to the root of the Next.js app's source code. This path is relative from the current process.cwd(). - Optional default to "."
-  appPath: "app",
-
-  //The path to the package.json file of the Next.js app. This path is relative from the current process.cwd(). - Optional
-  packageJsonPath: "package.json",
-
-} satisfies OpenNextConfig
+    // Enable the cache interception. Every request will go through the cache interceptor, if it is found in the cache,
+    // it will be returned without going through NextServer. Not every feature is covered by the cache interceptor and
+    // it should fallback to the NextServer if the cache is not found.
+    enableCacheInterception: true,
+    // Function to determine which headers or cookies takes precedence.
+    // By default, the middleware headers and cookies will override the handler headers and cookies.
+    // This is executed for every request and after next config headers and middleware has executed.
+    // Here is a very simple example of how you can use it:
+    headersAndCookiesPriority: (event) => {
+      if (event.rawPath.startsWith('/api')) {
+        return 'middleware';
+      }
+      return 'handler';
+    },
+  },
+  // The path to the target folder of build output from the `buildCommand` option 
+  // (the path which will contain the `.next` and `.open-next` folders).
+  // This path is relative from the current process.cwd() - Optional defaults to "."
+  buildOutputPath: 'build',
+  // The path to the root of the Next.js app's source code.
+  // This path is relative from the current process.cwd(). - Optional defaults to "."
+  appPath: 'app',
+  // The path to the package.json file of the Next.js app. 
+  // This path is relative from the current process.cwd(). - Optional
+  packageJsonPath: 'package.json',
+  // Advanced usage
+  // If you use the edge runtime somewhere (either with an external middleware or in the functions), we compile 2 versions of the open-next.config.ts file.
+  // One for the node runtime and one for the edge runtime.
+  // This option allows you to specify the externals for the edge runtime used in esbuild for the compilation of open-next.config.ts
+  // It is especially useful if you use some custom overrides only in node
+  edgeExternals: [],
+} satisfies OpenNextConfig;
 
 export default config;
-export type Config = typeof config
 ```
\ No newline at end of file
diff --git a/pages/aws/config/nx.mdx b/pages/aws/config/nx.mdx
index 0493b2a..e9334a8 100644
--- a/pages/aws/config/nx.mdx
+++ b/pages/aws/config/nx.mdx
@@ -1,7 +1,7 @@
 # Configuring OpenNext for use in an Nx Monorepo.
-Here's a detailed exampled of how to add open-next + SST to an existing Nx workspace, with an existing NextJS application sitting at `apps/next-site`
+Here's a detailed exampled of how to add OpenNext + SST to an existing Nx workspace, with an existing NextJS application sitting at `apps/next-site`
 
-1. install `open-next`: `pnpm add —save-dev open-next`
+1. install `open-next`: `pnpm add —save-dev @opennextjs/aws`
 
 2. Update your `apps/next-site/next.config.js` add `output: ‘standalone’`, and you want to add `experimental.outputFileTracingRoot`, it should look a little like this:
 ```javascript
@@ -35,9 +35,9 @@ const plugins = [
 module.exports = composePlugins(...plugins)(nextConfig);
 ```
 
-3. Create `open-next.config.js` inside your apps root directory, it should look a little something like this:
+3. Create `open-next.config.ts` inside your apps root directory, it should look a little something like this:
 ```javascript
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
 
 const config = {
   default: {},
@@ -122,7 +122,7 @@ now, when you run `nx open-next-build next-site`, nx will automatically build th
 
 Now, we have a built app, ready to deploy, so how do we get it onto SST/AWS ? Good question!
 
-We are using `sst ion` in this example. i will assume you have already have the cli installed, (if not, check here on how!)[https://ion.sst.dev/],
+We are using `sst ion` in this example. i will assume you have already have the cli installed, [if not, check here on how](https://sst.dev),
 but we will not use the SST cli to init this project, because it wants to add a package.json to your next app, and it will look like it's working, but you will end up with a big far server error (all because the package.json overrides whatever nx _thinks_ there should be, and it will miss a bunch of dependencies). we will instead manually set this up:
 
 - let's add the sst package with `pnpm add sst@ion`, and the required packages for SST to work with AWS `pnpm add --save-dev aws-cdk-lib constructs @types/aws-lambda`
diff --git a/pages/aws/config/reference.mdx b/pages/aws/config/reference.mdx
index ce2cc89..99e20da 100644
--- a/pages/aws/config/reference.mdx
+++ b/pages/aws/config/reference.mdx
@@ -1,6 +1,8 @@
 Every option that you can use in `open-next.config.ts` will be listed here. This is the configuration file that you can use to customize the build.
 You can look at the [full example](full_example) to see how you can use these options.
 
+<br/>
+
 import { Tabs } from 'nextra/components'
 
 <Tabs items={['Server Options', 'General Build Options']}>
@@ -24,7 +26,7 @@ import { Tabs } from 'nextra/components'
 
       ### `minify`
 
-      This will try to minify the output of the server including node_modules. It is a boolean and by default, it is set to `false`.
+      This will try to minify the output of the server including `node_modules`. It is a boolean and by default, it is set to `false`.
       It could lead to some issues with some packages, so it is recommended to test your app with this option before deploying it.
 
       We will likely not fix issues related to this option, as it is usually library specific.
@@ -32,18 +34,14 @@ import { Tabs } from 'nextra/components'
       ### `override`
 
       This is where you will be able to override some part of the server. For all of them you can provide what we call a `LazyLoadedOverride` which is a function that will return the override. For some example look at some [Custom overrides](custom_overrides).
-      All servers have some default override that you can override
-
-      TODO: Add all the types for the custom LazyLoadedOverride here. In the meantime, just look at the [source file](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/types/open-next.ts)
-
-      ---
+      All servers have some default override that you can override. You can look at the types [here](https://github.com/opennextjs/opennextjs-aws/blob/5b314b13b2907a4510e7f0cca6959f8da4eab310/packages/open-next/src/types/overrides.ts).
 
       #### [`wrapper`](overrides/wrapper)
 
       This is the entrypoint of the server. 
       Be aware that it might not be enough to change this to make it work on said platform. This is only the entrypoint, you might need to change other parts of the server to make it work on the platform.
 
-      Possible values are: `aws-lambda`, `aws-lambda-streaming`, `node`, `cloudflare`, `dummy` or a `LazyLoadedOverride` that will return the wrapper.
+      Possible values are: `aws-lambda`, `aws-lambda-streaming`, `cloudflare-edge`, `cloudflare-node`, `node`, `express-dev`, `dummy` or a `LazyLoadedOverride` that will return the wrapper.
 
       #### [`converter`](overrides/converter)
 
@@ -53,7 +51,7 @@ import { Tabs } from 'nextra/components'
 
       #### `install`
 
-      Install options for the server. This is used to install additional packages to this server
+      Install options for the server. This is used to install additional packages. It is an object with the options below.
 
       For image optimization, it will install sharp by default
 
@@ -68,7 +66,35 @@ import { Tabs } from 'nextra/components'
 
       Possible values are: `x64`, `arm64`
 
-      TODO: Add the other options and explain how to install packages on the default or splitted server functions
+      ##### `nodeVersion`
+
+      This option will be passed to the postinstall script of sharp. It is used by `node-gyp`.
+
+      ##### `libc`
+
+      Override libc of native modules to install.
+
+      Possible values are: `glibc`, `musl`
+
+      ##### `additionalArgs`
+
+      Additional arguments to pass to the install command (npm install). It is a string that will get appended to the `npm install` command.
+
+      Here is an example of how to install sharp on your default server function with ARM64 architecture:
+      ```ts
+      import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
+      const config = {
+        default: {
+          install: {
+            packages: ['sharp@0.33.5'],
+            arch: 'arm64',
+          },
+        },
+      } satisfies OpenNextConfig;
+
+      export default config;
+      ```
+
 
     </Tabs.Tab>
     <Tabs.Tab>
@@ -103,13 +129,13 @@ import { Tabs } from 'nextra/components'
 
       Add possibility to override the default s3 cache. Used for fetch cache and html/rsc/json cache.
 
-      Possible values are: `s3`, `s3-lite`, `dummy` or a `LazyLoadedOverride` that will return the incremental cache.
+      Possible values are: `s3`, `s3-lite`, `multi-tier-ddb-s3`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the incremental cache.
 
       #### [`tagCache`](overrides/tag_cache)
 
       Add possibility to override the default tag cache. Used for revalidateTags and revalidatePath.
 
-      Possible values are: `dynamodb`, `dynamodb-lite`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
+      Possible values are: `dynamodb`, `dynamodb-lite`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
 
       #### [`queue`](overrides/queue)
 
@@ -122,6 +148,12 @@ import { Tabs } from 'nextra/components'
       Add possibility to override the default proxy for external request (i.e. next config external rewrites or middleware rewrites). Used in the external middleware or one of the server function.
 
       Possible values are: `node`, `fetch`, `dummy` or a `LazyLoadedOverride` that will return the proxy. Default is `node`
+
+      #### [`cdnInvalidation`](overrides/automatic_cdn_invalidation)
+
+      Add possibility to override the CDN invalidation override. Used for on-demand invalidation with `revalidatePath()`, `revalidateTag()` and `res.revalidate()`. 
+
+      Possible values are: `cloudfront`, `dummy` or a `LazyLoadedOverride` that will return the invalidatePaths. This override is disabled by default.
     </Tabs.Tab>
     <Tabs.Tab>
       Every splitted server will have the same options as the default server. In addition to that, you can use the following options:
@@ -173,7 +205,7 @@ import { Tabs } from 'nextra/components'
       ### [`loader`](overrides/image_loader)
       The image loader is used to load the image from the source.
 
-      Possible values are: `s3`, `host`, `dummy` or a `LazyLoadedOverride` that will return the loader.
+      Possible values are: `s3`, `s3-lite`, `host`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the loader.
     </Tabs.Tab>
     <Tabs.Tab>
       Revalidate doesn't have any specific options. It only uses the common options.
@@ -195,7 +227,7 @@ import { Tabs } from 'nextra/components'
 
     Add possibility to override the default tag cache used for the initialization function.
 
-    Possible values are: `dynamodb`, `dynamodb-lite`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
+    Possible values are: `dynamodb`, `dynamodb-lite`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
   </Tabs.Tab>
   </Tabs>
 
@@ -239,14 +271,12 @@ It is also the place where you could find some experimental features.
 
 ---
 
-
 #### `disableTagCache`
 
 This will disable the tag cache. You can disable it safely if you only use page router.
 It is used for `revalidateTag` and `revalidatePath`.
 It's a boolean and by default, it is set to `false`.
 
-
 #### `disableIncrementalCache`
 
 This will disable the incremental cache. It is generally not recommended, as this is necessary for ISR **AND** SSG routes as well as the fetch cache.
@@ -254,7 +284,7 @@ It's a boolean and by default, it is set to `false`.
 
 #### `enableCacheInterception` - Experimental
 
-This will enable cache interception. It will allow you to intercept the cache system directly inside OpenNext routing layer and serve the page directly from the cache without going through `NextServer`. 
+This will enable cache interception. It will allow you to intercept the cache system directly inside OpenNext routing layer and serve the page directly from the cache without going through `NextServer`.
 
 If the cache interception fail, the request will be forwarded to the `NextServer` as usual.
 

From 75c3b3c76aaa679723af8aabfc1342ef00896580 Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 24 Feb 2025 14:18:44 +0100
Subject: [PATCH 058/140] refactor: overrides (#79)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 .../overrides/automatic_cdn_invalidation.mdx  |  2 +-
 pages/aws/config/overrides/converter.mdx      | 32 ++++++++++++++++++-
 pages/aws/config/overrides/image_loader.mdx   |  9 ++++++
 .../overrides/proxy_external_request.mdx      | 16 +++++++++-
 pages/aws/config/overrides/queue.mdx          |  6 ++--
 pages/aws/config/overrides/tag_cache.mdx      |  8 +++--
 pages/aws/config/overrides/wrapper.mdx        |  2 +-
 7 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/pages/aws/config/overrides/automatic_cdn_invalidation.mdx b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
index 268c8dc..dc08370 100644
--- a/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
+++ b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
@@ -2,7 +2,7 @@ import {Callout} from 'nextra/components'
 
 Available since `@opennextjs/aws` 3.4.0
 
-This override is used by OpenNext when routes have been On-Demand revalidated and the CDN needs to be updated. It is not called for ISR revalidation.
+Not enabled by default. This override is used by OpenNext when routes have been On-Demand revalidated and the CDN needs to be updated. It is not called for ISR revalidation.
 It will be called for `revalidatePath`, `revalidateTag` and `res.revalidate()`.
 
 If you want to better understand how to implement your own Automatic CDN Invalidation, the easiest way would be to take a look at the existing [included Automatic CDN Invalidation](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/cdnInvalidation)
diff --git a/pages/aws/config/overrides/converter.mdx b/pages/aws/config/overrides/converter.mdx
index 8f1785f..b8e5d77 100644
--- a/pages/aws/config/overrides/converter.mdx
+++ b/pages/aws/config/overrides/converter.mdx
@@ -6,4 +6,34 @@ Couple of things to note :
 - If you use a `StreamCreator` in your wrapper, you probably don't need to do anything in the `convertTo` function.
 - If used for the default, the image optimization, or one of the splitted server the internal types will be `InternalEvent` and `InternalResult` respectively.
 - If used for the external middleware, the internal types will be `InternalEvent` and `InternalResult | MiddlewareResult` respectively.
-- For the other servers, look up their respective types in the codebase.
\ No newline at end of file
+- For the other servers, look up their respective types in the codebase.
+
+## Included Converters
+
+### aws-apigw-v2
+
+The `aws-apigw-v2` Converter is the default convert for AWS. It is used by default if you don't provide any Converter in your configuration.
+
+### aws-apigw-v1
+
+The `aws-apigw-v1` Converter is a converter that allows you to convert request and response from Amazon API Gateway v1.
+
+### aws-cloudfront
+
+The `aws-cloudfront` Converter is a converter for Cloudfront (i.e. lambda@edge)
+
+### edge
+
+The `edge` Converter is the converter for everything that uses `Request` and `Response`. At the moment with the builtin one that's only Cloudflare.
+
+### converter
+
+The `node` Converter is a converter for classic Node.js server.
+
+### sqs-revalidate
+
+The `sqs-revalidate` Converter is a converter for the Revalidation server. It uses SQS Queue to handle the revalidation.
+
+### dummy
+
+The `dummy` Converter is a dummy implementation that will just forward the request and response as is.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/image_loader.mdx b/pages/aws/config/overrides/image_loader.mdx
index 2520cdf..06256a1 100644
--- a/pages/aws/config/overrides/image_loader.mdx
+++ b/pages/aws/config/overrides/image_loader.mdx
@@ -15,6 +15,15 @@ It uses the `@aws-sdk/client-s3` to interact with S3.
 
 - You need to provide the `BUCKET_KEY_PREFIX`, `BUCKET_NAME` environment variables to your server.
 
+### s3-lite
+
+The `s3-lite` ImageLoader will load images from an S3 bucket. It uses the `aws4fetch` to interact with S3.
+
+##### Requirements
+
+- You need to provide the `BUCKET_KEY_PREFIX`, `BUCKET_NAME` environment variables to your server. 
+- Can also provide `BUCKET_REGION`. It fallbacks to `AWS_REGION` ?? `AWS_DEFAULT_REGION`. This should be set by AWS automatically. You can read more about how this works on AWS Lambdas [here](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime).
+
 ### host
 
 The Host ImageLoader will load images from the host.
diff --git a/pages/aws/config/overrides/proxy_external_request.mdx b/pages/aws/config/overrides/proxy_external_request.mdx
index f9e3a16..641cb38 100644
--- a/pages/aws/config/overrides/proxy_external_request.mdx
+++ b/pages/aws/config/overrides/proxy_external_request.mdx
@@ -1,3 +1,17 @@
 This override is used by OpenNext to proxy rewritten requests to external services. It is used either in the `external` middleware (if set) or in the default/splitted server if the middleware is bundled.
 
-If you want to better understand how to implement your own ProxyExternalRequest, the easiest way would be to take a look at the existing [included ProxyExternalRequest](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/proxyExternalRequest).
\ No newline at end of file
+If you want to better understand how to implement your own ProxyExternalRequest, the easiest way would be to take a look at the existing [included ProxyExternalRequest](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/proxyExternalRequest).
+
+## Included Proxy External Request
+
+### node
+
+This uses node-proxy to proxy the request to the external service.
+
+### fetch
+
+This uses fetch to proxy the request to the external service. It doesn't work in Node.js
+
+### dummy
+
+This is a dummy implementation that throws a FatalError.
\ No newline at end of file
diff --git a/pages/aws/config/overrides/queue.mdx b/pages/aws/config/overrides/queue.mdx
index c081ca3..de99266 100644
--- a/pages/aws/config/overrides/queue.mdx
+++ b/pages/aws/config/overrides/queue.mdx
@@ -7,7 +7,7 @@ If you want to better understand how to implement your own Queue, the easiest wa
 
 Couple of things to note :
 - The default implementation use an SQS queue. This has the main advantage of being able to control the concurrency of the revalidations as well as avoiding trigerring the revalidation multiple times for the same route.
-- You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `queue` override](/aws/contribute/local_run#devqueuets).
+- You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `direct` override](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/queue/direct.ts).
 
 ## Included Queue
 
@@ -18,7 +18,7 @@ It uses the `@aws-sdk/client-sqs` to interact with SQS.
 
 #### Requirements
 
-- You need to provide the `QUEUE_URL` environment variable to your server.
+- You need to provide the `REVALIDATION_QUEUE_URL` environment variable to your server.
 
 ### sqs-lite
 
@@ -27,7 +27,7 @@ This implementation is a lighter version of the `sqs` Queue as it uses `aws4fetc
 
 #### Requirements
 
-- You need to provide the `QUEUE_URL`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
+- You need to provide the `REVALIDATION_QUEUE_URL`, `REVALIDATION_QUEUE_REGION`(will fallback to `us-east-1`), `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
 
 ### direct
 
diff --git a/pages/aws/config/overrides/tag_cache.mdx b/pages/aws/config/overrides/tag_cache.mdx
index 47575dd..a5f78e9 100644
--- a/pages/aws/config/overrides/tag_cache.mdx
+++ b/pages/aws/config/overrides/tag_cache.mdx
@@ -1,7 +1,7 @@
 This override is used by the [`cache` adapter](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/adapters/cache.ts) that is provided by OpenNext to the NextServer. It is also used by OpenNext if `enableCacheInterception` is set to `true` in the configuration and by the `initializationFunction` for prepopulating the cache.
 
 It is used for the cache tags (i.e. `revalidateTag` and `revalidatePath`). It does not handle anything related to the ISR/SSG cache or the fetch cache used by Next.js.
-It's main role is to detremine if a path is stale based on the tags and also to update the tag cache when `revalidateTag` is called.
+It's main role is to determine if a path is stale based on the tags and also to update the tag cache when `revalidateTag` is called.
 
 The current implementation differs from the way Next.js standalone handle cache tags. In the standalone version, the cache tags are stored in a file, and every time a cache entry is accessed, it has to check for every tags if the entry is stale. This approach is very read heavy and doesn't work well with DB like DynamoDB.
 We choose to go another way. We store tags for every path that exists in the cache. This way, we can easily know if a path is stale by just checking the path instead of every tags used. This approach is more write heavy but it's a tradeoff we are willing to make.
@@ -33,10 +33,14 @@ This implementation is a lighter version of the `dynamodb` TagCache as it uses `
 - You need to provide the `CACHE_DYNAMO_TABLE`, `CACHE_BUCKET_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables to your server.
 - DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
 
+### dynamodb-nextMode
+
+TBA
+
 ### dummy
 
 The Dummy TagCache is a dummy implementation that will throw an exception. It should not be used unless you want to disable cache tags.
 
 ### fs-dev
 
-The FsDev TagCache is a simple implementation that stores the cache tags in a file in the `.open-next/cache` folder and interact with it using the filesystem. It is useful for development purposes only.
\ No newline at end of file
+The FsDev TagCache is a simple implementation that stores the cache tags in a file in the `.open-next/cache` folder and interact with it using the filesystem. It is useful for development purposes only.
diff --git a/pages/aws/config/overrides/wrapper.mdx b/pages/aws/config/overrides/wrapper.mdx
index 3d81b00..6fbd086 100644
--- a/pages/aws/config/overrides/wrapper.mdx
+++ b/pages/aws/config/overrides/wrapper.mdx
@@ -6,7 +6,7 @@ Couple of things to note :
 - If you want to use streaming (for the `node` runtime of next), you'll need to create a `StreamCreator` and pass it to the `handler`. You can find some example in the [node](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/node.ts) or [aws-lambda-streaming](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/aws-lambda-streaming.ts) wrapper.
 - If you don't use streaming (like in the default `aws-lambda` wrapper), you may still need to provide a fake `StreamCreator` to the `handler` to avoid a weird issue with Node itself (see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/aws-lambda.ts#L49-L65) for an example and a more thorough explanation).
 - If you use the `edge` runtime of Next (either for the external middleware or for an `edge` route or page), you don't need the `StreamCreator` at all.
-- If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/cloudflare.ts#L29)). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
+- If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/b0b1f7776b41612d2638a33e3c9ced8c42afab0a/packages/open-next/src/overrides/wrappers/cloudflare-node.ts#L80). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
 
 
 ## Included Wrappers

From 5284312da00fb22f54f364b12bcb18f57a5a57bf Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Mon, 24 Feb 2025 13:46:15 +0000
Subject: [PATCH 059/140] add callout about `getCloudflareContext` in "async
 mode" (#75)

---
 pages/cloudflare/bindings.mdx | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index 48dbbfe..b13fbcf 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -27,6 +27,17 @@ export async function GET(request) {
 }
 ```
 
+<Callout type='info'>
+	`getCloudflareContext` can only be used in SSG routes in "async mode" (making it return a promise), to run the function in such a way simply provide an options argument with `async` set to `true`:
+	```js
+	const context = await getCloudflareContext({ async: true });
+	```
+
+	**WARNING**: During SSG caution is advised since secrets (stored in `.dev.vars` files) and local development
+	values from bindings (like values saved in a local KV) will be used for the pages static generation.
+
+</Callout>
+
 #### How to add bindings to your Worker
 
 Add bindings to your Worker by adding them to your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).

From 656a332e3230577fdeb377b57b4739fda13384d8 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Tue, 25 Feb 2025 20:40:13 +0000
Subject: [PATCH 060/140] cloudflare: update ISR support (#66)

---
 pages/cloudflare/caching.mdx | 89 ++++++++++++++++++++++++++++++++++--
 pages/cloudflare/index.mdx   |  4 +-
 2 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 356af4f..759cc3b 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -40,9 +40,9 @@ The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
   "kv_namespaces": [
     {
       "binding": "NEXT_CACHE_WORKERS_KV",
-      "id": "<BINDING_ID>"
-    }
-  ]
+      "id": "<BINDING_ID>",
+    },
+  ],
 }
 ```
 
@@ -70,3 +70,86 @@ const config: OpenNextConfig = {
 
 export default config;
 ```
+
+
+<Callout>
+  The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in production. We are actively working on a solution that will be suitable for production.
+</Callout>
+
+#### On-Demand Revalidation
+
+The tag revalidation mechanism uses a [Cloudflare D1](https://developers.cloudflare.com/d1/) database as its backing store for information about tags, paths, and revalidation times.
+
+To use on-demand revalidation, you should also follow the [ISR setup steps](#incremental-static-regeneration-isr).
+
+<Callout>
+  If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
+</Callout>
+
+##### 1. Create a D1 database
+
+The binding name used in your app's worker is `NEXT_CACHE_D1`.
+
+```jsonc
+// wrangler.json
+{
+  // ...
+  "d1_databases": [
+    {
+      "binding": "NEXT_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+}
+```
+
+##### 2. Create tables for tag revalidations
+
+The D1 tag cache requires two tables; one that keeps a record of the tag/path mappings, and another that tracks revalidation times.
+
+For the tag mappings, the default table name is `tags`, and can be configured by setting the `NEXT_CACHE_D1_TAGS_TABLE` environment variable to a string.
+
+For the revalidation times, the default table name is `revalidations` and can be configured by setting the `NEXT_CACHE_D1_REVALIDATIONS_TABLE` environment variable to a string.
+
+Wrangler can be used to create a table with it's [execute](https://developers.cloudflare.com/d1/wrangler-commands/#d1-execute) option. Ensure that you create a table for both your local dev database and your remote database.
+
+```sh
+wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS tags (tag TEXT NOT NULL, path TEXT NOT NULL, UNIQUE(tag, path) ON CONFLICT REPLACE)"
+wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS revalidations (tag TEXT NOT NULL, revalidatedAt INTEGER NOT NULL, UNIQUE(tag) ON CONFLICT REPLACE)"
+```
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import tagCache from "@opennextjs/cloudflare/d1-tag-cache";
+import incrementalCache from "@opennextjs/cloudflare/kv-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+
+const config: OpenNextConfig = {
+  default: {
+    override: {
+      // ...
+      incrementalCache: () => incrementalCache,
+      queue: () => memoryQueue,
+      tagCache: () => tagCache,
+    },
+  },
+  // ...
+};
+```
+
+##### 4. Initialise the cache during deployments
+
+In order for the cache to be properly initialised with the build-time revalidation data, you need to setup a command that runs as part of your deploy step.
+
+OpenNext will generate an SQL file during the build that can be used to setup your D1 database.
+
+```sh
+wrangler d1 execute NEXT_CACHE_D1 --file .open-next/cloudflare/cache-assets-manifest.sql
+```
+
+This should be run as part of each deployment to ensure that the cache is being populated with each build's initial revalidation data.
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 8cdbca7..85993f7 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -53,10 +53,12 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
-- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
+- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration) <sup>1</sup>
 - [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
+<sup>1</sup> Only the `direct` mode is supported at the moment, and is not suitable for production.
+
 We welcome both contributions and feedback!
 
 ### Windows support

From 814f261f4754203d99d3129498e2583a0d6c936a Mon Sep 17 00:00:00 2001
From: Philippe Serhal <philippe.serhal@netlify.com>
Date: Wed, 26 Feb 2025 02:54:28 -0500
Subject: [PATCH 061/140] chore: add team ownership via CODEOWNERS (#81)

---
 .github/CODEOWNERS | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 .github/CODEOWNERS

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..2d74fd8
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,3 @@
+/pages/aws/* @opennextjs/aws
+/pages/cloudflare/* @opennextjs/cloudflare @james-elicx 
+/pages/netlify/* @opennextjs/netlify-frameworks-and-build

From 241f3326baa6a83fa634e776dcc7f25cd01ae73c Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 26 Feb 2025 10:33:08 +0000
Subject: [PATCH 062/140] update Cloudflare docs to include 0.5 (#80)

---
 pages/cloudflare/_meta.json                  | 3 ++-
 pages/cloudflare/migrate-from-0.3-to-0.4.mdx | 4 ++--
 pages/cloudflare/migrate-from-0.4-to-0.5.mdx | 3 +++
 3 files changed, 7 insertions(+), 3 deletions(-)
 create mode 100644 pages/cloudflare/migrate-from-0.4-to-0.5.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index aff2153..e0d3688 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -7,7 +7,8 @@
   "examples": "",
   "community": "Community projects",
   "troubleshooting": "",
-  "migrate-from-0.3-to-0.4": "Migrate from 0.3",
+  "migrate-from-0.4-to-0.5": "Migrate from 0.4",
+  "migrate-from-0.3-to-0.4": "",
   "0.3": "Release 0.3",
   "migrate-from-0.2-to-0.3": "",
   "0.2": "Release 0.2"
diff --git a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
index 81c9df5..00c78f8 100644
--- a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
+++ b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
@@ -1,9 +1,9 @@
 import { SITE } from '../../config';
 import { Callout } from 'nextra/components';
 
-### Migrate from 0.3 (to 0.4)
+### Migrate from 0.3 to 0.4
 
-The `@opennextjs/cloudflare@0.4.0` introduced a new `initOpenNextCloudflareForDev` utility and made `getCloudflareContext` synchronous,
+`@opennextjs/cloudflare@0.4.0` introduced a new `initOpenNextCloudflareForDev` utility and made `getCloudflareContext` synchronous,
 we'll explore those two differences below, and how they effect applications built using `0.3.x` versions of the adapter.
 
 ##### `initOpenNextCloudflareForDev`
diff --git a/pages/cloudflare/migrate-from-0.4-to-0.5.mdx b/pages/cloudflare/migrate-from-0.4-to-0.5.mdx
new file mode 100644
index 0000000..26d371d
--- /dev/null
+++ b/pages/cloudflare/migrate-from-0.4-to-0.5.mdx
@@ -0,0 +1,3 @@
+### Migrate from 0.4 (to 0.5)
+
+`@opennextjs/cloudflare@0.5.0` did not introduce any breaking change, meaning that there are no migration steps from `0.4` to `0.5`.

From 9cd75ea6a76d7cd54fe08ce1e9095ec1ffd8c39c Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Wed, 26 Feb 2025 15:27:16 +0000
Subject: [PATCH 063/140] chore: add formatter (#83)

---
 .github/actions/build-docs/action.yml         |  22 +-
 .github/actions/format/action.yml             |  13 +
 .github/workflows/check.yml                   |  21 +-
 .github/workflows/nextjs.yml                  |   2 +-
 .prettierrc                                   |   8 +
 bun.lockb                                     | Bin 156549 -> 156965 bytes
 components/Footer.tsx                         |   4 +-
 components/Logo.svg.tsx                       |  13 +-
 package.json                                  |   8 +-
 pages/_app.mdx                                |   4 +-
 pages/aws/common_issues.mdx                   |  15 +-
 pages/aws/config.mdx                          |   6 +-
 pages/aws/config/_meta.json                   |   2 +-
 pages/aws/config/custom_overrides.mdx         | 208 +++--
 pages/aws/config/full_example.mdx             |  86 +--
 pages/aws/config/nx.mdx                       |  21 +-
 pages/aws/config/overrides/_meta.json         |   2 +-
 .../overrides/automatic_cdn_invalidation.mdx  |   5 +-
 pages/aws/config/overrides/converter.mdx      |   3 +-
 pages/aws/config/overrides/image_loader.mdx   |   4 +-
 .../config/overrides/incremental_cache.mdx    |   9 +-
 .../aws/config/overrides/origin_resolver.mdx  |   2 +-
 .../overrides/proxy_external_request.mdx      |   2 +-
 pages/aws/config/overrides/queue.mdx          |   9 +-
 pages/aws/config/overrides/wrapper.mdx        |  11 +-
 pages/aws/config/reference.mdx                | 111 +--
 pages/aws/config/simple_example.mdx           |  70 +-
 pages/aws/contribute/_meta.json               |   2 +-
 pages/aws/contribute/local_run.mdx            |  22 +-
 pages/aws/contribute/plugin.mdx               |  26 +-
 pages/aws/faq.mdx                             |   2 +-
 pages/aws/index.mdx                           |  10 +-
 pages/aws/inner_workings.mdx                  |   2 +-
 pages/aws/inner_workings/architecture.mdx     |   3 +-
 .../aws/inner_workings/cache_interception.mdx |   9 +-
 pages/aws/inner_workings/caching.mdx          |  22 +-
 .../aws/inner_workings/components/_meta.json  |   2 +-
 .../components/image_optimization.mdx         |  17 +-
 .../inner_workings/components/initializer.mdx |   5 +-
 .../inner_workings/components/middleware.mdx  |  18 +-
 .../inner_workings/components/overview.mdx    |   7 +-
 .../components/revalidation.mdx               |   7 +-
 .../inner_workings/components/server/edge.mdx |   2 +-
 .../inner_workings/components/server/node.mdx |  22 +-
 .../aws/inner_workings/components/warmer.mdx  |   7 +-
 pages/aws/inner_workings/routing.mdx          |   7 +-
 pages/aws/migration.mdx                       |   4 +-
 pages/aws/reference-implementation.mdx        | 710 +++++++++---------
 pages/aws/v2.mdx                              |   9 +-
 pages/aws/v2/_meta.json                       |   2 +-
 pages/aws/v2/advanced/_meta.json              |   2 +-
 pages/aws/v2/advanced/architecture.mdx        |  35 +-
 pages/aws/v2/advanced/debugging.mdx           |   2 +-
 pages/aws/v2/advanced/options.mdx             |   6 +-
 pages/aws/v2/common_issues.mdx                |   2 +-
 pages/aws/v2/common_issues/bundle_size.mdx    |  10 +-
 pages/aws/v2/common_issues/isr.mdx            |  17 +-
 pages/aws/v2/inner_workings/isr.mdx           |  18 +-
 pages/aws/v2/inner_workings/plugin.mdx        |   5 +-
 pages/aws/v2/inner_workings/streaming.mdx     |   9 +-
 pages/aws/v2/inner_workings/warming.mdx       |   2 +-
 pages/cloudflare/0.2/_meta.json               |   2 +-
 pages/cloudflare/0.2/bindings.mdx             |  19 +-
 pages/cloudflare/0.2/caching.mdx              |   7 +-
 pages/cloudflare/0.2/examples.mdx             |   8 +-
 pages/cloudflare/0.2/get-started.mdx          |  11 +-
 pages/cloudflare/0.2/index.mdx                |   4 +-
 pages/cloudflare/0.3/bindings.mdx             |  19 +-
 pages/cloudflare/0.3/caching.mdx              |  13 +-
 pages/cloudflare/0.3/examples.mdx             |  12 +-
 pages/cloudflare/0.3/get-started.mdx          |  40 +-
 pages/cloudflare/0.3/index.mdx                |   6 +-
 pages/cloudflare/bindings.mdx                 |  23 +-
 pages/cloudflare/caching.mdx                  |  11 +-
 pages/cloudflare/community.mdx                |   4 +-
 pages/cloudflare/examples.mdx                 |  12 +-
 pages/cloudflare/get-started.mdx              |  41 +-
 pages/cloudflare/howtos/NextAuth.mdx          |   1 -
 pages/cloudflare/howtos/stripeAPI.mdx         |   4 +-
 pages/cloudflare/index.mdx                    |   6 +-
 pages/cloudflare/migrate-from-0.2-to-0.3.mdx  |   4 +-
 pages/cloudflare/migrate-from-0.3-to-0.4.mdx  |   5 +-
 pages/cloudflare/troubleshooting.mdx          |   4 +-
 shared/WindowsSupport.mdx                     |  18 +-
 theme.config.jsx                              |   3 +-
 tsconfig.json                                 |  18 +-
 86 files changed, 1002 insertions(+), 979 deletions(-)
 create mode 100644 .github/actions/format/action.yml
 create mode 100644 .prettierrc

diff --git a/.github/actions/build-docs/action.yml b/.github/actions/build-docs/action.yml
index 44d6d04..799eff8 100644
--- a/.github/actions/build-docs/action.yml
+++ b/.github/actions/build-docs/action.yml
@@ -2,16 +2,16 @@ name: Build Docs
 description: Build docs pages inside /docs directory
 
 runs:
-    using: 'composite'
-    steps:
-        - name: Install dependencies
-          run: bun install
-          shell: bash
+  using: "composite"
+  steps:
+    - name: Install dependencies
+      run: bun install
+      shell: bash
 
-        - name: Build with Next.js
-          run: bun next build
-          shell: bash
+    - name: Build with Next.js
+      run: bun next build
+      shell: bash
 
-        - name: Export static HTML with Next.js
-          run: bun next export
-          shell: bash
+    - name: Export static HTML with Next.js
+      run: bun next export
+      shell: bash
diff --git a/.github/actions/format/action.yml b/.github/actions/format/action.yml
new file mode 100644
index 0000000..3257b85
--- /dev/null
+++ b/.github/actions/format/action.yml
@@ -0,0 +1,13 @@
+name: Format codebase
+description: Run prettier to check codebase formatting
+
+runs:
+  using: "composite"
+  steps:
+    - name: Install dependencies
+      run: bun install
+      shell: bash
+
+    - name: Run prettier
+      run: bun run prettier:check
+      shell: bash
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index 2a2fc68..ea4c643 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -1,15 +1,16 @@
 name: Validate merge requests
 
 on:
-    pull_request:
-        branches:
-            - main
+  pull_request:
+    branches:
+      - main
 
 jobs:
-    validate:
-        runs-on: ubuntu-latest
-        steps:
-            - name: Checkout
-              uses: actions/checkout@v4
-            - uses: oven-sh/setup-bun@v2
-            - uses: ./.github/actions/build-docs
+  validate:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - uses: oven-sh/setup-bun@v2
+      - uses: ./.github/actions/format
+      - uses: ./.github/actions/build-docs
diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml
index f0fe1d8..46ce460 100644
--- a/.github/workflows/nextjs.yml
+++ b/.github/workflows/nextjs.yml
@@ -23,7 +23,7 @@ permissions:
 
 # Allow one concurrent deployment
 concurrency:
-  group: 'pages'
+  group: "pages"
   cancel-in-progress: true
 
 jobs:
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..0adf136
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,8 @@
+{
+  "printWidth": 110,
+  "singleQuote": false,
+  "semi": true,
+  "useTabs": false,
+  "tabWidth": 2,
+  "trailingComma": "es5"
+}
diff --git a/bun.lockb b/bun.lockb
index d373d48687d5f409a4e2f3f087a0effe3a3f72c1..126f2470931ea69c4e7d92d417f540a1aef0e537 100755
GIT binary patch
diff --git a/components/Footer.tsx b/components/Footer.tsx
index f7a3cad..c690535 100644
--- a/components/Footer.tsx
+++ b/components/Footer.tsx
@@ -4,9 +4,7 @@ import styles from "../styles/Layout.module.css";
 export default function Footer() {
   return (
     <footer className={styles.footer}>
-      <span>
-        Maintained by the OpenNext community
-      </span>
+      <span>Maintained by the OpenNext community</span>
       <div>
         <a target="_blank" href={SITE.github} rel="noopener noreferrer">
           GitHub
diff --git a/components/Logo.svg.tsx b/components/Logo.svg.tsx
index 5077731..5421e0e 100644
--- a/components/Logo.svg.tsx
+++ b/components/Logo.svg.tsx
@@ -1,12 +1,6 @@
 export default function Logo() {
   return (
-    <svg
-      width="195"
-      height="36"
-      fill="none"
-      viewBox="0 0 195 36"
-      xmlns="http://www.w3.org/2000/svg"
-    >
+    <svg width="195" height="36" fill="none" viewBox="0 0 195 36" xmlns="http://www.w3.org/2000/svg">
       <path
         d="M89.9565 27V2.88H95.8965L108.713 19.908V2.88H113.248V27H108.676L94.4925 8.136V27H89.9565Z"
         fill="currentColor"
@@ -19,10 +13,7 @@ export default function Logo() {
         d="M145.8 27L154.764 14.58L145.944 2.88H151.776L158.4 11.592L164.664 2.88H170.1L161.28 15.12L170.28 27H164.412L157.644 18.072L151.236 27H145.8Z"
         fill="currentColor"
       />
-      <path
-        d="M181.074 27V7.092H172.218V2.88H194.646V7.092H185.79V27H181.074Z"
-        fill="currentColor"
-      />
+      <path d="M181.074 27V7.092H172.218V2.88H194.646V7.092H185.79V27H181.074Z" fill="currentColor" />
       <path
         d="M10.2284 27.3516C8.15422 27.3516 6.40813 26.9473 4.99016 26.1387C3.58391 25.3184 2.5175 24.1641 1.79094 22.6758C1.0761 21.1875 0.718674 19.4473 0.718674 17.4551C0.718674 16.0488 0.841721 14.6719 1.08781 13.3242C1.34563 11.9648 1.72063 10.6699 2.21281 9.43945C2.705 8.20898 3.32024 7.07227 4.05852 6.0293C4.80852 4.98633 5.6757 4.08398 6.66008 3.32227C7.64445 2.54883 8.74602 1.95117 9.96477 1.5293C11.1952 1.10742 12.537 0.896484 13.9902 0.896484C16.9902 0.896484 19.287 1.78125 20.8808 3.55078C22.4863 5.32031 23.289 7.72266 23.289 10.7578C23.289 12.1641 23.1718 13.5527 22.9374 14.9238C22.7148 16.2832 22.3632 17.584 21.8827 18.8262C21.414 20.0566 20.8222 21.1934 20.1073 22.2363C19.3925 23.2676 18.5488 24.1641 17.5761 24.9258C16.6152 25.6875 15.5195 26.2852 14.289 26.7188C13.0702 27.1406 11.7167 27.3516 10.2284 27.3516ZM10.4745 23.748C11.33 23.748 12.1327 23.5957 12.8827 23.291C13.6327 22.9863 14.3183 22.5586 14.9394 22.0078C15.5722 21.4453 16.1347 20.7715 16.6269 19.9863C17.1308 19.2012 17.5527 18.3281 17.8925 17.3672C18.2441 16.4062 18.5136 15.375 18.7011 14.2734C18.8886 13.1602 18.9823 12 18.9823 10.793C18.9823 8.83594 18.5195 7.29492 17.5937 6.16992C16.6796 5.04492 15.373 4.48242 13.6738 4.48242C12.7948 4.48242 11.9687 4.64062 11.1952 4.95703C10.4335 5.26172 9.73039 5.70703 9.08586 6.29297C8.44133 6.86719 7.86711 7.55273 7.3632 8.34961C6.87102 9.13477 6.44914 10.0078 6.09758 10.9688C5.74602 11.9297 5.47649 12.9551 5.28899 14.0449C5.1132 15.123 5.02531 16.248 5.02531 17.4199C5.02531 18.7559 5.23625 19.8984 5.65813 20.8477C6.09172 21.7969 6.71281 22.5176 7.52141 23.0098C8.34172 23.502 9.3261 23.748 10.4745 23.748Z"
         fill="currentColor"
diff --git a/package.json b/package.json
index 5dbab6c..eb81dbe 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,10 @@
     "dev": "next dev",
     "build": "next build",
     "start": "next start",
-    "lint": "next lint"
+    "lint": "next lint",
+    "prettier:check": "prettier --check .",
+    "prettier:fix": "prettier --write .",
+    "fix": "bun run prettier:fix"
   },
   "dependencies": {
     "@types/node": "18.11.9",
@@ -18,5 +21,8 @@
     "react": "18.2.0",
     "react-dom": "18.2.0",
     "typescript": "4.9.3"
+  },
+  "devDependencies": {
+    "prettier": "^3.5.2"
   }
 }
diff --git a/pages/_app.mdx b/pages/_app.mdx
index 2e1b362..39b86cd 100644
--- a/pages/_app.mdx
+++ b/pages/_app.mdx
@@ -1,3 +1,3 @@
 export default function App({ Component, pageProps }) {
-  return <Component {...pageProps} />
-}
\ No newline at end of file
+  return <Component {...pageProps} />;
+}
diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index 49c66e7..79b3dc5 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -63,7 +63,6 @@ This can also happen in app router when a client navigates via NextJS `<Link>` c
 
 The issue might be that your having a folder or file in your `public` directory with an overlapping between the name and your route. In this case, you should rename that to something else.
 
-
 #### `cannot find module './chunks/xxxx.js'` error
 
 Dynamic imports in `instrumentation.ts` will cause this error at runtime. Remove dynamic imports to resolve.
@@ -75,24 +74,26 @@ The config recommended by Sentry docs uses dynamic imports in `instrumentation.t
 Here's a working Sentry config which resolves the error:
 
 `instrumentation.ts`
+
 ```typescript
-import * as Sentry from '@sentry/nextjs';
-import { initSentry } from '../sentry.server.config';
+import * as Sentry from "@sentry/nextjs";
+import { initSentry } from "../sentry.server.config";
 
 export const onRequestError = Sentry.captureRequestError;
 
 export async function register() {
-  initSentry(process.env.NEXT_RUNTIME as 'nodejs' | 'edge');
+  initSentry(process.env.NEXT_RUNTIME as "nodejs" | "edge");
 }
 ```
 
 `sentry.server.config.ts`
+
 ```typescript
-import * as Sentry from '@sentry/nextjs';
+import * as Sentry from "@sentry/nextjs";
 
-export const initSentry = (runtime: 'nodejs' | 'edge') => {
+export const initSentry = (runtime: "nodejs" | "edge") => {
   Sentry.init({
-    dsn: 'https://...',
+    dsn: "https://...",
 
     //...rest of your config
   });
diff --git a/pages/aws/config.mdx b/pages/aws/config.mdx
index f5cebda..bcee5d4 100644
--- a/pages/aws/config.mdx
+++ b/pages/aws/config.mdx
@@ -25,12 +25,12 @@ For more advanced use cases, you can check [how to implement custom overrides](/
 
 If you want to look at a full example, you can check [the full example](/aws/config/full_example).
 
-
 ### Opt out of default poweredByHeader
 
 By default Next.js will add the [`x-powered-by`](https://nextjs.org/docs/app/api-reference/config/next-config-js/poweredByHeader) header. OpenNext will also add a header `x-opennext`. To opt-out of this, open `next.config.js` and disable the poweredByHeader property in the configuration:
+
 ```ts
 module.exports = {
   poweredByHeader: false,
-}
-```
\ No newline at end of file
+};
+```
diff --git a/pages/aws/config/_meta.json b/pages/aws/config/_meta.json
index 61715fd..a2b2009 100644
--- a/pages/aws/config/_meta.json
+++ b/pages/aws/config/_meta.json
@@ -5,4 +5,4 @@
   "full_example": "Full Example",
   "nx": "Nx Monorepo",
   "overrides": "Overrides"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index d255abb..0f1c66e 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -1,4 +1,4 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 In some cases the simple example is not enough, and you want to add more customization to your server. This is where the lazy loaded overrides come in. You can override any part of the server by providing a function that returns a promise that resolves to the override object. This is useful when you want to add custom logic to your server, like adding a custom queue, or adding a custom converter.
 
@@ -19,135 +19,133 @@ You'll still have to use a fallback value during dev as this is not used by the
 
 ```ts
 // customConverter.ts
-import converter from '@opennextjs/aws/overrides/converters/aws-apigw-v2.js'
-import type { Converter } from '@opennextjs/aws/types/overrides.js'
-import { Config } from 'sst/node/Config'
-const mySecretKey = Config.YOUR_SECRET_KEY
+import converter from "@opennextjs/aws/overrides/converters/aws-apigw-v2.js";
+import type { Converter } from "@opennextjs/aws/types/overrides.js";
+import { Config } from "sst/node/Config";
+const mySecretKey = Config.YOUR_SECRET_KEY;
 
 export default {
   convertFrom: async (event) => {
-    const result = await converter.convertFrom(event)
+    const result = await converter.convertFrom(event);
     return {
       ...result,
       headers: {
         ...result.headers,
-        'inserted-in-converter': '1',
-        'my-super-secret-key': mySecretKey
-      }
-    }
+        "inserted-in-converter": "1",
+        "my-super-secret-key": mySecretKey,
+      },
+    };
   },
-  convertTo : async (intResult) => {
-    const result = await converter.convertTo(intResult)
+  convertTo: async (intResult) => {
+    const result = await converter.convertTo(intResult);
     return {
       ...result,
       headers: {
         ...result.headers,
-        'x-converter-end': '1'
-      }
-    }
+        "x-converter-end": "1",
+      },
+    };
   },
-  name: 'custom-apigw-v2'
-} as Converter
+  name: "custom-apigw-v2",
+} as Converter;
 ```
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 
 const config = {
   default: {
     override: {
-      converter: () => import('./customConverter').then((mod) => mod.default)
-    }
-  }
-} as OpenNextConfig
+      converter: () => import("./customConverter").then((mod) => mod.default),
+    },
+  },
+} as OpenNextConfig;
 ```
 
 ## Custom wrapper
+
 Here we provide a few examples for some custom wrapper.
 
 ### Define a global to use node in the middleware
 
 ```ts
 // customWrapper.ts
-import defaultWrapper from '@opennextjs/aws/overrides/wrappers/aws-lambda.js'
+import defaultWrapper from "@opennextjs/aws/overrides/wrappers/aws-lambda.js";
 
 //Here you can define some globals
 declare global {
   var myApi: () => Promise<number>;
 }
 globalThis.myApi = async () => {
-  const crypto = await import('crypto')
+  const crypto = await import("crypto");
   return {
-    nb: crypto.randomInt(0, 100)
-  }
-}
+    nb: crypto.randomInt(0, 100),
+  };
+};
 
-export default defaultWrapper
+export default defaultWrapper;
 ```
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      wrapper: () => import('./customWrapper').then((mod) => mod.default)
-    }
-  }
-} as OpenNextConfig
-export default config
+      wrapper: () => import("./customWrapper").then((mod) => mod.default),
+    },
+  },
+} as OpenNextConfig;
+export default config;
 ```
+
 But since Next dev server runs in a fake edge runtime and that the global is defined only for deployment, you'll have to mock the global in your middleware.
 
 ```ts
 // middleware.ts
-import { NextResponse } from 'next/server'
-import type { NextRequest } from 'next/server'
+import { NextResponse } from "next/server";
+import type { NextRequest } from "next/server";
 
 // Here you need to mock the global if not present
 // One way to avoid issues with different implementation would be to create an api endpoint
 // that uses the exact same logic as the global you defined earlier,
 // and that is only available during development i.e. /api/dev/myApi
-if(!globalThis.myApi) {
+if (!globalThis.myApi) {
   globalThis.myApi = async () => {
-    return await fetch('http://localhost:3000/api/dev/myApi').then(res => res.json())
-  }
+    return await fetch("http://localhost:3000/api/dev/myApi").then((res) => res.json());
+  };
 }
 
 export function middleware(request: NextRequest) {
   // You can also send an error in the api endpoint itself
   // Or you could add all the dev endpoint in their own lambda
   // that you do not deploy in production
-  if(request.nextUrl.pathname.startsWith('/api/dev') && process.env.NODE_ENV === 'production') {
-    return NextResponse('This route is only available in development',{
+  if (request.nextUrl.pathname.startsWith("/api/dev") && process.env.NODE_ENV === "production") {
+    return NextResponse("This route is only available in development", {
       status: 500,
-    })
+    });
   }
   // Now you can use Node.js in your middleware
-  const {nb} = await myApi()
+  const { nb } = await myApi();
 
   // ... your code here
 }
-
 ```
 
-
 ### Use middy.js with the wrapper
 
 ```ts
 // customWrapper.ts
-import streamingWrapper from '@opennextjs/aws/overrides/wrappers/aws-lambda.js'
-import type { WrapperHandler } from '@opennextjs/aws/types/overrides.js'
-import middy from '@middy/core'
-import httpSecurityHeaders from '@middy/http-security-headers'
-
-const handler : WrapperHandler = async (handler, converter) => {
-  const defaultHandler = await streamingWrapper.wrapper(handler, converter)
-  return middy()
-  .use(httpSecurityHeaders())
-  .handler(defaultHandler)
-}
+import streamingWrapper from "@opennextjs/aws/overrides/wrappers/aws-lambda.js";
+import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
+import middy from "@middy/core";
+import httpSecurityHeaders from "@middy/http-security-headers";
+
+const handler: WrapperHandler = async (handler, converter) => {
+  const defaultHandler = await streamingWrapper.wrapper(handler, converter);
+  return middy().use(httpSecurityHeaders()).handler(defaultHandler);
+};
 
 export default {
   wrapper: handler,
@@ -158,15 +156,15 @@ export default {
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      wrapper: () => import('./customWrapper').then((mod) => mod.default)
-    }
-  }
-} as OpenNextConfig
-export default config
+      wrapper: () => import("./customWrapper").then((mod) => mod.default),
+    },
+  },
+} as OpenNextConfig;
+export default config;
 ```
 
 ### Preload some routes during warmer event
@@ -175,30 +173,21 @@ In this example the custom wrapper is used to preload some important routes befo
 
 **WARNING**: This one is not properly tested. It's just an example of what you could do. You should test it properly before using it in production. Also preloading too many routes is probably a bad idea.
 
-
 ```ts
 // customWrapper.ts
-import type {
-  APIGatewayProxyEventV2,
-  APIGatewayProxyResultV2,
-} from "aws-lambda";
+import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from "aws-lambda";
 import { Writable } from "node:stream";
 
 import { WarmerEvent, WarmerResponse } from "@opennextjs/aws/adapters/warmer-function.js";
 import type { StreamCreator } from "@opennextjs/aws/types/open-next.js";
 import type { WrapperHandler } from "@opennextjs/aws/types/overrides.js";
 
-type AwsLambdaEvent =
-  | APIGatewayProxyEventV2
-  | WarmerEvent;
-
-type AwsLambdaReturn =
-  | APIGatewayProxyResultV2
-  | WarmerResponse;
+type AwsLambdaEvent = APIGatewayProxyEventV2 | WarmerEvent;
 
+type AwsLambdaReturn = APIGatewayProxyResultV2 | WarmerResponse;
 
-const serverId = Math.random().toPrecision(5).toString()
-let isPreloaded = false
+const serverId = Math.random().toPrecision(5).toString();
+let isPreloaded = false;
 
 function formatWarmerResponse(event: WarmerEvent) {
   return new Promise<WarmerResponse>((resolve) => {
@@ -211,30 +200,29 @@ function formatWarmerResponse(event: WarmerEvent) {
 const handler: WrapperHandler =
   async (handler, converter) =>
   async (event: AwsLambdaEvent): Promise<AwsLambdaReturn> => {
-    console.log('custom wrapper')
+    console.log("custom wrapper");
     // Handle warmer event
     if ("type" in event) {
-      if(!isPreloaded) {
+      if (!isPreloaded) {
         // You could preload every route you want here
         // Be careful, while the route is preloading the lambda cannot process other requests
         await handler({
-          type: 'core',
-          url: '/myRoute',
-          method: 'GET',
+          type: "core",
+          url: "/myRoute",
+          method: "GET",
           headers: {},
           query: {},
-          rawPath: '/myRoute',
+          rawPath: "/myRoute",
           cookies: {},
-          remoteAddress: ''
+          remoteAddress: "",
         });
-        isPreloaded = true
+        isPreloaded = true;
       }
       return formatWarmerResponse(event);
     }
 
-
     const internalEvent = await converter.convertFrom(event);
-    internalEvent.headers['inserted-in-wrapper'] = 'hello from wrapper'
+    internalEvent.headers["inserted-in-wrapper"] = "hello from wrapper";
 
     //This is a workaround, there is an issue in node that causes node to crash silently if the OpenNextNodeResponse stream is not consumed
     //This does not happen everytime, it's probably caused by suspended component in ssr (either via <Suspense> or loading.tsx)
@@ -251,7 +239,7 @@ const handler: WrapperHandler =
     };
 
     const response = await handler(internalEvent, fakeStream);
-    response.headers['x-wrapper'] = 'hi'
+    response.headers["x-wrapper"] = "hi";
 
     return converter.convertTo(response, event);
   };
@@ -265,14 +253,14 @@ export default {
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      wrapper: () => import('./customWrapper').then((mod) => mod.default)
-    }
-  }
-} as OpenNextConfig
+      wrapper: () => import("./customWrapper").then((mod) => mod.default),
+    },
+  },
+} as OpenNextConfig;
 ```
 
 ## Custom Incremental cache
@@ -280,12 +268,12 @@ const config = {
 You can take inspiration from our [`fs-dev`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/incrementalCache/fs-dev.ts) override which uses the file system to store the incremental cache. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.ts";
 const config = {
   default: {
     override: {
       // can be any of our included ones or your own custom override
-      incrementalCache: () => import('./customIncrementalCache').then((mod) => mod.default),
+      incrementalCache: () => import("./customIncrementalCache").then((mod) => mod.default),
     },
   },
 } satisfies OpenNextConfig;
@@ -300,12 +288,12 @@ export default config;
 By default it will use SQS queue to revalidate stale routes. You can read more about this [here](/aws/config/overrides/queue). To create your own custom override you can take inspiration by looking at our [included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/queue) implementations. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.ts";
 const config = {
   default: {
     override: {
       // can be any of our included ones or your own custom override
-      queue: () => import('./customQueue').then((mod) => mod.default),
+      queue: () => import("./customQueue").then((mod) => mod.default),
     },
   },
 } satisfies OpenNextConfig;
@@ -320,12 +308,12 @@ export default config;
 To override the tag cache you can take inspiration by looking at the [`fs-dev`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/tagCache/fs-dev.ts) override that uses the filesystem. You can read more about this override [here](/aws/config/overrides/tag_cache). You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.ts';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.ts";
 const config = {
   default: {
     override: {
       // can be any of our included ones or your own custom override
-      tagCache: () => import('./customTagCache').then((mod) => mod.default),
+      tagCache: () => import("./customTagCache").then((mod) => mod.default),
     },
   },
 } satisfies OpenNextConfig;
@@ -340,14 +328,14 @@ export default config;
 This override is only used internally by OpenNext to resolve the origin of the request if you have an `external` middleware. You can take inspiration from looking at our included [`pattern-env`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/originResolver/pattern-env.ts) override. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {},
   middleware: {
     // must be true for the originResolver to be used
     external: true,
     // can be any of our included ones or your own custom override
-    originResolver: () => import('./customOriginResolver').then((mod) => mod.default),
+    originResolver: () => import("./customOriginResolver").then((mod) => mod.default),
   },
 } satisfies OpenNextConfig;
 
@@ -361,11 +349,11 @@ export default config;
 This override is used in the image optimization server to load an image from a custom source. You can look at our implemention of using the file system [here](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/imageLoader/fs-dev.ts). You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {},
   imageOptimization: {
-    loader: () => import('./customImageLoader').then((mod) => mod.default),
+    loader: () => import("./customImageLoader").then((mod) => mod.default),
   },
 } satisfies OpenNextConfig;
 
@@ -379,11 +367,11 @@ export default config;
 To have a custom override for the warmer invoke you can take inspiration by looking at our [`aws-lambda`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/warmer/aws-lambda.ts) override. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {},
   warmer: {
-    invokeFunction: () => import('./customWarmer').then((mod) => mod.default),
+    invokeFunction: () => import("./customWarmer").then((mod) => mod.default),
   },
 } satisfies OpenNextConfig;
 
@@ -397,12 +385,12 @@ export default config;
 To have a custom override for the CDN Invalidation you can take inspiration by looking at our [`cloudfront`](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/cdnInvalidation/cloudfront.ts) override. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      cdnInvalidation: () => import('./customCdnInvalidation').then((mod) => mod.default),
-    }
+      cdnInvalidation: () => import("./customCdnInvalidation").then((mod) => mod.default),
+    },
   },
 } satisfies OpenNextConfig;
 
@@ -416,12 +404,12 @@ export default config;
 This is used by OpenNext to proxy rewritten requests to external services. You can read more about it [here](/aws/config/overrides/proxy_external_request). To have a custom override for the External Request Proxy you can take inspiration by looking at our [`fetch`](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/proxyExternalRequest/fetch.ts) override. You need an `open-next.config.ts` with this:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      proxyExternalRequest: () => import('./customProxyExternalRequest').then((mod) => mod.default),
-    }
+      proxyExternalRequest: () => import("./customProxyExternalRequest").then((mod) => mod.default),
+    },
   },
 } satisfies OpenNextConfig;
 
diff --git a/pages/aws/config/full_example.mdx b/pages/aws/config/full_example.mdx
index b99e963..fd45da4 100644
--- a/pages/aws/config/full_example.mdx
+++ b/pages/aws/config/full_example.mdx
@@ -5,7 +5,7 @@ Here is a detailed example of an `open-next.config.ts` file. This file need to b
 For more information about the options here, take a look at the [reference section](/aws/config/reference).
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
 const config = {
   default: {
     // This is the default server, similar to the server-function in open-next v2
@@ -13,14 +13,14 @@ const config = {
     // for normal lambda as in open-next v2
     override: {
       // This is necessary to enable lambda streaming, defaults to aws-lambda
-      wrapper: 'aws-lambda-streaming',
+      wrapper: "aws-lambda-streaming",
       // Convert the input and output of the server, defaults to aws-apigw-v2
-      converter: 'aws-apigw-v2',
+      converter: "aws-apigw-v2",
       // Used for fetch cache and html/rsc/json cache, defaults to s3
-      incrementalCache: 's3',
+      incrementalCache: "s3",
       // Used for external rewrites, defaults to node
-      proxyExternalRequest: 'node',
-      tagCache: 'dynamodb', // Used for revalidatePath and revalidateTag, defaults to dynamodb
+      proxyExternalRequest: "node",
+      tagCache: "dynamodb", // Used for revalidatePath and revalidateTag, defaults to dynamodb
       // You can override any part that is a `LazyLoadedOverride` this way
       queue: () =>
         Promise.resolve({
@@ -33,8 +33,8 @@ const config = {
     // only for example purposes, you most likely should not use this
     // this can be used on every server to install additional packages
     install: {
-      packages: ['sharp@0.33.5'],
-      arch: 'arm64',
+      packages: ["sharp@0.33.5"],
+      arch: "arm64",
     },
     minify: true, // This will minify the output
   },
@@ -43,18 +43,18 @@ const config = {
   functions: {
     ssr: {
       routes: [
-        'app/api/isr/route',
-        'app/api/sse/route',
-        'app/api/revalidateTag/route', // app dir Api routes
-        'app/route1/page',
-        'app/route2/page', // app dir pages
-        'pages/route3', // page dir pages
+        "app/api/isr/route",
+        "app/api/sse/route",
+        "app/api/revalidateTag/route", // app dir Api routes
+        "app/route1/page",
+        "app/route2/page", // app dir pages
+        "pages/route3", // page dir pages
       ], // For app dir, you need to include route|page, no need to include layout or loading
       // patterns needs to be in a cloudfront compatible format
       // this will be used to generate the output
-      patterns: ['api/*', 'route1', 'route2', 'route3'],
+      patterns: ["api/*", "route1", "route2", "route3"],
       override: {
-        wrapper: 'aws-lambda-streaming',
+        wrapper: "aws-lambda-streaming",
       },
       // This enables the bundled next server which is faster and reduce the size of the server
       // This is also experimental and might not work in all cases
@@ -63,22 +63,22 @@ const config = {
     pageSsr: {
       // For page dir routes should be in the form `pages/${route}` without the extension
       // It should match the filesystem
-      routes: ['pages/pageSsr'],
+      routes: ["pages/pageSsr"],
       // BUILD_ID is a special case, it will be replaced with the actual build id
-      patterns: ['pageSsr', '_next/data/BUILD_ID/pageSsr.json'],
+      patterns: ["pageSsr", "_next/data/BUILD_ID/pageSsr.json"],
       override: {
-        wrapper: 'node',
-        converter: 'node',
-        // This is necessary to generate the dockerfile and 
+        wrapper: "node",
+        converter: "node",
+        // This is necessary to generate the dockerfile and
         // for the implementation to know that it needs to deploy on docker
         // You can also provide a string here which will be used to create the dockerfile
         generateDockerfile: true,
       },
     },
     edge: {
-      runtime: 'edge',
-      routes: ['app/ssr/page'],
-      patterns: ['ssr'],
+      runtime: "edge",
+      routes: ["app/ssr/page"],
+      patterns: ["ssr"],
       override: {},
     },
   },
@@ -99,34 +99,34 @@ const config = {
     // You can customize this to your needs
     // By default it will install with these options:
     install: {
-      packages: ['sharp@0.32.6'],
-      arch: 'arm64',
-      nodeVersion: '18',
-      libc: 'glibc',
+      packages: ["sharp@0.32.6"],
+      arch: "arm64",
+      nodeVersion: "18",
+      libc: "glibc",
     },
   },
   // Initialization function is a special server that will run at build time to initialize the cache.
   // By default, it only initializes the tag cache. Besides the common options, you can use the following options:
   initializationFunction: {
-    tagCache: 'dynamodb-lite', // Can be overridden with a LazyLoadedOverride
+    tagCache: "dynamodb-lite", // Can be overridden with a LazyLoadedOverride
   },
   // Override the default revalidate function
   // By default, works for lambda and on SQS event.
   // Supports only node runtime
   revalidate: {
     override: {
-      wrapper: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
-      converter: 'aws-apigw-v2', // Can be overridden with a LazyLoadedOverride
+      wrapper: "aws-lambda", // Can be overridden with a LazyLoadedOverride
+      converter: "aws-apigw-v2", // Can be overridden with a LazyLoadedOverride
     },
   },
   // Override the default warmer
   // By default, works for lambda only.
   // If you override this, you'll need to handle the warmer event in the wrapper
   warmer: {
-    invokeFunction: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
+    invokeFunction: "aws-lambda", // Can be overridden with a LazyLoadedOverride
     override: {
-      wrapper: 'aws-lambda', // Can be overridden with a LazyLoadedOverride
-      converter: 'aws-apigw-v2', // Can be overridden with a LazyLoadedOverride
+      wrapper: "aws-lambda", // Can be overridden with a LazyLoadedOverride
+      converter: "aws-apigw-v2", // Can be overridden with a LazyLoadedOverride
     },
   },
   // If you want to override the default build command, you can do it here
@@ -149,22 +149,22 @@ const config = {
     // This is executed for every request and after next config headers and middleware has executed.
     // Here is a very simple example of how you can use it:
     headersAndCookiesPriority: (event) => {
-      if (event.rawPath.startsWith('/api')) {
-        return 'middleware';
+      if (event.rawPath.startsWith("/api")) {
+        return "middleware";
       }
-      return 'handler';
+      return "handler";
     },
   },
-  // The path to the target folder of build output from the `buildCommand` option 
+  // The path to the target folder of build output from the `buildCommand` option
   // (the path which will contain the `.next` and `.open-next` folders).
   // This path is relative from the current process.cwd() - Optional defaults to "."
-  buildOutputPath: 'build',
+  buildOutputPath: "build",
   // The path to the root of the Next.js app's source code.
   // This path is relative from the current process.cwd(). - Optional defaults to "."
-  appPath: 'app',
-  // The path to the package.json file of the Next.js app. 
+  appPath: "app",
+  // The path to the package.json file of the Next.js app.
   // This path is relative from the current process.cwd(). - Optional
-  packageJsonPath: 'package.json',
+  packageJsonPath: "package.json",
   // Advanced usage
   // If you use the edge runtime somewhere (either with an external middleware or in the functions), we compile 2 versions of the open-next.config.ts file.
   // One for the node runtime and one for the edge runtime.
@@ -174,4 +174,4 @@ const config = {
 } satisfies OpenNextConfig;
 
 export default config;
-```
\ No newline at end of file
+```
diff --git a/pages/aws/config/nx.mdx b/pages/aws/config/nx.mdx
index e9334a8..b635c24 100644
--- a/pages/aws/config/nx.mdx
+++ b/pages/aws/config/nx.mdx
@@ -1,9 +1,11 @@
 # Configuring OpenNext for use in an Nx Monorepo.
+
 Here's a detailed exampled of how to add OpenNext + SST to an existing Nx workspace, with an existing NextJS application sitting at `apps/next-site`
 
 1. install `open-next`: `pnpm add —save-dev @opennextjs/aws`
 
 2. Update your `apps/next-site/next.config.js` add `output: ‘standalone’`, and you want to add `experimental.outputFileTracingRoot`, it should look a little like this:
+
 ```javascript
 //@ts-check
 
@@ -36,6 +38,7 @@ module.exports = composePlugins(...plugins)(nextConfig);
 ```
 
 3. Create `open-next.config.ts` inside your apps root directory, it should look a little something like this:
+
 ```javascript
 import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
 
@@ -57,6 +60,7 @@ it might even work.
 
 However, we don't want to rely on needing to manually running a build every time we want to deploy a change, so instead we can set up a target.
 We do this in your project's `project.json` (in this case, living at `apps/next-site/project`), we want to find the targets object and update it:
+
 ```diff
 {
   "name": "next-site",
@@ -79,7 +83,9 @@ We do this in your project's `project.json` (in this case, living at `apps/next-
 }
 
 ```
+
 Next we need to add the open-next directory to our eslint's `ignorePatterns` array
+
 ```diff
 {
   "extends": [
@@ -134,21 +140,21 @@ but we will not use the SST cli to init this project, because it wants to add a
 export default $config({
   app(input) {
     return {
-      name: 'next-site', // use whatever your project is called here
-      removal: input?.stage === 'production' ? 'retain' : 'remove',
-      home: 'aws',
+      name: "next-site", // use whatever your project is called here
+      removal: input?.stage === "production" ? "retain" : "remove",
+      home: "aws",
     };
   },
   async run() {
-    new sst.aws.Nextjs('Site', {
-      buildCommand: 'exit 0;' // again, we want to get Nx to handle building
+    new sst.aws.Nextjs("Site", {
+      buildCommand: "exit 0;", // again, we want to get Nx to handle building
     });
   },
 });
-
 ```
 
 - now, you probably see some type errors, as SST is not initialized yet, but we can resolve this by running
+
 ```bash
 $ cd apps/next-site && sst install
 ```
@@ -245,8 +251,9 @@ this will resolve the type issues and initialise SST.
 ```
 
 now we can run (or if you want a custom stage, you can simply do `nx deploy next-site --stage this-is-my-stage` and it will be passed directly to the sst command).
+
 ```bash
 $ nx deploy next-site --configuration dev # using dev configuration (which sets the stage to development)
 # nx deploy next-site -c dev # OR
 # nx deploy next-site --stage my-stage # Custom Stage
-```
\ No newline at end of file
+```
diff --git a/pages/aws/config/overrides/_meta.json b/pages/aws/config/overrides/_meta.json
index 5e89222..36719ab 100644
--- a/pages/aws/config/overrides/_meta.json
+++ b/pages/aws/config/overrides/_meta.json
@@ -9,4 +9,4 @@
   "origin_resolver": "Origin Resolver",
   "invoke_function": "Invoke Function for the warmer",
   "automatic_cdn_invalidation": "Automatic CDN Invalidation"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/config/overrides/automatic_cdn_invalidation.mdx b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
index dc08370..c9a9c09 100644
--- a/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
+++ b/pages/aws/config/overrides/automatic_cdn_invalidation.mdx
@@ -1,4 +1,4 @@
-import {Callout} from 'nextra/components'
+import { Callout } from "nextra/components";
 
 Available since `@opennextjs/aws` 3.4.0
 
@@ -25,10 +25,11 @@ This implementation will send an invalidation request for every route that needs
 Tag cache invalidation could end up triggering thousands of invalidation requests.
 
 Only use this implementation if you are aware of the costs and are willing to pay for it.
+
 </Callout>
 
 The CloudFront Automatic CDN Invalidation will invalidate the cache of the CloudFront distribution.
 
 ##### Requirements
 
-- You need to provide the `CLOUDFRONT_DISTRIBUTION_ID` environment variable to your server.
\ No newline at end of file
+- You need to provide the `CLOUDFRONT_DISTRIBUTION_ID` environment variable to your server.
diff --git a/pages/aws/config/overrides/converter.mdx b/pages/aws/config/overrides/converter.mdx
index b8e5d77..b23346d 100644
--- a/pages/aws/config/overrides/converter.mdx
+++ b/pages/aws/config/overrides/converter.mdx
@@ -3,6 +3,7 @@ This override is meant to convert request and response provided from your wrappe
 If you want to better understand how to implement your own Converter, the easiest way would be to take a look at one of the existing [included Converter](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/converters)
 
 Couple of things to note :
+
 - If you use a `StreamCreator` in your wrapper, you probably don't need to do anything in the `convertTo` function.
 - If used for the default, the image optimization, or one of the splitted server the internal types will be `InternalEvent` and `InternalResult` respectively.
 - If used for the external middleware, the internal types will be `InternalEvent` and `InternalResult | MiddlewareResult` respectively.
@@ -36,4 +37,4 @@ The `sqs-revalidate` Converter is a converter for the Revalidation server. It us
 
 ### dummy
 
-The `dummy` Converter is a dummy implementation that will just forward the request and response as is.
\ No newline at end of file
+The `dummy` Converter is a dummy implementation that will just forward the request and response as is.
diff --git a/pages/aws/config/overrides/image_loader.mdx b/pages/aws/config/overrides/image_loader.mdx
index 06256a1..9a89d90 100644
--- a/pages/aws/config/overrides/image_loader.mdx
+++ b/pages/aws/config/overrides/image_loader.mdx
@@ -21,7 +21,7 @@ The `s3-lite` ImageLoader will load images from an S3 bucket. It uses the `aws4f
 
 ##### Requirements
 
-- You need to provide the `BUCKET_KEY_PREFIX`, `BUCKET_NAME` environment variables to your server. 
+- You need to provide the `BUCKET_KEY_PREFIX`, `BUCKET_NAME` environment variables to your server.
 - Can also provide `BUCKET_REGION`. It fallbacks to `AWS_REGION` ?? `AWS_DEFAULT_REGION`. This should be set by AWS automatically. You can read more about how this works on AWS Lambdas [here](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime).
 
 ### host
@@ -39,4 +39,4 @@ The FsDev ImageLoader is a simple implementation that loads images from the `.op
 
 ### dummy
 
-The Dummy ImageLoader is a dummy implementation that will throw an exception. It should not be used.
\ No newline at end of file
+The Dummy ImageLoader is a dummy implementation that will throw an exception. It should not be used.
diff --git a/pages/aws/config/overrides/incremental_cache.mdx b/pages/aws/config/overrides/incremental_cache.mdx
index 0e9ca3d..e0cbc31 100644
--- a/pages/aws/config/overrides/incremental_cache.mdx
+++ b/pages/aws/config/overrides/incremental_cache.mdx
@@ -1,4 +1,4 @@
-import { Callout } from 'nextra/components';
+import { Callout } from "nextra/components";
 
 This override is used by the [`cache` adapter](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/adapters/cache.ts) that is provided by OpenNext to the NextServer. It is also used by OpenNext if `enableCacheInterception` is set to `true` in the configuration.
 
@@ -47,20 +47,23 @@ It needs to run on the local filesystem, and expect to be run from the OpenNext
 Because of how it works, this implementation is only eventually consistent and errors during update could cause inconsistencies between the local cache in some instances and the S3 cache.
 
 It could also end up being slower (and more expensive) than simpler implementations if used in a low traffic serverless environment.
+
 </Callout>
 
-The MultiTierDdbS3 IncrementalCache is a more complex implementation. 
+The MultiTierDdbS3 IncrementalCache is a more complex implementation.
 Cache are stored in a local In Memory LRU cache as well as in S3. DynamoDB is used to keep local cache in sync between multiple instances of the server.
 It uses `aws4fetch` to interact with S3 and DynamoDB.
 
 ##### How does it work
 
 On get :
+
 1. When a cache is requested, it first checks the local cache. If the cache is not found, it will fetch it from S3 and store it in the local cache.
 2. If the local cache exist for this key, it will check metadata in DynamoDB to see if the cache is still valid. If it is not, it will fetch the cache from S3 and store it in the local cache.
 3. If the local cache is valid, it will return it.
 
 On update :
+
 1. When a cache is updated, it will first try to update the cache in S3.
 2. If the update is successful, it will update the metadata in DynamoDB.
 3. Finally, it will update the local cache.
@@ -68,4 +71,4 @@ On update :
 ##### Requirements
 
 - You need to provide the `CACHE_BUCKET_REGION`, `CACHE_BUCKET_KEY_PREFIX`, `CACHE_BUCKET_NAME`, `CACHE_DYNAMO_TABLE`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN`, `OPEN_NEXT_LOCAL_CACHE_TTL_MS` (optional), `OPEN_NEXT_LOCAL_CACHE_SIZE`(optional) environment variables to your server.
-- DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
\ No newline at end of file
+- DynamoDB table should have a primary key `path` of type `String` and a sort key `tag` of type `String`. (It can reuse the same table as the one used by the default `tagCache`)
diff --git a/pages/aws/config/overrides/origin_resolver.mdx b/pages/aws/config/overrides/origin_resolver.mdx
index 09737cc..45fa536 100644
--- a/pages/aws/config/overrides/origin_resolver.mdx
+++ b/pages/aws/config/overrides/origin_resolver.mdx
@@ -3,4 +3,4 @@ This is only used by the external middleware.
 
 At build time, we may not know where the splitted server will be deployed, so we need to resolve the origin at runtime. This is why we need this override. The origin is resolved by this override will need to be handled by the wrapper used. At the moment, only the `aws-cloudfront` and the `cloudflare-edge` wrapper are able to do so.
 
-If you want to better understand how to implement your own OriginResolver, the easiest way would be to take a look at the existing [included OriginResolver](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/originResolver).
\ No newline at end of file
+If you want to better understand how to implement your own OriginResolver, the easiest way would be to take a look at the existing [included OriginResolver](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/originResolver).
diff --git a/pages/aws/config/overrides/proxy_external_request.mdx b/pages/aws/config/overrides/proxy_external_request.mdx
index 641cb38..3f57935 100644
--- a/pages/aws/config/overrides/proxy_external_request.mdx
+++ b/pages/aws/config/overrides/proxy_external_request.mdx
@@ -14,4 +14,4 @@ This uses fetch to proxy the request to the external service. It doesn't work in
 
 ### dummy
 
-This is a dummy implementation that throws a FatalError.
\ No newline at end of file
+This is a dummy implementation that throws a FatalError.
diff --git a/pages/aws/config/overrides/queue.mdx b/pages/aws/config/overrides/queue.mdx
index de99266..c4d2961 100644
--- a/pages/aws/config/overrides/queue.mdx
+++ b/pages/aws/config/overrides/queue.mdx
@@ -1,4 +1,4 @@
-import {Callout} from 'nextra/components'
+import { Callout } from "nextra/components";
 
 This override is used by OpenNext to trigger the revalidation of stale routes.
 Before sending the response to the client, OpenNext will check if the route is stale and if it is, it will call the queue override to revalidate the route.
@@ -6,6 +6,7 @@ Before sending the response to the client, OpenNext will check if the route is s
 If you want to better understand how to implement your own Queue, the easiest way would be to take a look at the existing [included Queue](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/queue).
 
 Couple of things to note :
+
 - The default implementation use an SQS queue. This has the main advantage of being able to control the concurrency of the revalidations as well as avoiding trigerring the revalidation multiple times for the same route.
 - You don't have to use a queue at all. You could trigger the revalidation directly in the Queue override itself. You can see a very simple implementation of this [in the `direct` override](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/queue/direct.ts).
 
@@ -33,10 +34,10 @@ This implementation is a lighter version of the `sqs` Queue as it uses `aws4fetc
 
 The Direct Queue will directly trigger the revalidation of the route in the Queue override itself. It is useful for development purposes and when you don't want to use a queue.
 
-<Callout type='warning'>
-Be careful with this implementation as it could lead to multiple revalidations of the same route.
+<Callout type="warning">
+  Be careful with this implementation as it could lead to multiple revalidations of the same route.
 </Callout>
 
 ### dummy
 
-The Dummy Queue is a dummy implementation that will throw an exception. It should not be used unless you want to disable ISR.
\ No newline at end of file
+The Dummy Queue is a dummy implementation that will throw an exception. It should not be used unless you want to disable ISR.
diff --git a/pages/aws/config/overrides/wrapper.mdx b/pages/aws/config/overrides/wrapper.mdx
index 6fbd086..33543a3 100644
--- a/pages/aws/config/overrides/wrapper.mdx
+++ b/pages/aws/config/overrides/wrapper.mdx
@@ -3,12 +3,12 @@ This is the main entrypoint of the server. It is used for every server and allow
 If you want to better understand how to implement your own Wrapper, the easiest way would be to take a look at one of the existing [included Wrapper](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/wrappers).
 
 Couple of things to note :
+
 - If you want to use streaming (for the `node` runtime of next), you'll need to create a `StreamCreator` and pass it to the `handler`. You can find some example in the [node](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/node.ts) or [aws-lambda-streaming](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/aws-lambda-streaming.ts) wrapper.
 - If you don't use streaming (like in the default `aws-lambda` wrapper), you may still need to provide a fake `StreamCreator` to the `handler` to avoid a weird issue with Node itself (see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/aws-lambda.ts#L49-L65) for an example and a more thorough explanation).
 - If you use the `edge` runtime of Next (either for the external middleware or for an `edge` route or page), you don't need the `StreamCreator` at all.
 - If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/b0b1f7776b41612d2638a33e3c9ced8c42afab0a/packages/open-next/src/overrides/wrappers/cloudflare-node.ts#L80). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
 
-
 ## Included Wrappers
 
 ### aws-lambda
@@ -16,6 +16,7 @@ Couple of things to note :
 The `aws-lambda` Wrapper is the default wrapper for AWS Lambda. It is used by default if you don't provide any Wrapper in your configuration.
 
 #### Features
+
 - [ ] Streaming
 - [ ] Proper support for `waitUntil`
 
@@ -24,6 +25,7 @@ The `aws-lambda` Wrapper is the default wrapper for AWS Lambda. It is used by de
 The `aws-lambda-streaming` Wrapper is a wrapper that allows you to use streaming in AWS Lambda. Streaming must be enabled for this lambda.
 
 #### Features
+
 - [x] Streaming
 - [x] Proper support for `waitUntil`
 
@@ -32,6 +34,7 @@ The `aws-lambda-streaming` Wrapper is a wrapper that allows you to use streaming
 The `cloudflare-edge` Wrapper is the wrapper for Cloudflare Workers. It should be used for the external middleware and for the `edge` runtime of Next.
 
 #### Features
+
 - [x] Streaming
 - [x] Proper support for `waitUntil`
 
@@ -40,6 +43,7 @@ The `cloudflare-edge` Wrapper is the wrapper for Cloudflare Workers. It should b
 The `cloudflare-node` Wrapper is the wrapper for Cloudflare Workers. It should be used only with the `node` runtime of Next and if you use `@opennextjs/cloudflare`.
 
 #### Features
+
 - [x] Streaming
 - [x] Proper support for `waitUntil`
 
@@ -48,6 +52,7 @@ The `cloudflare-node` Wrapper is the wrapper for Cloudflare Workers. It should b
 The `node` Wrapper is the wrapper for classic Node.js Server. This one is a long running server.
 
 #### Features
+
 - [x] Streaming
 - [x] Proper support for `waitUntil`
 
@@ -56,6 +61,7 @@ The `node` Wrapper is the wrapper for classic Node.js Server. This one is a long
 The `express-dev` Wrapper is the wrapper for a classic Express server. It is a long running process and should be used for development purposes only.
 
 #### Features
+
 - [x] Streaming
 - [x] Proper support for `waitUntil`
 
@@ -64,5 +70,6 @@ The `express-dev` Wrapper is the wrapper for a classic Express server. It is a l
 The `dummy` Wrapper is a dummy implementation that will just forward the event and `StreamCreator` to the handler.
 
 #### Features
+
 - [ ] Streaming
-- [ ] Proper support for `waitUntil`
\ No newline at end of file
+- [ ] Proper support for `waitUntil`
diff --git a/pages/aws/config/reference.mdx b/pages/aws/config/reference.mdx
index 99e20da..880d136 100644
--- a/pages/aws/config/reference.mdx
+++ b/pages/aws/config/reference.mdx
@@ -1,27 +1,26 @@
 Every option that you can use in `open-next.config.ts` will be listed here. This is the configuration file that you can use to customize the build.
 You can look at the [full example](full_example) to see how you can use these options.
 
-<br/>
+<br />
 
-import { Tabs } from 'nextra/components'
+import { Tabs } from "nextra/components";
 
 <Tabs items={['Server Options', 'General Build Options']}>
 <Tabs.Tab>
   Servers here refers to all the different build outputs (Lambda, Node, Deno etc). Each server can have its own options. This also includes some server/function that only need to run at build time.
 
-  Each server config will be under it's own key in the config object. Here are all the servers that you can configure:
+Each server config will be under it's own key in the config object. Here are all the servers that you can configure:
 
-  - Default Server - Key: `default` This is the default server, similar to the server-function in open-next v2
-  - Splitted Server - Key: `functions` This is only used if you want to split the server into multiple servers. This is a special case, under this key you will define every splitted server.
-  - External middleware - Key: `middleware` If you want to deploy your middleware separately from the default servers or functions, you can use this key.
-  - Revalidate Function - Key: `revalidate` This is a special server that will handle the revalidation queue.
-  - Image Optimization Server - Key: `imageOptimization` This server will handle `_next/image` optimization.
-  - Warmer Function - Key: `warmer` This server is meant to be used as a warmer for the lambda function.
-  - Initialization Function - Key: `initializationFunction` This is a special server that will run at build time to initialize the cache. By default it only initialize the tag cache.
-
-  <Tabs items={['Common Options','Default Server', 'Splitted Server', 'External middleware','Image Optimization server', 'Revalidate function', 'Warmer function', 'Initialization Function']}>
-    <Tabs.Tab>
+- Default Server - Key: `default` This is the default server, similar to the server-function in open-next v2
+- Splitted Server - Key: `functions` This is only used if you want to split the server into multiple servers. This is a special case, under this key you will define every splitted server.
+- External middleware - Key: `middleware` If you want to deploy your middleware separately from the default servers or functions, you can use this key.
+- Revalidate Function - Key: `revalidate` This is a special server that will handle the revalidation queue.
+- Image Optimization Server - Key: `imageOptimization` This server will handle `_next/image` optimization.
+- Warmer Function - Key: `warmer` This server is meant to be used as a warmer for the lambda function.
+- Initialization Function - Key: `initializationFunction` This is a special server that will run at build time to initialize the cache. By default it only initialize the tag cache.
 
+<Tabs items={['Common Options','Default Server', 'Splitted Server', 'External middleware','Image Optimization server', 'Revalidate function', 'Warmer function', 'Initialization Function']}>
+  <Tabs.Tab>
       All these servers share some common options that you can use to customize them.
 
       ### `minify`
@@ -38,7 +37,7 @@ import { Tabs } from 'nextra/components'
 
       #### [`wrapper`](overrides/wrapper)
 
-      This is the entrypoint of the server. 
+      This is the entrypoint of the server.
       Be aware that it might not be enough to change this to make it work on said platform. This is only the entrypoint, you might need to change other parts of the server to make it work on the platform.
 
       Possible values are: `aws-lambda`, `aws-lambda-streaming`, `cloudflare-edge`, `cloudflare-node`, `node`, `express-dev`, `dummy` or a `LazyLoadedOverride` that will return the wrapper.
@@ -81,23 +80,24 @@ import { Tabs } from 'nextra/components'
       Additional arguments to pass to the install command (npm install). It is a string that will get appended to the `npm install` command.
 
       Here is an example of how to install sharp on your default server function with ARM64 architecture:
+
       ```ts
       import type { OpenNextConfig } from '@opennextjs/aws/types/open-next';
       const config = {
-        default: {
-          install: {
-            packages: ['sharp@0.33.5'],
-            arch: 'arm64',
-          },
+      default: {
+        install: {
+          packages: ['sharp@0.33.5'],
+          arch: 'arm64',
         },
+      },
       } satisfies OpenNextConfig;
 
       export default config;
       ```
 
+  </Tabs.Tab>
 
-    </Tabs.Tab>
-    <Tabs.Tab>
+  <Tabs.Tab>
       ### `runtime`
 
       Runtime used for the server. The default server only support `node` or `deno`.
@@ -110,7 +110,7 @@ import { Tabs } from 'nextra/components'
       ### `placement`
 
       Option to determine where the server will be deployed. On a single region or on multiple regions at the edge.
-      
+
       This options does not have any effect on the build output, but is just an indication for IAC tools to know where to deploy the server.
 
       Possible values are: `regional`, `global`
@@ -118,7 +118,7 @@ import { Tabs } from 'nextra/components'
       ### `experimentalBundledNextServer`
       Bundle Next server into a single file.
       This results in a way smaller bundle but it might break for some cases.
-      
+
       This option is deprecated and doesn't work for Next 14.2+.
 
       ### `override`
@@ -151,11 +151,13 @@ import { Tabs } from 'nextra/components'
 
       #### [`cdnInvalidation`](overrides/automatic_cdn_invalidation)
 
-      Add possibility to override the CDN invalidation override. Used for on-demand invalidation with `revalidatePath()`, `revalidateTag()` and `res.revalidate()`. 
+      Add possibility to override the CDN invalidation override. Used for on-demand invalidation with `revalidatePath()`, `revalidateTag()` and `res.revalidate()`.
 
       Possible values are: `cloudfront`, `dummy` or a `LazyLoadedOverride` that will return the invalidatePaths. This override is disabled by default.
-    </Tabs.Tab>
-    <Tabs.Tab>
+
+  </Tabs.Tab>
+
+  <Tabs.Tab>
       Every splitted server will have the same options as the default server. In addition to that, you can use the following options:
 
       ### `routes` - Mandatory
@@ -177,15 +179,16 @@ import { Tabs } from 'nextra/components'
       For example:
       ```ts
       patterns: [
-        // This one will match all the routes that start with /api/
-        "/api/*",
-        // For a single route, this one will only match /page
-        "/page",
+      // This one will match all the routes that start with /api/
+      "/api/*",
+      // For a single route, this one will only match /page
+      "/page",
       ]
       ```
 
-    </Tabs.Tab>
-    <Tabs.Tab>
+  </Tabs.Tab>
+
+  <Tabs.Tab>
       ### `external` - Mandatory
       Only possible value is true. This is used to specify that this server is an external middleware.
 
@@ -196,21 +199,25 @@ import { Tabs } from 'nextra/components'
       ### [`originResolver`](overrides/origin_resolver)
 
       Origin resolver is used to resolve the origin for internal rewrite. By default, it uses the pattern-env origin resolver.
-      
+
       Possible values are: `pattern-env`, `dummy` or a `LazyLoadedOverride` that will return the origin resolver.
-    </Tabs.Tab>
-    <Tabs.Tab>
+
+  </Tabs.Tab>
+
+  <Tabs.Tab>
       Image optimization server is a special server that will handle the `_next/image` optimization. Besides the common options, you can use the following options:
 
       ### [`loader`](overrides/image_loader)
       The image loader is used to load the image from the source.
 
       Possible values are: `s3`, `s3-lite`, `host`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the loader.
-    </Tabs.Tab>
-    <Tabs.Tab>
-      Revalidate doesn't have any specific options. It only uses the common options.
-    </Tabs.Tab>
-    <Tabs.Tab>
+
+  </Tabs.Tab>
+
+<Tabs.Tab>Revalidate doesn't have any specific options. It only uses the common options.</Tabs.Tab>
+
+  <Tabs.Tab>
+
       Warmer is a special server that will be used to warm the lambda function. Besides the common options, you can use the following options:
 
       ### [`invokeFunction`](overrides/invoke_function)
@@ -219,17 +226,22 @@ import { Tabs } from 'nextra/components'
       If you override this, you'll need to handle the warmer event in the wrapper
 
       Possible values are: `aws-lambda`, `dummy` or a `LazyLoadedOverride` that will return the invoke function.
-    </Tabs.Tab>
-    <Tabs.Tab>
-    Initialization function is a special server that will run at build time to initialize the cache. By default, it only initializes the tag cache. Besides the common options, you can use the following options:
 
-    ### `tagCache`
+  </Tabs.Tab>
+
+  <Tabs.Tab>
 
-    Add possibility to override the default tag cache used for the initialization function.
+      Initialization function is a special server that will run at build time to initialize the cache. By default, it only initializes the tag cache. Besides the common options, you can use the following options:
+
+      ### `tagCache`
+
+      Add possibility to override the default tag cache used for the initialization function.
+
+      Possible values are: `dynamodb`, `dynamodb-lite`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
 
-    Possible values are: `dynamodb`, `dynamodb-lite`, `fs-dev`, `dummy` or a `LazyLoadedOverride` that will return the tag cache.
   </Tabs.Tab>
-  </Tabs>
+
+</Tabs>
 
 </Tabs.Tab>
 <Tabs.Tab>
@@ -243,7 +255,7 @@ If you want to specify a different command, you can do so here.
 
 ### `appPath`
 
-The path to the root of the Next.js app's source code. This path is relative from the current process.cwd(). *
+The path to the root of the Next.js app's source code. This path is relative from the current process.cwd().
 
 By default, it is set to `.`
 
@@ -305,5 +317,6 @@ headersAndCookiesPriority: (event) => {
   return 'handler';
 },
 ```
+
 </Tabs.Tab>
-</Tabs>
\ No newline at end of file
+</Tabs>
diff --git a/pages/aws/config/simple_example.mdx b/pages/aws/config/simple_example.mdx
index 77d3b0c..bf981b8 100644
--- a/pages/aws/config/simple_example.mdx
+++ b/pages/aws/config/simple_example.mdx
@@ -1,20 +1,21 @@
-import { Callout } from 'nextra/components';
+import { Callout } from "nextra/components";
 
 Here you can find the most common `open-next.config.ts` file examples that you could easily take as a starting point for your own configuration.
 
 ## Streaming with lambda
 
 <Callout type="info" emoji="ℹ️">
-  If you have an issue with streaming send a message on [discord](https://discord.com/channels/1283128968140161065/1286094576788177059)
-  and contact AWS support to let them know of the issue.
+  If you have an issue with streaming send a message on
+  [discord](https://discord.com/channels/1283128968140161065/1286094576788177059) and contact AWS support to
+  let them know of the issue.
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      wrapper: 'aws-lambda-streaming', // This is necessary to enable lambda streaming
+      wrapper: "aws-lambda-streaming", // This is necessary to enable lambda streaming
     },
   },
 } satisfies OpenNextConfig;
@@ -29,7 +30,7 @@ Be aware that there has been some issues in the past with AWS breaking streaming
 ## Splitting the server
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   // This is the default server, similar to the server-function in open-next v2
   // In this case we are not providing any override, so it will generate a normal lambda (i.e. no streaming)
@@ -38,12 +39,12 @@ const config = {
   functions: {
     myFn: {
       // Patterns needs to use the glob pattern
-      patterns: ['route1', 'route2', 'route3'],
+      patterns: ["route1", "route2", "route3"],
       // For app dir, you need to include route|page, no need to include layout or loading
       // It needs to be prepended with app/ or pages/ depending on the directory used
-      routes: ['app/route1/page', 'app/route2/page', 'pages/route3'],
+      routes: ["app/route1/page", "app/route2/page", "pages/route3"],
       override: {
-        wrapper: 'aws-lambda-streaming',
+        wrapper: "aws-lambda-streaming",
       },
     },
   },
@@ -55,22 +56,20 @@ export default config;
 ## Use aws4fetch instead of AWS sdk
 
 <Callout type="info" emoji="ℹ️">
-  By default we use S3, DynamoDB and SQS for handling ISR/SSG and the fetch
-  cache. We interact with them using AWS sdk v3. This can contribute a lot to
-  the cold start. There is a built-in option to use
-  [aws4fetch](https://github.com/mhart/aws4fetch) instead of the AWS sdk that
-  can reduce cold start up to 300ms. Requires `OpenNext v3.0.3+`. Here is how
-  you enable it:
+  By default we use S3, DynamoDB and SQS for handling ISR/SSG and the fetch cache. We interact with them using
+  AWS sdk v3. This can contribute a lot to the cold start. There is a built-in option to use
+  [aws4fetch](https://github.com/mhart/aws4fetch) instead of the AWS sdk that can reduce cold start up to
+  300ms. Requires `OpenNext v3.0.3+`. Here is how you enable it:
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
     override: {
-      tagCache: 'dynamodb-lite',
-      incrementalCache: 's3-lite',
-      queue: 'sqs-lite',
+      tagCache: "dynamodb-lite",
+      incrementalCache: "s3-lite",
+      queue: "sqs-lite",
     },
   },
 } satisfies OpenNextConfig;
@@ -81,12 +80,12 @@ export default config;
 ## Running in Lambda@Edge
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {
-    placement: 'global',
+    placement: "global",
     override: {
-      converter: 'aws-cloudfront',
+      converter: "aws-cloudfront",
     },
   },
 } satisfies OpenNextConfig;
@@ -100,17 +99,18 @@ export default config;
 This is not implemented in SST yet. You'll have to use your own IAC construct to deploy this.
 
 Be aware that this uses the exact same system for ISR/SSG as the default lambda setup. So it will have to have all the proper permissions and env variable to interact with S3, DynamoDB and SQS (Or whatever you override it with). You can see [here](/aws/inner_workings/components/server/node#special-overrides) for more details
+
 </Callout>
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   // In this case, the default server is meant to run as a classic Node server
   // To execute the server you need to run `node index.mjs` inside `.open-next/server-functions/default`
   default: {
     override: {
-      wrapper: 'node',
-      converter: 'node',
+      wrapper: "node",
+      converter: "node",
       // This is necessary to generate a simple dockerfile and for the generated output to know that it needs to deploy on docker
       // You can also provide a string here (i.e. the content of your Dockerfile) which will be used to create the dockerfile
       // You don't have to provide this if you plan on not using docker, or if you plan on using your own custom dockerfile
@@ -122,8 +122,8 @@ const config = {
     // In this case both the api route is in lambda and the rest is in node
     myFn: {
       // Patterns needs to use the glob pattern
-      patterns: ['api/*'],
-      routes: ['app/api/test/route', 'app/api/test2/route'],
+      patterns: ["api/*"],
+      routes: ["app/api/test/route", "app/api/test2/route"],
     },
   },
 } satisfies OpenNextConfig;
@@ -138,15 +138,15 @@ This will generate 2 server functions, the default one and the edge one. The edg
 Edge runtime function have less cold start time, but you can only deploy one route per function. They also do not have the middleware bundled in the function, so you need to use external middleware if you need it in front of the edge function.
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {},
   functions: {
     edge: {
-      runtime: 'edge',
+      runtime: "edge",
       //placement: "global", If you want your function to be deployed globally (i.e. lambda@edge) uncomment this line. Otherwise it will be deployed in the region specified in the stack
-      routes: ['app/api/test/route'],
-      patterns: ['api/test'],
+      routes: ["app/api/test/route"],
+      patterns: ["api/test"],
     },
   },
 } satisfies OpenNextConfig;
@@ -161,15 +161,15 @@ With the default middleware configuration, it is bundled for a deployment in lam
 This is how you can do it:
 
 ```ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
   default: {},
   functions: {
     myFn: {
-      patterns: ['route1', 'route2', 'route3'],
-      routes: ['app/route1/page', 'app/route2/page', 'pages/route3'],
+      patterns: ["route1", "route2", "route3"],
+      routes: ["app/route1/page", "app/route2/page", "pages/route3"],
       override: {
-        wrapper: 'aws-lambda-streaming',
+        wrapper: "aws-lambda-streaming",
       },
     },
   },
diff --git a/pages/aws/contribute/_meta.json b/pages/aws/contribute/_meta.json
index 64c1128..b0d5ba3 100644
--- a/pages/aws/contribute/_meta.json
+++ b/pages/aws/contribute/_meta.json
@@ -1,4 +1,4 @@
 {
   "local_run": "Run locally",
   "plugin": "Internal plugin system"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/contribute/local_run.mdx b/pages/aws/contribute/local_run.mdx
index 970a2cf..cd4f581 100644
--- a/pages/aws/contribute/local_run.mdx
+++ b/pages/aws/contribute/local_run.mdx
@@ -1,20 +1,22 @@
-When making some changes to OpenNext, it can be a bit cumbersome to need to deploy every time you want to test changes. If your change is not dependent on the wrapper or the converter, then you can create a custom `open-next.config.ts` file (you can use another name so that it doesn't conflict with your existing `open-next.config.ts`). 
-
+When making some changes to OpenNext, it can be a bit cumbersome to need to deploy every time you want to test changes. If your change is not dependent on the wrapper or the converter, then you can create a custom `open-next.config.ts` file (you can use another name so that it doesn't conflict with your existing `open-next.config.ts`).
 
 To run `OpenNext` locally:
+
 ```bash
 # This is to build (the config-path is needed if you use a different name than the default one)
 node /path/to/opennextjs-aws/packages/open-next/dist/index.js build --config-path open-next.local.config.ts
 # Then to run the server
 node .open-next/server-functions/default/index.mjs
 ```
+
 ### open-next.local.config.ts
+
 ```typescript
 // open-next.local.config.ts -
 // A good practice would be to use a different name so that it doesn't conflict
 // with your existing open-next.config.ts i.e. open-next.local.config.ts
 // You could also customize it by using custom overrides if you need to.
-import type {OpenNextConfig} from "@opennextjs/aws/types/open-next.js"
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 
 export default {
   default: {
@@ -23,26 +25,26 @@ export default {
       converter: "node",
       incrementalCache: "fs-dev",
       queue: "direct",
-      tagCache: "fs-dev"
-    }
+      tagCache: "fs-dev",
+    },
   },
 
   imageOptimization: {
     override: {
       wrapper: "dummy",
-      converter: "dummy"
+      converter: "dummy",
     },
     loader: "fs-dev",
     // This part is not needed on arm linux, and image optimization will only work in linux
     install: {
       arch: "x64",
-      packages: ["sharp"]
-    }
+      packages: ["sharp"],
+    },
   },
 
   // You can override the build command here so that you don't have to rebuild next every time you make a change
   //buildCommand: "echo 'No build command'",
-} satisfies OpenNextConfig
+} satisfies OpenNextConfig;
 
-export default config
+export default config;
 ```
diff --git a/pages/aws/contribute/plugin.mdx b/pages/aws/contribute/plugin.mdx
index a2041f3..2ecd0c2 100644
--- a/pages/aws/contribute/plugin.mdx
+++ b/pages/aws/contribute/plugin.mdx
@@ -2,7 +2,7 @@ OpenNext use 3 different esbuild plugins internally to recompile or modify the s
 
 #### OpenNext Replacement Plugin
 
-This plugin is used to replace some code in the source code with some other code. 
+This plugin is used to replace some code in the source code with some other code.
 
 Here is a very simple example of how to use it:
 
@@ -15,24 +15,24 @@ openNextPlugin({
     // This is to delete some code from the target file
     deletes: ["id1"],
   })
- 
+
   //To inject arbritary code by using (import at top of file):
- 
+
   //#import
- 
+
   import data from 'data'
   const datum = data.datum
- 
+
   //#endImport
- 
+
   To replace code:
- 
+
   //#override id1
- 
+
   export function overrideMe() {
      // I will replace the "id1" block in the target file
   }
- 
+
   //#endOverride
 ```
 
@@ -47,13 +47,13 @@ openNextResolvePlugin({
   overrides: {
     wrapper: "node",
     converter: "node",
-  }
-})
+  },
+});
 ```
 
 #### OpenNext Edge Plugin
 
-This plugin is used to properly compile routes or middleware built for the `edge` runtime. 
+This plugin is used to properly compile routes or middleware built for the `edge` runtime.
 
 Here is a very simple example of how to use it:
 
@@ -68,4 +68,4 @@ openNextEdgePlugin({
   // If the app should be bundled for cloudflare workers
   isInCloudflare: true
 })
-```
\ No newline at end of file
+```
diff --git a/pages/aws/faq.mdx b/pages/aws/faq.mdx
index 7e9001a..3ad694d 100644
--- a/pages/aws/faq.mdx
+++ b/pages/aws/faq.mdx
@@ -22,4 +22,4 @@ OpenNext is an open source initiative, and there are a couple of advantages when
 
 1. Amplify's Next.js hosting is a black box. Resources are not deployed to your AWS account. All Amplify users share the same CloudFront CDN owned by the Amplify team. This prevents you from customizing the setup, and customization is important if you are looking for Vercel-like features.
 
-1. Amplify's implementation is closed-source. Bug fixes often take much longer to get fixed as you have to go through AWS support. And you are likely to encounter more quirks when hosting Next.js anywhere but Vercel.
\ No newline at end of file
+1. Amplify's implementation is closed-source. Bug fixes often take much longer to get fixed as you have to go through AWS support. And you are likely to encounter more quirks when hosting Next.js anywhere but Vercel.
diff --git a/pages/aws/index.mdx b/pages/aws/index.mdx
index 39d6e43..99ff485 100644
--- a/pages/aws/index.mdx
+++ b/pages/aws/index.mdx
@@ -1,6 +1,6 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
-import WindowsSupport from '../../shared/WindowsSupport.mdx';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
+import WindowsSupport from "../../shared/WindowsSupport.mdx";
 
 <Callout>
 This docs is for the V3 of OpenNext. If you are looking for the V2 docs, you can find them [here](/aws/v2).
@@ -46,8 +46,8 @@ OpenNext aims to support all Next.js 15 features. Some features are work in prog
 
 ---
 
-<Callout type='info'>
-    <WindowsSupport />
+<Callout type="info">
+  <WindowsSupport />
 </Callout>
 
 ---
diff --git a/pages/aws/inner_workings.mdx b/pages/aws/inner_workings.mdx
index 013fc0f..fb4c724 100644
--- a/pages/aws/inner_workings.mdx
+++ b/pages/aws/inner_workings.mdx
@@ -20,4 +20,4 @@ my-next-app/
     image-optimization-function/   -> Handler code for image optimization backend
     warmer-function/               -> Cron job code to keep server function warm - Not mandatory
     dynamo-provider/               -> Code for a custom resource to populate the Tag Cache - Only necessary for app dir
-```
\ No newline at end of file
+```
diff --git a/pages/aws/inner_workings/architecture.mdx b/pages/aws/inner_workings/architecture.mdx
index 5b8fc3b..f8e09ed 100644
--- a/pages/aws/inner_workings/architecture.mdx
+++ b/pages/aws/inner_workings/architecture.mdx
@@ -14,7 +14,6 @@ We are going to take a look at every component created by OpenNext.
 
 OpenNext will create a `.open-next/assets` folder containing the hashed and un-hashed files. Those files can be directly served without going through the server function. Files in `.open-next/assets` should be served from the root of your website. For example, the file `.open-next/assets/favicon.ico` should be served from `/favicon.ico`.
 
-
 There are two types of files in the `.open-next/assets` folder:
 
 **Hashed files**
@@ -109,4 +108,4 @@ Read more on [how warming works](/aws/v2/inner_workings/warming).
 
 #### Tag Provider backend
 
-This is used to populate the revalidation table with tags.
\ No newline at end of file
+This is used to populate the revalidation table with tags.
diff --git a/pages/aws/inner_workings/cache_interception.mdx b/pages/aws/inner_workings/cache_interception.mdx
index d19ec18..7aa0e56 100644
--- a/pages/aws/inner_workings/cache_interception.mdx
+++ b/pages/aws/inner_workings/cache_interception.mdx
@@ -7,6 +7,7 @@ Since OpenNext 3.1, we have added a new feature that we call Cache Interception
 Enabling this alongside external middleware means that the external middleware will need to have all the proper permissions and env variable to interact with S3, DynamoDB and SQS (Or whatever you override it with). You can see [here](/aws/inner_workings/components/server/node#special-overrides) for more details.
 
 This has the following benefits:
+
 - Faster cold start (No need to load the js associated with the page if the page is cached)
 - ISR/SSG route can be served directly from an external middleware
 - If the external middleware is in front of the CDN, the middleware can be used for every route including ISR/SSG
@@ -16,17 +17,15 @@ To enable cache interception, you need to add `enableCacheInterception` option i
 
 ```ts
 // open-next.config.ts
-import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
 const config = {
-  default: {
-  },
+  default: {},
   dangerous: {
     enableCacheInterception: true,
   },
 } satisfies OpenNextConfig;
 
 export default config;
-
 ```
 
-1. PPR outside of vercel does not work in the way they demonstrated. The reason is that the cache system is handled by `NextServer` and it has to reach the server **every single time**. PPR pages cannot be served from the CDN when using `next start` or the standalone ouput as of now. In some cases PPR without vercel can be slower than SSR (especially if your cache is not using the default filesystem).
\ No newline at end of file
+1. PPR outside of vercel does not work in the way they demonstrated. The reason is that the cache system is handled by `NextServer` and it has to reach the server **every single time**. PPR pages cannot be served from the CDN when using `next start` or the standalone ouput as of now. In some cases PPR without vercel can be slower than SSR (especially if your cache is not using the default filesystem).
diff --git a/pages/aws/inner_workings/caching.mdx b/pages/aws/inner_workings/caching.mdx
index a062850..71cc0b6 100644
--- a/pages/aws/inner_workings/caching.mdx
+++ b/pages/aws/inner_workings/caching.mdx
@@ -8,14 +8,13 @@ Also the default Next.js standalone output (or `next start`) does not work in a
 
 Default Next.js also uses the file system to cache files. You can override it by providing your own cache implementation. This is done **automatically** when using OpenNext.
 
-There is also 2 issues with the default `Cache-Control` headers that Next.js sets. 
-They use this header by default `s-maxage=YOUR_REVALIDATION_TIME, stale-while-revalidate`. There is 2 issue with that: 
+There is also 2 issues with the default `Cache-Control` headers that Next.js sets.
+They use this header by default `s-maxage=YOUR_REVALIDATION_TIME, stale-while-revalidate`. There is 2 issue with that:
+
 - `stale-while-revalidate` is not the proper syntax for the `Cache-Control` header. It should be `stale-while-revalidate=TIME_WHERE_YOU_SERVE_STALE`. They added this [undocumented options](https://github.com/vercel/next.js/blob/952da876f7bb8590d0222b2579117f8a2bd301bb/packages/next/src/server/config-shared.ts#L202) to remedy this in recent version of Next
 - Setting `s-maxage` to the same value for every request to the same page could be a bad idea.
-Next can serve different content based on if you request the full html or are doing client side navigation (RSC or JSON for page router)
-  
+  Next can serve different content based on if you request the full html or are doing client side navigation (RSC or JSON for page router)
   This can cause inconsistencies in the cache with ISR especially when you can have big revalidation time.
-  
   For example, let's assume you use app router, you have a link to your homepage in your main navbar and you set ISR to 1 day. Every other page will have a different RSC cache entry (for client side navigation). This will result in as many cache entry as you have pages in your app which all will have that same 1 day `s-maxage` value but could have been requested at very different time. This could lead to some pages being served with stale content for as long as 2 day.
 
 **All of these issues are automatically fixed for you in OpenNext**
@@ -58,7 +57,7 @@ async function invalidateCloudFrontPaths(paths: string[]) {
           Items: paths,
         },
       },
-    }),
+    })
   );
 }
 ```
@@ -80,7 +79,7 @@ await invalidateCloudFrontPaths(["/page/*"]);
 For on-demand revalidation via the [`next/cache` module](https://nextjs.org/docs/app/building-your-application/data-fetching/revalidating#using-on-demand-revalidation), if you want to retrieve the associated paths for a given tag, you can use this function:
 
 ```ts
-import { DynamoDBClient, QueryCommand } from '@aws-sdk/client-dynamodb';
+import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
 
 const client = new DynamoDBClient({ region: process.env.CACHE_BUCKET_REGION });
 
@@ -96,14 +95,9 @@ async function getPaths(tag: string) {
         ExpressionAttributeValues: {
           ":tag": { S: `${process.env.NEXT_BUILD_ID}/${tag}` },
         },
-      }),
-    );
-    return (
-      Items?.map(
-        (item) =>
-          item.path?.S?.replace(`${process.env.NEXT_BUILD_ID}/`, "") ?? "",
-      ) ?? []
+      })
     );
+    return Items?.map((item) => item.path?.S?.replace(`${process.env.NEXT_BUILD_ID}/`, "") ?? "") ?? [];
   } catch (e) {
     console.error("Failed to get by tag", e);
     return [];
diff --git a/pages/aws/inner_workings/components/_meta.json b/pages/aws/inner_workings/components/_meta.json
index 5291967..18c948c 100644
--- a/pages/aws/inner_workings/components/_meta.json
+++ b/pages/aws/inner_workings/components/_meta.json
@@ -6,4 +6,4 @@
   "revalidation": "Revalidation",
   "warmer": "Warmer",
   "initializer": "Initializer"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/inner_workings/components/image_optimization.mdx b/pages/aws/inner_workings/components/image_optimization.mdx
index 6bef28b..b80f59a 100644
--- a/pages/aws/inner_workings/components/image_optimization.mdx
+++ b/pages/aws/inner_workings/components/image_optimization.mdx
@@ -1,20 +1,23 @@
-The image optimization backend is used to transform images to the desired format and quality. 
+The image optimization backend is used to transform images to the desired format and quality.
 It should be accessible at `/_next/image?url=URL_OF_THE_IMAGE&q=QUALITY&w=WIDTH` and should be used as a proxy to the image source.
 
 Streaming is **useless** for this backend, as we have to wait for the image to be transformed even for the headers. In the future this backend might be enhanced to support streaming.
 
 ### Environment Variables
-  - BUCKET_NAME: The name of the bucket where the images are stored
-  - BUCKET_KEY_PREFIX: The prefix of the key where the images are stored
-  - OPENNEXT_STATIC_ETAG: If set to `true`, the ETag header will be set to the hash of the properties of the image (href, width, quality, buildId). This will allow us to return 304 responses when the image properties has not changed.
+
+- BUCKET_NAME: The name of the bucket where the images are stored
+- BUCKET_KEY_PREFIX: The prefix of the key where the images are stored
+- OPENNEXT_STATIC_ETAG: If set to `true`, the ETag header will be set to the hash of the properties of the image (href, width, quality, buildId). This will allow us to return 304 responses when the image properties has not changed.
 
 ### Special Overrides
 
 #### Loader
+
 It is used to load **internal** images. By default, it uses S3 API to load the images from the bucket.
 
 You can customize the loader by providing a custom loader function to the `loader` prop.
-It should return 
+It should return
+
 ```typescript
 type ImageLoader = BaseOverride & {
   load: (url: string) => Promise<{
@@ -22,5 +25,5 @@ type ImageLoader = BaseOverride & {
     contentType?: string;
     cacheControl?: string;
   }>;
-}
-```
\ No newline at end of file
+};
+```
diff --git a/pages/aws/inner_workings/components/initializer.mdx b/pages/aws/inner_workings/components/initializer.mdx
index ced2cac..11bb84d 100644
--- a/pages/aws/inner_workings/components/initializer.mdx
+++ b/pages/aws/inner_workings/components/initializer.mdx
@@ -1,6 +1,7 @@
 The Initializer is a special backend that should run only once during deployment. It's default role is to populate the tag cache with the prerendered tags.
 
-It uses these events and results: 
+It uses these events and results:
+
 ```typescript
 interface InitializationFunctionEvent {
   type: "initializationFunction";
@@ -13,4 +14,4 @@ type InitializationFunctionResult = InitializationFunctionEvent;
 
 ### Special Overrides
 
-The initializer uses the tag cache to store the prerendered tags. 
\ No newline at end of file
+The initializer uses the tag cache to store the prerendered tags.
diff --git a/pages/aws/inner_workings/components/middleware.mdx b/pages/aws/inner_workings/components/middleware.mdx
index 4694e57..d3327e6 100644
--- a/pages/aws/inner_workings/components/middleware.mdx
+++ b/pages/aws/inner_workings/components/middleware.mdx
@@ -1,20 +1,23 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 <Callout type="warning" emoji="⚠️">
-  When we talk about middleware in this docs, we are referring both to the next `middleware` as well as the whole `routing` layer of next.
-  For example, `next.config.js` headers, redirects, rewrites, etc. are all considered `routing` in this context.
+  When we talk about middleware in this docs, we are referring both to the next `middleware` as well as the
+  whole `routing` layer of next. For example, `next.config.js` headers, redirects, rewrites, etc. are all
+  considered `routing` in this context.
 </Callout>
 
 Since V3, you can decide to move the middleware outside of the server into it's own function that you can place in front of your others backend functions.
 
 By default, the middleware is inside the server, but you can move it outside by setting `middleware.external` to `true` in your `open-next.config.ts` file.
+
 ```ts
 {
   middleware: {
-    external: true
+    external: true;
   }
 }
 ```
+
 It uses the `aws-lambda` wrapper and the `aws-cloudfront` converter by default so that you can use it with AWS Lambda@edge and Cloudfront.
 You can also use it inside Cloudflare Workers by setting the wrapper to `cloudflare` and the converter to `edge`.
 
@@ -22,9 +25,10 @@ You can also use it inside Cloudflare Workers by setting the wrapper to `cloudfl
 
 #### Origin resolver
 
-Since your app could be split into different origins, you need to be able to retrieve the right origin for the request. That's the purpose of the `originResolver` function. 
+Since your app could be split into different origins, you need to be able to retrieve the right origin for the request. That's the purpose of the `originResolver` function.
 
 By default, it uses the `pattern-env` resolver which uses an `OPEN_NEXT_ORIGIN` environment variable to resolve the origin as well as the pattern defined in your `open-next.config.ts`. This env var should be a stringified version of an object of this shape:
+
 ```ts
 {
   // Key should be the same as the one used in `open-next.config.ts` for the functions
@@ -36,10 +40,12 @@ By default, it uses the `pattern-env` resolver which uses an `OPEN_NEXT_ORIGIN`
   }
 }
 ```
+
 You can of course override this behavior by providing your own `originResolver` function in your `open-next.config.ts` file.
 This is the type of the `originResolver` function:
+
 ```ts
 type OriginResolver = BaseOverride & {
   resolve: (path: string) => Promise<Origin | false>;
 };
-```
\ No newline at end of file
+```
diff --git a/pages/aws/inner_workings/components/overview.mdx b/pages/aws/inner_workings/components/overview.mdx
index aa040fc..481c97a 100644
--- a/pages/aws/inner_workings/components/overview.mdx
+++ b/pages/aws/inner_workings/components/overview.mdx
@@ -1,4 +1,4 @@
-import { Callout } from 'nextra/components';
+import { Callout } from "nextra/components";
 
 <Callout>
   This documentation is still a work in progress. Some parts might be missing or incomplete.
@@ -47,10 +47,7 @@ The wrapper is the main entrypoint for the backend. This is the type of the wrap
 type WrapperHandler<
   E extends BaseEventOrResult = InternalEvent,
   R extends BaseEventOrResult = InternalResult,
-> = (
-  handler: OpenNextHandler<E, R>,
-  converter: Converter<E, R>,
-) => Promise<(...args: any[]) => any>;
+> = (handler: OpenNextHandler<E, R>, converter: Converter<E, R>) => Promise<(...args: any[]) => any>;
 
 export type Wrapper<
   E extends BaseEventOrResult = InternalEvent,
diff --git a/pages/aws/inner_workings/components/revalidation.mdx b/pages/aws/inner_workings/components/revalidation.mdx
index 7bc1253..f2136e3 100644
--- a/pages/aws/inner_workings/components/revalidation.mdx
+++ b/pages/aws/inner_workings/components/revalidation.mdx
@@ -2,6 +2,7 @@ The revalidation backend is used to read the queue and revalidate the routes. It
 For every received message it will trigger a `HEAD` request with `x-prerender-revalidate` header to the host.
 
 ### Special Event and Result types
+
 ```typescript
 interface RevalidateEvent {
   type: "revalidate";
@@ -10,7 +11,7 @@ interface RevalidateEvent {
     url: string;
   }[];
 }
- interface RevalidateResult {
+interface RevalidateResult {
   type: "revalidate";
- }
-```
\ No newline at end of file
+}
+```
diff --git a/pages/aws/inner_workings/components/server/edge.mdx b/pages/aws/inner_workings/components/server/edge.mdx
index 30404ce..1333ed7 100644
--- a/pages/aws/inner_workings/components/server/edge.mdx
+++ b/pages/aws/inner_workings/components/server/edge.mdx
@@ -1 +1 @@
-TODO
\ No newline at end of file
+TODO
diff --git a/pages/aws/inner_workings/components/server/node.mdx b/pages/aws/inner_workings/components/server/node.mdx
index 4185b6f..9d377d4 100644
--- a/pages/aws/inner_workings/components/server/node.mdx
+++ b/pages/aws/inner_workings/components/server/node.mdx
@@ -26,7 +26,7 @@ To facilitate this:
 #### Lifetime of an SSG request for a page revalidated using `revalidateTag`
 
 1. You revalidate the page using `revalidateTag` or `revalidatePath`. You should also invalidate the cache in Cloudfront
-2. Cloudfront receives a request for a page. 
+2. Cloudfront receives a request for a page.
 3. Cloudfront forwards the request to the `server-function`.
 4. The `server-function` checks in the incremental cache, then in the tag cache. If the page is stale in the tag cache, it will trigger an immediate revalidation and send the updated response back to Cloudfront.
 5. The user will receive the updated version of the page with the `x-next-cache` header set to `MISS`.
@@ -48,12 +48,14 @@ You can look at the expected types [here](https://github.com/sst/open-next/blob/
 The default S3 Incremental Cache uses the `@aws-sdk/client-s3` to interact with the S3 bucket. It needs to have the proper permissions to read and write to the bucket.
 
 File in S3 should follow the following structure:
+
 - `Key_Prefix/BUILD_ID/path/to/page.cache` - For the cache of a page
 - `Key_Prefix/__fetch/BUILD_ID/fetch-cache-key` - For the fetch cache
 
 The default S3 Incremental Cache can be configured using the following environment variables:
 
 ###### Environment Variables
+
 - CACHE_BUCKET_REGION: The region of the S3 bucket
 - CACHE_BUCKET_NAME: The name of the S3 bucket
 - CACHE_BUCKET_KEY_PREFIX: The prefix of the keys in the S3 bucket - Optional
@@ -72,20 +74,22 @@ You can look at the expected types [here](https://github.com/sst/open-next/blob/
 The default DynamoDB Tag Cache uses the `@aws-sdk/client-dynamodb` to interact with the DynamoDB table. It needs to have the proper permissions to read and write to the table.
 
 Tags in DynamoDB should follow the following structure:
-```typescript 
-type Tag = {
-  path: string, // The path of the page
-  tag: string, // The tag of the page
-  revalidatedAt: number, // The time at which the page has been revalidated
-}
 
+```typescript
+type Tag = {
+  path: string; // The path of the page
+  tag: string; // The tag of the page
+  revalidatedAt: number; // The time at which the page has been revalidated
+};
 ```
+
 We use an index called `revalidate` with `path` as a partition key and `revalidatedAt` as the sort key.
 It needs to be pre-populated with the tags of the pages that are being generated.
 
 The default DynamoDB Tag Cache can be configured using the following environment variables:
 
 ###### Environment Variables
+
 - CACHE_BUCKET_REGION: The region of the DynamoDB table
 - CACHE_DYNAMO_TABLE: The name of the DynamoDB table
 - AWS_SDK_DYNAMODB_MAX_ATTEMPTS: The maximum number of attempts to make to the DynamoDB table - Optional
@@ -99,6 +103,7 @@ By default, OpenNext uses SQS as the default revalidation queue.
 You can override the default queue by setting the `override.queue` property in the `open-next.config.ts` file.
 
 Here is the expected type for the queue override:
+
 ```ts
 interface QueueMessage {
   MessageDeduplicationId: string;
@@ -114,6 +119,7 @@ export interface Queue {
   name: string;
 }
 ```
+
 The send function will be called when a page is marked as `STALE`. You don't have to use a queue here, you can use any other mechanism to send the message to the revalidation worker or even do the revalidation in the same process.
 
 #### Shared Environment Variables
@@ -129,4 +135,4 @@ The default SQS Revalidation Queue can be configured using the following environ
 ###### Environment Variables
 
 - REVALIDATION_QUEUE_REGION: The region of the SQS queue
-- REVALIDATION_QUEUE_URL: The URL of the SQS queue
\ No newline at end of file
+- REVALIDATION_QUEUE_URL: The URL of the SQS queue
diff --git a/pages/aws/inner_workings/components/warmer.mdx b/pages/aws/inner_workings/components/warmer.mdx
index 65ae199..960e46b 100644
--- a/pages/aws/inner_workings/components/warmer.mdx
+++ b/pages/aws/inner_workings/components/warmer.mdx
@@ -1,6 +1,7 @@
 The warmer backend is used to warm up the server lambda in case of serverless. This is useful to avoid cold starts.
 
 ### Special Event and Result
+
 ```typescript
 interface WarmerEvent {
   type: "warmer";
@@ -19,10 +20,12 @@ interface WarmerResponse {
 ### Special Overrides
 
 #### Invoke function
-You can customize the `invoke` function to handle the `warmer` event. By default it uses lambda invoke command. The default invoke needs a `WARM_PARAMS` environment variable that is a stringified version of this 
+
+You can customize the `invoke` function to handle the `warmer` event. By default it uses lambda invoke command. The default invoke needs a `WARM_PARAMS` environment variable that is a stringified version of this
+
 ```typescript
 {
   concurrency: number;
   function: string;
 }[]
-```
\ No newline at end of file
+```
diff --git a/pages/aws/inner_workings/routing.mdx b/pages/aws/inner_workings/routing.mdx
index 93b0785..11e762a 100644
--- a/pages/aws/inner_workings/routing.mdx
+++ b/pages/aws/inner_workings/routing.mdx
@@ -1,4 +1,4 @@
-OpenNext doesn't use the default routing provided by Next.js. Instead, it uses its own routing system. 
+OpenNext doesn't use the default routing provided by Next.js. Instead, it uses its own routing system.
 
 Historically, OpenNext used the same routing system as Next.js. But in Next 13.4.13, they moved the routing system outside of `NextServer` and separated every major part of the app (i.e. app router, page router and the routing) inside jest workers. This caused terrible cold start (around 8s for a default `create next-app` app) and made it impossible to serve ISR/SSG pages inside lambda. Since then, OpenNext has been using its own routing system for every app that uses Next 13.4.13 or higher. FYI Vercel use an undocumented `minimalMode` inside `NextServer` to bypass the routing and cache system so that it is done in their infra instead of the lambda.
 
@@ -6,7 +6,7 @@ This move also allow OpenNext to have a more flexible routing system. With OpenN
 
 Here is a list of features that OpenNext routing system handle:
 
-- From `next.config.js` (the rest is handled by `NextServer` itself): 
+- From `next.config.js` (the rest is handled by `NextServer` itself):
   - Headers
   - Redirects
   - Rewrites
@@ -16,7 +16,6 @@ Here is a list of features that OpenNext routing system handle:
 - [Optional Cache Interception](/aws/inner_workings/cache_interception) (i.e. serve ISR/SSG directly from the routing layer)
 - Handle 404 in some cases (i.e. when the page does not correspond to any of the regex routes)
 
-
 #### Next Middleware
 
-The Next middleware in OpenNext is not running in the same way as in Next.js. In Next.js, the middleware is running inside the `NextServer` inside a fake edge runtime. In OpenNext, we modify the middleware and run it fully inside the routing layer. So if you run the routing layer in Node, you can use Node api inside the middleware (it's a bit tricky because it won't work with `next dev` and involves some workaround because Next will remove Node api during bundling. Some example [here](/aws/config/custom_overrides#define-a-global-to-use-node-in-the-middleware)).
\ No newline at end of file
+The Next middleware in OpenNext is not running in the same way as in Next.js. In Next.js, the middleware is running inside the `NextServer` inside a fake edge runtime. In OpenNext, we modify the middleware and run it fully inside the routing layer. So if you run the routing layer in Node, you can use Node api inside the middleware (it's a bit tricky because it won't work with `next dev` and involves some workaround because Next will remove Node api during bundling. Some example [here](/aws/config/custom_overrides#define-a-global-to-use-node-in-the-middleware)).
diff --git a/pages/aws/migration.mdx b/pages/aws/migration.mdx
index d4ea3ef..4d3d90c 100644
--- a/pages/aws/migration.mdx
+++ b/pages/aws/migration.mdx
@@ -35,7 +35,7 @@ You should remove some stuff from your `next.config.js` file, otherwise you'll g
 ```js
 module.exports = {
   // ...
-  target: 'serverless', // remove this
+  target: "serverless", // remove this
   // ...
-}
+};
 ```
diff --git a/pages/aws/reference-implementation.mdx b/pages/aws/reference-implementation.mdx
index d2898cc..13227fd 100644
--- a/pages/aws/reference-implementation.mdx
+++ b/pages/aws/reference-implementation.mdx
@@ -1,4 +1,4 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 In order to help deploying OpenNext with your own IAC implementation, we created a simple reference implementation using aws-cdk.
 
@@ -6,11 +6,12 @@ If you wish to use it, just copy the code for the construct below. If you use it
 
 <Callout type="warning" emoji="⚠️">
 
-  This is a reference implementation, and it is not meant to be used in production as is.
+This is a reference implementation, and it is not meant to be used in production as is.
 
-	This is just here to help you understand how to use the new features of OpenNext.
+    This is just here to help you understand how to use the new features of OpenNext.
+
+There is some features that are not implemented like the warmer function, or everything related to lambda@edge(It requires inserting env variables which is out of scope of this implementation).
 
-  There is some features that are not implemented like the warmer function, or everything related to lambda@edge(It requires inserting env variables which is out of scope of this implementation).
 </Callout>
 
 ```ts
@@ -19,49 +20,33 @@ import { readFileSync } from "fs";
 import path from "path";
 import { BlockPublicAccess, Bucket } from "aws-cdk-lib/aws-s3";
 import { BucketDeployment, Source } from "aws-cdk-lib/aws-s3-deployment";
+import { CustomResource, Duration, Fn, RemovalPolicy, Stack } from "aws-cdk-lib/core";
 import {
-	CustomResource,
-	Duration,
-	Fn,
-	RemovalPolicy,
-	Stack,
-} from "aws-cdk-lib/core";
-import {
-	AllowedMethods,
-	BehaviorOptions,
-	CacheCookieBehavior,
-	CacheHeaderBehavior,
-	CachePolicy,
-	CacheQueryStringBehavior,
-	CachedMethods,
-	Distribution,
-	ICachePolicy,
-	ViewerProtocolPolicy,
-	FunctionEventType,
-	OriginRequestPolicy,
-	Function as CloudfrontFunction,
-	FunctionCode,
+  AllowedMethods,
+  BehaviorOptions,
+  CacheCookieBehavior,
+  CacheHeaderBehavior,
+  CachePolicy,
+  CacheQueryStringBehavior,
+  CachedMethods,
+  Distribution,
+  ICachePolicy,
+  ViewerProtocolPolicy,
+  FunctionEventType,
+  OriginRequestPolicy,
+  Function as CloudfrontFunction,
+  FunctionCode,
 } from "aws-cdk-lib/aws-cloudfront";
 import { HttpOrigin, S3Origin } from "aws-cdk-lib/aws-cloudfront-origins";
 import {
-	Code,
-	Function as CdkFunction,
-	FunctionUrlAuthType,
-	InvokeMode,
-	Runtime,
+  Code,
+  Function as CdkFunction,
+  FunctionUrlAuthType,
+  InvokeMode,
+  Runtime,
 } from "aws-cdk-lib/aws-lambda";
-import {
-	TableV2 as Table,
-	AttributeType,
-	Billing,
-} from "aws-cdk-lib/aws-dynamodb";
-import {
-	Service,
-	Source as AppRunnerSource,
-	Memory,
-	HealthCheck,
-	Cpu,
-} from "@aws-cdk/aws-apprunner-alpha";
+import { TableV2 as Table, AttributeType, Billing } from "aws-cdk-lib/aws-dynamodb";
+import { Service, Source as AppRunnerSource, Memory, HealthCheck, Cpu } from "@aws-cdk/aws-apprunner-alpha";
 import { DockerImageAsset } from "aws-cdk-lib/aws-ecr-assets";
 import { Queue } from "aws-cdk-lib/aws-sqs";
 import { SqsEventSource } from "aws-cdk-lib/aws-lambda-event-sources";
@@ -70,365 +55,340 @@ import { Provider } from "aws-cdk-lib/custom-resources";
 import { RetentionDays } from "aws-cdk-lib/aws-logs";
 
 type BaseFunction = {
-	handler: string;
-	bundle: string;
+  handler: string;
+  bundle: string;
 };
 
 type OpenNextFunctionOrigin = {
-	type: "function";
-	streaming?: boolean;
+  type: "function";
+  streaming?: boolean;
 } & BaseFunction;
 
 type OpenNextECSOrigin = {
-	type: "ecs";
-	bundle: string;
-	dockerfile: string;
+  type: "ecs";
+  bundle: string;
+  dockerfile: string;
 };
 
 type OpenNextS3Origin = {
-	type: "s3";
-	originPath: string;
-	copy: {
-		from: string;
-		to: string;
-		cached: boolean;
-		versionedSubDir?: string;
-	}[];
+  type: "s3";
+  originPath: string;
+  copy: {
+    from: string;
+    to: string;
+    cached: boolean;
+    versionedSubDir?: string;
+  }[];
 };
 
-type OpenNextOrigins =
-	| OpenNextFunctionOrigin
-	| OpenNextECSOrigin
-	| OpenNextS3Origin;
+type OpenNextOrigins = OpenNextFunctionOrigin | OpenNextECSOrigin | OpenNextS3Origin;
 
 interface OpenNextOutput {
-	edgeFunctions: {
-		[key: string]: BaseFunction;
-	};
-	origins: {
-		s3: OpenNextS3Origin;
-		default: OpenNextFunctionOrigin | OpenNextECSOrigin;
-		imageOptimizer: OpenNextFunctionOrigin | OpenNextECSOrigin;
-		[key: string]: OpenNextOrigins;
-	};
-	behaviors: {
-		pattern: string;
-		origin?: string;
-		edgeFunction?: string;
-	}[];
-	additionalProps?: {
-		disableIncrementalCache?: boolean;
-		disableTagCache?: boolean;
-		initializationFunction?: BaseFunction;
-		warmer?: BaseFunction;
-		revalidationFunction?: BaseFunction;
-	};
+  edgeFunctions: {
+    [key: string]: BaseFunction;
+  };
+  origins: {
+    s3: OpenNextS3Origin;
+    default: OpenNextFunctionOrigin | OpenNextECSOrigin;
+    imageOptimizer: OpenNextFunctionOrigin | OpenNextECSOrigin;
+    [key: string]: OpenNextOrigins;
+  };
+  behaviors: {
+    pattern: string;
+    origin?: string;
+    edgeFunction?: string;
+  }[];
+  additionalProps?: {
+    disableIncrementalCache?: boolean;
+    disableTagCache?: boolean;
+    initializationFunction?: BaseFunction;
+    warmer?: BaseFunction;
+    revalidationFunction?: BaseFunction;
+  };
 }
 
 interface OpenNextCdkReferenceImplementationProps {
-	openNextPath: string;
+  openNextPath: string;
 }
 
 export class OpenNextCdkReferenceImplementation extends Construct {
-	private openNextOutput: OpenNextOutput;
-	private bucket: Bucket;
-	private table: Table;
-	private queue: Queue;
-
-	private staticCachePolicy: ICachePolicy;
-	private serverCachePolicy: CachePolicy;
-
-	public distribution: Distribution;
-
-	constructor(
-		scope: Construct,
-		id: string,
-		props: OpenNextCdkReferenceImplementationProps,
-	) {
-		super(scope, id);
-		this.openNextOutput = JSON.parse(
-			readFileSync(
-				path.join(props.openNextPath, "open-next.output.json"),
-				"utf-8",
-			),
-		) as OpenNextOutput;
-
-		this.bucket = new Bucket(this, "OpenNextBucket", {
-			publicReadAccess: false,
-			blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
-			autoDeleteObjects: true,
-			removalPolicy: RemovalPolicy.DESTROY,
-			enforceSSL: true,
-		});
-		this.table = this.createRevalidationTable();
-		this.queue = this.createRevalidationQueue();
-
-		const origins = this.createOrigins();
-		this.serverCachePolicy = this.createServerCachePolicy();
-		this.staticCachePolicy = this.createStaticCachePolicy();
-		this.distribution = this.createDistribution(origins);
-	}
-
-	private createRevalidationTable() {
-		const table = new Table(this, "RevalidationTable", {
-			partitionKey: { name: "tag", type: AttributeType.STRING },
-			sortKey: { name: "path", type: AttributeType.STRING },
-			pointInTimeRecovery: true,
-			billing: Billing.onDemand(),
-			globalSecondaryIndexes: [
-				{
-					indexName: "revalidate",
-					partitionKey: { name: "path", type: AttributeType.STRING },
-					sortKey: { name: "revalidatedAt", type: AttributeType.NUMBER },
-				},
-			],
-			removalPolicy: RemovalPolicy.DESTROY,
-		});
-
-		const initFn = this.openNextOutput.additionalProps?.initializationFunction;
-
-		const insertFn = new CdkFunction(this, "RevalidationInsertFunction", {
-			description: "Next.js revalidation data insert",
-			handler: initFn?.handler ?? "index.handler",
-			// code: Code.fromAsset(initFn?.bundle ?? ""),
-			code: Code.fromAsset(".open-next/dynamodb-provider"),
-			runtime: Runtime.NODEJS_18_X,
-			timeout: Duration.minutes(15),
-			memorySize: 128,
-			environment: {
-				CACHE_DYNAMO_TABLE: table.tableName,
-			},
-		});
-
-		const provider = new Provider(this, "RevalidationProvider", {
-			onEventHandler: insertFn,
-			logRetention: RetentionDays.ONE_DAY,
-		});
-
-		new CustomResource(this, "RevalidationResource", {
-			serviceToken: provider.serviceToken,
-			properties: {
-				version: Date.now().toString(),
-			},
-		});
-
-		return table;
-	}
-
-	private createOrigins() {
-		const {
-			s3: s3Origin,
-			default: defaultOrigin,
-			imageOptimizer: imageOrigin,
-			...restOrigins
-		} = this.openNextOutput.origins;
-		const s3 = new S3Origin(this.bucket, {
-			originPath: s3Origin.originPath,
-		});
-		for (const copy of s3Origin.copy) {
-			new BucketDeployment(this, `OpenNextBucketDeployment${copy.from}`, {
-				sources: [Source.asset(copy.from)],
-				destinationBucket: this.bucket,
-				destinationKeyPrefix: copy.to,
-				prune: false,
-			});
-		}
-		const origins = {
-			s3: new S3Origin(this.bucket, {
-				originPath: s3Origin.originPath,
-				originAccessIdentity: undefined,
-			}),
-			default:
-				defaultOrigin.type === "function"
-					? this.createFunctionOrigin("default", defaultOrigin)
-					: this.createAppRunnerOrigin("default", defaultOrigin),
-			imageOptimizer:
-				imageOrigin.type === "function"
-					? this.createFunctionOrigin("imageOptimizer", imageOrigin)
-					: this.createAppRunnerOrigin("imageOptimizer", imageOrigin),
-			...Object.entries(restOrigins).reduce(
-				(acc, [key, value]) => {
-					if (value.type === "function") {
-						acc[key] = this.createFunctionOrigin(key, value);
-					} else if (value.type === "ecs") {
-						acc[key] = this.createAppRunnerOrigin(key, value);
-					}
-					return acc;
-				},
-				{} as Record<string, HttpOrigin>,
-			),
-		};
-		return origins;
-	}
-
-	private createRevalidationQueue() {
-		const queue = new Queue(this, "RevalidationQueue", {
-			fifo: true,
-			receiveMessageWaitTime: Duration.seconds(20),
-		});
-		const consumer = new CdkFunction(this, "RevalidationFunction", {
-			description: "Next.js revalidator",
-			handler: "index.handler",
-			code: Code.fromAsset(
-				this.openNextOutput.additionalProps?.revalidationFunction?.bundle ?? "",
-			),
-			runtime: Runtime.NODEJS_18_X,
-			timeout: Duration.seconds(30),
-		});
-		consumer.addEventSource(new SqsEventSource(queue, { batchSize: 5 }));
-		return queue;
-	}
-
-	private getEnvironment() {
-		return {
-			CACHE_BUCKET_NAME: this.bucket.bucketName,
-			CACHE_BUCKET_KEY_PREFIX: "_cache",
-			CACHE_BUCKET_REGION: Stack.of(this).region,
-			REVALIDATION_QUEUE_URL: this.queue.queueUrl,
-			REVALIDATION_QUEUE_REGION: Stack.of(this).region,
-			CACHE_DYNAMO_TABLE: this.table.tableName,
-			// Those 2 are used only for image optimizer
-			BUCKET_NAME: this.bucket.bucketName,
-			BUCKET_KEY_PREFIX: "_assets",
-		};
-	}
-
-	private grantPermissions(grantable: IGrantable) {
-		this.bucket.grantReadWrite(grantable);
-		this.table.grantReadWriteData(grantable);
-		this.queue.grantSendMessages(grantable);
-	}
-
-	private createFunctionOrigin(key: string, origin: OpenNextFunctionOrigin) {
-		const environment = this.getEnvironment();
-		const fn = new CdkFunction(this, `${key}Function`, {
-			runtime: Runtime.NODEJS_18_X,
-			handler: origin.handler,
-			code: Code.fromAsset(origin.bundle),
-			environment,
-			memorySize: 1024,
-		});
-		const fnUrl = fn.addFunctionUrl({
-			authType: FunctionUrlAuthType.NONE,
-			invokeMode: origin.streaming
-				? InvokeMode.RESPONSE_STREAM
-				: InvokeMode.BUFFERED,
-		});
-		this.grantPermissions(fn);
-		return new HttpOrigin(Fn.parseDomainName(fnUrl.url));
-	}
+  private openNextOutput: OpenNextOutput;
+  private bucket: Bucket;
+  private table: Table;
+  private queue: Queue;
+
+  private staticCachePolicy: ICachePolicy;
+  private serverCachePolicy: CachePolicy;
+
+  public distribution: Distribution;
+
+  constructor(scope: Construct, id: string, props: OpenNextCdkReferenceImplementationProps) {
+    super(scope, id);
+    this.openNextOutput = JSON.parse(
+      readFileSync(path.join(props.openNextPath, "open-next.output.json"), "utf-8")
+    ) as OpenNextOutput;
+
+    this.bucket = new Bucket(this, "OpenNextBucket", {
+      publicReadAccess: false,
+      blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
+      autoDeleteObjects: true,
+      removalPolicy: RemovalPolicy.DESTROY,
+      enforceSSL: true,
+    });
+    this.table = this.createRevalidationTable();
+    this.queue = this.createRevalidationQueue();
+
+    const origins = this.createOrigins();
+    this.serverCachePolicy = this.createServerCachePolicy();
+    this.staticCachePolicy = this.createStaticCachePolicy();
+    this.distribution = this.createDistribution(origins);
+  }
+
+  private createRevalidationTable() {
+    const table = new Table(this, "RevalidationTable", {
+      partitionKey: { name: "tag", type: AttributeType.STRING },
+      sortKey: { name: "path", type: AttributeType.STRING },
+      pointInTimeRecovery: true,
+      billing: Billing.onDemand(),
+      globalSecondaryIndexes: [
+        {
+          indexName: "revalidate",
+          partitionKey: { name: "path", type: AttributeType.STRING },
+          sortKey: { name: "revalidatedAt", type: AttributeType.NUMBER },
+        },
+      ],
+      removalPolicy: RemovalPolicy.DESTROY,
+    });
+
+    const initFn = this.openNextOutput.additionalProps?.initializationFunction;
+
+    const insertFn = new CdkFunction(this, "RevalidationInsertFunction", {
+      description: "Next.js revalidation data insert",
+      handler: initFn?.handler ?? "index.handler",
+      // code: Code.fromAsset(initFn?.bundle ?? ""),
+      code: Code.fromAsset(".open-next/dynamodb-provider"),
+      runtime: Runtime.NODEJS_18_X,
+      timeout: Duration.minutes(15),
+      memorySize: 128,
+      environment: {
+        CACHE_DYNAMO_TABLE: table.tableName,
+      },
+    });
+
+    const provider = new Provider(this, "RevalidationProvider", {
+      onEventHandler: insertFn,
+      logRetention: RetentionDays.ONE_DAY,
+    });
+
+    new CustomResource(this, "RevalidationResource", {
+      serviceToken: provider.serviceToken,
+      properties: {
+        version: Date.now().toString(),
+      },
+    });
+
+    return table;
+  }
+
+  private createOrigins() {
+    const {
+      s3: s3Origin,
+      default: defaultOrigin,
+      imageOptimizer: imageOrigin,
+      ...restOrigins
+    } = this.openNextOutput.origins;
+    const s3 = new S3Origin(this.bucket, {
+      originPath: s3Origin.originPath,
+    });
+    for (const copy of s3Origin.copy) {
+      new BucketDeployment(this, `OpenNextBucketDeployment${copy.from}`, {
+        sources: [Source.asset(copy.from)],
+        destinationBucket: this.bucket,
+        destinationKeyPrefix: copy.to,
+        prune: false,
+      });
+    }
+    const origins = {
+      s3: new S3Origin(this.bucket, {
+        originPath: s3Origin.originPath,
+        originAccessIdentity: undefined,
+      }),
+      default:
+        defaultOrigin.type === "function"
+          ? this.createFunctionOrigin("default", defaultOrigin)
+          : this.createAppRunnerOrigin("default", defaultOrigin),
+      imageOptimizer:
+        imageOrigin.type === "function"
+          ? this.createFunctionOrigin("imageOptimizer", imageOrigin)
+          : this.createAppRunnerOrigin("imageOptimizer", imageOrigin),
+      ...Object.entries(restOrigins).reduce(
+        (acc, [key, value]) => {
+          if (value.type === "function") {
+            acc[key] = this.createFunctionOrigin(key, value);
+          } else if (value.type === "ecs") {
+            acc[key] = this.createAppRunnerOrigin(key, value);
+          }
+          return acc;
+        },
+        {} as Record<string, HttpOrigin>
+      ),
+    };
+    return origins;
+  }
+
+  private createRevalidationQueue() {
+    const queue = new Queue(this, "RevalidationQueue", {
+      fifo: true,
+      receiveMessageWaitTime: Duration.seconds(20),
+    });
+    const consumer = new CdkFunction(this, "RevalidationFunction", {
+      description: "Next.js revalidator",
+      handler: "index.handler",
+      code: Code.fromAsset(this.openNextOutput.additionalProps?.revalidationFunction?.bundle ?? ""),
+      runtime: Runtime.NODEJS_18_X,
+      timeout: Duration.seconds(30),
+    });
+    consumer.addEventSource(new SqsEventSource(queue, { batchSize: 5 }));
+    return queue;
+  }
+
+  private getEnvironment() {
+    return {
+      CACHE_BUCKET_NAME: this.bucket.bucketName,
+      CACHE_BUCKET_KEY_PREFIX: "_cache",
+      CACHE_BUCKET_REGION: Stack.of(this).region,
+      REVALIDATION_QUEUE_URL: this.queue.queueUrl,
+      REVALIDATION_QUEUE_REGION: Stack.of(this).region,
+      CACHE_DYNAMO_TABLE: this.table.tableName,
+      // Those 2 are used only for image optimizer
+      BUCKET_NAME: this.bucket.bucketName,
+      BUCKET_KEY_PREFIX: "_assets",
+    };
+  }
+
+  private grantPermissions(grantable: IGrantable) {
+    this.bucket.grantReadWrite(grantable);
+    this.table.grantReadWriteData(grantable);
+    this.queue.grantSendMessages(grantable);
+  }
+
+  private createFunctionOrigin(key: string, origin: OpenNextFunctionOrigin) {
+    const environment = this.getEnvironment();
+    const fn = new CdkFunction(this, `${key}Function`, {
+      runtime: Runtime.NODEJS_18_X,
+      handler: origin.handler,
+      code: Code.fromAsset(origin.bundle),
+      environment,
+      memorySize: 1024,
+    });
+    const fnUrl = fn.addFunctionUrl({
+      authType: FunctionUrlAuthType.NONE,
+      invokeMode: origin.streaming ? InvokeMode.RESPONSE_STREAM : InvokeMode.BUFFERED,
+    });
+    this.grantPermissions(fn);
+    return new HttpOrigin(Fn.parseDomainName(fnUrl.url));
+  }
 
   // We are using AppRunner because it is the easiest way to demonstrate the new feature.
   // You can use any other container service like ECS, EKS, Fargate, etc.
-	private createAppRunnerOrigin(
-		key: string,
-		origin: OpenNextECSOrigin,
-	): HttpOrigin {
-		const imageAsset = new DockerImageAsset(this, `${key}ImageAsset`, {
-			directory: origin.bundle,
-			// file: origin.dockerfile,
-		});
-		const service = new Service(this, `${key}Service`, {
-			source: AppRunnerSource.fromAsset({
-				asset: imageAsset,
-
-				imageConfiguration: {
-					port: 3000,
-					environmentVariables: this.getEnvironment(),
-				},
-			}),
-			serviceName: key,
-			autoDeploymentsEnabled: false,
-			cpu: Cpu.HALF_VCPU,
-			memory: Memory.ONE_GB,
-			healthCheck: HealthCheck.http({
-				path: "/__health",
-			}),
-		});
-		this.grantPermissions(service);
-		return new HttpOrigin(service.serviceUrl);
-	}
-
-	private createDistribution(origins: Record<string, HttpOrigin | S3Origin>) {
-		const cloudfrontFunction = new CloudfrontFunction(this, 'OpenNextCfFunction', {
-			code: FunctionCode.fromInline(`
+  private createAppRunnerOrigin(key: string, origin: OpenNextECSOrigin): HttpOrigin {
+    const imageAsset = new DockerImageAsset(this, `${key}ImageAsset`, {
+      directory: origin.bundle,
+      // file: origin.dockerfile,
+    });
+    const service = new Service(this, `${key}Service`, {
+      source: AppRunnerSource.fromAsset({
+        asset: imageAsset,
+
+        imageConfiguration: {
+          port: 3000,
+          environmentVariables: this.getEnvironment(),
+        },
+      }),
+      serviceName: key,
+      autoDeploymentsEnabled: false,
+      cpu: Cpu.HALF_VCPU,
+      memory: Memory.ONE_GB,
+      healthCheck: HealthCheck.http({
+        path: "/__health",
+      }),
+    });
+    this.grantPermissions(service);
+    return new HttpOrigin(service.serviceUrl);
+  }
+
+  private createDistribution(origins: Record<string, HttpOrigin | S3Origin>) {
+    const cloudfrontFunction = new CloudfrontFunction(this, "OpenNextCfFunction", {
+      code: FunctionCode.fromInline(`
 			function handler(event) {
 				var request = event.request;
 				request.headers["x-forwarded-host"] = request.headers.host;
 				return request;
 			}
-			`)
-		})
-		const fnAssociations = [
-			{
-				function: cloudfrontFunction ,
-				eventType: FunctionEventType.VIEWER_REQUEST,
-			},
-		]
-
-		const distribution = new Distribution(this, "OpenNextDistribution", {
-			defaultBehavior: {
-				origin: origins.default,
-				viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
-				allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
-				cachedMethods: CachedMethods.CACHE_GET_HEAD_OPTIONS,
-				cachePolicy: this.serverCachePolicy,
-				originRequestPolicy: OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
-				functionAssociations: fnAssociations
-			},
-			additionalBehaviors: this.openNextOutput.behaviors
-				.filter((b) => b.pattern !== "*")
-				.reduce(
-					(acc, behavior) => {
-						return {
-							...acc,
-							[behavior.pattern]: {
-								origin: behavior.origin
-									? origins[behavior.origin]
-									: origins.default,
-								viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
-								allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
-								cachedMethods: CachedMethods.CACHE_GET_HEAD_OPTIONS,
-								cachePolicy:
-									behavior.origin === "s3"
-										? this.staticCachePolicy
-										: this.serverCachePolicy,
-								originRequestPolicy: 
-									behavior.origin === "s3" 
-										? undefined 
-										: OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
-								functionAssociations: fnAssociations
-							},
-						};
-					},
-					{} as Record<string, BehaviorOptions>,
-				),
-		});
-		return distribution;
-	}
-
-	private createServerCachePolicy() {
-		return new CachePolicy(this, "OpenNextServerCachePolicy", {
-			queryStringBehavior: CacheQueryStringBehavior.all(),
-			headerBehavior: CacheHeaderBehavior.allowList(
-				"accept",
-				"accept-encoding",
-				"rsc",
-				"next-router-prefetch",
-				"next-router-state-tree",
-				"next-url",
-				"x-prerender-revalidate",
-			),
-			cookieBehavior: CacheCookieBehavior.none(),
-			defaultTtl: Duration.days(0),
-			maxTtl: Duration.days(365),
-			minTtl: Duration.days(0),
-		});
-	}
-
-	private createStaticCachePolicy() {
-		return CachePolicy.CACHING_OPTIMIZED;
-	}
+			`),
+    });
+    const fnAssociations = [
+      {
+        function: cloudfrontFunction,
+        eventType: FunctionEventType.VIEWER_REQUEST,
+      },
+    ];
+
+    const distribution = new Distribution(this, "OpenNextDistribution", {
+      defaultBehavior: {
+        origin: origins.default,
+        viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
+        allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
+        cachedMethods: CachedMethods.CACHE_GET_HEAD_OPTIONS,
+        cachePolicy: this.serverCachePolicy,
+        originRequestPolicy: OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
+        functionAssociations: fnAssociations,
+      },
+      additionalBehaviors: this.openNextOutput.behaviors
+        .filter((b) => b.pattern !== "*")
+        .reduce(
+          (acc, behavior) => {
+            return {
+              ...acc,
+              [behavior.pattern]: {
+                origin: behavior.origin ? origins[behavior.origin] : origins.default,
+                viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
+                allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
+                cachedMethods: CachedMethods.CACHE_GET_HEAD_OPTIONS,
+                cachePolicy: behavior.origin === "s3" ? this.staticCachePolicy : this.serverCachePolicy,
+                originRequestPolicy:
+                  behavior.origin === "s3" ? undefined : OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
+                functionAssociations: fnAssociations,
+              },
+            };
+          },
+          {} as Record<string, BehaviorOptions>
+        ),
+    });
+    return distribution;
+  }
+
+  private createServerCachePolicy() {
+    return new CachePolicy(this, "OpenNextServerCachePolicy", {
+      queryStringBehavior: CacheQueryStringBehavior.all(),
+      headerBehavior: CacheHeaderBehavior.allowList(
+        "accept",
+        "accept-encoding",
+        "rsc",
+        "next-router-prefetch",
+        "next-router-state-tree",
+        "next-url",
+        "x-prerender-revalidate"
+      ),
+      cookieBehavior: CacheCookieBehavior.none(),
+      defaultTtl: Duration.days(0),
+      maxTtl: Duration.days(365),
+      minTtl: Duration.days(0),
+    });
+  }
+
+  private createStaticCachePolicy() {
+    return CachePolicy.CACHING_OPTIMIZED;
+  }
 }
-
 ```
diff --git a/pages/aws/v2.mdx b/pages/aws/v2.mdx
index 1e7f027..10bfddb 100644
--- a/pages/aws/v2.mdx
+++ b/pages/aws/v2.mdx
@@ -1,11 +1,10 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 <Callout>
-  OpenNext V2 will be deprecated soon and will not receive new features or updates.
-  
-  We might release security updates if needed. They will be listed on this page.
+  OpenNext V2 will be deprecated soon and will not receive new features or updates. We might release security
+  updates if needed. They will be listed on this page.
 </Callout>
 
 ### Latest Releases
 
-- OpenNext [2.3.9](https://github.com/sst/open-next/releases/tag/v2.3.9)
\ No newline at end of file
+- OpenNext [2.3.9](https://github.com/sst/open-next/releases/tag/v2.3.9)
diff --git a/pages/aws/v2/_meta.json b/pages/aws/v2/_meta.json
index 6d0e932..eed8218 100644
--- a/pages/aws/v2/_meta.json
+++ b/pages/aws/v2/_meta.json
@@ -2,4 +2,4 @@
   "common_issues": "Troubleshooting",
   "inner_workings": "Inner Workings",
   "advanced": "Advanced"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/v2/advanced/_meta.json b/pages/aws/v2/advanced/_meta.json
index 8eb79fc..7591c3e 100644
--- a/pages/aws/v2/advanced/_meta.json
+++ b/pages/aws/v2/advanced/_meta.json
@@ -4,4 +4,4 @@
   "workaround": "Workaround",
   "debugging": "Debugging",
   "contribute": "Contribute"
-}
\ No newline at end of file
+}
diff --git a/pages/aws/v2/advanced/architecture.mdx b/pages/aws/v2/advanced/architecture.mdx
index 651abf7..ea4bbd4 100644
--- a/pages/aws/v2/advanced/architecture.mdx
+++ b/pages/aws/v2/advanced/architecture.mdx
@@ -44,6 +44,7 @@ There are two types of caches in the `.open-next/cache` folder:
 #### Revalidation Table
 
 Create a DynamoDB table with the following configuration:
+
 - Partition key: `tag` (String)
 - Sort key: `path` (String)
 - An index named `revalidate` with the following configuration:
@@ -123,14 +124,14 @@ This ensures that the Lambda handler remains at `index.mjs`.
 
 Create a CloudFront distribution, and dispatch requests to their corresponding handlers (behaviors). The following behaviors are configured:
 
-| Behavior                                                                                                                      | Requests            | CloudFront Function                                                                         | Origin                      |
-| ----------------------------------------------------------------------------------------------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------- | --------------------------- |
-| `/_next/static/*`                                                                                                             | Hashed static files | -                                                                                           | S3 bucket                   |
-| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                           | S3 bucket                   |
-| `/_next/image`                                                                                                                | Image optimization  | -                                                                                           | image optimization function |
-| `/_next/data/*`                                                                                                               | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
-| `/api/*`                                                                                                                      | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
-| `/*`                                                                                                                          | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
+| Behavior                                                                                                                                | Requests            | CloudFront Function                                                                                   | Origin                      |
+| --------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------- |
+| `/_next/static/*`                                                                                                                       | Hashed static files | -                                                                                                     | S3 bucket                   |
+| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                                     | S3 bucket                   |
+| `/_next/image`                                                                                                                          | Image optimization  | -                                                                                                     | image optimization function |
+| `/_next/data/*`                                                                                                                         | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
+| `/api/*`                                                                                                                                | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
+| `/*`                                                                                                                                    | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
 
 #### Running at edge
 
@@ -138,14 +139,14 @@ The server function can also run at edge locations by configuring it as Lambda@E
 
 To configure the CloudFront distribution:
 
-| Behavior                                                                                                                      | Requests            | CloudFront Function                                                                         | Lambda@Edge     | Origin                      |
-| ----------------------------------------------------------------------------------------------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------- | --------------- | --------------------------- |
-| `/_next/static/*`                                                                                                             | Hashed static files | -                                                                                           | -               | S3 bucket                   |
-| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                           | -               | S3 bucket                   |
-| `/_next/image`                                                                                                                | Image optimization  | -                                                                                           | -               | image optimization function |
-| `/_next/data/*`                                                                                                               | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
-| `/api/*`                                                                                                                      | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
-| `/*`                                                                                                                          | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
+| Behavior                                                                                                                                | Requests            | CloudFront Function                                                                                   | Lambda@Edge     | Origin                      |
+| --------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------- | --------------- | --------------------------- |
+| `/_next/static/*`                                                                                                                       | Hashed static files | -                                                                                                     | -               | S3 bucket                   |
+| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                                     | -               | S3 bucket                   |
+| `/_next/image`                                                                                                                          | Image optimization  | -                                                                                                     | -               | image optimization function |
+| `/_next/data/*`                                                                                                                         | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
+| `/api/*`                                                                                                                                | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
+| `/*`                                                                                                                                    | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function | -                           |
 
 #### Revalidation function
 
@@ -172,4 +173,4 @@ Read more on [how warming works](/aws/v2/inner_workings/warming).
 This function is used to populate the revalidation table. It is a custom resource handler from the cdk see [here](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.custom_resources.AwsCustomResource.html). Ensure the function is configured as follows:
 
 - Set the `CACHE_DYNAMO_TABLE` environment variable with the value being the name of the DynamoDB table where the revalidation table is stored.
-- Grant `dynamodb:PutItem` permission to allow the function to write to the DynamoDB table.
\ No newline at end of file
+- Grant `dynamodb:PutItem` permission to allow the function to write to the DynamoDB table.
diff --git a/pages/aws/v2/advanced/debugging.mdx b/pages/aws/v2/advanced/debugging.mdx
index 41cb8f4..6c6dcc2 100644
--- a/pages/aws/v2/advanced/debugging.mdx
+++ b/pages/aws/v2/advanced/debugging.mdx
@@ -18,4 +18,4 @@ The logs from the warmer function provide insights into the results of the warmi
 
 #### Opening an issue
 
-To help diagnose issues, it's always helpful to provide a reproducible setup when opening an issue. One easy way to do this is to create a pull request (PR) and add a new page to the [benchmark app](#example) located in the `example` folder, which reproduces the issue. The PR will automatically deploy the app to AWS.
\ No newline at end of file
+To help diagnose issues, it's always helpful to provide a reproducible setup when opening an issue. One easy way to do this is to create a pull request (PR) and add a new page to the [benchmark app](#example) located in the `example` folder, which reproduces the issue. The PR will automatically deploy the app to AWS.
diff --git a/pages/aws/v2/advanced/options.mdx b/pages/aws/v2/advanced/options.mdx
index a246736..d21cc69 100644
--- a/pages/aws/v2/advanced/options.mdx
+++ b/pages/aws/v2/advanced/options.mdx
@@ -32,7 +32,7 @@ import { build } from "open-next/build.js";
 await build({
   buildCommand: "pnpm custom:build",
   appPath: "./apps/example-app",
-  buildOutputPath: "./dist/apps/example-app"
+  buildOutputPath: "./dist/apps/example-app",
 });
 ```
 
@@ -58,7 +58,7 @@ This feature is currently **experimental** and needs to be opted into. It can si
 
 #### **Experimental** Streaming support
 
-Enabling this option will enable streaming support for the server function. This is experimental and needs to be opted into. It can significantly decrease the server function's time to first byte. 
+Enabling this option will enable streaming support for the server function. This is experimental and needs to be opted into. It can significantly decrease the server function's time to first byte.
 
 **Do not use this in production**. See [this](/v2/inner_workings/streaming) for more information.
 
@@ -125,4 +125,4 @@ This does a few things:
 It is recommended to **turn off debug mode when building for production** because:
 
 1. Un-minified function code is 2-3X larger than minified code. This will result in longer Lambda cold start times.
-1. Logging the event object on each request can result in a lot of logs being written to AWS CloudWatch. This will result in increased AWS costs.
\ No newline at end of file
+1. Logging the event object on each request can result in a lot of logs being written to AWS CloudWatch. This will result in increased AWS costs.
diff --git a/pages/aws/v2/common_issues.mdx b/pages/aws/v2/common_issues.mdx
index 307fa54..7edf553 100644
--- a/pages/aws/v2/common_issues.mdx
+++ b/pages/aws/v2/common_issues.mdx
@@ -20,4 +20,4 @@ Given how ISR works, while waiting for the revalidation to happen, the page will
 
 AWS Lambda has an unzipped size limit of 250MB. If your app is over this limit, then it is most likely using a node_module library that is too large for serverless or there is a large dev dependency getting bundled.
 For example, `pdfjs` has `canvas` optional dependency which takes up 180MB. For more details, [read me](/aws/v2/common_issues/bundle_size).
-Note: a large bundle size will increase cold start significantly.
\ No newline at end of file
+Note: a large bundle size will increase cold start significantly.
diff --git a/pages/aws/v2/common_issues/bundle_size.mdx b/pages/aws/v2/common_issues/bundle_size.mdx
index 6132df4..31950cd 100644
--- a/pages/aws/v2/common_issues/bundle_size.mdx
+++ b/pages/aws/v2/common_issues/bundle_size.mdx
@@ -1,13 +1,12 @@
-import {Callout} from 'nextra/components'
-
+import { Callout } from "nextra/components";
 
 #### Reducing Bundle Size
 
 Serverless environments are sensitive to bundle size, since it has to download and unzip the contents. To help reduce cold start times as much as possible, you should remove any unnecessary files in the node_modules or report offending dev libraries in this [PR](https://github.com/sst/open-next/pull/242)
 
-
 <Callout type="info" emoji="ℹ️">
-  Next 14+ no longer includes dev dependencies like @swc, esbuild, etc... in the output node_modules, so please upgrade at your earliest convenience.
+  Next 14+ no longer includes dev dependencies like @swc, esbuild, etc... in the output node_modules, so
+  please upgrade at your earliest convenience.
 </Callout>
 
 #### Unzipped size must be smaller than 262144000 bytes
@@ -21,7 +20,8 @@ du -hs .open-next/server-function/node_modules/* | sort -rh
 If your app requires the offending library, then consider moving your business logic of the `api` to its own lambda, eg: `/api/v2` => `Api Lambda`
 
 <Callout type="info" emoji="ℹ️">
-  There is a [PR](https://github.com/sst/open-next/pull/242) to remove some dev dependency from the output node_modules but that requires more testing before it can merge.
+  There is a [PR](https://github.com/sst/open-next/pull/242) to remove some dev dependency from the output
+  node_modules but that requires more testing before it can merge.
 </Callout>
 
 #### Common issues
diff --git a/pages/aws/v2/common_issues/isr.mdx b/pages/aws/v2/common_issues/isr.mdx
index e6a4c39..ea38dbf 100644
--- a/pages/aws/v2/common_issues/isr.mdx
+++ b/pages/aws/v2/common_issues/isr.mdx
@@ -1,7 +1,8 @@
-import {Callout} from 'nextra/components'
+import { Callout } from "nextra/components";
 
 <Callout type="warning" emoji="⚠️">
-  `next/cache` revalidation needs `next@13.5.1` or higher to work properly. If you are using an older version, please upgrade.
+  `next/cache` revalidation needs `next@13.5.1` or higher to work properly. If you are using an older version,
+  please upgrade.
 </Callout>
 
 #### On-demand revalidation
@@ -42,7 +43,7 @@ async function invalidateCloudFrontPaths(paths: string[]) {
           Items: paths,
         },
       },
-    }),
+    })
   );
 }
 ```
@@ -76,13 +77,11 @@ function getByTag(tag: string) {
         ExpressionAttributeValues: {
           ":tag": { S: `${process.env.NEXT_BUILD_ID}/${tag}` },
         },
-      }),
+      })
     );
     return (
       // We need to remove the buildId from the path
-      Items?.map(
-        ({ path: { S: key } }) => key?.replace(`${process.env.NEXT_BUILD_ID}/`, "") ?? "",
-      ) ?? []
+      Items?.map(({ path: { S: key } }) => key?.replace(`${process.env.NEXT_BUILD_ID}/`, "") ?? "") ?? []
     );
   } catch (e) {
     error("Failed to get by tag", e);
@@ -93,7 +92,7 @@ function getByTag(tag: string) {
 
 #### Patch fetch behaviour for ISR. Only for next@13.5.1+
 
-If you use ISR and fetch in your app, you may encounter a bug that makes your revalidate values inconsistent. 
+If you use ISR and fetch in your app, you may encounter a bug that makes your revalidate values inconsistent.
 The issue is that it revalidates using the lowest revalidate of all fetch calls in your page, regardless of their individual values. To fix this bug, you need to modify the fetch function in your root layout component with the following code snippet
 
 ```ts
@@ -105,4 +104,4 @@ export default function RootLayout() {
   store.isOnDemandRevalidate = store.isOnDemandRevalidate && !(process.env.OPEN_NEXT_ISR === 'true');
   return <>...</>;
 }
-```
\ No newline at end of file
+```
diff --git a/pages/aws/v2/inner_workings/isr.mdx b/pages/aws/v2/inner_workings/isr.mdx
index d1444a1..3f6e653 100644
--- a/pages/aws/v2/inner_workings/isr.mdx
+++ b/pages/aws/v2/inner_workings/isr.mdx
@@ -1,4 +1,4 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 In standalone mode, Next.js prebuilds the ISR cache during the build process. And at runtime, **NextServer** expects this cache locally on the server. This works effectively when the server is run on a single web server machine, sharing the cache across all requests. In a Lambda environment, the cache needs to be housed centrally in a location accessible by all server Lambda function instances. S3 serves as this central location.
 
@@ -20,9 +20,9 @@ To facilitate this:
 4. A new request comes in for the same page after 2 seconds. Cloudfront sends the cached version back to the user and forwards the request to the `server-function`.
 5. If the revalidation is done, the `server-function` will update the cache and send the updated response back to Cloudfront. Subsequent request will then get the updated version. Otherwise, we go back to step 3.
 
-#### Tags 
+#### Tags
 
-Tags are stored in a dynamodb table. 
+Tags are stored in a dynamodb table.
 There is 3 fields in the table: `tag`, `path`, `revalidatedAt`. The `tag` field is the partition key and `path` is the sort key.
 
 We use an index called `revalidate` with `path` as a partition key and `revalidatedAt` as the sort key.
@@ -36,7 +36,10 @@ When we check if a page is stale, we check the `revalidatedAt` value for each re
 #### Cost
 
 <Callout type="warning" emoji="⚠️">
-  Be aware that fetch cache is using S3. `fetch` by default in next is cached, and even for SSR requests, it will be written to S3. This can lead to a lot of S3 requests and can be expensive. You can disable fetch cache by setting `cache` to `no-store` in the `fetch` options. Also see [this workaround](/aws/v2/common_issues/isr#patch-fetch-behaviour-for-isr-only-for-next1351)
+  Be aware that fetch cache is using S3. `fetch` by default in next is cached, and even for SSR requests, it
+  will be written to S3. This can lead to a lot of S3 requests and can be expensive. You can disable fetch
+  cache by setting `cache` to `no-store` in the `fetch` options. Also see [this
+  workaround](/aws/v2/common_issues/isr#patch-fetch-behaviour-for-isr-only-for-next1351)
 </Callout>
 
 `get` will be called on every request to ISR and SSG that are not cached in Cloudfront, and `set` will be called on every revalidation.
@@ -47,6 +50,7 @@ There is also some cost associated to deployment since you need to upload the ca
 For the examples here, let's assume an app route with a 5 minute revalidation delay in us-east-1. This is assuming you get constant traffic to the route (If you get no traffic, you will only pay for the storage cost).
 
 ##### S3
+
 - Each `get` request to the cache will result in at least 1 `GetObject`
 
 ```
@@ -68,22 +72,26 @@ You can then calculate the cost based on your usage and the [S3 pricing](https:/
 For the example, let's consider that that same route has 2 tags and 10 paths and subpath for each tag. This is assuming you get constant traffic to the route.
 
 - Each `revalidateTag` request will result in 1 `Query` in DynamoDB and a `PutItem` for each path associated with the tag, they are grouped in batches of 25 in a `BatchWriteItem` request.
+
 ```
   Assuming you do 1 revalidation per 5 minute
   Query cost - 8,640 request * $0.25 per 1,000,000 read = $0.00216
   BatchWriteItem cost - 86,400 requests * $0.25 per 1,000,000 write = $0.0216
   Total cost - $0.04536 per tag revalidation per month
 ```
+
 - Each `get` request will result in 1 `Query` in DynamoDB
+
 ```
   Query cost - 8,640 request * $0.25 per 1,000,000 read = $0.00216
   Total cost - $0.00216 per route per month
 ```
+
 - Each `set` request will result in 1 `Query` in DynamoDB and a `PutItem` for each tag associated with the path that are not present in DynamoDB, they are grouped in batches of 25 in a `BatchWriteItem` request.
+
 ```
   Query cost - 8,640 request * $0.25 per 1,000,000 read = $0.00216
   Total cost - $0.00216 per route per month
 ```
 
 You can then calculate the cost based on your usage and the [DynamoDB pricing](https://aws.amazon.com/dynamodb/pricing/)
-
diff --git a/pages/aws/v2/inner_workings/plugin.mdx b/pages/aws/v2/inner_workings/plugin.mdx
index 4ce9945..573eb8a 100644
--- a/pages/aws/v2/inner_workings/plugin.mdx
+++ b/pages/aws/v2/inner_workings/plugin.mdx
@@ -3,8 +3,8 @@ import { Callout } from "nextra/components";
 Open-next use esbuild to build the project. Given that we aim to support multiple version of Next and multiple runtime, we developped a plugin to override some parts of our code at build time with an esbuild plugin.
 
 <Callout type="warning" emoji="⚠️">
-  As of now, the plugin is internal and not exposed to the user.
-  We might expose it in the future, but for now, it is used only internally.
+  As of now, the plugin is internal and not exposed to the user. We might expose it in the future, but for
+  now, it is used only internally.
 </Callout>
 
 #### How to use
@@ -17,7 +17,6 @@ You need to create a ts file where you will override the code. Inside this file,
 const test = "test";
 //#endImport
 
-
 //#override import
 // Everything inside here will replace the content of the override with the given id: import
 // To get the id you'll need to look at the file you want to override
diff --git a/pages/aws/v2/inner_workings/streaming.mdx b/pages/aws/v2/inner_workings/streaming.mdx
index e6d259c..0013aac 100644
--- a/pages/aws/v2/inner_workings/streaming.mdx
+++ b/pages/aws/v2/inner_workings/streaming.mdx
@@ -1,16 +1,17 @@
-import { Callout } from 'nextra/components'
+import { Callout } from "nextra/components";
 
 <Callout type="warning" emoji="⚠️">
   Streaming support is **EXTREMELY EXPERIMENTAL**... AWS has updated their runtime in the past which broke streaming... It seems stable now but if they do another rugpull, it could cause your app to break.
 
-  **It's not recommended to use streaming in production.**
+**It's not recommended to use streaming in production.**
+
 </Callout>
 
 Streaming is using the new AWS lambda support for [streaming responses](https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html). This allows you to send data to the client as it's generated instead of waiting for the entire response to be generated.
 
 If you want to try streaming you need to set the function url invoke mode to `RESPONSE_STREAM`.
 You'll also need to add a `--streaming` tags to the build cli.
-  
+
 ```bash
 open-next build --streaming
-```
\ No newline at end of file
+```
diff --git a/pages/aws/v2/inner_workings/warming.mdx b/pages/aws/v2/inner_workings/warming.mdx
index 6944adc..35c13e0 100644
--- a/pages/aws/v2/inner_workings/warming.mdx
+++ b/pages/aws/v2/inner_workings/warming.mdx
@@ -44,4 +44,4 @@ $0.00864 + $0.145728288 + $0.0161280288 x 50 = $0.960769728
 
 ```
 
-This cost estimate is based on the `us-east-1` region pricing and does not consider any free tier benefits.
\ No newline at end of file
+This cost estimate is based on the `us-east-1` region pricing and does not consider any free tier benefits.
diff --git a/pages/cloudflare/0.2/_meta.json b/pages/cloudflare/0.2/_meta.json
index 9a7cfe5..53a20a0 100644
--- a/pages/cloudflare/0.2/_meta.json
+++ b/pages/cloudflare/0.2/_meta.json
@@ -4,4 +4,4 @@
   "bindings": "",
   "caching": "",
   "examples": ""
-}
\ No newline at end of file
+}
diff --git a/pages/cloudflare/0.2/bindings.mdx b/pages/cloudflare/0.2/bindings.mdx
index 900e009..f42790d 100644
--- a/pages/cloudflare/0.2/bindings.mdx
+++ b/pages/cloudflare/0.2/bindings.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ### Bindings
 
@@ -17,13 +17,13 @@ You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
 export async function GET(request) {
-	let responseText = "Hello World";
+  let responseText = "Hello World";
 
-	const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
-	await myKv.put("foo", "bar");
-	const foo = await myKv.get("foo");
+  const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
+  await myKv.put("foo", "bar");
+  const foo = await myKv.get("foo");
 
-	return new Response(foo);
+  return new Response(foo);
 }
 ```
 
@@ -56,10 +56,9 @@ You can access context about the incoming request from the [`cf` object](https:/
 ```js
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
-
 export async function GET(request) {
-	const { env, cf, ctx } = await getCloudflareContext();
+  const { env, cf, ctx } = await getCloudflareContext();
 
-	// ...
+  // ...
 }
 ```
diff --git a/pages/cloudflare/0.2/caching.mdx b/pages/cloudflare/0.2/caching.mdx
index cbeb544..e507e21 100644
--- a/pages/cloudflare/0.2/caching.mdx
+++ b/pages/cloudflare/0.2/caching.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ## Caching
 
@@ -10,7 +10,8 @@ By default, all `fetch()` subrequests made in your Next.js app are cached. Refer
 [The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
 
 <Callout>
-Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
 </Callout>
 
 ### How to enable caching
diff --git a/pages/cloudflare/0.2/examples.mdx b/pages/cloudflare/0.2/examples.mdx
index 2cdecbb..4fd3469 100644
--- a/pages/cloudflare/0.2/examples.mdx
+++ b/pages/cloudflare/0.2/examples.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ## Examples
 
@@ -13,8 +13,8 @@ npm create cloudflare@latest -- my-next-app --framework=next --experimental
 
 Two basic example apps are included in the repository for `@opennextjs/cloudflare` package:
 
-- [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
-- [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
 
 You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
 
diff --git a/pages/cloudflare/0.2/get-started.mdx b/pages/cloudflare/0.2/get-started.mdx
index 803fbe4..ea1482e 100644
--- a/pages/cloudflare/0.2/get-started.mdx
+++ b/pages/cloudflare/0.2/get-started.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ### Get Started
 
@@ -30,7 +30,7 @@ npm install -D wrangler@latest
 ```
 
 <Callout>
-You must use Wrangler version `3.78.10` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+  You must use Wrangler version `3.78.10` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
 Then, add a [`wrangler.toml`](https://developers.cloudflare.com/workers/wrangler/configuration/) file to the root directory of your Next.js app:
@@ -44,7 +44,10 @@ assets = { directory = ".worker-next/assets", binding = "ASSETS" }
 ```
 
 <Callout>
-As shown above, you must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare.
+  As shown above, you must enable the [`nodejs_compat` compatibility
+  flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility
+  date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
+  later, in order for your Next.js app to work with @opennextjs/cloudflare.
 </Callout>
 
 `wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
diff --git a/pages/cloudflare/0.2/index.mdx b/pages/cloudflare/0.2/index.mdx
index 02ba3dd..2c39400 100644
--- a/pages/cloudflare/0.2/index.mdx
+++ b/pages/cloudflare/0.2/index.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ## Cloudflare
 
diff --git a/pages/cloudflare/0.3/bindings.mdx b/pages/cloudflare/0.3/bindings.mdx
index ee412f0..d0af91d 100644
--- a/pages/cloudflare/0.3/bindings.mdx
+++ b/pages/cloudflare/0.3/bindings.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ### Bindings
 
@@ -17,13 +17,13 @@ You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
 export async function GET(request) {
-	let responseText = "Hello World";
+  let responseText = "Hello World";
 
-	const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
-	await myKv.put("foo", "bar");
-	const foo = await myKv.get("foo");
+  const myKv = (await getCloudflareContext()).env.MY_KV_NAMESPACE;
+  await myKv.put("foo", "bar");
+  const foo = await myKv.get("foo");
 
-	return new Response(foo);
+  return new Response(foo);
 }
 ```
 
@@ -56,10 +56,9 @@ You can access context about the incoming request from the [`cf` object](https:/
 ```js
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
-
 export async function GET(request) {
-	const { env, cf, ctx } = await getCloudflareContext();
+  const { env, cf, ctx } = await getCloudflareContext();
 
-	// ...
+  // ...
 }
 ```
diff --git a/pages/cloudflare/0.3/caching.mdx b/pages/cloudflare/0.3/caching.mdx
index 5e4688e..47e9168 100644
--- a/pages/cloudflare/0.3/caching.mdx
+++ b/pages/cloudflare/0.3/caching.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ## Caching
 
@@ -14,7 +14,8 @@ Note that [Revalidating](https://nextjs.org/docs/app/building-your-application/d
 Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
 
 <Callout>
-Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
 </Callout>
 
 ### How to enable caching
@@ -40,8 +41,8 @@ The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
   "kv_namespaces": [
     {
       "binding": "NEXT_CACHE_WORKERS_KV",
-      "id": "<BINDING_ID>"
-    }
-  ]
+      "id": "<BINDING_ID>",
+    },
+  ],
 }
 ```
diff --git a/pages/cloudflare/0.3/examples.mdx b/pages/cloudflare/0.3/examples.mdx
index deafb82..d75a1f6 100644
--- a/pages/cloudflare/0.3/examples.mdx
+++ b/pages/cloudflare/0.3/examples.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ## Examples
 
@@ -13,10 +13,10 @@ npm create cloudflare@latest -- my-next-app --framework=next --experimental
 
 Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
 
-- [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
-- [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
-- [*`middleware`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
-- [*`vercel-blog-starter`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
+- [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [_`middleware`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [_`vercel-blog-starter`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
 
 You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
 
diff --git a/pages/cloudflare/0.3/get-started.mdx b/pages/cloudflare/0.3/get-started.mdx
index b3b5668..de6091d 100644
--- a/pages/cloudflare/0.3/get-started.mdx
+++ b/pages/cloudflare/0.3/get-started.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
 
 ### Get Started
 
@@ -30,19 +30,21 @@ npm install --save-dev wrangler@latest
 ```
 
 <Callout>
-You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+  You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
 ##### 3. Create a wrangler configuration file
 
-<Callout type='info'>
-This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
 </Callout>
 
 A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
 application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
 You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
+
 ```jsonc
 {
   "$schema": "node_modules/wrangler/config-schema.json",
@@ -66,16 +68,20 @@ You can create one yourself in the root directory of your Next.js app with the n
 ```
 
 <Callout>
-As shown above:
- - You must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare
- - The `main` and `assets` values should also not be changed unless you modify the build output result in some way
- - You can add a binding named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching docs](/cloudflare/caching)
+  As shown above: - You must enable the [`nodejs_compat` compatibility
+  flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility
+  date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
+  later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
+  should also not be changed unless you modify the build output result in some way - You can add a binding
+  named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching
+  docs](/cloudflare/caching)
 </Callout>
 
 ##### 4. Add an `open-next.config.ts` file
 
-<Callout type='info'>
-This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
 </Callout>
 
 Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
@@ -110,7 +116,8 @@ export default config;
 ```
 
 <Callout>
-To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the `@opennextjs/aws` NPM package as a dev dependency.
+  To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the
+  `@opennextjs/aws` NPM package as a dev dependency.
 </Callout>
 
 ##### 5. Add a `.dev.vars` file
@@ -163,10 +170,11 @@ Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 
 Remove any reference of these packages from your source and configuration files.
 This includes:
- - `setupDevPlatform()` calls in your Next.js config file
- - `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
-   (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
- - next-on-pages eslint rules set in your Eslint config file
+
+- `setupDevPlatform()` calls in your Next.js config file
+- `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+  (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+- next-on-pages eslint rules set in your Eslint config file
 
 ##### 11. Develop locally
 
diff --git a/pages/cloudflare/0.3/index.mdx b/pages/cloudflare/0.3/index.mdx
index 3c5e7c3..79748c6 100644
--- a/pages/cloudflare/0.3/index.mdx
+++ b/pages/cloudflare/0.3/index.mdx
@@ -1,6 +1,6 @@
-import { SITE } from '../../../config';
-import { Callout } from 'nextra/components';
-import WindowsSupport from '../../../shared/WindowsSupport.mdx';
+import { SITE } from "../../../config";
+import { Callout } from "nextra/components";
+import WindowsSupport from "../../../shared/WindowsSupport.mdx";
 
 ## Cloudflare
 
diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index b13fbcf..558fb15 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ### Bindings
 
@@ -17,13 +17,13 @@ You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
 export async function GET(request) {
-	let responseText = "Hello World";
+  let responseText = "Hello World";
 
-	const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
-	await myKv.put("foo", "bar");
-	const foo = await myKv.get("foo");
+  const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
+  await myKv.put("foo", "bar");
+  const foo = await myKv.get("foo");
 
-	return new Response(foo);
+  return new Response(foo);
 }
 ```
 
@@ -33,8 +33,8 @@ export async function GET(request) {
 	const context = await getCloudflareContext({ async: true });
 	```
 
-	**WARNING**: During SSG caution is advised since secrets (stored in `.dev.vars` files) and local development
-	values from bindings (like values saved in a local KV) will be used for the pages static generation.
+    **WARNING**: During SSG caution is advised since secrets (stored in `.dev.vars` files) and local development
+    values from bindings (like values saved in a local KV) will be used for the pages static generation.
 
 </Callout>
 
@@ -67,10 +67,9 @@ You can access context about the incoming request from the [`cf` object](https:/
 ```js
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
-
 export async function GET(request) {
-	const { env, cf, ctx } = getCloudflareContext();
+  const { env, cf, ctx } = getCloudflareContext();
 
-	// ...
+  // ...
 }
 ```
diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 759cc3b..aba87d7 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ## Caching
 
@@ -12,7 +12,8 @@ By default, all `fetch()` subrequests made in your Next.js app are cached. Refer
 Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
 
 <Callout>
-Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be reflected globally, when using the default TTL of 60 seconds.
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
 </Callout>
 
 ### How to enable caching
@@ -71,9 +72,9 @@ const config: OpenNextConfig = {
 export default config;
 ```
 
-
 <Callout>
-  The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in production. We are actively working on a solution that will be suitable for production.
+  The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in
+  production. We are actively working on a solution that will be suitable for production.
 </Callout>
 
 #### On-Demand Revalidation
diff --git a/pages/cloudflare/community.mdx b/pages/cloudflare/community.mdx
index 212a898..985b961 100644
--- a/pages/cloudflare/community.mdx
+++ b/pages/cloudflare/community.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ## Projects from the community
 
diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index ca3c6bd..bf5167b 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ## Examples
 
@@ -13,10 +13,10 @@ npm create cloudflare@latest -- my-next-app --framework=next --experimental
 
 Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
 
-- [*`create-next-app`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
-- [*`api`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
-- [*`middleware`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
-- [*`vercel-blog-starter`*](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
+- [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [_`middleware`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [_`vercel-blog-starter`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
 
 You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
 
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 7252fd4..78b5115 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ### Get Started
 
@@ -30,19 +30,21 @@ npm install --save-dev wrangler@latest
 ```
 
 <Callout>
-You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+  You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
 </Callout>
 
 ##### 3. Create a wrangler configuration file
 
-<Callout type='info'>
-This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
 </Callout>
 
 A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
 application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
 You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
+
 ```jsonc
 {
   "$schema": "node_modules/wrangler/config-schema.json",
@@ -66,16 +68,20 @@ You can create one yourself in the root directory of your Next.js app with the n
 ```
 
 <Callout>
-As shown above:
- - You must enable the [`nodejs_compat` compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or later, in order for your Next.js app to work with @opennextjs/cloudflare
- - The `main` and `assets` values should also not be changed unless you modify the build output result in some way
- - You can add a binding named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching docs](/cloudflare/caching)
+  As shown above: - You must enable the [`nodejs_compat` compatibility
+  flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility
+  date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
+  later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
+  should also not be changed unless you modify the build output result in some way - You can add a binding
+  named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching
+  docs](/cloudflare/caching)
 </Callout>
 
 ##### 4. Add an `open-next.config.ts` file
 
-<Callout type='info'>
-This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if not already present).
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
 </Callout>
 
 Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
@@ -110,7 +116,8 @@ export default config;
 ```
 
 <Callout>
-To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the `@opennextjs/aws` NPM package as a dev dependency.
+  To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the
+  `@opennextjs/aws` NPM package as a dev dependency.
 </Callout>
 
 ##### 5. Add a `.dev.vars` file
@@ -159,10 +166,11 @@ Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cl
 
 Remove any reference of these packages from your source and configuration files.
 This includes:
- - `setupDevPlatform()` calls in your Next.js config file
- - `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
-   (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
- - next-on-pages eslint rules set in your Eslint config file
+
+- `setupDevPlatform()` calls in your Next.js config file
+- `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+  (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+- next-on-pages eslint rules set in your Eslint config file
 
 ##### 11. Develop locally
 
@@ -173,6 +181,7 @@ from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev
 cloudflare adapter and it is necessary for using bindings during local development.
 
 This is an example of a Next.js configuration file calling the utility:
+
 ```js
 // next.config.mjs
 
diff --git a/pages/cloudflare/howtos/NextAuth.mdx b/pages/cloudflare/howtos/NextAuth.mdx
index 7c7fa0f..a8e1066 100644
--- a/pages/cloudflare/howtos/NextAuth.mdx
+++ b/pages/cloudflare/howtos/NextAuth.mdx
@@ -1,4 +1,3 @@
-
 ## [NextAuth.js](https://next-auth.js.org/)
 
 NextAuth.js is an open-source authentication solution for Next.js applications.
diff --git a/pages/cloudflare/howtos/stripeAPI.mdx b/pages/cloudflare/howtos/stripeAPI.mdx
index 621cecf..4c024b3 100644
--- a/pages/cloudflare/howtos/stripeAPI.mdx
+++ b/pages/cloudflare/howtos/stripeAPI.mdx
@@ -1,4 +1,3 @@
-
 ## [Stripe API](https://www.npmjs.com/package/stripe)
 
 When [creating a Stripe object](https://docs.stripe.com/js/initializing), the default http client implementation is based on `node:https` which is not implemented on Workers.
@@ -10,7 +9,6 @@ import Stripe from "stripe";
 
 const stripe = Stripe(STRIPE_API_KEY, {
   // Cloudflare Workers use the Fetch API for their API requests.
-  httpClient: Stripe.createFetchHttpClient()
+  httpClient: Stripe.createFetchHttpClient(),
 });
 ```
-
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 85993f7..3744766 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -1,6 +1,6 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
-import WindowsSupport from '../../shared/WindowsSupport.mdx';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
+import WindowsSupport from "../../shared/WindowsSupport.mdx";
 
 ## Cloudflare
 
diff --git a/pages/cloudflare/migrate-from-0.2-to-0.3.mdx b/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
index 68160a6..e43347a 100644
--- a/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
+++ b/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ### Migrate from 0.2 to 0.3
 
diff --git a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
index 00c78f8..ca8da55 100644
--- a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
+++ b/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ### Migrate from 0.3 to 0.4
 
@@ -13,6 +13,7 @@ with the Next.js dev server. If you don't plan on using the `next dev` command y
 configuration file to import and call the utility.
 
 Example:
+
 ```js
 // next.config.mjs
 
diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index f792339..b0521a5 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -1,5 +1,5 @@
-import { SITE } from '../../config';
-import { Callout } from 'nextra/components';
+import { SITE } from "../../config";
+import { Callout } from "nextra/components";
 
 ## Troubleshooting
 
diff --git a/shared/WindowsSupport.mdx b/shared/WindowsSupport.mdx
index 647b7d1..af51736 100644
--- a/shared/WindowsSupport.mdx
+++ b/shared/WindowsSupport.mdx
@@ -1,12 +1,14 @@
 OpenNext can be used on Windows systems but Windows full support is not guaranteed because:
- - historically the Next.js tooling itself has had Windows support issues
-   (and OpenNext is built on these tools)
- - the OpenNext team has limited capacity and fully supporting Windows (given the point above)
-   has been determined to be a lower priority, thus the effort and testing on Windows is limited
+
+- historically the Next.js tooling itself has had Windows support issues
+  (and OpenNext is built on these tools)
+- the OpenNext team has limited capacity and fully supporting Windows (given the point above)
+  has been determined to be a lower priority, thus the effort and testing on Windows is limited
 
 Given the above, you can develop your application under Windows at your own risk. If you don't have an alternative we
 recommend either:
- - running OpenNext using [WSL2](https://learn.microsoft.com/en-us/windows/wsl/),
- - in a Linux Virtual Machine or
- - develop your application using the standard Next.js tooling and deploy it using OpenNext in CI/CD systems such
-   as [GitHub Actions](https://github.com/features/actions) that run linux/MacOS environments
\ No newline at end of file
+
+- running OpenNext using [WSL2](https://learn.microsoft.com/en-us/windows/wsl/),
+- in a Linux Virtual Machine or
+- develop your application using the standard Next.js tooling and deploy it using OpenNext in CI/CD systems such
+  as [GitHub Actions](https://github.com/features/actions) that run linux/MacOS environments
diff --git a/theme.config.jsx b/theme.config.jsx
index 5557379..3b5a92b 100644
--- a/theme.config.jsx
+++ b/theme.config.jsx
@@ -38,8 +38,7 @@ export default {
         },
       ],
       titleTemplate: "%s - OpenNext",
-      description:
-        frontMatter.description || "Open-source Next.js adapters",
+      description: frontMatter.description || "Open-source Next.js adapters",
       openGraph: {
         titleTemplate: "%s - OpenNext",
         images: [
diff --git a/tsconfig.json b/tsconfig.json
index 64f4de7..fca8dc5 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,7 @@
 {
   "compilerOptions": {
     "target": "es5",
-    "lib": [
-      "dom",
-      "dom.iterable",
-      "esnext"
-    ],
+    "lib": ["dom", "dom.iterable", "esnext"],
     "allowJs": true,
     "skipLibCheck": true,
     "strict": true,
@@ -19,14 +15,6 @@
     "jsx": "preserve",
     "incremental": true
   },
-  "include": [
-    "next-env.d.ts",
-    "**/*.ts",
-    "**/*.tsx",
-    "pages/index.mdx", 
-    "theme.config.jsx"  
-  ],
-  "exclude": [
-    "node_modules"
-  ]
+  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "pages/index.mdx", "theme.config.jsx"],
+  "exclude": ["node_modules"]
 }

From 9b62883b862cafe27c5a7b217148575acbe4fe50 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 27 Feb 2025 01:09:01 -0800
Subject: [PATCH 064/140] cloudflare: mark after as supported (#85)

---
 pages/cloudflare/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 3744766..8069067 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -54,7 +54,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
 - [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration) <sup>1</sup>
-- [ ] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+- [x] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
 <sup>1</sup> Only the `direct` mode is supported at the moment, and is not suitable for production.

From e3ba077b58b8120b89b63e33a0f7d28de1f0b70b Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Thu, 27 Feb 2025 20:47:27 +0000
Subject: [PATCH 065/140] use the new `defineCloudflareConfig` utility the
 Cloudflare get-started configuration step (#84)

---
 pages/cloudflare/caching.mdx     | 45 ++++++++++++++------------------
 pages/cloudflare/get-started.mdx | 30 ++++-----------------
 2 files changed, 24 insertions(+), 51 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index aba87d7..e41a6a1 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -53,23 +53,21 @@ In your project's OpenNext config, enable the KV cache and set up a queue.
 
 The memory queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests on a per-isolate basis. There might still be duplicate requests under high traffic or across regions.
 
+<Callout type="warning">
+  The memory queue provided by `@opennextjs/cloudflare` is not fully suitable for production deployments, you
+  can use it at your own risk!
+</Callout>
+
 ```ts
 // open-next.config.ts
-import incrementalCache from "@opennextjs/cloudflare/kv-cache";
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
 import memoryQueue from "@opennextjs/cloudflare/memory-queue";
 
-const config: OpenNextConfig = {
-  default: {
-    override: {
-      // ...
-      incrementalCache: () => incrementalCache,
-      queue: () => memoryQueue,
-    },
-  },
-  // ...
-};
-
-export default config;
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  queue: memoryQueue,
+});
 ```
 
 <Callout>
@@ -126,21 +124,16 @@ In your project's OpenNext config, enable the KV cache and set up a queue. The q
 
 ```ts
 // open-next.config.ts
-import tagCache from "@opennextjs/cloudflare/d1-tag-cache";
-import incrementalCache from "@opennextjs/cloudflare/kv-cache";
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import d1TagCache from "@opennextjs/cloudflare/d1-tag-cache";
 import memoryQueue from "@opennextjs/cloudflare/memory-queue";
 
-const config: OpenNextConfig = {
-  default: {
-    override: {
-      // ...
-      incrementalCache: () => incrementalCache,
-      queue: () => memoryQueue,
-      tagCache: () => tagCache,
-    },
-  },
-  // ...
-};
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: d1TagCache,
+  queue: memoryQueue,
+});
 ```
 
 ##### 4. Initialise the cache during deployments
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 78b5115..a29ed7b 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -87,32 +87,12 @@ You can create one yourself in the root directory of your Next.js app with the n
 Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
 
 ```ts
-import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
-import cache from "@opennextjs/cloudflare/kv-cache";
-
-const config: OpenNextConfig = {
-  default: {
-    override: {
-      wrapper: "cloudflare-node",
-      converter: "edge",
-      // set `incrementalCache` to "dummy" to disable KV cache
-      incrementalCache: async () => cache,
-      tagCache: "dummy",
-      queue: "dummy",
-    },
-  },
-
-  middleware: {
-    external: true,
-    override: {
-      wrapper: "cloudflare-edge",
-      converter: "edge",
-      proxyExternalRequest: "fetch",
-    },
-  },
-};
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
 
-export default config;
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+});
 ```
 
 <Callout>

From e68e874c2ac6f9e79941518b9a57950776dd8472 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 27 Feb 2025 12:59:10 -0800
Subject: [PATCH 066/140] Update(aws): sync with the new handler API (#71)

---
 pages/aws/config/custom_overrides.mdx  | 2 +-
 pages/aws/config/overrides/wrapper.mdx | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index 0f1c66e..7c86e75 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -238,7 +238,7 @@ const handler: WrapperHandler =
       },
     };
 
-    const response = await handler(internalEvent, fakeStream);
+    const response = await handler(internalEvent, { streamCreator: fakeStream });
     response.headers["x-wrapper"] = "hi";
 
     return converter.convertTo(response, event);
diff --git a/pages/aws/config/overrides/wrapper.mdx b/pages/aws/config/overrides/wrapper.mdx
index 33543a3..1728b3c 100644
--- a/pages/aws/config/overrides/wrapper.mdx
+++ b/pages/aws/config/overrides/wrapper.mdx
@@ -7,7 +7,7 @@ Couple of things to note :
 - If you want to use streaming (for the `node` runtime of next), you'll need to create a `StreamCreator` and pass it to the `handler`. You can find some example in the [node](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/node.ts) or [aws-lambda-streaming](https://github.com/opennextjs/opennextjs-aws/blob/main/packages/open-next/src/overrides/wrappers/aws-lambda-streaming.ts) wrapper.
 - If you don't use streaming (like in the default `aws-lambda` wrapper), you may still need to provide a fake `StreamCreator` to the `handler` to avoid a weird issue with Node itself (see [here](https://github.com/opennextjs/opennextjs-aws/blob/f685ddea8f8a5c82591dc02713aff7138f2d9896/packages/open-next/src/overrides/wrappers/aws-lambda.ts#L49-L65) for an example and a more thorough explanation).
 - If you use the `edge` runtime of Next (either for the external middleware or for an `edge` route or page), you don't need the `StreamCreator` at all.
-- If you are in a serverless environment and it supports `waitUntil`, you should define it here(see [here](https://github.com/opennextjs/opennextjs-aws/blob/b0b1f7776b41612d2638a33e3c9ced8c42afab0a/packages/open-next/src/overrides/wrappers/cloudflare-node.ts#L80). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
+- If you are in a serverless environment and it supports `waitUntil`, you should pass it to the handler as it is done in the [cloudflare-edge wrapper](https://github.com/opennextjs/opennextjs-aws/blob/87b59e59a8a0bf1e83d2d1df9efa0ad3bfc912f5/packages/open-next/src/overrides/wrappers/cloudflare-edge.ts#L65-L67). This might not be necessary depending on where you run it (for example the `aws-lambda-streaming` or the `node` wrapper doesn't need it.)
 
 ## Included Wrappers
 

From 33229c5a1823078b4e214cef4cdad58b60fe6c73 Mon Sep 17 00:00:00 2001
From: Mark Dembo <dembo.mark@gmail.com>
Date: Thu, 6 Mar 2025 15:36:19 +0100
Subject: [PATCH 067/140] [cloudflare] Add nextauth infos (#88)

Co-authored-by: Dario Piotrowicz <dario.piotrowicz@gmail.com>
---
 pages/cloudflare/howtos/NextAuth.mdx | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/pages/cloudflare/howtos/NextAuth.mdx b/pages/cloudflare/howtos/NextAuth.mdx
index a8e1066..77b644e 100644
--- a/pages/cloudflare/howtos/NextAuth.mdx
+++ b/pages/cloudflare/howtos/NextAuth.mdx
@@ -1,9 +1,16 @@
+import { Callout } from "nextra/components";
+
 ## [NextAuth.js](https://next-auth.js.org/)
 
 NextAuth.js is an open-source authentication solution for Next.js applications.
 
 ### Solving a broken build
 
+<Callout>
+  This section offers a solution for NextAuth.js v4. Use of v5 is currently blocked by the lack of
+  `createCipheriv` implementation.
+</Callout>
+
 NextAuth.js relies on [`createCipheriv`](https://nodejs.org/docs/v22.13.1/api/crypto.html#cryptocreatecipherivalgorithm-key-iv-options) from [`node:crypto`](https://nodejs.org/docs/v22.13.1/api/crypto.html).
 
 `createCipheriv` is not currently implemented by the workerd runtime so apps using NextAuth.js with the default configuration break at build time.
@@ -28,3 +35,18 @@ Kudos to Arnav Gupta ([`@arnavgupta00`](https://github.com/arnavgupta00)) for co
 You can find an example of this on his [example repository](https://github.com/arnavgupta00/deployment-cf-workers-prisma-nextauth).
 
 Related issues: [`workers-sdk#206`](https://github.com/opennextjs/opennextjs-cloudflare/issues/206) and [`workerd#3277`](https://github.com/cloudflare/workerd/issues/3277).
+
+### Solving issues in local dev
+
+When trying to access Cloudflare bindings depending on your implementation, you might run into:
+
+`ERROR: getCloudflareContext has been called without having called initOpenNextCloudflareForDev from the Next.js config file.`
+
+You can resolve this issue, by calling `getCloudflareContext` in your `NextAuth` callback, for example like so:
+
+```js
+export const { handlers, auth, signIn, signOut } = NextAuth(async _ => {
+	let { env } = await getCloudflareContext({async: true})
+        ..
+}
+```

From b348d10c89ed2a74895c2be2d10623fdf82793e8 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Mon, 10 Mar 2025 09:48:30 +0000
Subject: [PATCH 068/140] update docs for revalidation service binding (#89)

---
 pages/cloudflare/caching.mdx | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index e41a6a1..14c3d55 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -30,7 +30,7 @@ The ISR adapter for Cloudflare uses [Workers KV](https://developers.cloudflare.c
 npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 ```
 
-##### 2. Add the KV namespace to your Worker
+##### 2. Add the KV namespace and Service Binding to your Worker
 
 The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
 
@@ -44,6 +44,12 @@ The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
       "id": "<BINDING_ID>",
     },
   ],
+  "services": [
+    {
+      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "service": "<WORKER_NAME>",
+    },
+  ],
 }
 ```
 
@@ -85,7 +91,7 @@ To use on-demand revalidation, you should also follow the [ISR setup steps](#inc
   If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
 </Callout>
 
-##### 1. Create a D1 database
+##### 1. Create a D1 database and Service Binding
 
 The binding name used in your app's worker is `NEXT_CACHE_D1`.
 
@@ -100,6 +106,12 @@ The binding name used in your app's worker is `NEXT_CACHE_D1`.
       "database_name": "<DATABASE_NAME>",
     },
   ],
+  "services": [
+    {
+      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "service": "<WORKER_NAME>",
+    },
+  ],
 }
 ```
 

From e100c75bea89e8c256809c533e08c32277577e19 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 10 Mar 2025 08:26:08 -0700
Subject: [PATCH 069/140] [cloudflare]: rename wrangler.json to wrangler.jsonc
 (#90)

---
 pages/cloudflare/caching.mdx     | 4 ++--
 pages/cloudflare/get-started.mdx | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 14c3d55..e8adb01 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -35,7 +35,7 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
 
 ```jsonc
-// wrangler.json
+// wrangler.jsonc
 {
   // ...
   "kv_namespaces": [
@@ -96,7 +96,7 @@ To use on-demand revalidation, you should also follow the [ISR setup steps](#inc
 The binding name used in your app's worker is `NEXT_CACHE_D1`.
 
 ```jsonc
-// wrangler.json
+// wrangler.jsonc
 {
   // ...
   "d1_databases": [
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index a29ed7b..6cb4517 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -43,7 +43,7 @@ npm install --save-dev wrangler@latest
 A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
 application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
 
-You can create one yourself in the root directory of your Next.js app with the name `wrangler.json` and the following content:
+You can create one yourself in the root directory of your Next.js app with the name `wrangler.jsonc` and the following content:
 
 ```jsonc
 {

From 57c6d94c6b2d2c4fb50b82c5c04332fc727690ec Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Thu, 13 Mar 2025 19:33:14 +0100
Subject: [PATCH 070/140] [aws]: refactor docs (#91)

---
 pages/aws/common_issues.mdx          | 13 +++++++++++++
 pages/aws/comparison.mdx             |  2 +-
 pages/aws/inner_workings.mdx         |  2 +-
 pages/aws/inner_workings/caching.mdx |  2 +-
 pages/aws/inner_workings/routing.mdx | 16 ++++++++++++++++
 5 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index 79b3dc5..0cf33cb 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -99,3 +99,16 @@ export const initSentry = (runtime: "nodejs" | "edge") => {
   });
 };
 ```
+
+#### Empty body in response when streaming in AWS Lambda
+
+We have seen trouble in the past with streaming hanging in AWS Lambda when the response body is empty.
+We currently have a workaround in OpenNext for this by setting the environment variable `OPEN_NEXT_FORCE_NON_EMPTY_RESPONSE` to `true`.
+This will write something to the stream to make sure it is not empty.
+
+#### The Yarn Plug'n'Play manifest forbids importing "xxx" here because it's not listed as a dependency of this package
+
+This error is usually resolved by removing all yarn files in your repo. You should also look in your `package.json` and see if you have `yarn` set as `packageManager` there. Removing it will solve the issue.
+If you use `yarn` there is a workaround [here](https://stackoverflow.com/a/76902985https://stackoverflow.com/a/76902985).
+
+If you are not using `yarn` and you see `yarn` related errors it might be solved by running `corepack disable` or updating `nvm` to `0.40.2`.
diff --git a/pages/aws/comparison.mdx b/pages/aws/comparison.mdx
index 1f0a522..a229c26 100644
--- a/pages/aws/comparison.mdx
+++ b/pages/aws/comparison.mdx
@@ -1,4 +1,4 @@
-It should be noted that open-next does not actually deploy the app. It only bundles everything for your IAC to deploy it.
+It should be noted that OpenNext 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:
 
diff --git a/pages/aws/inner_workings.mdx b/pages/aws/inner_workings.mdx
index fb4c724..f6f8ec7 100644
--- a/pages/aws/inner_workings.mdx
+++ b/pages/aws/inner_workings.mdx
@@ -19,5 +19,5 @@ my-next-app/
     revalidation-function/         -> Handler code for revalidation backend
     image-optimization-function/   -> Handler code for image optimization backend
     warmer-function/               -> Cron job code to keep server function warm - Not mandatory
-    dynamo-provider/               -> Code for a custom resource to populate the Tag Cache - Only necessary for app dir
+    dynamodb-provider/               -> Code for a custom resource to populate the Tag Cache - Only necessary for app dir
 ```
diff --git a/pages/aws/inner_workings/caching.mdx b/pages/aws/inner_workings/caching.mdx
index 71cc0b6..2344ecd 100644
--- a/pages/aws/inner_workings/caching.mdx
+++ b/pages/aws/inner_workings/caching.mdx
@@ -1,6 +1,6 @@
 ## Caching in Next and OpenNext
 
-Caching could be become tricky very fast when using Next outside of Vercel. There is a lot of things that need to be taken into account.
+Caching could become tricky very fast when using Next outside of Vercel. There is a lot of things that need to be taken into account.
 
 Usually, you'll deploy your Next app with a CDN in front of it. This CDN will cache the responses from your Next app and serve them to the users. This is great for performance, but it can also be a problem when you need to invalidate the cache. We provide some code examples in this doc to help with [cloudfront cache invalidation](#cloudfront-cache-invalidation). **In OpenNext, you only need to do this if you do On Demand Revalidation**.
 
diff --git a/pages/aws/inner_workings/routing.mdx b/pages/aws/inner_workings/routing.mdx
index 11e762a..fcb4cb6 100644
--- a/pages/aws/inner_workings/routing.mdx
+++ b/pages/aws/inner_workings/routing.mdx
@@ -19,3 +19,19 @@ Here is a list of features that OpenNext routing system handle:
 #### Next Middleware
 
 The Next middleware in OpenNext is not running in the same way as in Next.js. In Next.js, the middleware is running inside the `NextServer` inside a fake edge runtime. In OpenNext, we modify the middleware and run it fully inside the routing layer. So if you run the routing layer in Node, you can use Node api inside the middleware (it's a bit tricky because it won't work with `next dev` and involves some workaround because Next will remove Node api during bundling. Some example [here](/aws/config/custom_overrides#define-a-global-to-use-node-in-the-middleware)).
+
+On latest Next 15(works with latest OpenNext aswell) you can now add an `experimental` setting in `next.config.ts` to enable `nodejs` as the runtime for the middleware:
+
+```ts
+const nextConfig: NextConfig = {
+  experimental: {
+    nodeMiddleware: true,
+  },
+};
+// and then in your `middleware.ts` you put:
+export const config = {
+  runtime: "nodejs",
+};
+```
+
+Here is the [PR](https://github.com/vercel/next.js/pull/75624) that introduced this feature in Next.

From c5cafcd70afb4cc3bd42ca68e8b945bd31408759 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Thu, 13 Mar 2025 20:16:30 +0100
Subject: [PATCH 071/140] [aws] add a compatibility table (#87)

---
 pages/aws/_meta.json        |  1 +
 pages/aws/compatibility.mdx | 54 +++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)
 create mode 100644 pages/aws/compatibility.mdx

diff --git a/pages/aws/_meta.json b/pages/aws/_meta.json
index 64e02dd..82ff59c 100644
--- a/pages/aws/_meta.json
+++ b/pages/aws/_meta.json
@@ -1,6 +1,7 @@
 {
   "index": "Overview",
   "get_started": "Getting started",
+  "compatibility": "Compatibility",
   "config": "Configuration",
   "comparison": "Comparison",
   "inner_workings": "How does it work?",
diff --git a/pages/aws/compatibility.mdx b/pages/aws/compatibility.mdx
new file mode 100644
index 0000000..21a7f22
--- /dev/null
+++ b/pages/aws/compatibility.mdx
@@ -0,0 +1,54 @@
+import { Callout } from "nextra/components";
+
+This page will list the release of Next.js that was tested at the time of the release of OpenNext.
+
+<Callout variant="info">
+  - Earlier versions of Next.js on the same major version should work just fine, if not, please open an [issue
+  with a reproduction](https://github.com/opennextjs/opennextjs-aws/issues/new). - Later versions of Next.js
+  on the same major version **usually** work, but there is no guarantee. - If you run versions of OpenNext on
+  previous major versions of Next.js, we only aim to provide compatibility with the latest minor (and ideally
+  patch) version of that major version. - No versions behind Next 12.3.4 is supported. - The main branch of
+  `@opennextjs/aws` is always tested against the latest version of Next.js.
+</Callout>
+
+#### `@opennextjs/aws` Compatibility
+
+| OpenNext Version | Next.js Version |
+| ---------------- | --------------- |
+| 3.5.1            | 15.2.0          |
+| 3.5.0            | 15.2.0          |
+| 3.4.2            | 15.1.6          |
+| 3.4.1            | 15.1.6          |
+| 3.4.0            | 15.1.5          |
+| 3.3.1            | 15.1.3          |
+| 3.3.0            | 15.1.0          |
+| 3.2.2            | 15.0.3          |
+| 3.2.1            | 15.0.2          |
+| 3.2.0            | 15.0.1          |
+| 3.1.6            | 14.2.15         |
+| 3.1.5            | 14.2.15         |
+| 3.1.4            | 14.2.15         |
+
+#### `open-next` Compatibility
+
+<Callout variant="warning">
+  Before version 3.1.3, the package was named `open-next` it is now `@opennextjs/aws`. The compatibility table
+  for `open-next` is as follows:
+</Callout>
+
+| OpenNext Version | Next.js Version |
+| ---------------- | --------------- |
+| 3.1.3            | 14.2.13         |
+| 3.1.2            | 14.2.8          |
+| 3.1.1            | 14.2.6          |
+| 3.1.0            | 14.2.6          |
+| 3.0.8            | 14.2.5          |
+| 3.0.7            | 14.2.5          |
+| 3.0.6            | 14.2.4          |
+| 3.0.5            | 14.2.4          |
+| 3.0.4            | 14.2.4          |
+| 3.0.3            | 14.2.4          |
+| 3.0.2            | 14.2.3          |
+| 3.0.1            | 14.2.3          |
+| 3.0.0            | 14.2.3          |
+| 2.3.9            | 14.1.4          |

From e9a297a2b1967496804f922bbd38dc4194d82a30 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 13 Mar 2025 14:28:47 -0700
Subject: [PATCH 072/140] [cloudflare] add howto dev workflow (#92)

Co-authored-by: Dario Piotrowicz <dario@cloudflare.com>
---
 pages/cloudflare/get-started.mdx   | 27 +++++++++--------
 pages/cloudflare/howtos/_meta.json |  3 +-
 pages/cloudflare/howtos/dev.mdx    | 47 ++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 15 deletions(-)
 create mode 100644 pages/cloudflare/howtos/dev.mdx

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 6cb4517..8a7c29e 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -7,7 +7,7 @@ import { Callout } from "nextra/components";
 
 To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
-```
+```sh
 npm create cloudflare@latest -- my-next-app --framework=next --experimental
 ```
 
@@ -25,7 +25,7 @@ npm install --save-dev @opennextjs/cloudflare@latest
 
 Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
 
-```npm
+```sh
 npm install --save-dev wrangler@latest
 ```
 
@@ -157,26 +157,25 @@ This includes:
 You can continue to run `next dev` when developing locally.
 
 Modify your Next.js configuration file to import and call the `initOpenNextCloudflareForDev` utility
-from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev server can optimally integrate with the open-next
-cloudflare adapter and it is necessary for using bindings during local development.
+from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev server can optimally integrate with the open-next cloudflare adapter and it is necessary for using bindings during local development.
 
 This is an example of a Next.js configuration file calling the utility:
 
-```js
-// next.config.mjs
-
-import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
-
-initOpenNextCloudflareForDev();
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
 
-/** @type {import('next').NextConfig} */
-const nextConfig = {};
+const nextConfig: NextConfig = {
+  /* config options here */
+};
 
 export default nextConfig;
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
 ```
 
-After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local
-development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
 
 In step 3, we also added the `npm run preview`, which allows you to quickly preview your app running locally in the Workers runtime,
 rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 1676dce..5bc5e65 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -1,4 +1,5 @@
 {
   "NextAuth": "NextAuth",
-  "stripeAPI": "Stripe API"
+  "stripeAPI": "Stripe API",
+  "dev": "Development workflow"
 }
diff --git a/pages/cloudflare/howtos/dev.mdx b/pages/cloudflare/howtos/dev.mdx
new file mode 100644
index 0000000..a8a901f
--- /dev/null
+++ b/pages/cloudflare/howtos/dev.mdx
@@ -0,0 +1,47 @@
+## Development Workflow
+
+The primary purpose of `@opennextjs/cloudflare` is to take a Next.js application, built with standard Next.js tooling, and convert it into a format compatible with Cloudflare Workers.
+
+This code transformation process takes some time, making the adapter less than ideal for active application development, where a very fast feedback loop and other quality-of-life features, such as Hot Module Replacement (HMR), are crucial. Fortunately, Vercel already provides excellent tooling for this workflow, which Next.js developers are likely already familiar with.
+
+We recommend that developers continue using the tools they are already comfortable with for local development and then use `@opennextjs/cloudflare` when they are ready to deploy their applications to the Cloudflare platform.
+
+Let's explore, in more detail, the application development workflow we recommend for the best developer experience.
+
+### Create a new application based on a template
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```bash
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+### Develop locally using `next dev`
+
+We believe that the best development workflow uses the `next dev` command provided by Next.js.
+
+To access Cloudflare resources using the `getCloudflareContext` API while running `next dev`, you will need to update the Next.js configuration to call `initOpenNextCloudflareForDev`, as shown in the following example:
+
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+};
+
+export default nextConfig;
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
+```
+
+### `wrangler dev` and `wrangler deploy`
+
+After you've finished iterating on your Next.js application with `next dev`, you can convert it to a Cloudflare Worker by running the `opennextjs-cloudflare` command. This will generate the Worker code in the `.open-next` directory.
+
+You can then preview the app locally in the Cloudflare Workers runtime or deploy it to the Cloudflare network.
+
+To preview your worker locally, run the `wrangler dev` command. This creates a local server that runs your worker in the Cloudflare Workers runtime. Testing your worker is important to ensure that it has been properly built and is working as expected.
+
+Once you've tested your worker, You can run `wrangler deploy`, and in a matter of seconds, your masterpiece will be available to all your users around the world.

From a705ca038048191e0b4b5245ffca43feb718089e Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 13 Mar 2025 23:43:37 -0700
Subject: [PATCH 073/140] [cloudflare] add howto env vars (#93)

Co-authored-by: James Anderson <james@eli.cx>
---
 pages/cloudflare/howtos/_meta.json   |  3 ++-
 pages/cloudflare/howtos/env-vars.mdx | 35 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 pages/cloudflare/howtos/env-vars.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 5bc5e65..2dae0f9 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -1,5 +1,6 @@
 {
   "NextAuth": "NextAuth",
   "stripeAPI": "Stripe API",
-  "dev": "Development workflow"
+  "dev": "Development workflow",
+  "env-vars": "Enviroment Variables"
 }
diff --git a/pages/cloudflare/howtos/env-vars.mdx b/pages/cloudflare/howtos/env-vars.mdx
new file mode 100644
index 0000000..f838382
--- /dev/null
+++ b/pages/cloudflare/howtos/env-vars.mdx
@@ -0,0 +1,35 @@
+## Environment variables
+
+This entry describe the most sensible way to handle your environment variables which works well both during local development and once your application is deployed to Cloudflare Workers.
+
+On the Cloudflare platform, your environment variables can be stored in either ["Enviroment variables"](https://developers.cloudflare.com/workers/configuration/environment-variables/) or ["Secrets"](https://developers.cloudflare.com/workers/configuration/secrets/). The difference being that Secrets can not be read back from either the dashboard or the CLI after being created.
+
+### Local development
+
+While there are multiple ways to set environment variables for local development on the Cloudflare platform (adding them to to your [wrangler configuration](https://developers.cloudflare.com/workers/configuration/secrets/) or to a [.dev.vars](https://developers.cloudflare.com/workers/configuration/secrets/) file) that does not play well with the recommended development workflow as they would not be available while using `next dev`.
+
+What you should do instead is to use the Next.js [`.env` files](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables). By doing so the environment variables will be available on `process.env` both while running `next dev` and when running your app locally on a Worker with `wrangler dev`.
+
+Next.js `.env` files are environment specific. That is a `.env.development` will take precedence over a `.env` file when you use the "development" environment. See the Next.js site for a detailed explanation of the [loading order](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables).
+
+You should use the `NEXTJS_ENV` environment variable to select the environment to use when running your app locally on a worker, that's how you would select the "development" environment:
+
+```plain
+# .dev.vars
+NEXTJS_ENV=development
+```
+
+The "production" environment is used by default when `NEXTJS_ENV` is not explicitly set.
+
+### Production
+
+`.env` and `.dev.vars` are local files that should not be added to source control. You should instead use the cloudflare dashboard to set your environment variables for production.
+
+Next.js has [2 kinds](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#bundling-environment-variables-for-the-browser) of environment variables:
+
+- non-`NEXT_PUBLIC_` variables which are only available on the server
+- `NEXT_PUBLIC_` variables on the other hand are available to the browser
+
+Those are called runtime environment variables (non-`NEXT_PUBLIC_`) and buildtime environment variables (`NEXT_PUBLIC_`) on the Cloudflare paltform.
+
+You can set the runtime environment variables (non-`NEXT_PUBLIC_`) by following those [instructions](https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard). The build time environment variables (`NEXT_PUBLIC_`) should be set in the [Builds Configuration](https://developers.cloudflare.com/workers/ci-cd/builds/configuration/) so that their value can be inlined by the Workers Builds.

From 5fc6b57e20ef8280e7cc3d2264021cdc2b77aa67 Mon Sep 17 00:00:00 2001
From: sommeeeR <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 17 Mar 2025 21:43:17 +0100
Subject: [PATCH 074/140] [aws]: fix link (#96)

---
 pages/aws/common_issues.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index 0cf33cb..2117c1f 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -109,6 +109,6 @@ This will write something to the stream to make sure it is not empty.
 #### The Yarn Plug'n'Play manifest forbids importing "xxx" here because it's not listed as a dependency of this package
 
 This error is usually resolved by removing all yarn files in your repo. You should also look in your `package.json` and see if you have `yarn` set as `packageManager` there. Removing it will solve the issue.
-If you use `yarn` there is a workaround [here](https://stackoverflow.com/a/76902985https://stackoverflow.com/a/76902985).
+If you use `yarn` there is a workaround [here](https://stackoverflow.com/a/76902985).
 
 If you are not using `yarn` and you see `yarn` related errors it might be solved by running `corepack disable` or updating `nvm` to `0.40.2`.

From 504408b088f1e878d9c3db53ab6da54b4fcb9a35 Mon Sep 17 00:00:00 2001
From: Tim <76897954+timsexperiments@users.noreply.github.com>
Date: Wed, 19 Mar 2025 03:34:30 -0500
Subject: [PATCH 075/140] [cloudflare] add more information around what
 `NEXT_CACHE_REVALIDATION_WORKER` is (#97)

---
 pages/cloudflare/caching.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index e8adb01..1a6c469 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -32,7 +32,7 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 
 ##### 2. Add the KV namespace and Service Binding to your Worker
 
-The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`.
+The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc
@@ -93,7 +93,7 @@ To use on-demand revalidation, you should also follow the [ISR setup steps](#inc
 
 ##### 1. Create a D1 database and Service Binding
 
-The binding name used in your app's worker is `NEXT_CACHE_D1`.
+The binding name used in your app's worker is `NEXT_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc

From dae34d3ebc563fbc4416c90ef31a4ce38e7f4502 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 19 Mar 2025 02:00:40 -0700
Subject: [PATCH 076/140] [cloudflare] Update caching docs (#98)

---
 pages/cloudflare/caching.mdx | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 1a6c469..8814995 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -5,10 +5,6 @@ import { Callout } from "nextra/components";
 
 `@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
 
-By default, all `fetch()` subrequests made in your Next.js app are cached. Refer to the [Next.js documentation](https://nextjs.org/docs/app/building-your-application/caching#opting-out-1) for information about how to disable caching for an individual subrequest, or for an entire route.
-
-[The cache persists across deployments](https://nextjs.org/docs/app/building-your-application/caching#data-cache). You are responsible for revalidating/purging this cache.
-
 Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
 
 <Callout>

From 5ff8bcac872538830356228bc9c8d5134ce1d102 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 24 Mar 2025 00:58:36 -0700
Subject: [PATCH 077/140] [cloudflare] NextAuth should just work from wrangler
 4.4.0 (#104)

---
 pages/cloudflare/howtos/NextAuth.mdx | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/pages/cloudflare/howtos/NextAuth.mdx b/pages/cloudflare/howtos/NextAuth.mdx
index 77b644e..3882eb5 100644
--- a/pages/cloudflare/howtos/NextAuth.mdx
+++ b/pages/cloudflare/howtos/NextAuth.mdx
@@ -2,6 +2,11 @@ import { Callout } from "nextra/components";
 
 ## [NextAuth.js](https://next-auth.js.org/)
 
+<Callout>
+  Starting from wrangler 4.4.0, the implementation of `createCipheriv` is available and NextAuth.js should
+  work out of the box.
+</Callout>
+
 NextAuth.js is an open-source authentication solution for Next.js applications.
 
 ### Solving a broken build

From 710827777ef6256e7c97773cfedebcf6707a2181 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 26 Mar 2025 08:02:27 -0700
Subject: [PATCH 078/140] docs(cloudflare): release 0.6 (#107)

Co-authored-by: Brendan Irvine-Broque <birvine-broque@cloudflare.com>
Co-authored-by: James <james@eli.cx>
Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/cloudflare/_meta.json                   |   7 +-
 pages/cloudflare/bindings.mdx                 |   1 -
 pages/cloudflare/caching.mdx                  | 347 +++++++++++++++---
 pages/cloudflare/community.mdx                |   1 -
 pages/cloudflare/examples.mdx                 |   1 -
 .../{ => former-releases}/0.2/_meta.json      |   0
 .../{ => former-releases}/0.2/bindings.mdx    |   1 -
 .../{ => former-releases}/0.2/caching.mdx     |   1 -
 .../{ => former-releases}/0.2/examples.mdx    |   1 -
 .../{ => former-releases}/0.2/get-started.mdx |   1 -
 .../{ => former-releases}/0.2/index.mdx       |   1 -
 .../{ => former-releases}/0.3/_meta.json      |   0
 .../{ => former-releases}/0.3/bindings.mdx    |   1 -
 .../{ => former-releases}/0.3/caching.mdx     |   1 -
 .../{ => former-releases}/0.3/examples.mdx    |   1 -
 .../{ => former-releases}/0.3/get-started.mdx |   1 -
 .../{ => former-releases}/0.3/index.mdx       |   3 +-
 .../cloudflare/former-releases/0.5/_meta.json |   7 +
 .../former-releases/0.5/bindings.mdx          |  74 ++++
 .../former-releases/0.5/caching.mdx           | 156 ++++++++
 .../former-releases/0.5/examples.mdx          |  24 ++
 .../former-releases/0.5/get-started.mdx       | 190 ++++++++++
 .../cloudflare/former-releases/0.5/index.mdx  |  73 ++++
 pages/cloudflare/former-releases/_meta.json   |   8 +
 .../migrate-from-0.2-to-0.3.mdx               |   1 -
 .../migrate-from-0.3-to-0.4.mdx               |   1 -
 .../migrate-from-0.4-to-0.5.mdx               |   0
 pages/cloudflare/get-started.mdx              |  20 +-
 pages/cloudflare/howtos/_meta.json            |   3 +-
 pages/cloudflare/howtos/dev.mdx               |   2 +-
 pages/cloudflare/howtos/image.mdx             |  64 ++++
 pages/cloudflare/index.mdx                    |  10 +-
 pages/cloudflare/migrate-from-0.5-to-0.6.mdx  |  40 ++
 pages/cloudflare/troubleshooting.mdx          |   1 -
 34 files changed, 959 insertions(+), 84 deletions(-)
 rename pages/cloudflare/{ => former-releases}/0.2/_meta.json (100%)
 rename pages/cloudflare/{ => former-releases}/0.2/bindings.mdx (98%)
 rename pages/cloudflare/{ => former-releases}/0.2/caching.mdx (98%)
 rename pages/cloudflare/{ => former-releases}/0.2/examples.mdx (96%)
 rename pages/cloudflare/{ => former-releases}/0.2/get-started.mdx (99%)
 rename pages/cloudflare/{ => former-releases}/0.2/index.mdx (99%)
 rename pages/cloudflare/{ => former-releases}/0.3/_meta.json (100%)
 rename pages/cloudflare/{ => former-releases}/0.3/bindings.mdx (98%)
 rename pages/cloudflare/{ => former-releases}/0.3/caching.mdx (98%)
 rename pages/cloudflare/{ => former-releases}/0.3/examples.mdx (97%)
 rename pages/cloudflare/{ => former-releases}/0.3/get-started.mdx (99%)
 rename pages/cloudflare/{ => former-releases}/0.3/index.mdx (98%)
 create mode 100644 pages/cloudflare/former-releases/0.5/_meta.json
 create mode 100644 pages/cloudflare/former-releases/0.5/bindings.mdx
 create mode 100644 pages/cloudflare/former-releases/0.5/caching.mdx
 create mode 100644 pages/cloudflare/former-releases/0.5/examples.mdx
 create mode 100644 pages/cloudflare/former-releases/0.5/get-started.mdx
 create mode 100644 pages/cloudflare/former-releases/0.5/index.mdx
 create mode 100644 pages/cloudflare/former-releases/_meta.json
 rename pages/cloudflare/{ => former-releases}/migrate-from-0.2-to-0.3.mdx (98%)
 rename pages/cloudflare/{ => former-releases}/migrate-from-0.3-to-0.4.mdx (97%)
 rename pages/cloudflare/{ => former-releases}/migrate-from-0.4-to-0.5.mdx (100%)
 create mode 100644 pages/cloudflare/howtos/image.mdx
 create mode 100644 pages/cloudflare/migrate-from-0.5-to-0.6.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index e0d3688..0b730ce 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -7,9 +7,6 @@
   "examples": "",
   "community": "Community projects",
   "troubleshooting": "",
-  "migrate-from-0.4-to-0.5": "Migrate from 0.4",
-  "migrate-from-0.3-to-0.4": "",
-  "0.3": "Release 0.3",
-  "migrate-from-0.2-to-0.3": "",
-  "0.2": "Release 0.2"
+  "migrate-from-0.5-to-0.6": "Migrate from 0.5 to 0.6",
+  "former-releases": "Former releases"
 }
diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index 558fb15..df0a480 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ### Bindings
diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 8814995..b3bed4d 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -1,25 +1,28 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
+import { Tabs } from "nextra/components";
 
 ## Caching
 
 `@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
 
-Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
-
-<Callout>
-  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
-  reflected globally, when using the default TTL of 60 seconds.
-</Callout>
-
 ### How to enable caching
 
 `@opennextjs/cloudflare` supports multiple caching mechanisms through a project's OpenNext configuration.
 
 #### Incremental Static Regeneration (ISR)
 
-The ISR adapter for Cloudflare uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
+There are two storage options to use for the incremental cache.
+
+- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/). Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
+- **R2 Object Storage:** A [cost-effective](https://developers.cloudflare.com/r2/pricing/) S3-compatible object storage option for large amounts of unstructured data. Data is stored in a single region, meaning cache interactions may be slower - this can be mitigated with a regional cache.
+
+<Callout>
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
+</Callout>
 
+<Tabs items={["Workers KV", "R2 Object Storage"]}>
+<Tabs.Tab>
 ##### 1. Create a KV namespace
 
 ```
@@ -28,68 +31,204 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 
 ##### 2. Add the KV namespace and Service Binding to your Worker
 
-The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
+The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc
 {
   // ...
+  "name": "<WORKER_NAME>",
   "kv_namespaces": [
     {
-      "binding": "NEXT_CACHE_WORKERS_KV",
+      "binding": "NEXT_INC_CACHE_KV",
       "id": "<BINDING_ID>",
     },
   ],
   "services": [
     {
-      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "binding": "WORKER_SELF_REFERENCE",
       "service": "<WORKER_NAME>",
     },
   ],
 }
 ```
 
-#### 3. Configure the cache
+##### 3. Configure the cache
 
-In your project's OpenNext config, enable the KV cache and set up a queue.
+In your project's OpenNext config, enable the KV cache.
 
-The memory queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests on a per-isolate basis. There might still be duplicate requests under high traffic or across regions.
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+// ...
 
-<Callout type="warning">
-  The memory queue provided by `@opennextjs/cloudflare` is not fully suitable for production deployments, you
-  can use it at your own risk!
-</Callout>
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  // ...
+});
+```
+
+</Tabs.Tab>
+
+<Tabs.Tab>
+
+##### 1. Create an R2 Bucket
+
+```
+npx wrangler@latest r2 bucket create <YOUR_BUCKET_NAME>
+```
+
+##### 2. Add the R2 Bucket and Service Binding to your Worker
+
+The binding name used in your app's worker is `NEXT_INC_CACHE_R2_BUCKET`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+The prefix used by the R2 bucket can be configured with the `NEXT_INC_CACHE_R2_PREFIX` environment variable, and defaults to `incremental-cache`.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "name": "<WORKER_NAME>",
+  "r2_buckets": [
+    {
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
+      "preview_bucket_name": "<PREVIEW_BUCKET_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the R2 cache.
+
+You can optionally setup a regional cache to use with the R2 incremental cache. This will enable faster retrieval of cache entries and reduce the amount of requests being sent to object storage.
+
+The regional cache has two modes:
+
+- `short-lived`: Responses are re-used for up to a minute.
+- `long-lived`: Fetch responses are re-used until revalidated, and ISR/SSG responses are re-used for up to 30 minutes.
+
+Additionally, lazy updating of the regional cache can be enabled with the `shouldLazilyUpdateOnCacheHit` option. When requesting data from the cache, it sends a background request to the R2 bucket to get the latest entry. This is enabled by default for the `long-lived` mode.
 
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
-import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+// ...
 
+// With regional cache enabled:
 export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
-  queue: memoryQueue,
+  incrementalCache: withRegionalCache(r2IncrementalCache, {
+    mode: "long-lived",
+    shouldLazilyUpdateOnCacheHit: true,
+  }),
+  // ...
+});
+
+// Without regional cache:
+export default defineCloudflareConfig({
+  incrementalCache: r2IncrementalCache,
+  // ...
+});
+```
+
+</Tabs.Tab>
+</Tabs>
+
+##### 4. Configure the queue
+
+In your project's OpenNext config, enable the cache and set up a queue.
+
+The Durable Object Queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests.
+By default there will be a maximum of 10 instance of the Durables Object Queue and they can each process up to 5 requests in parallel, for up to 50 concurrent ISR revalidations.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+// ...
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+
+export default defineCloudflareConfig({
+  // ...
+  queue: doQueue,
 });
 ```
 
+You will also need to add some binding to your `wrangler.jsonc` file.
+
+```jsonc
+"durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_QUEUE",
+        "class_name": "DurableObjectQueueHandler"
+      }
+    ]
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DurableObjectQueueHandler"]
+    }
+  ],
+```
+
+You can customize the behaviors of the queue with environment variables:
+
+- The max number of revalidations that can be processed by an instance of durable object at the same time (`NEXT_CACHE_DO_QUEUE_MAX_REVALIDATION`)
+- The max time in milliseconds that a revalidation can take before being considered as failed (`NEXT_CACHE_DO_QUEUE_REVALIDATION_TIMEOUT_MS`)
+- The amount of time after which a revalidation will be attempted again if it failed. If it fails again it will exponentially back off until it reaches the max retry interval (`NEXT_CACHE_DO_QUEUE_RETRY_INTERVAL_MS`)
+- The maximum number of attempts that can be made to revalidate a path (`NEXT_CACHE_DO_QUEUE_MAX_NUM_REVALIDATIONS`)
+- Disable SQLite for this durable object. It should only be used if your incremental cache is not eventually consistent (`NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE`)
+
 <Callout>
-  The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in
-  production. We are actively working on a solution that will be suitable for production.
+  There is 2 additional modes that you can use for the queue `direct` and the memory queue
+
+- The memory queue will dedupe request but only on a per isolate basis. It is not fully suitable for production deployments, you
+  can use it at your own risk!
+
+- The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in
+  production. It only works in preview mode (i.e. `wrangler dev`)
+
+  For apps using the Page Router, `res.revalidate` requires to provide a self reference service binding named `WORKER_SELF_REFERENCE`.
+
 </Callout>
 
 #### On-Demand Revalidation
 
-The tag revalidation mechanism uses a [Cloudflare D1](https://developers.cloudflare.com/d1/) database as its backing store for information about tags, paths, and revalidation times.
+The tag revalidation mechanism can use either a [Cloudflare D1](https://developers.cloudflare.com/d1/) database or [Durable Objects](https://developers.cloudflare.com/durable-objects/) with `SqliteStorage` as its backing store for information about tags, paths, and revalidation times.
 
 To use on-demand revalidation, you should also follow the [ISR setup steps](#incremental-static-regeneration-isr).
 
 <Callout>
   If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
+  You can also skip this step if your app doesn't to use `revalidateTag` nor `revalidatePath`.
 </Callout>
 
+There are 3 different options to choose from for the tag cache: `d1NextTagCache`, `doShardedTagCache` and `d1TagCache`.
+Which one to choose should be based on two key factors:
+
+1. **Expected Load**: Consider the volume of traffic or data you anticipate.
+2. **Usage of** `revalidateTag` / `revalidatePath`: Evaluate how frequently these features will be utilized.
+
+If either of these factors is significant, opting for a sharded database is recommended. Additionally, incorporating a regional cache can further enhance performance.
+
+<Tabs items={["D1NextTagCache", "doShardedTagCache", "D1TagCache"]}>
+<Tabs.Tab>
 ##### 1. Create a D1 database and Service Binding
 
-The binding name used in your app's worker is `NEXT_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc
@@ -97,36 +236,78 @@ The binding name used in your app's worker is `NEXT_CACHE_D1`. The service bindi
   // ...
   "d1_databases": [
     {
-      "binding": "NEXT_CACHE_D1",
+      "binding": "NEXT_TAG_CACHE_D1",
       "database_id": "<DATABASE_ID>",
       "database_name": "<DATABASE_NAME>",
     },
   ],
   "services": [
     {
-      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "binding": "WORKER_SELF_REFERENCE",
       "service": "<WORKER_NAME>",
     },
   ],
 }
 ```
 
-##### 2. Create tables for tag revalidations
+##### 2. Create table for tag revalidations
 
-The D1 tag cache requires two tables; one that keeps a record of the tag/path mappings, and another that tracks revalidation times.
+The D1 tag cache requires a `revalidations` table that tracks On-Demand revalidation times.
 
-For the tag mappings, the default table name is `tags`, and can be configured by setting the `NEXT_CACHE_D1_TAGS_TABLE` environment variable to a string.
+##### 3. Configure the cache
 
-For the revalidation times, the default table name is `revalidations` and can be configured by setting the `NEXT_CACHE_D1_REVALIDATIONS_TABLE` environment variable to a string.
+In your project's OpenNext config, enable the KV cache and set up a queue (see above). The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
 
-Wrangler can be used to create a table with it's [execute](https://developers.cloudflare.com/d1/wrangler-commands/#d1-execute) option. Ensure that you create a table for both your local dev database and your remote database.
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import d1NextTagCache from "@opennextjs/cloudflare/d1-next-tag-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
 
-```sh
-wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS tags (tag TEXT NOT NULL, path TEXT NOT NULL, UNIQUE(tag, path) ON CONFLICT REPLACE)"
-wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS revalidations (tag TEXT NOT NULL, revalidatedAt INTEGER NOT NULL, UNIQUE(tag) ON CONFLICT REPLACE)"
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: d1NextTagCache,
+  queue: memoryQueue,
+});
 ```
 
-##### 3. Configure the cache
+</Tabs.Tab>
+
+<Tabs.Tab>
+##### 1. Create a Durable Object and Service Binding
+The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "durable_objects": [
+    {
+      "name": "NEXT_CACHE_REVALIDATION_DURABLE_OBJECT",
+      "class_name": "DurableObjectQueueHandler",
+    },
+    {
+      "name": "NEXT_CACHE_DO_SHARDED",
+      "class_name": "DOShardedTagCache",
+    },
+  ],
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 2. Configure the cache
 
 In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
 
@@ -134,9 +315,75 @@ In your project's OpenNext config, enable the KV cache and set up a queue. The q
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
 import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
-import d1TagCache from "@opennextjs/cloudflare/d1-tag-cache";
+import doShardedTagCache from "@opennextjs/cloudflare/do-sharded-tag-cache";
 import memoryQueue from "@opennextjs/cloudflare/memory-queue";
 
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: doShardedTagCache({ baseShardSize: 12, regionalCache: true }),
+  queue: memoryQueue,
+});
+```
+
+doShardedTagCache tahes the following options:
+
+- `baseShardSize` - The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the one you define in your app) will be split in different shards
+- `regionalCache` - Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
+- `regionalCacheTtlSec` - The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
+- `enableShardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
+- `shardReplicationOptions.numberOfSoftReplicas`: Number of replicas for the soft tag shards
+- `shardReplicationOptions.numberOfHardReplicas`: Number of replicas for the hard tag shards
+- `maxWriteRetries`: The number of retries to perform when writing tags
+
+</Tabs.Tab>
+
+<Tabs.Tab>
+
+<Callout>
+  The `d1TagCache` is not recommended for production use, as it does not scale well with the number of tags.
+</Callout>
+
+##### 1. Create a D1 database and Service Binding
+
+The binding name used in your app's worker is `NEXT_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "name": "<WORKER_NAME>",
+  "d1_databases": [
+    {
+      "binding": "NEXT_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+The D1 database uses two tables, created when initialising the cache:
+
+- the "tags" table keeps a record of the tag/path mappings
+- the "revalidations" table tracks revalidation times
+
+##### 2. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import d1TagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-tag-cache";
+import memoryQueue from "@opennextjs/cloudflare/overrides/queue/memory-queue";
+
 export default defineCloudflareConfig({
   incrementalCache: kvIncrementalCache,
   tagCache: d1TagCache,
@@ -144,14 +391,26 @@ export default defineCloudflareConfig({
 });
 ```
 
-##### 4. Initialise the cache during deployments
+##### 3. Initialise the cache during deployments
 
-In order for the cache to be properly initialised with the build-time revalidation data, you need to setup a command that runs as part of your deploy step.
+In order for the cache to be properly initialised with the build-time revalidation data, you need to run a command as part of your deploy step. This should be run as part of each deployment to ensure that the cache is being populated with each build's data.
+
+To populate remote bindings and deploy your application at the same time, you can use the `deploy` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
+
+```sh
+# Populate remote and deploy.
+opennextjs-cloudflare deploy
+
+# Populate local and start dev server.
+opennextjs-cloudflare preview
+```
 
-OpenNext will generate an SQL file during the build that can be used to setup your D1 database.
+It is possible to only populate the cache without any other steps with the `populateCache` command.
 
 ```sh
-wrangler d1 execute NEXT_CACHE_D1 --file .open-next/cloudflare/cache-assets-manifest.sql
+# The target is passed as an option, either `local` or `remote`.
+opennextjs-cloudflare populateCache local
 ```
 
-This should be run as part of each deployment to ensure that the cache is being populated with each build's initial revalidation data.
+</Tabs.Tab>
+</Tabs>
diff --git a/pages/cloudflare/community.mdx b/pages/cloudflare/community.mdx
index 985b961..3ccd11f 100644
--- a/pages/cloudflare/community.mdx
+++ b/pages/cloudflare/community.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ## Projects from the community
diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index bf5167b..e44bee0 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ## Examples
diff --git a/pages/cloudflare/0.2/_meta.json b/pages/cloudflare/former-releases/0.2/_meta.json
similarity index 100%
rename from pages/cloudflare/0.2/_meta.json
rename to pages/cloudflare/former-releases/0.2/_meta.json
diff --git a/pages/cloudflare/0.2/bindings.mdx b/pages/cloudflare/former-releases/0.2/bindings.mdx
similarity index 98%
rename from pages/cloudflare/0.2/bindings.mdx
rename to pages/cloudflare/former-releases/0.2/bindings.mdx
index f42790d..36d02b9 100644
--- a/pages/cloudflare/0.2/bindings.mdx
+++ b/pages/cloudflare/former-releases/0.2/bindings.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ### Bindings
diff --git a/pages/cloudflare/0.2/caching.mdx b/pages/cloudflare/former-releases/0.2/caching.mdx
similarity index 98%
rename from pages/cloudflare/0.2/caching.mdx
rename to pages/cloudflare/former-releases/0.2/caching.mdx
index e507e21..fab6edf 100644
--- a/pages/cloudflare/0.2/caching.mdx
+++ b/pages/cloudflare/former-releases/0.2/caching.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ## Caching
diff --git a/pages/cloudflare/0.2/examples.mdx b/pages/cloudflare/former-releases/0.2/examples.mdx
similarity index 96%
rename from pages/cloudflare/0.2/examples.mdx
rename to pages/cloudflare/former-releases/0.2/examples.mdx
index 4fd3469..6dd75b2 100644
--- a/pages/cloudflare/0.2/examples.mdx
+++ b/pages/cloudflare/former-releases/0.2/examples.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ## Examples
diff --git a/pages/cloudflare/0.2/get-started.mdx b/pages/cloudflare/former-releases/0.2/get-started.mdx
similarity index 99%
rename from pages/cloudflare/0.2/get-started.mdx
rename to pages/cloudflare/former-releases/0.2/get-started.mdx
index ea1482e..2e16213 100644
--- a/pages/cloudflare/0.2/get-started.mdx
+++ b/pages/cloudflare/former-releases/0.2/get-started.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ### Get Started
diff --git a/pages/cloudflare/0.2/index.mdx b/pages/cloudflare/former-releases/0.2/index.mdx
similarity index 99%
rename from pages/cloudflare/0.2/index.mdx
rename to pages/cloudflare/former-releases/0.2/index.mdx
index 2c39400..a3f53c2 100644
--- a/pages/cloudflare/0.2/index.mdx
+++ b/pages/cloudflare/former-releases/0.2/index.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ## Cloudflare
diff --git a/pages/cloudflare/0.3/_meta.json b/pages/cloudflare/former-releases/0.3/_meta.json
similarity index 100%
rename from pages/cloudflare/0.3/_meta.json
rename to pages/cloudflare/former-releases/0.3/_meta.json
diff --git a/pages/cloudflare/0.3/bindings.mdx b/pages/cloudflare/former-releases/0.3/bindings.mdx
similarity index 98%
rename from pages/cloudflare/0.3/bindings.mdx
rename to pages/cloudflare/former-releases/0.3/bindings.mdx
index d0af91d..1b3164d 100644
--- a/pages/cloudflare/0.3/bindings.mdx
+++ b/pages/cloudflare/former-releases/0.3/bindings.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ### Bindings
diff --git a/pages/cloudflare/0.3/caching.mdx b/pages/cloudflare/former-releases/0.3/caching.mdx
similarity index 98%
rename from pages/cloudflare/0.3/caching.mdx
rename to pages/cloudflare/former-releases/0.3/caching.mdx
index 47e9168..1314873 100644
--- a/pages/cloudflare/0.3/caching.mdx
+++ b/pages/cloudflare/former-releases/0.3/caching.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ## Caching
diff --git a/pages/cloudflare/0.3/examples.mdx b/pages/cloudflare/former-releases/0.3/examples.mdx
similarity index 97%
rename from pages/cloudflare/0.3/examples.mdx
rename to pages/cloudflare/former-releases/0.3/examples.mdx
index d75a1f6..e44bee0 100644
--- a/pages/cloudflare/0.3/examples.mdx
+++ b/pages/cloudflare/former-releases/0.3/examples.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ## Examples
diff --git a/pages/cloudflare/0.3/get-started.mdx b/pages/cloudflare/former-releases/0.3/get-started.mdx
similarity index 99%
rename from pages/cloudflare/0.3/get-started.mdx
rename to pages/cloudflare/former-releases/0.3/get-started.mdx
index de6091d..1345e34 100644
--- a/pages/cloudflare/0.3/get-started.mdx
+++ b/pages/cloudflare/former-releases/0.3/get-started.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
 
 ### Get Started
diff --git a/pages/cloudflare/0.3/index.mdx b/pages/cloudflare/former-releases/0.3/index.mdx
similarity index 98%
rename from pages/cloudflare/0.3/index.mdx
rename to pages/cloudflare/former-releases/0.3/index.mdx
index 79748c6..b44423e 100644
--- a/pages/cloudflare/0.3/index.mdx
+++ b/pages/cloudflare/former-releases/0.3/index.mdx
@@ -1,6 +1,5 @@
-import { SITE } from "../../../config";
 import { Callout } from "nextra/components";
-import WindowsSupport from "../../../shared/WindowsSupport.mdx";
+import WindowsSupport from "../../../../shared/WindowsSupport.mdx";
 
 ## Cloudflare
 
diff --git a/pages/cloudflare/former-releases/0.5/_meta.json b/pages/cloudflare/former-releases/0.5/_meta.json
new file mode 100644
index 0000000..53a20a0
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/_meta.json
@@ -0,0 +1,7 @@
+{
+  "index": "Overview",
+  "get-started": "",
+  "bindings": "",
+  "caching": "",
+  "examples": ""
+}
diff --git a/pages/cloudflare/former-releases/0.5/bindings.mdx b/pages/cloudflare/former-releases/0.5/bindings.mdx
new file mode 100644
index 0000000..df0a480
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/bindings.mdx
@@ -0,0 +1,74 @@
+import { Callout } from "nextra/components";
+
+### Bindings
+
+[Bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](https://developers.cloudflare.com/r2/) bucket.
+
+#### How to configure your Next.js app so it can access bindings
+
+Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started#3-create-a-wranglerjson-file).
+
+#### How to access bindings in your Next.js app
+
+You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) from any route of your Next.js app via `getCloudflareContext`:
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+  let responseText = "Hello World";
+
+  const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
+  await myKv.put("foo", "bar");
+  const foo = await myKv.get("foo");
+
+  return new Response(foo);
+}
+```
+
+<Callout type='info'>
+	`getCloudflareContext` can only be used in SSG routes in "async mode" (making it return a promise), to run the function in such a way simply provide an options argument with `async` set to `true`:
+	```js
+	const context = await getCloudflareContext({ async: true });
+	```
+
+    **WARNING**: During SSG caution is advised since secrets (stored in `.dev.vars` files) and local development
+    values from bindings (like values saved in a local KV) will be used for the pages static generation.
+
+</Callout>
+
+#### How to add bindings to your Worker
+
+Add bindings to your Worker by adding them to your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+
+## TypeScript type declarations for bindings
+
+To ensure that the `env` object from `getCloudflareContext().env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
+
+```
+npx wrangler types --experimental-include-runtime
+```
+
+This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
+
+If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
+
+```bash
+npx wrangler types --experimental-include-runtime="./runtime.d.ts"
+```
+
+To ensure that your types are always up-to-date, make sure to run `wrangler types --experimental-include-runtime` after any changes to your config file.
+
+## Other Cloudflare APIs (`cf`, `ctx`)
+
+You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/get-cloudflare-context.ts):
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+  const { env, cf, ctx } = getCloudflareContext();
+
+  // ...
+}
+```
diff --git a/pages/cloudflare/former-releases/0.5/caching.mdx b/pages/cloudflare/former-releases/0.5/caching.mdx
new file mode 100644
index 0000000..c5eed52
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/caching.mdx
@@ -0,0 +1,156 @@
+import { Callout } from "nextra/components";
+
+## Caching
+
+`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
+
+Next.js primes the cache at build time. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
+
+<Callout>
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
+</Callout>
+
+### How to enable caching
+
+`@opennextjs/cloudflare` supports multiple caching mechanisms through a project's OpenNext configuration.
+
+#### Incremental Static Regeneration (ISR)
+
+The ISR adapter for Cloudflare uses [Workers KV](https://developers.cloudflare.com/kv/) as the cache for your Next.js app. Workers KV is [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
+
+##### 1. Create a KV namespace
+
+```
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
+```
+
+##### 2. Add the KV namespace and Service Binding to your Worker
+
+The binding name used in your app's worker is `NEXT_CACHE_WORKERS_KV`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "kv_namespaces": [
+    {
+      "binding": "NEXT_CACHE_WORKERS_KV",
+      "id": "<BINDING_ID>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+#### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue.
+
+The memory queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests on a per-isolate basis. There might still be duplicate requests under high traffic or across regions.
+
+<Callout type="warning">
+  The memory queue provided by `@opennextjs/cloudflare` is not fully suitable for production deployments, you
+  can use it at your own risk!
+</Callout>
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  queue: memoryQueue,
+});
+```
+
+<Callout>
+  The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in
+  production. We are actively working on a solution that will be suitable for production.
+</Callout>
+
+#### On-Demand Revalidation
+
+The tag revalidation mechanism uses a [Cloudflare D1](https://developers.cloudflare.com/d1/) database as its backing store for information about tags, paths, and revalidation times.
+
+To use on-demand revalidation, you should also follow the [ISR setup steps](#incremental-static-regeneration-isr).
+
+<Callout>
+  If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
+</Callout>
+
+##### 1. Create a D1 database and Service Binding
+
+The binding name used in your app's worker is `NEXT_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "d1_databases": [
+    {
+      "binding": "NEXT_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "NEXT_CACHE_REVALIDATION_WORKER",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 2. Create tables for tag revalidations
+
+The D1 tag cache requires two tables; one that keeps a record of the tag/path mappings, and another that tracks revalidation times.
+
+For the tag mappings, the default table name is `tags`, and can be configured by setting the `NEXT_CACHE_D1_TAGS_TABLE` environment variable to a string.
+
+For the revalidation times, the default table name is `revalidations` and can be configured by setting the `NEXT_CACHE_D1_REVALIDATIONS_TABLE` environment variable to a string.
+
+Wrangler can be used to create a table with it's [execute](https://developers.cloudflare.com/d1/wrangler-commands/#d1-execute) option. Ensure that you create a table for both your local dev database and your remote database.
+
+```sh
+wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS tags (tag TEXT NOT NULL, path TEXT NOT NULL, UNIQUE(tag, path) ON CONFLICT REPLACE)"
+wrangler d1 execute NEXT_CACHE_D1 --command "CREATE TABLE IF NOT EXISTS revalidations (tag TEXT NOT NULL, revalidatedAt INTEGER NOT NULL, UNIQUE(tag) ON CONFLICT REPLACE)"
+```
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import d1TagCache from "@opennextjs/cloudflare/d1-tag-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: d1TagCache,
+  queue: memoryQueue,
+});
+```
+
+##### 4. Initialise the cache during deployments
+
+In order for the cache to be properly initialised with the build-time revalidation data, you need to setup a command that runs as part of your deploy step.
+
+OpenNext will generate an SQL file during the build that can be used to setup your D1 database.
+
+```sh
+wrangler d1 execute NEXT_CACHE_D1 --file .open-next/cloudflare/cache-assets-manifest.sql
+```
+
+This should be run as part of each deployment to ensure that the cache is being populated with each build's initial revalidation data.
diff --git a/pages/cloudflare/former-releases/0.5/examples.mdx b/pages/cloudflare/former-releases/0.5/examples.mdx
new file mode 100644
index 0000000..e44bee0
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/examples.mdx
@@ -0,0 +1,24 @@
+import { Callout } from "nextra/components";
+
+## Examples
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+### Basic starter projects
+
+Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
+
+- [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [_`middleware`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [_`vercel-blog-starter`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
+
+You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
+
+### Next.js Commerce Demo
+
+The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
diff --git a/pages/cloudflare/former-releases/0.5/get-started.mdx b/pages/cloudflare/former-releases/0.5/get-started.mdx
new file mode 100644
index 0000000..f1d70dd
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/get-started.mdx
@@ -0,0 +1,190 @@
+import { Callout } from "nextra/components";
+
+### Get Started
+
+#### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```sh
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+#### Existing Next.js apps
+
+##### 1. Install @opennextjs/cloudflare
+
+First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
+
+```sh
+npm install --save-dev @opennextjs/cloudflare@latest
+```
+
+##### 2. Install Wrangler
+
+Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
+
+```sh
+npm install --save-dev wrangler@latest
+```
+
+<Callout>
+  You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+</Callout>
+
+##### 3. Create a wrangler configuration file
+
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
+</Callout>
+
+A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
+application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+
+You can create one yourself in the root directory of your Next.js app with the name `wrangler.jsonc` and the following content:
+
+```jsonc
+{
+  "$schema": "node_modules/wrangler/config-schema.json",
+  "main": ".open-next/worker.js",
+  "name": "my-app",
+  "compatibility_date": "2024-12-30",
+  "compatibility_flags": ["nodejs_compat"],
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+  },
+  "kv_namespaces": [
+    // Create a KV binding with the binding name "NEXT_CACHE_WORKERS_KV"
+    // to enable the KV based caching:
+    // {
+    //   "binding": "NEXT_CACHE_WORKERS_KV",
+    //   "id": "<BINDING_ID>"
+    // }
+  ],
+}
+```
+
+<Callout>
+  As shown above: - You must enable the [`nodejs_compat` compatibility
+  flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility
+  date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
+  later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
+  should also not be changed unless you modify the build output result in some way - You can add a binding
+  named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching
+  docs](/cloudflare/caching)
+</Callout>
+
+##### 4. Add an `open-next.config.ts` file
+
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
+</Callout>
+
+Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+});
+```
+
+<Callout>
+  To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the
+  `@opennextjs/aws` NPM package as a dev dependency.
+</Callout>
+
+##### 5. Add a `.dev.vars` file
+
+Then, add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
+
+```text
+NEXTJS_ENV=development
+```
+
+The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
+
+##### 6. Update the `package.json` file
+
+Add the following to the scripts field of your `package.json` file:
+
+```json
+"preview": "opennextjs-cloudflare && wrangler dev",
+"deploy": "opennextjs-cloudflare && wrangler deploy",
+"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
+```
+
+- `npm run preview`: Builds your app and serves it locally, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+- `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
+
+##### 7. Add caching with Workers KV
+
+See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
+
+##### 8. Remove any `export const runtime = "edge";` if present
+
+Before deploying your app, remove the `export const runtime = "edge";` line from any of your source files.
+
+The edge runtime is not supported yet with `@opennextjs/cloudflare`.
+
+##### 9. Add `.open-next` to `.gitignore`
+
+You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
+
+##### 10. Remove `@cloudflare/next-on-pages` (if necessary)
+
+If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
+
+Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) package as well as the [`eslint-plugin-next-on-pages`](https://www.npmjs.com/package/eslint-plugin-next-on-pages) package if present.
+
+Remove any reference of these packages from your source and configuration files.
+This includes:
+
+- `setupDevPlatform()` calls in your Next.js config file
+- `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+  (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+- next-on-pages eslint rules set in your Eslint config file
+
+##### 11. Develop locally
+
+You can continue to run `next dev` when developing locally.
+
+Modify your Next.js configuration file to import and call the `initOpenNextCloudflareForDev` utility
+from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev server can optimally integrate with the open-next cloudflare adapter and it is necessary for using bindings during local development.
+
+This is an example of a Next.js configuration file calling the utility:
+
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+};
+
+export default nextConfig;
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
+```
+
+After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
+In step 3, we also added the `npm run preview`, which allows you to quickly preview your app running locally in the Workers runtime,
+rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
+
+##### 12. Deploy to Cloudflare Workers
+
+Either deploy via the command line:
+
+```sh
+npm run deploy
+```
+
+Or [connect a Github or Gitlab repository](https://developers.cloudflare.com/workers/ci-cd/), and Cloudflare will automatically build and deploy each pull request you merge to your production branch.
diff --git a/pages/cloudflare/former-releases/0.5/index.mdx b/pages/cloudflare/former-releases/0.5/index.mdx
new file mode 100644
index 0000000..cdb70bb
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.5/index.mdx
@@ -0,0 +1,73 @@
+import { Callout } from "nextra/components";
+import WindowsSupport from "../../../../shared/WindowsSupport.mdx";
+
+## Cloudflare
+
+The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
+
+<Callout>
+[`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
+
+You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
+
+</Callout>
+
+### Get Started
+
+##### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+##### Existing Next.js apps
+
+Follow the guide [here](/cloudflare/get-started) to use [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) with an existing Next.js app.
+
+### Supported Next.js runtimes
+
+Next.js has [two "runtimes"](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) — "Edge" and "Node.js". When you use `@opennextjs/cloudflare`, your app should use the Node.js runtime, which is more fully featured, and allows you to use the [Node.js APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) that are provided by the Cloudflare Workers runtime.
+
+This is an important difference from `@cloudflare/next-on-pages`, which only supports the "Edge" runtime. The Edge Runtime code in Next.js [intentionally constrains which APIs from Node.js can be used](https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/plugins/middleware-plugin.ts#L820), and the "Edge" runtime does not support all Next.js features.
+
+### Supported Next.js versions
+
+`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 15 and the latest minor of Next.js 14.
+
+To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
+
+### Supported Next.js features
+
+Some Next.js features are not yet supported are not fully tested.
+We will update the list as we progress towards releasing 1.0.
+
+- [x] [App Router](https://nextjs.org/docs/app)
+- [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
+- [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)
+- [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
+- [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
+- [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
+- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
+- [x] [Pages Router](https://nextjs.org/docs/pages)
+- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration) <sup>1</sup>
+- [x] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
+- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
+
+<sup>1</sup> Only the `direct` mode is supported at the moment, and is not suitable for production.
+
+We welcome both contributions and feedback!
+
+### Windows support
+
+<WindowsSupport />
+
+### How `@opennextjs/cloudflare` Works
+
+The OpenNext Cloudflare adapter works by taking the Next.js build output and transforming it, so that it can run in Cloudflare Workers.
+
+When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running the `build` script in your `package.json`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
+
+You can view the code for `@opennextjs/cloudflare` [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
diff --git a/pages/cloudflare/former-releases/_meta.json b/pages/cloudflare/former-releases/_meta.json
new file mode 100644
index 0000000..fcfac6d
--- /dev/null
+++ b/pages/cloudflare/former-releases/_meta.json
@@ -0,0 +1,8 @@
+{
+  "0.5": "Release 0.5",
+  "migrate-from-0.4-to-0.5": "",
+  "migrate-from-0.3-to-0.4": "",
+  "0.3": "Release 0.3",
+  "migrate-from-0.2-to-0.3": "",
+  "0.2": "Release 0.2"
+}
diff --git a/pages/cloudflare/migrate-from-0.2-to-0.3.mdx b/pages/cloudflare/former-releases/migrate-from-0.2-to-0.3.mdx
similarity index 98%
rename from pages/cloudflare/migrate-from-0.2-to-0.3.mdx
rename to pages/cloudflare/former-releases/migrate-from-0.2-to-0.3.mdx
index e43347a..e213c6f 100644
--- a/pages/cloudflare/migrate-from-0.2-to-0.3.mdx
+++ b/pages/cloudflare/former-releases/migrate-from-0.2-to-0.3.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ### Migrate from 0.2 to 0.3
diff --git a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx b/pages/cloudflare/former-releases/migrate-from-0.3-to-0.4.mdx
similarity index 97%
rename from pages/cloudflare/migrate-from-0.3-to-0.4.mdx
rename to pages/cloudflare/former-releases/migrate-from-0.3-to-0.4.mdx
index ca8da55..70fb364 100644
--- a/pages/cloudflare/migrate-from-0.3-to-0.4.mdx
+++ b/pages/cloudflare/former-releases/migrate-from-0.3-to-0.4.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ### Migrate from 0.3 to 0.4
diff --git a/pages/cloudflare/migrate-from-0.4-to-0.5.mdx b/pages/cloudflare/former-releases/migrate-from-0.4-to-0.5.mdx
similarity index 100%
rename from pages/cloudflare/migrate-from-0.4-to-0.5.mdx
rename to pages/cloudflare/former-releases/migrate-from-0.4-to-0.5.mdx
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 8a7c29e..5b1e9b0 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ### Get Started
@@ -56,11 +55,18 @@ You can create one yourself in the root directory of your Next.js app with the n
     "directory": ".open-next/assets",
     "binding": "ASSETS",
   },
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      // The service should match the "name" of your worker
+      "service": "my-app",
+    },
+  ],
   "kv_namespaces": [
-    // Create a KV binding with the binding name "NEXT_CACHE_WORKERS_KV"
+    // Create a KV binding with the binding name "NEXT_INC_CACHE_KV"
     // to enable the KV based caching:
     // {
-    //   "binding": "NEXT_CACHE_WORKERS_KV",
+    //   "binding": "NEXT_INC_CACHE_KV",
     //   "id": "<BINDING_ID>"
     // }
   ],
@@ -73,7 +79,7 @@ You can create one yourself in the root directory of your Next.js app with the n
   date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
   later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
   should also not be changed unless you modify the build output result in some way - You can add a binding
-  named `NEXT_CACHE_WORKERS_KV` to make use of Next.js' caching as described in the [Caching
+  named `NEXT_INC_CACHE_KV` to make use of Next.js' caching as described in the [Caching
   docs](/cloudflare/caching)
 </Callout>
 
@@ -88,7 +94,7 @@ Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the ro
 
 ```ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
 
 export default defineCloudflareConfig({
   incrementalCache: kvIncrementalCache,
@@ -115,8 +121,8 @@ The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.
 Add the following to the scripts field of your `package.json` file:
 
 ```json
-"preview": "opennextjs-cloudflare && wrangler dev",
-"deploy": "opennextjs-cloudflare && wrangler deploy",
+"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
+"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
 "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
 ```
 
diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 2dae0f9..e4803ff 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -2,5 +2,6 @@
   "NextAuth": "NextAuth",
   "stripeAPI": "Stripe API",
   "dev": "Development workflow",
-  "env-vars": "Enviroment Variables"
+  "env-vars": "Enviroment Variables",
+  "image": "Image Optimization"
 }
diff --git a/pages/cloudflare/howtos/dev.mdx b/pages/cloudflare/howtos/dev.mdx
index a8a901f..0d5b39f 100644
--- a/pages/cloudflare/howtos/dev.mdx
+++ b/pages/cloudflare/howtos/dev.mdx
@@ -38,7 +38,7 @@ initOpenNextCloudflareForDev();
 
 ### `wrangler dev` and `wrangler deploy`
 
-After you've finished iterating on your Next.js application with `next dev`, you can convert it to a Cloudflare Worker by running the `opennextjs-cloudflare` command. This will generate the Worker code in the `.open-next` directory.
+After you've finished iterating on your Next.js application with `next dev`, you can convert it to a Cloudflare Worker by running the `opennextjs-cloudflare build` command. This will generate the Worker code in the `.open-next` directory.
 
 You can then preview the app locally in the Cloudflare Workers runtime or deploy it to the Cloudflare network.
 
diff --git a/pages/cloudflare/howtos/image.mdx b/pages/cloudflare/howtos/image.mdx
new file mode 100644
index 0000000..fd4e2ae
--- /dev/null
+++ b/pages/cloudflare/howtos/image.mdx
@@ -0,0 +1,64 @@
+import { Callout } from "nextra/components";
+
+## Image Optimization
+
+Next.js has a builtin [`<Image>` component](https://nextjs.org/docs/pages/building-your-application/optimizing/images) to automatically optimize your images for faster page loads.
+
+In this post, we will look at how to integrate the Next.js image optimization with [Cloudflare Images](https://developers.cloudflare.com/images)
+
+### Enable Cloudflare Images
+
+You first need to [enable Cloudflare Images](https://developers.cloudflare.com/images/get-started/#enable-transformations-on-your-zone) for your zone.
+
+It is strongly advised to restrict the image origins that can be transformed to where your images are hosted, i.e. a [R2 bucket](https://developers.cloudflare.com/r2/buckets/).
+
+### Use a custom loader
+
+You then need to configure your Next application to use a custom loader for Cloudflare Images.
+
+Create an `image-loader.ts` at the root of your application:
+
+```ts
+// image-loader.ts
+import type { ImageLoaderProps } from "next/image";
+
+const normalizeSrc = (src: string) => {
+  return src.startsWith("/") ? src.slice(1) : src;
+};
+
+export default function cloudflareLoader({ src, width, quality }: ImageLoaderProps) {
+  if (process.env.NODE_ENV === "development") {
+    // Serve the original image when using `next dev`
+    return src;
+  }
+  const params = [`width=${width}`];
+  if (quality) {
+    params.push(`quality=${quality}`);
+  }
+  const paramsString = params.join(",");
+  return `/cdn-cgi/image/${paramsString}/${normalizeSrc(src)}`;
+}
+```
+
+You will then need to update your app configuration to use this loader:
+
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  // ...
+  images: {
+    loader: "custom",
+    loaderFile: "./image-loader.ts",
+  },
+};
+
+export default nextConfig;
+```
+
+<Callout type="info">
+  Images using the cloudflare loader are served directly without going through the middleware.
+</Callout>
+
+See more details in the [Cloudfare Images documentation](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/).
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 8069067..5cc52a6 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 import WindowsSupport from "../../shared/WindowsSupport.mdx";
 
@@ -6,13 +5,6 @@ import WindowsSupport from "../../shared/WindowsSupport.mdx";
 
 The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) adapter lets you deploy Next.js apps to [Cloudflare Workers](https://developers.cloudflare.com/workers) using the [Node.js "runtime" from Next.js](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes).
 
-<Callout>
-[`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudflare) is pre 1.0, and still in active development. You should try it, [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues), [share feedback](https://github.com/opennextjs/opennextjs-cloudflare/discussions), and contribute code to help make running Next.js apps on Cloudflare easier. We don't quite yet recommend using it for mission-critical production apps.
-
-You can also use [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) to deploy Next.js apps to Cloudflare Pages. You can review the differences in supported Next.js features below and by reviewing [the docs for `@cloudflare/next-on-pages`](https://developers.cloudflare.com/pages/framework-guides/nextjs/ssr/supported-features/), and understand the differences between Workers and Pages [here](https://developers.cloudflare.com/workers/static-assets/compatibility-matrix/).
-
-</Callout>
-
 ### Get Started
 
 ##### New apps
@@ -50,7 +42,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
-- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (you can integrate Cloudflare Images with Next.js by following [this guide](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/))
+- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (See [this guide](/cloudflare/howtos/image) to configure [Cloudfare Images](https://developers.cloudflare.com/images/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
 - [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration) <sup>1</sup>
diff --git a/pages/cloudflare/migrate-from-0.5-to-0.6.mdx b/pages/cloudflare/migrate-from-0.5-to-0.6.mdx
new file mode 100644
index 0000000..de1ab56
--- /dev/null
+++ b/pages/cloudflare/migrate-from-0.5-to-0.6.mdx
@@ -0,0 +1,40 @@
+import { Callout } from "nextra/components";
+
+### Migrate from 0.5 to 0.6
+
+`@opennextjs/cloudflare@0.6.0` introduces more options for caching.
+
+The codebase has been refactored with some breaking changes, read-on to update your apps:
+
+##### Overrides location
+
+The cloudflare overrides now live in `@opennextjs/cloudflare/overrides`:
+
+- Incremental cache overrides: `@opennextjs/cloudflare/overrides/incremental-cache/...`
+- Tag cache overrides: `@opennextjs/cloudflare/overrides/tag-cache/...`
+- Queue overrides: `@opennextjs/cloudflare/overrides/queue/...`
+
+For example the KV incremental cache override can be now imported as `@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache`.
+
+##### Environment variables and bindings
+
+We have updated the name for consistency:
+
+- `NEXT_CACHE_WORKERS_KV` -> `NEXT_INC_CACHE_KV`
+- `NEXT_CACHE_R2_...` -> `NEXT_INC_CACHE_R2_...`
+- `NEXT_CACHE_D1` -> `NEXT_TAG_CACHE_D1`
+- `NEXT_CACHE_DO_...` -> `NEXT_TAG_CACHE_DO_...`
+- `NEXT_CACHE_DO_REVALIDATION` -> `NEXT_CACHE_DO_QUEUE`
+- `NEXT_CACHE_REVALIDATION_WORKER` -> `WORKER_SELF_REFERENCE`
+
+`NEXT_CACHE_D1_TAGS_TABLE` and `NEXT_CACHE_D1_REVALIDATIONS_TABLE` have been dropped.
+The D1 tables have a fixed names `tags` and `revalidations`.
+
+##### CLI
+
+The CLI was previsouly invoked as `opennextjs-cloudflare` and now takes a mandatory command:
+
+- `opennextjs-cloudflare build` is the equivalent of executing `opennextjs-cloudflare` previously
+- `opennextjs-cloudflare populateCache local` is used to populate the `local` or `remote` cache
+- `opennextjs-cloudflare preview` is used to populate the local cache and start a dev server
+- `opennextjs-cloudflare deploy` is used to populate the remote cache and deploy
diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index b0521a5..a3ac20c 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -1,4 +1,3 @@
-import { SITE } from "../../config";
 import { Callout } from "nextra/components";
 
 ## Troubleshooting

From 0340ead341f196f97ba97daf19c2ca078888d513 Mon Sep 17 00:00:00 2001
From: eposha <54452472+eposha@users.noreply.github.com>
Date: Wed, 26 Mar 2025 13:44:58 -0400
Subject: [PATCH 079/140] Fix cloudfare cache doc (#108)

---
 package-lock.json            | 19 +++++++++++++++++
 pages/cloudflare/caching.mdx | 40 +++++++++++++++++++-----------------
 2 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c566ccc..7a42dde 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,9 @@
         "react": "18.2.0",
         "react-dom": "18.2.0",
         "typescript": "4.9.3"
+      },
+      "devDependencies": {
+        "prettier": "^3.5.2"
       }
     },
     "node_modules/@babel/runtime": {
@@ -4005,6 +4008,22 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/prettier": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+      "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
     "node_modules/property-information": {
       "version": "6.5.0",
       "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index b3bed4d..df6812e 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -282,22 +282,24 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
 // wrangler.jsonc
 {
   // ...
-  "durable_objects": [
-    {
-      "name": "NEXT_CACHE_REVALIDATION_DURABLE_OBJECT",
-      "class_name": "DurableObjectQueueHandler",
-    },
-    {
-      "name": "NEXT_CACHE_DO_SHARDED",
-      "class_name": "DOShardedTagCache",
-    },
-  ],
-  "migrations": [
-    {
-      "tag": "v1",
-      "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
-    },
-  ],
+  "durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_REVALIDATION_DURABLE_OBJECT",
+        "class_name": "DurableObjectQueueHandler",
+      },
+      {
+        "name": "NEXT_CACHE_DO_SHARDED",
+        "class_name": "DOShardedTagCache",
+      },
+    ],
+    "migrations": [
+      {
+        "tag": "v1",
+        "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
+      },
+    ],
+  },
   "services": [
     {
       "binding": "WORKER_SELF_REFERENCE",
@@ -314,9 +316,9 @@ In your project's OpenNext config, enable the KV cache and set up a queue. The q
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
-import doShardedTagCache from "@opennextjs/cloudflare/do-sharded-tag-cache";
-import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import memoryQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
 
 export default defineCloudflareConfig({
   incrementalCache: kvIncrementalCache,

From fd4f1566b40effccfb577971ad6b0c955103491f Mon Sep 17 00:00:00 2001
From: eposha <54452472+eposha@users.noreply.github.com>
Date: Wed, 26 Mar 2025 14:37:06 -0400
Subject: [PATCH 080/140] minor caching.mdx fix (#109)

---
 pages/cloudflare/caching.mdx | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index df6812e..b9eecef 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -293,13 +293,13 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
         "class_name": "DOShardedTagCache",
       },
     ],
-    "migrations": [
-      {
-        "tag": "v1",
-        "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
-      },
-    ],
   },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
+    },
+  ],
   "services": [
     {
       "binding": "WORKER_SELF_REFERENCE",

From 267b086d29eb3f55c43d044b1d22184feac38ba6 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 26 Mar 2025 13:21:31 -0700
Subject: [PATCH 081/140] docs(cloudflare): update package.json for 0.6 (#110)

---
 pages/cloudflare/migrate-from-0.5-to-0.6.mdx | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/pages/cloudflare/migrate-from-0.5-to-0.6.mdx b/pages/cloudflare/migrate-from-0.5-to-0.6.mdx
index de1ab56..be0285f 100644
--- a/pages/cloudflare/migrate-from-0.5-to-0.6.mdx
+++ b/pages/cloudflare/migrate-from-0.5-to-0.6.mdx
@@ -38,3 +38,10 @@ The CLI was previsouly invoked as `opennextjs-cloudflare` and now takes a mandat
 - `opennextjs-cloudflare populateCache local` is used to populate the `local` or `remote` cache
 - `opennextjs-cloudflare preview` is used to populate the local cache and start a dev server
 - `opennextjs-cloudflare deploy` is used to populate the remote cache and deploy
+
+You will need to update the `scripts` in your `package.json`:
+
+```json
+"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
+"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
+```

From ac2b0cf86e876a9c7bac98bfb22f0d650a9d102d Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 27 Mar 2025 03:35:16 -0700
Subject: [PATCH 082/140] docs(cloudflare): fix the environment variable howto
 (#111)

---
 pages/cloudflare/howtos/env-vars.mdx | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/pages/cloudflare/howtos/env-vars.mdx b/pages/cloudflare/howtos/env-vars.mdx
index f838382..2e01ba0 100644
--- a/pages/cloudflare/howtos/env-vars.mdx
+++ b/pages/cloudflare/howtos/env-vars.mdx
@@ -23,13 +23,14 @@ The "production" environment is used by default when `NEXTJS_ENV` is not explici
 
 ### Production
 
-`.env` and `.dev.vars` are local files that should not be added to source control. You should instead use the cloudflare dashboard to set your environment variables for production.
+`.env` and `.dev.vars` are local files that should not be added to source control. You should instead use the Cloudflare dashboard to set your environment variables for production.
 
-Next.js has [2 kinds](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#bundling-environment-variables-for-the-browser) of environment variables:
+#### Workers Builds
 
-- non-`NEXT_PUBLIC_` variables which are only available on the server
-- `NEXT_PUBLIC_` variables on the other hand are available to the browser
+When you use [Workers Builds](https://developers.cloudflare.com/workers/ci-cd/builds/) to deploy your application, the environment variables must be set in the ["Build variables and secrets"](https://developers.cloudflare.com/workers/ci-cd/builds/configuration/).
 
-Those are called runtime environment variables (non-`NEXT_PUBLIC_`) and buildtime environment variables (`NEXT_PUBLIC_`) on the Cloudflare paltform.
+By settings the "Build variables and secrets", the Next build executed by Workers Builds will have access to the environment variables. It needs that access to inline the [`NEXT_PUBLIC_...` variables](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#bundling-environment-variables-for-the-browser) and access non-`NEXT_PUBLIC_...` variables needed for SSG pages.
 
-You can set the runtime environment variables (non-`NEXT_PUBLIC_`) by following those [instructions](https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard). The build time environment variables (`NEXT_PUBLIC_`) should be set in the [Builds Configuration](https://developers.cloudflare.com/workers/ci-cd/builds/configuration/) so that their value can be inlined by the Workers Builds.
+#### Runtime variables
+
+Your Next application needs to access environment variables at runtime. You should always set the runtime environment variables [in the Cloudflare dashboard](https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard)

From 74a9e20c9004f853d09a11488dee17cd6126121c Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 28 Mar 2025 04:18:06 -0700
Subject: [PATCH 083/140] docs(cloudflare): fix D1 binding (#112)

---
 pages/cloudflare/caching.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index b9eecef..13396ab 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -347,7 +347,7 @@ doShardedTagCache tahes the following options:
 
 ##### 1. Create a D1 database and Service Binding
 
-The binding name used in your app's worker is `NEXT_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc
@@ -356,7 +356,7 @@ The binding name used in your app's worker is `NEXT_CACHE_D1`. The service bindi
   "name": "<WORKER_NAME>",
   "d1_databases": [
     {
-      "binding": "NEXT_CACHE_D1",
+      "binding": "NEXT_TAG_CACHE_D1",
       "database_id": "<DATABASE_ID>",
       "database_name": "<DATABASE_NAME>",
     },

From a26449de547fa3879ad1db882316a33eb50d9bdf Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 28 Mar 2025 06:58:39 -0700
Subject: [PATCH 084/140] docs(cloudflare): fix DO queue binding name (#113)

---
 pages/cloudflare/caching.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 13396ab..9636b8b 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -285,7 +285,7 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
   "durable_objects": {
     "bindings": [
       {
-        "name": "NEXT_CACHE_REVALIDATION_DURABLE_OBJECT",
+        "name": "NEXT_CACHE_DO_QUEUE",
         "class_name": "DurableObjectQueueHandler",
       },
       {

From 5eb8515779972ab29ff9f5ed9539e05942cc0d5c Mon Sep 17 00:00:00 2001
From: Hrishikesh Kokate <hrishi5200@gmail.com>
Date: Mon, 31 Mar 2025 00:52:28 +0530
Subject: [PATCH 085/140] chore: make docs clearer about Netlify Functions vs
 Edge Functions provisioning (#115)

---
 pages/netlify/index.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/netlify/index.mdx b/pages/netlify/index.mdx
index adde8d5..91c546a 100644
--- a/pages/netlify/index.mdx
+++ b/pages/netlify/index.mdx
@@ -15,7 +15,7 @@ import { Callout } from "nextra/components";
 
 Netlify's Next.js adapter automatically configures Netlify sites with key functionality, including cache control, on-demand revalidation, and image optimization.
 
-The adapter provisions serverless and edge functions as appropriate to handle your site’s server-side functionality (such as SSR, ISR and PPR pages, API endpoints, Server Actions, Edge Middleware, etc.), ensuring that functionality works out-of-the-box.
+The adapter provisions Netlify Functions to handle your site’s server-side functionality (such as SSR, ISR and PPR pages, API endpoints, Server Actions, etc.), and Netlify Edge Functions for Edge Middleware, ensuring that functionality works out-of-the-box.
 
 We automatically verify compatibility with the latest stable version of Next.js, using the comprehensive end-to-end tests of the framework itself. To access up-to-date test results, use the badge above.
 

From 68337d8f3c85471f1b45bbcbc2be7e0eb004aead Mon Sep 17 00:00:00 2001
From: dswbx <dennis.senn@gmx.ch>
Date: Wed, 2 Apr 2025 14:43:12 +0200
Subject: [PATCH 086/140] [cloudflare] added clarification on workers size
 limit (#114)

---
 pages/cloudflare/index.mdx           | 10 ++++++++++
 pages/cloudflare/troubleshooting.mdx |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 5cc52a6..70969c3 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -64,3 +64,13 @@ The OpenNext Cloudflare adapter works by taking the Next.js build output and tra
 When you add [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare) as a dependency to your Next.js app, and then run `npx opennextjs-cloudflare` the adapter first builds your app by running the `build` script in your `package.json`, and then transforms the build output to a format that you can run locally using [Wrangler](https://developers.cloudflare.com/workers/wrangler/), and deploy to Cloudflare.
 
 You can view the code for `@opennextjs/cloudflare` [here](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src) to understand what it does under the hood.
+
+### Note on Worker Size Limits
+
+The size limit of a Cloudflare Worker is 3 MiB on the Workers Free plan, and 10 MiB on the Workers Paid plan. After building your Worker, `wrangler` will show both the original and compressed sizes:
+
+```
+Total Upload: 13833.20 KiB / gzip: 2295.89 KiB
+```
+
+Only the latter (compressed size) matters for [the Worker size limit](https://developers.cloudflare.com/workers/platform/limits/#worker-size).
diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index a3ac20c..4b7bdb3 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -14,6 +14,8 @@ If you need to deploy to Cloudflare Pages, you can use `@cloudflare/next-on-page
 
 The Cloudflare Account you are deploying to is on the Workers Free plan, which [limits the size of each Worker to 3 MiB](https://developers.cloudflare.com/workers/platform/limits/#worker-size). When you subscribe to the Workers Paid plan, each Worker can be up to 10 MiB.
 
+When deploying your Worker, `wrangler` will show both the original and compressed sizes. Only the latter (gzipped size) matters for these limits.
+
 ### My app fails to build when I import a specific NPM package
 
 First, make sure that the `nodejs_compat` compatibility flag is enabled, and your compatibility date is set to on or after "2024-09-23", in your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).

From e133dbb1a949a8668101845f02a35a23477f76a0 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 3 Apr 2025 01:00:39 -0700
Subject: [PATCH 087/140] [Cloudflare] Update docs for 1.0.0-beta.0 (#118)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
Co-authored-by: James <james@eli.cx>
---
 pages/cloudflare/_meta.json                   |   2 +-
 pages/cloudflare/caching.mdx                  | 224 ++++------
 .../cloudflare/former-releases/0.6/_meta.json |   7 +
 .../former-releases/0.6/bindings.mdx          |  74 ++++
 .../former-releases/0.6/caching.mdx           | 418 ++++++++++++++++++
 .../former-releases/0.6/examples.mdx          |  24 +
 .../former-releases/0.6/get-started.mdx       | 197 +++++++++
 pages/cloudflare/former-releases/_meta.json   |   2 +
 .../migrate-from-0.5-to-0.6.mdx               |   0
 pages/cloudflare/get-started.mdx              |  19 +-
 .../migrate-from-0.6-to-1.0.0-beta.mdx        |  46 ++
 11 files changed, 861 insertions(+), 152 deletions(-)
 create mode 100644 pages/cloudflare/former-releases/0.6/_meta.json
 create mode 100644 pages/cloudflare/former-releases/0.6/bindings.mdx
 create mode 100644 pages/cloudflare/former-releases/0.6/caching.mdx
 create mode 100644 pages/cloudflare/former-releases/0.6/examples.mdx
 create mode 100644 pages/cloudflare/former-releases/0.6/get-started.mdx
 rename pages/cloudflare/{ => former-releases}/migrate-from-0.5-to-0.6.mdx (100%)
 create mode 100644 pages/cloudflare/migrate-from-0.6-to-1.0.0-beta.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index 0b730ce..e509557 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -7,6 +7,6 @@
   "examples": "",
   "community": "Community projects",
   "troubleshooting": "",
-  "migrate-from-0.5-to-0.6": "Migrate from 0.5 to 0.6",
+  "migrate-from-0.6-to-1.0.0-beta": "Migrate from 0.6 to 1.0.0-beta",
   "former-releases": "Former releases"
 }
diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 9636b8b..aaeb62c 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -21,28 +21,30 @@ There are two storage options to use for the incremental cache.
   reflected globally, when using the default TTL of 60 seconds.
 </Callout>
 
-<Tabs items={["Workers KV", "R2 Object Storage"]}>
+<Tabs items={["R2 Object Storage", "Workers KV"]}>
 <Tabs.Tab>
-##### 1. Create a KV namespace
+
+##### 1. Create an R2 Bucket
 
 ```
-npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
+npx wrangler@latest r2 bucket create <YOUR_BUCKET_NAME>
 ```
 
-##### 2. Add the KV namespace and Service Binding to your Worker
+##### 2. Add the R2 Bucket and Service Binding to your Worker
 
-The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
-The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+The binding name used in your app's worker is `NEXT_INC_CACHE_R2_BUCKET`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+The prefix used by the R2 bucket can be configured with the `NEXT_INC_CACHE_R2_PREFIX` environment variable, and defaults to `incremental-cache`.
 
 ```jsonc
 // wrangler.jsonc
 {
   // ...
   "name": "<WORKER_NAME>",
-  "kv_namespaces": [
+  "r2_buckets": [
     {
-      "binding": "NEXT_INC_CACHE_KV",
-      "id": "<BINDING_ID>",
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
     },
   ],
   "services": [
@@ -56,46 +58,62 @@ The `WORKER_SELF_REFERENCE` service binding should be a self reference to your w
 
 ##### 3. Configure the cache
 
-In your project's OpenNext config, enable the KV cache.
+In your project's OpenNext config, enable the R2 cache.
+
+You can optionally setup a regional cache to use with the R2 incremental cache. This will enable faster retrieval of cache entries and reduce the amount of requests being sent to object storage.
+
+The regional cache has two modes:
+
+- `short-lived`: Responses are re-used for up to a minute.
+- `long-lived`: Fetch responses are re-used until revalidated, and ISR/SSG responses are re-used for up to 30 minutes.
+
+Additionally, lazy updating of the regional cache can be enabled with the `shouldLazilyUpdateOnCacheHit` option. When requesting data from the cache, it sends a background request to the R2 bucket to get the latest entry. This is enabled by default for the `long-lived` mode.
 
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
 // ...
 
+// With regional cache enabled:
 export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
+  incrementalCache: withRegionalCache(r2IncrementalCache, {
+    mode: "long-lived",
+    shouldLazilyUpdateOnCacheHit: true,
+  }),
+  // ...
+});
+
+// Without regional cache:
+export default defineCloudflareConfig({
+  incrementalCache: r2IncrementalCache,
   // ...
 });
 ```
 
 </Tabs.Tab>
-
 <Tabs.Tab>
-
-##### 1. Create an R2 Bucket
+##### 1. Create a KV namespace
 
 ```
-npx wrangler@latest r2 bucket create <YOUR_BUCKET_NAME>
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 ```
 
-##### 2. Add the R2 Bucket and Service Binding to your Worker
-
-The binding name used in your app's worker is `NEXT_INC_CACHE_R2_BUCKET`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+##### 2. Add the KV namespace and Service Binding to your Worker
 
-The prefix used by the R2 bucket can be configured with the `NEXT_INC_CACHE_R2_PREFIX` environment variable, and defaults to `incremental-cache`.
+The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
+The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
 // wrangler.jsonc
 {
   // ...
   "name": "<WORKER_NAME>",
-  "r2_buckets": [
+  "kv_namespaces": [
     {
-      "binding": "NEXT_INC_CACHE_R2_BUCKET",
-      "bucket_name": "<BUCKET_NAME>",
-      "preview_bucket_name": "<PREVIEW_BUCKET_NAME>",
+      "binding": "NEXT_INC_CACHE_KV",
+      "id": "<BINDING_ID>",
     },
   ],
   "services": [
@@ -109,36 +127,16 @@ The prefix used by the R2 bucket can be configured with the `NEXT_INC_CACHE_R2_P
 
 ##### 3. Configure the cache
 
-In your project's OpenNext config, enable the R2 cache.
-
-You can optionally setup a regional cache to use with the R2 incremental cache. This will enable faster retrieval of cache entries and reduce the amount of requests being sent to object storage.
-
-The regional cache has two modes:
-
-- `short-lived`: Responses are re-used for up to a minute.
-- `long-lived`: Fetch responses are re-used until revalidated, and ISR/SSG responses are re-used for up to 30 minutes.
-
-Additionally, lazy updating of the regional cache can be enabled with the `shouldLazilyUpdateOnCacheHit` option. When requesting data from the cache, it sends a background request to the R2 bucket to get the latest entry. This is enabled by default for the `long-lived` mode.
+In your project's OpenNext config, enable the KV cache.
 
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
-import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
 // ...
 
-// With regional cache enabled:
 export default defineCloudflareConfig({
-  incrementalCache: withRegionalCache(r2IncrementalCache, {
-    mode: "long-lived",
-    shouldLazilyUpdateOnCacheHit: true,
-  }),
-  // ...
-});
-
-// Without regional cache:
-export default defineCloudflareConfig({
-  incrementalCache: r2IncrementalCache,
+  incrementalCache: kvIncrementalCache,
   // ...
 });
 ```
@@ -172,14 +170,14 @@ You will also need to add some binding to your `wrangler.jsonc` file.
     "bindings": [
       {
         "name": "NEXT_CACHE_DO_QUEUE",
-        "class_name": "DurableObjectQueueHandler"
+        "class_name": "DOQueueHandler"
       }
     ]
   },
   "migrations": [
     {
       "tag": "v1",
-      "new_sqlite_classes": ["DurableObjectQueueHandler"]
+      "new_sqlite_classes": ["DOQueueHandler"]
     }
   ],
 ```
@@ -189,7 +187,7 @@ You can customize the behaviors of the queue with environment variables:
 - The max number of revalidations that can be processed by an instance of durable object at the same time (`NEXT_CACHE_DO_QUEUE_MAX_REVALIDATION`)
 - The max time in milliseconds that a revalidation can take before being considered as failed (`NEXT_CACHE_DO_QUEUE_REVALIDATION_TIMEOUT_MS`)
 - The amount of time after which a revalidation will be attempted again if it failed. If it fails again it will exponentially back off until it reaches the max retry interval (`NEXT_CACHE_DO_QUEUE_RETRY_INTERVAL_MS`)
-- The maximum number of attempts that can be made to revalidate a path (`NEXT_CACHE_DO_QUEUE_MAX_NUM_REVALIDATIONS`)
+- The maximum number of attempts that can be made to revalidate a path (`NEXT_CACHE_DO_QUEUE_MAX_RETRIES`)
 - Disable SQLite for this durable object. It should only be used if your incremental cache is not eventually consistent (`NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE`)
 
 <Callout>
@@ -216,7 +214,7 @@ To use on-demand revalidation, you should also follow the [ISR setup steps](#inc
   You can also skip this step if your app doesn't to use `revalidateTag` nor `revalidatePath`.
 </Callout>
 
-There are 3 different options to choose from for the tag cache: `d1NextTagCache`, `doShardedTagCache` and `d1TagCache`.
+There are 2 different options to choose from for the tag cache: `d1NextTagCache`, `doShardedTagCache`.
 Which one to choose should be based on two key factors:
 
 1. **Expected Load**: Consider the volume of traffic or data you anticipate.
@@ -224,7 +222,7 @@ Which one to choose should be based on two key factors:
 
 If either of these factors is significant, opting for a sharded database is recommended. Additionally, incorporating a regional cache can further enhance performance.
 
-<Tabs items={["D1NextTagCache", "doShardedTagCache", "D1TagCache"]}>
+<Tabs items={["D1NextTagCache", "doShardedTagCache"]}>
 <Tabs.Tab>
 ##### 1. Create a D1 database and Service Binding
 
@@ -256,22 +254,43 @@ The D1 tag cache requires a `revalidations` table that tracks On-Demand revalida
 
 ##### 3. Configure the cache
 
-In your project's OpenNext config, enable the KV cache and set up a queue (see above). The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+In your project's OpenNext config, enable the R2 cache and set up a queue (see above). The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
 
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
-import d1NextTagCache from "@opennextjs/cloudflare/d1-next-tag-cache";
-import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
 
 export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
+  incrementalCache: r2IncrementalCache,
   tagCache: d1NextTagCache,
-  queue: memoryQueue,
+  queue: doQueue,
 });
 ```
 
+##### 4. Initialise the cache during deployments
+
+In order for the cache to be properly initialised with the build-time revalidation data, you need to run a command as part of your deploy step. This should be run as part of each deployment to ensure that the cache is being populated with each build's data.
+
+To populate remote bindings and deploy your application at the same time, you can use the `deploy` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
+
+```sh
+# Populate remote and deploy.
+opennextjs-cloudflare deploy
+
+# Populate local and start dev server.
+opennextjs-cloudflare preview
+```
+
+It is possible to only populate the cache without any other steps with the `populateCache` command.
+
+```sh
+# The target is passed as an option, either `local` or `remote`.
+opennextjs-cloudflare populateCache local
+```
+
 </Tabs.Tab>
 
 <Tabs.Tab>
@@ -286,10 +305,10 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
     "bindings": [
       {
         "name": "NEXT_CACHE_DO_QUEUE",
-        "class_name": "DurableObjectQueueHandler",
+        "class_name": "DOQueueHandler",
       },
       {
-        "name": "NEXT_CACHE_DO_SHARDED",
+        "name": "NEXT_TAG_CACHE_DO_SHARDED",
         "class_name": "DOShardedTagCache",
       },
     ],
@@ -297,7 +316,7 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
   "migrations": [
     {
       "tag": "v1",
-      "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
+      "new_sqlite_classes": ["DOQueueHandler", "DOShardedTagCache"],
     },
   ],
   "services": [
@@ -332,87 +351,10 @@ doShardedTagCache tahes the following options:
 - `baseShardSize` - The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the one you define in your app) will be split in different shards
 - `regionalCache` - Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
 - `regionalCacheTtlSec` - The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
-- `enableShardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
-- `shardReplicationOptions.numberOfSoftReplicas`: Number of replicas for the soft tag shards
-- `shardReplicationOptions.numberOfHardReplicas`: Number of replicas for the hard tag shards
+- `shardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
+- `shardReplication.numberOfSoftReplicas`: Number of replicas for the soft tag shards
+- `shardReplication.numberOfHardReplicas`: Number of replicas for the hard tag shards
 - `maxWriteRetries`: The number of retries to perform when writing tags
 
-</Tabs.Tab>
-
-<Tabs.Tab>
-
-<Callout>
-  The `d1TagCache` is not recommended for production use, as it does not scale well with the number of tags.
-</Callout>
-
-##### 1. Create a D1 database and Service Binding
-
-The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
-
-```jsonc
-// wrangler.jsonc
-{
-  // ...
-  "name": "<WORKER_NAME>",
-  "d1_databases": [
-    {
-      "binding": "NEXT_TAG_CACHE_D1",
-      "database_id": "<DATABASE_ID>",
-      "database_name": "<DATABASE_NAME>",
-    },
-  ],
-  "services": [
-    {
-      "binding": "WORKER_SELF_REFERENCE",
-      "service": "<WORKER_NAME>",
-    },
-  ],
-}
-```
-
-The D1 database uses two tables, created when initialising the cache:
-
-- the "tags" table keeps a record of the tag/path mappings
-- the "revalidations" table tracks revalidation times
-
-##### 2. Configure the cache
-
-In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
-
-```ts
-// open-next.config.ts
-import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
-import d1TagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-tag-cache";
-import memoryQueue from "@opennextjs/cloudflare/overrides/queue/memory-queue";
-
-export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
-  tagCache: d1TagCache,
-  queue: memoryQueue,
-});
-```
-
-##### 3. Initialise the cache during deployments
-
-In order for the cache to be properly initialised with the build-time revalidation data, you need to run a command as part of your deploy step. This should be run as part of each deployment to ensure that the cache is being populated with each build's data.
-
-To populate remote bindings and deploy your application at the same time, you can use the `deploy` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
-
-```sh
-# Populate remote and deploy.
-opennextjs-cloudflare deploy
-
-# Populate local and start dev server.
-opennextjs-cloudflare preview
-```
-
-It is possible to only populate the cache without any other steps with the `populateCache` command.
-
-```sh
-# The target is passed as an option, either `local` or `remote`.
-opennextjs-cloudflare populateCache local
-```
-
 </Tabs.Tab>
 </Tabs>
diff --git a/pages/cloudflare/former-releases/0.6/_meta.json b/pages/cloudflare/former-releases/0.6/_meta.json
new file mode 100644
index 0000000..53a20a0
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.6/_meta.json
@@ -0,0 +1,7 @@
+{
+  "index": "Overview",
+  "get-started": "",
+  "bindings": "",
+  "caching": "",
+  "examples": ""
+}
diff --git a/pages/cloudflare/former-releases/0.6/bindings.mdx b/pages/cloudflare/former-releases/0.6/bindings.mdx
new file mode 100644
index 0000000..df0a480
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.6/bindings.mdx
@@ -0,0 +1,74 @@
+import { Callout } from "nextra/components";
+
+### Bindings
+
+[Bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](https://developers.cloudflare.com/r2/) bucket.
+
+#### How to configure your Next.js app so it can access bindings
+
+Install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare), and then add a [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) in the root directory of your Next.js app, as described in [Get Started](/cloudflare/get-started#3-create-a-wranglerjson-file).
+
+#### How to access bindings in your Next.js app
+
+You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) from any route of your Next.js app via `getCloudflareContext`:
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+  let responseText = "Hello World";
+
+  const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
+  await myKv.put("foo", "bar");
+  const foo = await myKv.get("foo");
+
+  return new Response(foo);
+}
+```
+
+<Callout type='info'>
+	`getCloudflareContext` can only be used in SSG routes in "async mode" (making it return a promise), to run the function in such a way simply provide an options argument with `async` set to `true`:
+	```js
+	const context = await getCloudflareContext({ async: true });
+	```
+
+    **WARNING**: During SSG caution is advised since secrets (stored in `.dev.vars` files) and local development
+    values from bindings (like values saved in a local KV) will be used for the pages static generation.
+
+</Callout>
+
+#### How to add bindings to your Worker
+
+Add bindings to your Worker by adding them to your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).
+
+## TypeScript type declarations for bindings
+
+To ensure that the `env` object from `getCloudflareContext().env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
+
+```
+npx wrangler types --experimental-include-runtime
+```
+
+This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
+
+If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
+
+```bash
+npx wrangler types --experimental-include-runtime="./runtime.d.ts"
+```
+
+To ensure that your types are always up-to-date, make sure to run `wrangler types --experimental-include-runtime` after any changes to your config file.
+
+## Other Cloudflare APIs (`cf`, `ctx`)
+
+You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/get-cloudflare-context.ts):
+
+```js
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+
+export async function GET(request) {
+  const { env, cf, ctx } = getCloudflareContext();
+
+  // ...
+}
+```
diff --git a/pages/cloudflare/former-releases/0.6/caching.mdx b/pages/cloudflare/former-releases/0.6/caching.mdx
new file mode 100644
index 0000000..0f642d3
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.6/caching.mdx
@@ -0,0 +1,418 @@
+import { Callout } from "nextra/components";
+import { Tabs } from "nextra/components";
+
+## Caching
+
+`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
+
+### How to enable caching
+
+`@opennextjs/cloudflare` supports multiple caching mechanisms through a project's OpenNext configuration.
+
+#### Incremental Static Regeneration (ISR)
+
+There are two storage options to use for the incremental cache.
+
+- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/). Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
+- **R2 Object Storage:** A [cost-effective](https://developers.cloudflare.com/r2/pricing/) S3-compatible object storage option for large amounts of unstructured data. Data is stored in a single region, meaning cache interactions may be slower - this can be mitigated with a regional cache.
+
+<Callout>
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
+</Callout>
+
+<Tabs items={["Workers KV", "R2 Object Storage"]}>
+<Tabs.Tab>
+##### 1. Create a KV namespace
+
+```
+npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
+```
+
+##### 2. Add the KV namespace and Service Binding to your Worker
+
+The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
+The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "name": "<WORKER_NAME>",
+  "kv_namespaces": [
+    {
+      "binding": "NEXT_INC_CACHE_KV",
+      "id": "<BINDING_ID>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+// ...
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  // ...
+});
+```
+
+</Tabs.Tab>
+
+<Tabs.Tab>
+
+##### 1. Create an R2 Bucket
+
+```
+npx wrangler@latest r2 bucket create <YOUR_BUCKET_NAME>
+```
+
+##### 2. Add the R2 Bucket and Service Binding to your Worker
+
+The binding name used in your app's worker is `NEXT_INC_CACHE_R2_BUCKET`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+The prefix used by the R2 bucket can be configured with the `NEXT_INC_CACHE_R2_PREFIX` environment variable, and defaults to `incremental-cache`.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "name": "<WORKER_NAME>",
+  "r2_buckets": [
+    {
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
+      "preview_bucket_name": "<PREVIEW_BUCKET_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the R2 cache.
+
+You can optionally setup a regional cache to use with the R2 incremental cache. This will enable faster retrieval of cache entries and reduce the amount of requests being sent to object storage.
+
+The regional cache has two modes:
+
+- `short-lived`: Responses are re-used for up to a minute.
+- `long-lived`: Fetch responses are re-used until revalidated, and ISR/SSG responses are re-used for up to 30 minutes.
+
+Additionally, lazy updating of the regional cache can be enabled with the `shouldLazilyUpdateOnCacheHit` option. When requesting data from the cache, it sends a background request to the R2 bucket to get the latest entry. This is enabled by default for the `long-lived` mode.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+// ...
+
+// With regional cache enabled:
+export default defineCloudflareConfig({
+  incrementalCache: withRegionalCache(r2IncrementalCache, {
+    mode: "long-lived",
+    shouldLazilyUpdateOnCacheHit: true,
+  }),
+  // ...
+});
+
+// Without regional cache:
+export default defineCloudflareConfig({
+  incrementalCache: r2IncrementalCache,
+  // ...
+});
+```
+
+</Tabs.Tab>
+</Tabs>
+
+##### 4. Configure the queue
+
+In your project's OpenNext config, enable the cache and set up a queue.
+
+The Durable Object Queue will send revalidation requests to a page when needed, and offers support for de-duplicating requests.
+By default there will be a maximum of 10 instance of the Durables Object Queue and they can each process up to 5 requests in parallel, for up to 50 concurrent ISR revalidations.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+// ...
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+
+export default defineCloudflareConfig({
+  // ...
+  queue: doQueue,
+});
+```
+
+You will also need to add some binding to your `wrangler.jsonc` file.
+
+```jsonc
+"durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_QUEUE",
+        "class_name": "DurableObjectQueueHandler"
+      }
+    ]
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DurableObjectQueueHandler"]
+    }
+  ],
+```
+
+You can customize the behaviors of the queue with environment variables:
+
+- The max number of revalidations that can be processed by an instance of durable object at the same time (`NEXT_CACHE_DO_QUEUE_MAX_REVALIDATION`)
+- The max time in milliseconds that a revalidation can take before being considered as failed (`NEXT_CACHE_DO_QUEUE_REVALIDATION_TIMEOUT_MS`)
+- The amount of time after which a revalidation will be attempted again if it failed. If it fails again it will exponentially back off until it reaches the max retry interval (`NEXT_CACHE_DO_QUEUE_RETRY_INTERVAL_MS`)
+- The maximum number of attempts that can be made to revalidate a path (`NEXT_CACHE_DO_QUEUE_MAX_NUM_REVALIDATIONS`)
+- Disable SQLite for this durable object. It should only be used if your incremental cache is not eventually consistent (`NEXT_CACHE_DO_QUEUE_DISABLE_SQLITE`)
+
+<Callout>
+  There is 2 additional modes that you can use for the queue `direct` and the memory queue
+
+- The memory queue will dedupe request but only on a per isolate basis. It is not fully suitable for production deployments, you
+  can use it at your own risk!
+
+- The `direct` mode for the queue is intended for debugging purposes and is not recommended for use in
+  production. It only works in preview mode (i.e. `wrangler dev`)
+
+  For apps using the Page Router, `res.revalidate` requires to provide a self reference service binding named `WORKER_SELF_REFERENCE`.
+
+</Callout>
+
+#### On-Demand Revalidation
+
+The tag revalidation mechanism can use either a [Cloudflare D1](https://developers.cloudflare.com/d1/) database or [Durable Objects](https://developers.cloudflare.com/durable-objects/) with `SqliteStorage` as its backing store for information about tags, paths, and revalidation times.
+
+To use on-demand revalidation, you should also follow the [ISR setup steps](#incremental-static-regeneration-isr).
+
+<Callout>
+  If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
+  You can also skip this step if your app doesn't to use `revalidateTag` nor `revalidatePath`.
+</Callout>
+
+There are 3 different options to choose from for the tag cache: `d1NextTagCache`, `doShardedTagCache` and `d1TagCache`.
+Which one to choose should be based on two key factors:
+
+1. **Expected Load**: Consider the volume of traffic or data you anticipate.
+2. **Usage of** `revalidateTag` / `revalidatePath`: Evaluate how frequently these features will be utilized.
+
+If either of these factors is significant, opting for a sharded database is recommended. Additionally, incorporating a regional cache can further enhance performance.
+
+<Tabs items={["D1NextTagCache", "doShardedTagCache", "D1TagCache"]}>
+<Tabs.Tab>
+##### 1. Create a D1 database and Service Binding
+
+The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "d1_databases": [
+    {
+      "binding": "NEXT_TAG_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 2. Create table for tag revalidations
+
+The D1 tag cache requires a `revalidations` table that tracks On-Demand revalidation times.
+
+##### 3. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue (see above). The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/kv-cache";
+import d1NextTagCache from "@opennextjs/cloudflare/d1-next-tag-cache";
+import memoryQueue from "@opennextjs/cloudflare/memory-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: d1NextTagCache,
+  queue: memoryQueue,
+});
+```
+
+</Tabs.Tab>
+
+<Tabs.Tab>
+##### 1. Create a Durable Object and Service Binding
+The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_QUEUE",
+        "class_name": "DurableObjectQueueHandler",
+      },
+      {
+        "name": "NEXT_TAG_CACHE_DO_SHARDED",
+        "class_name": "DOShardedTagCache",
+      },
+    ],
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DurableObjectQueueHandler", "DOShardedTagCache"],
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+##### 2. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import memoryQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: doShardedTagCache({ baseShardSize: 12, regionalCache: true }),
+  queue: memoryQueue,
+});
+```
+
+doShardedTagCache tahes the following options:
+
+- `baseShardSize` - The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the one you define in your app) will be split in different shards
+- `regionalCache` - Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
+- `regionalCacheTtlSec` - The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
+- `enableShardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
+- `shardReplicationOptions.numberOfSoftReplicas`: Number of replicas for the soft tag shards
+- `shardReplicationOptions.numberOfHardReplicas`: Number of replicas for the hard tag shards
+- `maxWriteRetries`: The number of retries to perform when writing tags
+
+</Tabs.Tab>
+
+<Tabs.Tab>
+
+<Callout>
+  The `d1TagCache` is not recommended for production use, as it does not scale well with the number of tags.
+</Callout>
+
+##### 1. Create a D1 database and Service Binding
+
+The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
+
+```jsonc
+// wrangler.jsonc
+{
+  // ...
+  "name": "<WORKER_NAME>",
+  "d1_databases": [
+    {
+      "binding": "NEXT_TAG_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+}
+```
+
+The D1 database uses two tables, created when initialising the cache:
+
+- the "tags" table keeps a record of the tag/path mappings
+- the "revalidations" table tracks revalidation times
+
+##### 2. Configure the cache
+
+In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import d1TagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-tag-cache";
+import memoryQueue from "@opennextjs/cloudflare/overrides/queue/memory-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+  tagCache: d1TagCache,
+  queue: memoryQueue,
+});
+```
+
+##### 3. Initialise the cache during deployments
+
+In order for the cache to be properly initialised with the build-time revalidation data, you need to run a command as part of your deploy step. This should be run as part of each deployment to ensure that the cache is being populated with each build's data.
+
+To populate remote bindings and deploy your application at the same time, you can use the `deploy` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
+
+```sh
+# Populate remote and deploy.
+opennextjs-cloudflare deploy
+
+# Populate local and start dev server.
+opennextjs-cloudflare preview
+```
+
+It is possible to only populate the cache without any other steps with the `populateCache` command.
+
+```sh
+# The target is passed as an option, either `local` or `remote`.
+opennextjs-cloudflare populateCache local
+```
+
+</Tabs.Tab>
+</Tabs>
diff --git a/pages/cloudflare/former-releases/0.6/examples.mdx b/pages/cloudflare/former-releases/0.6/examples.mdx
new file mode 100644
index 0000000..e44bee0
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.6/examples.mdx
@@ -0,0 +1,24 @@
+import { Callout } from "nextra/components";
+
+## Examples
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+### Basic starter projects
+
+Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
+
+- [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
+- [_`middleware`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
+- [_`vercel-blog-starter`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
+
+You can use these to understand how to configure your Next.js app to use `@opennextjs/cloudflare`, or refer to [Get Started](/cloudflare/get-started).
+
+### Next.js Commerce Demo
+
+The [Next.js Commerce demo app](https://github.com/vercel/commerce/tree/v1) works with `@opennextjs/cloudflare`. You can view a deployed version of it [here](https://vercel-commerce-on-workers.web-experiments.workers.dev/).
diff --git a/pages/cloudflare/former-releases/0.6/get-started.mdx b/pages/cloudflare/former-releases/0.6/get-started.mdx
new file mode 100644
index 0000000..5b1e9b0
--- /dev/null
+++ b/pages/cloudflare/former-releases/0.6/get-started.mdx
@@ -0,0 +1,197 @@
+import { Callout } from "nextra/components";
+
+### Get Started
+
+#### New apps
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```sh
+npm create cloudflare@latest -- my-next-app --framework=next --experimental
+```
+
+#### Existing Next.js apps
+
+##### 1. Install @opennextjs/cloudflare
+
+First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
+
+```sh
+npm install --save-dev @opennextjs/cloudflare@latest
+```
+
+##### 2. Install Wrangler
+
+Install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) as a devDependency:
+
+```sh
+npm install --save-dev wrangler@latest
+```
+
+<Callout>
+  You must use Wrangler version `3.99.0` or later to deploy Next.js apps using `@opennextjs/cloudflare`.
+</Callout>
+
+##### 3. Create a wrangler configuration file
+
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
+</Callout>
+
+A [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/) is needed for your
+application to be previewed and deployed, it is also where you configure your Worker and define what resources it can access via [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings).
+
+You can create one yourself in the root directory of your Next.js app with the name `wrangler.jsonc` and the following content:
+
+```jsonc
+{
+  "$schema": "node_modules/wrangler/config-schema.json",
+  "main": ".open-next/worker.js",
+  "name": "my-app",
+  "compatibility_date": "2024-12-30",
+  "compatibility_flags": ["nodejs_compat"],
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+  },
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      // The service should match the "name" of your worker
+      "service": "my-app",
+    },
+  ],
+  "kv_namespaces": [
+    // Create a KV binding with the binding name "NEXT_INC_CACHE_KV"
+    // to enable the KV based caching:
+    // {
+    //   "binding": "NEXT_INC_CACHE_KV",
+    //   "id": "<BINDING_ID>"
+    // }
+  ],
+}
+```
+
+<Callout>
+  As shown above: - You must enable the [`nodejs_compat` compatibility
+  flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/) *and* set your [compatibility
+  date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
+  later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
+  should also not be changed unless you modify the build output result in some way - You can add a binding
+  named `NEXT_INC_CACHE_KV` to make use of Next.js' caching as described in the [Caching
+  docs](/cloudflare/caching)
+</Callout>
+
+##### 4. Add an `open-next.config.ts` file
+
+<Callout type="info">
+  This step is optional since `@opennextjs/cloudflare` creates this file for you during the build process (if
+  not already present).
+</Callout>
+
+Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the root directory of your Next.js app:
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+
+export default defineCloudflareConfig({
+  incrementalCache: kvIncrementalCache,
+});
+```
+
+<Callout>
+  To use the `OpenNextConfig` type as illustrated above (which is not necessary), you need to install the
+  `@opennextjs/aws` NPM package as a dev dependency.
+</Callout>
+
+##### 5. Add a `.dev.vars` file
+
+Then, add a [`.dev.vars`](https://developers.cloudflare.com/workers/testing/local-development/#local-only-environment-variables) file to the root directory of your Next.js app:
+
+```text
+NEXTJS_ENV=development
+```
+
+The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.env` files. It defaults to "production" when not defined.
+
+##### 6. Update the `package.json` file
+
+Add the following to the scripts field of your `package.json` file:
+
+```json
+"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
+"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
+"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
+```
+
+- `npm run preview`: Builds your app and serves it locally, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
+- `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+- `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
+
+##### 7. Add caching with Workers KV
+
+See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
+
+##### 8. Remove any `export const runtime = "edge";` if present
+
+Before deploying your app, remove the `export const runtime = "edge";` line from any of your source files.
+
+The edge runtime is not supported yet with `@opennextjs/cloudflare`.
+
+##### 9. Add `.open-next` to `.gitignore`
+
+You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
+
+##### 10. Remove `@cloudflare/next-on-pages` (if necessary)
+
+If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
+
+Uninstalling the [`@cloudflare/next-on-pages`](https://www.npmjs.com/package/@cloudflare/next-on-pages) package as well as the [`eslint-plugin-next-on-pages`](https://www.npmjs.com/package/eslint-plugin-next-on-pages) package if present.
+
+Remove any reference of these packages from your source and configuration files.
+This includes:
+
+- `setupDevPlatform()` calls in your Next.js config file
+- `getRequestContext` imports from `@cloudflare/next-on-pages` from your source files
+  (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
+- next-on-pages eslint rules set in your Eslint config file
+
+##### 11. Develop locally
+
+You can continue to run `next dev` when developing locally.
+
+Modify your Next.js configuration file to import and call the `initOpenNextCloudflareForDev` utility
+from the `@opennextjs/cloudflare` package. This makes sure that the Next.js dev server can optimally integrate with the open-next cloudflare adapter and it is necessary for using bindings during local development.
+
+This is an example of a Next.js configuration file calling the utility:
+
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+};
+
+export default nextConfig;
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
+```
+
+After having added the `initOpenNextCloudflareForDev()` call in your Next.js configuration file, you will be able, during local development, to access in any of your server code, local versions of Cloudflare bindings as indicated in the [bindings documentation](./bindings).
+
+In step 3, we also added the `npm run preview`, which allows you to quickly preview your app running locally in the Workers runtime,
+rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
+
+##### 12. Deploy to Cloudflare Workers
+
+Either deploy via the command line:
+
+```sh
+npm run deploy
+```
+
+Or [connect a Github or Gitlab repository](https://developers.cloudflare.com/workers/ci-cd/), and Cloudflare will automatically build and deploy each pull request you merge to your production branch.
diff --git a/pages/cloudflare/former-releases/_meta.json b/pages/cloudflare/former-releases/_meta.json
index fcfac6d..1186ae9 100644
--- a/pages/cloudflare/former-releases/_meta.json
+++ b/pages/cloudflare/former-releases/_meta.json
@@ -1,4 +1,6 @@
 {
+  "0.6": "Release 0.6",
+  "migrate-from-0.5-to-0.6": "",
   "0.5": "Release 0.5",
   "migrate-from-0.4-to-0.5": "",
   "migrate-from-0.3-to-0.4": "",
diff --git a/pages/cloudflare/migrate-from-0.5-to-0.6.mdx b/pages/cloudflare/former-releases/migrate-from-0.5-to-0.6.mdx
similarity index 100%
rename from pages/cloudflare/migrate-from-0.5-to-0.6.mdx
rename to pages/cloudflare/former-releases/migrate-from-0.5-to-0.6.mdx
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 5b1e9b0..f260672 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -62,13 +62,12 @@ You can create one yourself in the root directory of your Next.js app with the n
       "service": "my-app",
     },
   ],
-  "kv_namespaces": [
-    // Create a KV binding with the binding name "NEXT_INC_CACHE_KV"
-    // to enable the KV based caching:
+  "r2_buckets": [
+    // Create a R2 binding with the binding name "NEXT_INC_CACHE_R2_BUCKET"
     // {
-    //   "binding": "NEXT_INC_CACHE_KV",
-    //   "id": "<BINDING_ID>"
-    // }
+    //   "binding": "NEXT_INC_CACHE_R2_BUCKET",
+    //   "bucket_name": "<BUCKET_NAME>",
+    // },
   ],
 }
 ```
@@ -79,7 +78,7 @@ You can create one yourself in the root directory of your Next.js app with the n
   date](https://developers.cloudflare.com/workers/configuration/compatibility-dates/) to `2024-09-23` or
   later, in order for your Next.js app to work with @opennextjs/cloudflare - The `main` and `assets` values
   should also not be changed unless you modify the build output result in some way - You can add a binding
-  named `NEXT_INC_CACHE_KV` to make use of Next.js' caching as described in the [Caching
+  named `NEXT_INC_CACHE_R2_BUCKET` to make use of Next.js' caching as described in the [Caching
   docs](/cloudflare/caching)
 </Callout>
 
@@ -94,10 +93,10 @@ Add a [`open-next.config.ts`](https://opennext.js.org/aws/config) file to the ro
 
 ```ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
 
 export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
+  incrementalCache: r2IncrementalCache,
 });
 ```
 
@@ -130,7 +129,7 @@ Add the following to the scripts field of your `package.json` file:
 - `npm run deploy`: Builds your app, and then deploys it to Cloudflare
 - `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
 
-##### 7. Add caching with Workers KV
+##### 7. Add caching with Cloudflare R2
 
 See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
 
diff --git a/pages/cloudflare/migrate-from-0.6-to-1.0.0-beta.mdx b/pages/cloudflare/migrate-from-0.6-to-1.0.0-beta.mdx
new file mode 100644
index 0000000..521550c
--- /dev/null
+++ b/pages/cloudflare/migrate-from-0.6-to-1.0.0-beta.mdx
@@ -0,0 +1,46 @@
+import { Callout } from "nextra/components";
+
+### Migrate from 0.6 to 1.0.0-beta
+
+The codebase has been refactored with some breaking changes, read-on to update your apps:
+
+#### Name changes
+
+`DurableObjectQueueHandler` was renamed to `DOQueueHandler`. Durable object bindings should be updated in the wrangler configuration file.
+
+#### Environment variables
+
+`NEXT_CACHE_DO_QUEUE_MAX_NUM_REVALIDATIONS` was renamed to `NEXT_CACHE_DO_QUEUE_MAX_RETRIES`.
+
+#### API changes
+
+`D1TagCache` was removed. You should use `D1NextModeTagCache` instead which is more efficient and also based on D1.
+
+The `enableShardReplication` and `shardReplicationOptions` options passed to `ShardedDOTagCache`
+have been folded into `shardReplication`. A value for `shardReplication` must be specified to enable
+replications. The value must be an object with the number of soft and hard replicas.
+
+Before:
+
+```ts
+shardedDOTagCache({
+  baseShardSize: 4,
+  enableShardReplication: true,
+  shardReplicationOptions: {
+    numberOfSoftReplicas: 4,
+    numberOfHardReplicas: 2,
+  },
+});
+```
+
+After:
+
+```ts
+shardedDOTagCache({
+  baseShardSize: 4,
+  shardReplication: {
+    numberOfSoftReplicas: 4,
+    numberOfHardReplicas: 2,
+  },
+});
+```

From 58a36d86ea7f47a11c1b1957a034c744dbe56a51 Mon Sep 17 00:00:00 2001
From: Magnus <91796856+sommeeeer@users.noreply.github.com>
Date: Thu, 3 Apr 2025 11:38:28 +0200
Subject: [PATCH 088/140] [aws]: add outputFileTracingIncludes to common issues
 (#116)

---
 pages/aws/common_issues.mdx | 56 +++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index 2117c1f..c0d27e9 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -112,3 +112,59 @@ This error is usually resolved by removing all yarn files in your repo. You shou
 If you use `yarn` there is a workaround [here](https://stackoverflow.com/a/76902985).
 
 If you are not using `yarn` and you see `yarn` related errors it might be solved by running `corepack disable` or updating `nvm` to `0.40.2`.
+
+#### A file/dependency is missing from my bundle
+
+Sometimes there might be a file missing from your server functions bundle. An example could be `sentry.server.config.ts`. It can be any file or directory and it also accept globs. In Next there is an option to include files that were not picked up by tracing.
+Its called `outputFileTracingIncludes`. Here is an example on how to use it in `next.config.ts`:
+
+```ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+  outputFileTracingIncludes: {
+    "*": ["sentry.server.config.ts"],
+    // can also be a glob pattern
+    "/api/*": ["node_modules/.prisma/client/**/*"],
+  },
+};
+
+export default nextConfig;
+```
+
+This will copy the file to `.open-next/server-functions/default/sentry.server.config.ts`, or every splitted function in this case.
+To read more about `outputFileTracingIncludes` you can refer to the [Next.js documentation](https://nextjs.org/docs/pages/api-reference/config/next-config-js/output#caveats).
+
+It works with function splitting in OpenNext aswell. If your key corresponds to a specific route (i.e: `api/test`), it will be included only in the function bundle for that route.
+Using `*` as a key, however, will include it in every function bundle. Here is an example with function splitting:
+
+```ts
+// open-next.config.ts
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
+const config = {
+  default: {},
+  functions: {
+    extraFunction: {
+      patterns: ["api/test"],
+      // this is the route that will be used in this function
+      routes: ["app/api/test/route"],
+      override: {
+        wrapper: "aws-lambda-streaming",
+      },
+    },
+  },
+} satisfies OpenNextConfig;
+
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  outputFileTracingIncludes: {
+    // these files will be copied only to the extraFunction bundle
+    "/api/test": ["sentry.config.ts", "node_modules/.prisma/client/**/*"],
+  },
+};
+```
+
+It will also work in a monorepo. Lets say you have your Next app in `packages/web`, the files will be written to: `packages/web/.open-next/server-functions/default/packages/web/*`

From 96c43daee77919c83c3e13aa480c75deb7bd3beb Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 3 Apr 2025 23:12:33 -0700
Subject: [PATCH 089/140] [cloudflare] sync create-cloudflare command with
 latest changes (#119)

---
 pages/cloudflare/examples.mdx    | 2 +-
 pages/cloudflare/get-started.mdx | 2 +-
 pages/cloudflare/howtos/dev.mdx  | 2 +-
 pages/cloudflare/index.mdx       | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index e44bee0..cf9aee5 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -5,7 +5,7 @@ import { Callout } from "nextra/components";
 To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 ```
 
 ### Basic starter projects
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index f260672..e5f13a4 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -7,7 +7,7 @@ import { Callout } from "nextra/components";
 To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```sh
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 ```
 
 #### Existing Next.js apps
diff --git a/pages/cloudflare/howtos/dev.mdx b/pages/cloudflare/howtos/dev.mdx
index 0d5b39f..bced793 100644
--- a/pages/cloudflare/howtos/dev.mdx
+++ b/pages/cloudflare/howtos/dev.mdx
@@ -13,7 +13,7 @@ Let's explore, in more detail, the application development workflow we recommend
 To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```bash
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 ```
 
 ### Develop locally using `next dev`
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 70969c3..6df23f5 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -12,7 +12,7 @@ The [`@opennextjs/cloudflare`](https://www.npmjs.com/package/@opennextjs/cloudfl
 To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
 
 ```
-npm create cloudflare@latest -- my-next-app --framework=next --experimental
+npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 ```
 
 ##### Existing Next.js apps

From 4c9cd5065893e353c5a2c59661594df1372fde16 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 4 Apr 2025 03:30:00 -0700
Subject: [PATCH 090/140] doc(cloudflare): Known build issue with Durable
 Objects (#120)

---
 pages/cloudflare/_meta.json       |  1 +
 pages/cloudflare/known-issues.mdx | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 pages/cloudflare/known-issues.mdx

diff --git a/pages/cloudflare/_meta.json b/pages/cloudflare/_meta.json
index e509557..d00ded9 100644
--- a/pages/cloudflare/_meta.json
+++ b/pages/cloudflare/_meta.json
@@ -6,6 +6,7 @@
   "howtos": "How-Tos",
   "examples": "",
   "community": "Community projects",
+  "known-issues": "Known issues",
   "troubleshooting": "",
   "migrate-from-0.6-to-1.0.0-beta": "Migrate from 0.6 to 1.0.0-beta",
   "former-releases": "Former releases"
diff --git a/pages/cloudflare/known-issues.mdx b/pages/cloudflare/known-issues.mdx
new file mode 100644
index 0000000..ea8f040
--- /dev/null
+++ b/pages/cloudflare/known-issues.mdx
@@ -0,0 +1,31 @@
+### Known issues
+
+#### Caching Durable Objects (`DOQueueHandler` and `DOShardedTagCache`)
+
+If your app uses [Durable Objects](https://developers.cloudflare.com/durable-objects/) for caching, you might see a warning while building your app:
+
+```text
+┌─────────────────────────────────┐
+│ OpenNext — Building Next.js app │
+└─────────────────────────────────┘
+
+
+> next build
+
+   ▲ Next.js 15.2.4
+
+▲ [WARNING] 				You have defined bindings to the following internal Durable Objects:
+
+  				- {"name":"NEXT_CACHE_DO_QUEUE","class_name":"DOQueueHandler"}
+  				These will not work in local development, but they should work in production.
+
+  				If you want to develop these locally, you can define your DO in a separate Worker, with a
+  separate configuration file.
+  				For detailed instructions, refer to the Durable Objects section here:
+  https://developers.cloudflare.com/workers/wrangler/api#supported-bindings
+
+   Creating an optimized production build ...
+workerd/server/server.c++:1951: warning: A DurableObjectNamespace in the config referenced the class "DOQueueHandler", but no such Durable Object class is exported from the worker. Please make sure the class name matches, it is exported, and the class extends 'DurableObject'. Attempts to call to this Durable Object class will fail at runtime, but historically this was not a startup-time error. Future versions of workerd may make this a startup-time error.
+```
+
+The warning can be safely ignored as the caching Durable Objects are not used during the build.

From 398efa483c50b87c6988215eb7df83c41f79a346 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 4 Apr 2025 09:51:09 -0700
Subject: [PATCH 091/140] [cloudflare] Update caching doc (#117)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
Co-authored-by: James <james@eli.cx>
---
 pages/cloudflare/caching.mdx | 291 +++++++++++++++++++++++++++++++----
 1 file changed, 258 insertions(+), 33 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index aaeb62c..6ffc417 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -3,18 +3,234 @@ import { Tabs } from "nextra/components";
 
 ## Caching
 
-`@opennextjs/cloudflare` supports [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data).
+Next.js offers multiple ways to improve an application's performance by [caching](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#caching-data) routes and network requests. An application will try to pre-render and cache as much data as possible during build-time to reduce the amount of work required when serving a response to a user.
 
-### How to enable caching
+The cache data are updated using revalidation, either peridiocally or on-demand:
 
-`@opennextjs/cloudflare` supports multiple caching mechanisms through a project's OpenNext configuration.
+- "[Time-based revalidation](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration#time-based-revalidation)" updates the cache data after the revalidation delay specified by the applications expires
+- "[On-demand revalidation](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation-with-revalidatetag)" allows to invalid cache entries with a specific tag (via `revalidateTag`) or at a given path (via `revalidatePath`). You can also use `res.revalidate` in Pages router API route.
+
+The `@opennextjs/cloudflare` caching supports rely on 3 components:
+
+- An **Incremental Cache** to store the cache data
+- A **Queue** to synchronize and deduplicate time-based revalidations
+- A **Tag Cache** for On-demand revalidations via [`revalidateTag`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) and [`revalidatePath`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath).
+
+The adapter provides several implementations for each of those components configured in `open-next.config.ts`.
+
+This guide provides guidelines for common use cases before detailing all the configuration options.
+
+<Callout type="info">
+  Everything in this page only concerns SSG/ISR and the data cache, SSR route will work out of the box without
+  any caching config.
+</Callout>
+
+### Guidelines
+
+#### Small site using revalidation
+
+You should use the following implementation for a small site:
+
+- Incremental Cache: use R2 to store the data
+- Queue: use a Queue backed by Durable Objects
+- Tag Cache: `D1NextModeTagCache`
+
+<Tabs items={["wrangler.jsonc", "open-next.config.ts"]}>
+<Tabs.Tab>
+
+```jsonc
+{
+  "name": "<WORKER_NAME>",
+  // ...
+
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+
+  // R2 incremental cache
+  "r2_buckets": [
+    {
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
+    },
+  ],
+
+  // DO Queue
+  "durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_QUEUE",
+        "class_name": "DOQueueHandler",
+      },
+    ],
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["DOQueueHandler"],
+    },
+  ],
+
+  // D1 Tag Cache (Next mode)
+  // This is only required if you use On-demand revalidation
+  "d1_databases": [
+    {
+      "binding": "NEXT_TAG_CACHE_D1",
+      "database_id": "<DATABASE_ID>",
+      "database_name": "<DATABASE_NAME>",
+    },
+  ],
+}
+```
+
+</Tabs.Tab>
+<Tabs.Tab>
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: r2IncrementalCache,
+  queue: doQueue,
+  // This is only required if you use On-demand revalidation
+  tagCache: d1NextTagCache,
+});
+```
+
+</Tabs.Tab>
+</Tabs>
+
+#### Large site using revalidation
+
+For a larger site, you should use the `ShardedDOTagCache` that can handle a higher load than the `D1NextModeTagCache`:
+
+<Tabs items={["wrangler.jsonc", "open-next.config.ts"]}>
+<Tabs.Tab>
+
+```jsonc
+{
+  "name": "<WORKER_NAME>",
+  // ...
+
+  "services": [
+    {
+      "binding": "WORKER_SELF_REFERENCE",
+      "service": "<WORKER_NAME>",
+    },
+  ],
+
+  // R2 incremental cache
+  "r2_buckets": [
+    {
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
+    },
+  ],
+
+  // DO Queue and DO Sharded Tag Cache
+  "durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_QUEUE",
+        "class_name": "DOQueueHandler",
+      },
+      // This is only required if you use On-demand revalidation
+      {
+        "name": "NEXT_TAG_CACHE_DO_SHARDED",
+        "class_name": "DOShardedTagCache",
+      },
+    ],
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": [
+        "DOQueueHandler",
+        // This is only required if you use On-demand revalidation
+        "DOShardedTagCache",
+      ],
+    },
+  ],
+}
+```
+
+</Tabs.Tab>
+<Tabs.Tab>
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+
+export default defineCloudflareConfig({
+  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "short-lived" }),
+  queue: doQueue,
+  // This is only required if you use On-demand revalidation
+  tagCache: doShardedTagCache({ baseShardSize: 12 }),
+});
+```
+
+</Tabs.Tab>
+</Tabs>
+
+#### SSG site
+
+If your site is static, you do not need a Queue nor a Tag Cache. You can also use the `long-lived` mode of the R2 Incremental Cache to make reading from the store faster.
+
+<Tabs items={["wrangler.jsonc", "open-next.config.ts"]}>
+<Tabs.Tab>
+
+```jsonc
+{
+  "name": "<WORKER_NAME>",
+  // ...
+
+  // R2 incremental cache
+  "r2_buckets": [
+    {
+      "binding": "NEXT_INC_CACHE_R2_BUCKET",
+      "bucket_name": "<BUCKET_NAME>",
+    },
+  ],
+}
+```
+
+</Tabs.Tab>
+<Tabs.Tab>
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+
+export default defineCloudflareConfig({
+  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
+});
+```
+
+</Tabs.Tab>
+</Tabs>
+
+#### Staging
+
+For staging, when your site receives low traffic from a single IP, you can replace the DO queue with a memory queue.
+
+### References
 
 #### Incremental Static Regeneration (ISR)
 
-There are two storage options to use for the incremental cache.
+There are 2 storage options for the incremental cache:
 
-- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) and uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/). Pricing information can be found in the Cloudflare [docs](https://developers.cloudflare.com/workers/platform/pricing/#workers-kv).
 - **R2 Object Storage:** A [cost-effective](https://developers.cloudflare.com/r2/pricing/) S3-compatible object storage option for large amounts of unstructured data. Data is stored in a single region, meaning cache interactions may be slower - this can be mitigated with a regional cache.
+- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) key value store, it uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
 
 <Callout>
   Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
@@ -26,7 +242,7 @@ There are two storage options to use for the incremental cache.
 
 ##### 1. Create an R2 Bucket
 
-```
+```sh
 npx wrangler@latest r2 bucket create <YOUR_BUCKET_NAME>
 ```
 
@@ -94,13 +310,14 @@ export default defineCloudflareConfig({
 
 </Tabs.Tab>
 <Tabs.Tab>
-##### 1. Create a KV namespace
 
-```
+**Create a KV namespace**
+
+```sh
 npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 ```
 
-##### 2. Add the KV namespace and Service Binding to your Worker
+**Add the KV namespace and Service Binding to your Worker**
 
 The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
 The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
@@ -125,7 +342,7 @@ The `WORKER_SELF_REFERENCE` service binding should be a self reference to your w
 }
 ```
 
-##### 3. Configure the cache
+**Configure the cache**
 
 In your project's OpenNext config, enable the KV cache.
 
@@ -144,7 +361,11 @@ export default defineCloudflareConfig({
 </Tabs.Tab>
 </Tabs>
 
-##### 4. Configure the queue
+#### Queue
+
+A queue must be setup for projects using revalidation (either Time based or On-demand).
+
+**Configure the queue**
 
 In your project's OpenNext config, enable the cache and set up a queue.
 
@@ -155,10 +376,12 @@ By default there will be a maximum of 10 instance of the Durables Object Queue a
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
 // ...
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
 
 export default defineCloudflareConfig({
   // ...
+  incrementalCache: r2IncrementalCache,
   queue: doQueue,
 });
 ```
@@ -184,7 +407,7 @@ You will also need to add some binding to your `wrangler.jsonc` file.
 
 You can customize the behaviors of the queue with environment variables:
 
-- The max number of revalidations that can be processed by an instance of durable object at the same time (`NEXT_CACHE_DO_QUEUE_MAX_REVALIDATION`)
+- The max number of revalidations that can be processed by an instance of durable object at the same time (`NEXT_CACHE_DO_QUEUE_MAX_RETRIES`)
 - The max time in milliseconds that a revalidation can take before being considered as failed (`NEXT_CACHE_DO_QUEUE_REVALIDATION_TIMEOUT_MS`)
 - The amount of time after which a revalidation will be attempted again if it failed. If it fails again it will exponentially back off until it reaches the max retry interval (`NEXT_CACHE_DO_QUEUE_RETRY_INTERVAL_MS`)
 - The maximum number of attempts that can be made to revalidate a path (`NEXT_CACHE_DO_QUEUE_MAX_RETRIES`)
@@ -203,7 +426,7 @@ You can customize the behaviors of the queue with environment variables:
 
 </Callout>
 
-#### On-Demand Revalidation
+#### Tag Cache for On-Demand Revalidation
 
 The tag revalidation mechanism can use either a [Cloudflare D1](https://developers.cloudflare.com/d1/) database or [Durable Objects](https://developers.cloudflare.com/durable-objects/) with `SqliteStorage` as its backing store for information about tags, paths, and revalidation times.
 
@@ -211,7 +434,7 @@ To use on-demand revalidation, you should also follow the [ISR setup steps](#inc
 
 <Callout>
   If your app **only** uses the pages router, it does not need to have a tag cache and should skip this step.
-  You can also skip this step if your app doesn't to use `revalidateTag` nor `revalidatePath`.
+  You can also skip this step if your app doesn't use `revalidateTag` nor `revalidatePath`.
 </Callout>
 
 There are 2 different options to choose from for the tag cache: `d1NextTagCache`, `doShardedTagCache`.
@@ -224,7 +447,8 @@ If either of these factors is significant, opting for a sharded database is reco
 
 <Tabs items={["D1NextTagCache", "doShardedTagCache"]}>
 <Tabs.Tab>
-##### 1. Create a D1 database and Service Binding
+
+**Create a D1 database and Service Binding**
 
 The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
@@ -248,11 +472,11 @@ The binding name used in your app's worker is `NEXT_TAG_CACHE_D1`. The `WORKER_S
 }
 ```
 
-##### 2. Create table for tag revalidations
+**Create table for tag revalidations**
 
 The D1 tag cache requires a `revalidations` table that tracks On-Demand revalidation times.
 
-##### 3. Configure the cache
+**Configure the cache**
 
 In your project's OpenNext config, enable the R2 cache and set up a queue (see above). The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
 
@@ -260,13 +484,13 @@ In your project's OpenNext config, enable the R2 cache and set up a queue (see a
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
 import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
-import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
 
 export default defineCloudflareConfig({
   incrementalCache: r2IncrementalCache,
-  tagCache: d1NextTagCache,
   queue: doQueue,
+  tagCache: d1NextTagCache,
 });
 ```
 
@@ -292,9 +516,10 @@ opennextjs-cloudflare populateCache local
 ```
 
 </Tabs.Tab>
-
 <Tabs.Tab>
-##### 1. Create a Durable Object and Service Binding
+
+**Create a Durable Object and Service Binding**
+
 The service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
 ```jsonc
@@ -328,32 +553,32 @@ The service binding should be a self reference to your worker where `<WORKER_NAM
 }
 ```
 
-##### 2. Configure the cache
+**Configure the cache**
 
-In your project's OpenNext config, enable the KV cache and set up a queue. The queue will send a revalidation request to a page when needed, but it will not dedupe requests.
+In your project's OpenNext config, enable the R2 cache and set up a queue.
 
 ```ts
 // open-next.config.ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
-import memoryQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
 import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
 
 export default defineCloudflareConfig({
-  incrementalCache: kvIncrementalCache,
+  incrementalCache: r2IncrementalCache,
   tagCache: doShardedTagCache({ baseShardSize: 12, regionalCache: true }),
-  queue: memoryQueue,
+  queue: doQueue,
 });
 ```
 
-doShardedTagCache tahes the following options:
+doShardedTagCache takes the following options:
 
-- `baseShardSize` - The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the one you define in your app) will be split in different shards
-- `regionalCache` - Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
-- `regionalCacheTtlSec` - The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
+- `baseShardSize`: The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the ones you define in your app) will be split in different shards
+- `regionalCache`: Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
+- `regionalCacheTtlSec`: The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
 - `shardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
-- `shardReplication.numberOfSoftReplicas`: Number of replicas for the soft tag shards
-- `shardReplication.numberOfHardReplicas`: Number of replicas for the hard tag shards
+  - `numberOfSoftReplicas`: Number of replicas for the soft tag shards
+  - `numberOfHardReplicas`: Number of replicas for the hard tag shards
 - `maxWriteRetries`: The number of retries to perform when writing tags
 
 </Tabs.Tab>

From 64e949b001b3bf540ccd14716e0a17cea6161756 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 4 Apr 2025 10:02:01 -0700
Subject: [PATCH 092/140] doc(cloudflare): not a dev dependency (#121)

---
 pages/cloudflare/get-started.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index e5f13a4..6b1c936 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -17,7 +17,7 @@ npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextjs/cloudflare):
 
 ```sh
-npm install --save-dev @opennextjs/cloudflare@latest
+npm install @opennextjs/cloudflare@latest
 ```
 
 ##### 2. Install Wrangler

From c29add08ee42cca60e3fe346a0cc01c25f27994b Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Tue, 8 Apr 2025 12:59:35 +0100
Subject: [PATCH 093/140] docs(cloudflare): static assets incremental cache
 (#123)

---
 pages/cloudflare/caching.mdx | 66 +++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 31 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 6ffc417..3d46299 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -183,36 +183,17 @@ export default defineCloudflareConfig({
 
 #### SSG site
 
-If your site is static, you do not need a Queue nor a Tag Cache. You can also use the `long-lived` mode of the R2 Incremental Cache to make reading from the store faster.
+If your site is static, you do not need a Queue nor a Tag Cache. You can use a read-only Workers Static Assets-based incremental cache for the prerendered routes.
 
-<Tabs items={["wrangler.jsonc", "open-next.config.ts"]}>
-<Tabs.Tab>
-
-```jsonc
-{
-  "name": "<WORKER_NAME>",
-  // ...
-
-  // R2 incremental cache
-  "r2_buckets": [
-    {
-      "binding": "NEXT_INC_CACHE_R2_BUCKET",
-      "bucket_name": "<BUCKET_NAME>",
-    },
-  ],
-}
-```
-
-</Tabs.Tab>
+<Tabs items={["open-next.config.ts"]}>
 <Tabs.Tab>
 
 ```ts
 import { defineCloudflareConfig } from "@opennextjs/cloudflare";
-import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
-import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+import staticAssetsIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/static-assets-incremental-cache";
 
 export default defineCloudflareConfig({
-  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
+  incrementalCache: staticAssetsIncrementalCache,
 });
 ```
 
@@ -227,17 +208,13 @@ For staging, when your site receives low traffic from a single IP, you can repla
 
 #### Incremental Static Regeneration (ISR)
 
-There are 2 storage options for the incremental cache:
+There are 3 storage options for the incremental cache:
 
 - **R2 Object Storage:** A [cost-effective](https://developers.cloudflare.com/r2/pricing/) S3-compatible object storage option for large amounts of unstructured data. Data is stored in a single region, meaning cache interactions may be slower - this can be mitigated with a regional cache.
-- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) key value store, it uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache. The build time values are serverd by the [Workers Assets](https://developers.cloudflare.com/workers/static-assets/).
+- **Workers KV:** A [fast](https://blog.cloudflare.com/faster-workers-kv) key value store, it uses Cloudflare's [Tiered Cache](https://developers.cloudflare.com/cache/how-to/tiered-cache/) to increase cache hit rates. When you write cached data to Workers KV, you write to storage that can be read by any Cloudflare location. This means your app can fetch data, cache it in KV, and then subsequent requests anywhere around the world can read from this cache.
+- **Workers Static Assets:** A read-only store for the incremental cache, serving build-time values from [Workers Static Assets](https://developers.cloudflare.com/workers/static-assets/). Revalidation is not supported with this cache.
 
-<Callout>
-  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
-  reflected globally, when using the default TTL of 60 seconds.
-</Callout>
-
-<Tabs items={["R2 Object Storage", "Workers KV"]}>
+<Tabs items={["R2 Object Storage", "Workers KV", "Workers Static Assets"]}>
 <Tabs.Tab>
 
 ##### 1. Create an R2 Bucket
@@ -311,6 +288,11 @@ export default defineCloudflareConfig({
 </Tabs.Tab>
 <Tabs.Tab>
 
+<Callout>
+  Workers KV is eventually consistent, which means that it can take up to 60 seconds for updates to be
+  reflected globally, when using the default TTL of 60 seconds.
+</Callout>
+
 **Create a KV namespace**
 
 ```sh
@@ -358,6 +340,28 @@ export default defineCloudflareConfig({
 });
 ```
 
+</Tabs.Tab>
+
+<Tabs.Tab>
+
+<Callout>
+  The Workers Static Assets cache is read-only. Requests that attempt to modify it will be ignored.
+</Callout>
+
+**Configure the cache**
+
+In your project's OpenNext config, enable the static assets cache.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import staticAssetsIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/static-assets-incremental-cache";
+
+export default defineCloudflareConfig({
+  incrementalCache: staticAssetsIncrementalCache,
+});
+```
+
 </Tabs.Tab>
 </Tabs>
 

From 66bde345e5d2910c046b9d64461ef3abc112a188 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Tue, 8 Apr 2025 19:01:57 +0200
Subject: [PATCH 094/140] [aws]: Update v2 docs (#124)

---
 pages/aws/v2.mdx                       |  1 +
 pages/aws/v2/advanced/architecture.mdx | 16 ++++++++--------
 pages/aws/v2/advanced/workaround.mdx   |  5 ++++-
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/pages/aws/v2.mdx b/pages/aws/v2.mdx
index 10bfddb..b8edd68 100644
--- a/pages/aws/v2.mdx
+++ b/pages/aws/v2.mdx
@@ -7,4 +7,5 @@ import { Callout } from "nextra/components";
 
 ### Latest Releases
 
+- OpenNext [2.3.10](https://www.npmjs.com/package/open-next/v/2.3.10)
 - OpenNext [2.3.9](https://github.com/sst/open-next/releases/tag/v2.3.9)
diff --git a/pages/aws/v2/advanced/architecture.mdx b/pages/aws/v2/advanced/architecture.mdx
index ea4bbd4..31b79f8 100644
--- a/pages/aws/v2/advanced/architecture.mdx
+++ b/pages/aws/v2/advanced/architecture.mdx
@@ -124,14 +124,14 @@ This ensures that the Lambda handler remains at `index.mjs`.
 
 Create a CloudFront distribution, and dispatch requests to their corresponding handlers (behaviors). The following behaviors are configured:
 
-| Behavior                                                                                                                                | Requests            | CloudFront Function                                                                                   | Origin                      |
-| --------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------- |
-| `/_next/static/*`                                                                                                                       | Hashed static files | -                                                                                                     | S3 bucket                   |
-| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                                     | S3 bucket                   |
-| `/_next/image`                                                                                                                          | Image optimization  | -                                                                                                     | image optimization function |
-| `/_next/data/*`                                                                                                                         | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
-| `/api/*`                                                                                                                                | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
-| `/*`                                                                                                                                    | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific) | server function             |
+| Behavior                                                                                                                                | Requests            | CloudFront Function                                                                                                                                                                                | Origin                      |
+| --------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- |
+| `/_next/static/*`                                                                                                                       | Hashed static files | -                                                                                                                                                                                                  | S3 bucket                   |
+| `/favicon.ico`<br />`/my-images/*`<br />[see why](workaround#workaround-public-static-files-served-out-by-server-function-aws-specific) | public assets       | -                                                                                                                                                                                                  | S3 bucket                   |
+| `/_next/image`                                                                                                                          | Image optimization  | -                                                                                                                                                                                                  | image optimization function |
+| `/_next/data/*`                                                                                                                         | data requests       | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific)                                                                                              | server function             |
+| `/api/*`                                                                                                                                | API                 | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific)                                                                                              | server function             |
+| `/*`                                                                                                                                    | catch all           | set `x-forwarded-host`<br />[see why](workaround#workaround-set-x-forwarded-host-header-aws-specific). Also [see this](workaround#workaround-nextserver-does-not-set-cache-headers-for-html-pages) | server function             |
 
 #### Running at edge
 
diff --git a/pages/aws/v2/advanced/workaround.mdx b/pages/aws/v2/advanced/workaround.mdx
index 9461e3d..88bbec4 100644
--- a/pages/aws/v2/advanced/workaround.mdx
+++ b/pages/aws/v2/advanced/workaround.mdx
@@ -113,12 +113,15 @@ export function middleware(request: NextRequest) {
 
 As mentioned in the [Server function](./architecture#server-lambda-function) section, the server function uses the `NextServer` class from Next.js' build output to handle requests. However, `NextServer` does not seem to set the correct `Cache Control` headers.
 
-To work around the issue, the server function checks if the request is for an HTML page, and sets the `Cache Control` header to:
+To work around the issue, the server function checks if the request is for a fully static HTML page from page router (i.e. without `getStaticProps`), and sets the `Cache Control` header to:
 
 ```
 public, max-age=0, s-maxage=31536000, must-revalidate
 ```
 
+If you plan on using fully static HTML pages, you should also add the `x-middleware-prefetch` header to cloudfront cache headers to avoid cloudfront caching an empty response when this header is set.
+You can also just add an empty `getStaticProps` function to your page, which will set the correct cache headers.
+
 #### WORKAROUND: `NextServer` does not set correct SWR cache headers
 
 `NextServer` does not seem to set an appropriate value for the `stale-while-revalidate` cache header. For example, the header might look like this:

From 2f4df078d8c0cd9a40d7e77ec192b6426684faf3 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Thu, 10 Apr 2025 07:25:00 -0700
Subject: [PATCH 095/140] doc(cloudflare) Remove outdated notes (#127)

---
 pages/cloudflare/index.mdx | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 6df23f5..67df9c3 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -45,12 +45,10 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (See [this guide](/cloudflare/howtos/image) to configure [Cloudfare Images](https://developers.cloudflare.com/images/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
-- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration) <sup>1</sup>
+- [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [x] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
 - [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
 
-<sup>1</sup> Only the `direct` mode is supported at the moment, and is not suitable for production.
-
 We welcome both contributions and feedback!
 
 ### Windows support

From 38a3cf3187d3fdf84f618734d48a4bc5690f7232 Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Thu, 10 Apr 2025 17:11:14 +0100
Subject: [PATCH 096/140] docs(cloudflare): upload command (#126)

---
 pages/cloudflare/caching.mdx     | 7 +++++--
 pages/cloudflare/get-started.mdx | 4 +++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 3d46299..6032af7 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -502,12 +502,15 @@ export default defineCloudflareConfig({
 
 In order for the cache to be properly initialised with the build-time revalidation data, you need to run a command as part of your deploy step. This should be run as part of each deployment to ensure that the cache is being populated with each build's data.
 
-To populate remote bindings and deploy your application at the same time, you can use the `deploy` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
+To populate remote bindings and create a new [version](https://developers.cloudflare.com/workers/configuration/versions-and-deployments/#versions) of your application at the same time, you can use either the `deploy` command or the `upload` command. Similarly, the `preview` command will populate your local bindings and start a Wrangler dev server.
 
 ```sh
-# Populate remote and deploy.
+# Populate remote and deploy the worker immediately.
 opennextjs-cloudflare deploy
 
+# Populate remote and upload a new version of the worker.
+opennextjs-cloudflare upload
+
 # Populate local and start dev server.
 opennextjs-cloudflare preview
 ```
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 6b1c936..7f3c0e5 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -122,11 +122,13 @@ Add the following to the scripts field of your `package.json` file:
 ```json
 "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
 "deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
+"upload": "opennextjs-cloudflare build && opennextjs-cloudflare upload",
 "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
 ```
 
 - `npm run preview`: Builds your app and serves it locally, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
-- `npm run deploy`: Builds your app, and then deploys it to Cloudflare
+- `npm run deploy`: Builds your app, and then immediately deploys it to Cloudflare.
+- `npm run upload`: Builds your app, and then uploads a new [version](https://developers.cloudflare.com/workers/configuration/versions-and-deployments/#versions) of it to Cloudflare.
 - `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
 
 ##### 7. Add caching with Cloudflare R2

From 9c2af8ebdbf0df449a135d9e71d0c12f126bd70f Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 14 Apr 2025 02:40:05 -0700
Subject: [PATCH 097/140] doc(cloudflare) add instructions for Workers Builds
 (#128)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/cloudflare/howtos/_meta.json     |  2 +-
 pages/cloudflare/howtos/dev-deploy.mdx | 88 ++++++++++++++++++++++++++
 pages/cloudflare/howtos/dev.mdx        | 47 --------------
 3 files changed, 89 insertions(+), 48 deletions(-)
 create mode 100644 pages/cloudflare/howtos/dev-deploy.mdx
 delete mode 100644 pages/cloudflare/howtos/dev.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index e4803ff..3616fcb 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -1,7 +1,7 @@
 {
   "NextAuth": "NextAuth",
   "stripeAPI": "Stripe API",
-  "dev": "Development workflow",
+  "dev-deploy": "Develop and Deploy",
   "env-vars": "Enviroment Variables",
   "image": "Image Optimization"
 }
diff --git a/pages/cloudflare/howtos/dev-deploy.mdx b/pages/cloudflare/howtos/dev-deploy.mdx
new file mode 100644
index 0000000..d7ea61d
--- /dev/null
+++ b/pages/cloudflare/howtos/dev-deploy.mdx
@@ -0,0 +1,88 @@
+import { Callout } from "nextra/components";
+
+## Develop and deploy
+
+### Development workflow
+
+The primary purpose of `@opennextjs/cloudflare` is to take a Next.js application, built with standard Next.js tooling, and convert it into a format compatible with Cloudflare Workers.
+
+This code transformation process takes some time, making the adapter less than ideal for active application development, where a very fast feedback loop and other quality-of-life features, such as Hot Module Replacement (HMR), are crucial. Fortunately, Vercel already provides excellent tooling for this workflow, which Next.js developers are likely already familiar with.
+
+We recommend that developers continue using the tools they are already comfortable with for local development and then use `@opennextjs/cloudflare` when they are ready to deploy their applications to the Cloudflare platform.
+
+Let's explore, in more detail, the application development workflow we recommend for the best developer experience.
+
+#### Create a new application based on a template
+
+To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
+
+```bash
+npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
+```
+
+#### Develop locally using `next dev`
+
+We believe that the best development workflow uses the `next dev` command provided by Next.js.
+
+To access Cloudflare resources using the `getCloudflareContext` API while running `next dev`, you will need to update the Next.js configuration to call `initOpenNextCloudflareForDev`, as shown in the following example:
+
+```ts
+// next.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+};
+
+export default nextConfig;
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
+```
+
+#### Use `opennextjs-cloudflare` to build and test on the Workers runtime
+
+After you've finished iterating on your Next.js application with `next dev`, you can convert it to a Cloudflare Worker by running the `opennextjs-cloudflare build` command. This will generate the Worker code in the `.open-next` directory.
+
+You can then preview the app locally in the Cloudflare Workers runtime.
+
+To preview your worker locally, run the `opennextjs-cloudflare preview` command. This will populate the cache and create a local server that runs your worker in the Cloudflare Workers runtime. Testing your worker is important to ensure that it has been properly built and is working as expected.
+
+### Deploy your application to Cloudflare Workers
+
+Both the `deploy` and `upload` commands of `opennextjs-cloudflare` can be used to deploy your application to cloudflare Workers. Both commands will initialize the remote cache and upload your application to the Cloudflare infrastructure.
+
+While `deploy` will start serving your application as soon as it is uploaded, `upload` only creates a new version of the application so that you can use [gradual deployments](https://developers.cloudflare.com/workers/configuration/versions-and-deployments/gradual-deployments/).
+
+#### Local build
+
+Use the `build` command followed by either `deploy` or `upload` to deploy your local build.
+
+<Callout type="warning">
+  When running the `build` command locally, `.dev.vars` and [Next `.env`
+  files](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables) might
+  override your configuration. It is preferreable to use a CD system as [Workers
+  Builds](https://developers.cloudflare.com/workers/ci-cd/builds/) to deploy your application for reproducible
+  deployments.
+</Callout>
+
+#### Workers Builds
+
+When using Workers Builds, make sure to setup your environment variables as explained in [this guide](https://opennext.js.org/cloudflare/howtos/env-vars#production).
+
+You can then connect your GitHub repository by following [the documentation](https://developers.cloudflare.com/workers/ci-cd/builds/git-integration/).
+
+In the Build settings:
+
+- The "Build command" should be set to `npx opennextjs-cloudflare build`.
+- The "Deploy command" should be set to `npx opennextjs-cloudflare deploy` (or `upload` to use gradual deployments).
+
+<Callout type="info">
+  The `deploy`, `upload`, and `populateCache` commands of `opennextjs-cloudflare` invoke `wrangler`.
+  You can pass arguments to `wrangler` by specifying them after `--`:
+
+```sh
+opennextjs-cloudflare deploy -- --env=prod
+```
+
+</Callout>
diff --git a/pages/cloudflare/howtos/dev.mdx b/pages/cloudflare/howtos/dev.mdx
deleted file mode 100644
index bced793..0000000
--- a/pages/cloudflare/howtos/dev.mdx
+++ /dev/null
@@ -1,47 +0,0 @@
-## Development Workflow
-
-The primary purpose of `@opennextjs/cloudflare` is to take a Next.js application, built with standard Next.js tooling, and convert it into a format compatible with Cloudflare Workers.
-
-This code transformation process takes some time, making the adapter less than ideal for active application development, where a very fast feedback loop and other quality-of-life features, such as Hot Module Replacement (HMR), are crucial. Fortunately, Vercel already provides excellent tooling for this workflow, which Next.js developers are likely already familiar with.
-
-We recommend that developers continue using the tools they are already comfortable with for local development and then use `@opennextjs/cloudflare` when they are ready to deploy their applications to the Cloudflare platform.
-
-Let's explore, in more detail, the application development workflow we recommend for the best developer experience.
-
-### Create a new application based on a template
-
-To create a new Next.js app, pre-configured to run on Cloudflare using `@opennextjs/cloudflare`, run:
-
-```bash
-npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
-```
-
-### Develop locally using `next dev`
-
-We believe that the best development workflow uses the `next dev` command provided by Next.js.
-
-To access Cloudflare resources using the `getCloudflareContext` API while running `next dev`, you will need to update the Next.js configuration to call `initOpenNextCloudflareForDev`, as shown in the following example:
-
-```ts
-// next.config.ts
-import type { NextConfig } from "next";
-
-const nextConfig: NextConfig = {
-  /* config options here */
-};
-
-export default nextConfig;
-
-import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
-initOpenNextCloudflareForDev();
-```
-
-### `wrangler dev` and `wrangler deploy`
-
-After you've finished iterating on your Next.js application with `next dev`, you can convert it to a Cloudflare Worker by running the `opennextjs-cloudflare build` command. This will generate the Worker code in the `.open-next` directory.
-
-You can then preview the app locally in the Cloudflare Workers runtime or deploy it to the Cloudflare network.
-
-To preview your worker locally, run the `wrangler dev` command. This creates a local server that runs your worker in the Cloudflare Workers runtime. Testing your worker is important to ensure that it has been properly built and is working as expected.
-
-Once you've tested your worker, You can run `wrangler deploy`, and in a matter of seconds, your masterpiece will be available to all your users around the world.

From 77028b9a0df4e8f01d9c00dd753c59b8860e27b3 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 16 Apr 2025 02:01:24 -0700
Subject: [PATCH 098/140] doc(cloudflare): custom worker (#129)

---
 pages/cloudflare/howtos/_meta.json        |  3 +-
 pages/cloudflare/howtos/custom-worker.mdx | 43 +++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 pages/cloudflare/howtos/custom-worker.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 3616fcb..ca4bfe1 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -3,5 +3,6 @@
   "stripeAPI": "Stripe API",
   "dev-deploy": "Develop and Deploy",
   "env-vars": "Enviroment Variables",
-  "image": "Image Optimization"
+  "image": "Image Optimization",
+  "custom-worker": "Custom Worker"
 }
diff --git a/pages/cloudflare/howtos/custom-worker.mdx b/pages/cloudflare/howtos/custom-worker.mdx
new file mode 100644
index 0000000..cab9ea9
--- /dev/null
+++ b/pages/cloudflare/howtos/custom-worker.mdx
@@ -0,0 +1,43 @@
+## Custom Worker
+
+The worker generated by the Cloudflare adapter only exports [a fetch handler](https://developers.cloudflare.com/workers/runtime-apis/handlers/fetch/).
+
+Sometimes your application needs to expose another type of handler (i.e. [a scheduled handler](https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/)) or export a [Durable Object](https://developers.cloudflare.com/durable-objects/api/base/). This can be achieved by creating a custom worker.
+
+The custom worker re-uses the generated fetch handler.
+
+### Create your custom worker Worker
+
+The following custom worker re-uses the generated fetch handler and adds a scheduled handler:
+
+```ts
+// custom-worker.ts
+
+// @ts-ignore `.open-next/worker.ts` is generated at build time
+import { default as handler } from "./.open-next/worker.js";
+
+export default {
+  fetch: handler.fetch,
+
+  async scheduled(event) {
+    // ...
+  },
+} satisfies ExportedHandler<CloudflareEnv>;
+
+// The re-export is only required if your app uses the DO Queue and DO Tag Cache
+// See https://opennext.js.org/cloudflare/caching for details
+// @ts-ignore `.open-next/worker.ts` is generated at build time
+export { DOQueueHandler, DOShardedTagCache } from "./.open-next/worker.js";
+```
+
+See [an example in the adapter repository](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/examples/playground14/worker.ts).
+
+### Update the entry point in your wrangler configuration
+
+```diff
+// wrangler.jsonc
+{
+-  "main": "./.open-next/worker.js"
++  "main": "./path/to/custom-worker.ts",
+}
+```

From fbf8c17b564e98c28685c4c020548f37d8391965 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bat=C4=B1n=20Evirgen?= <batinevirgen@gmail.com>
Date: Tue, 22 Apr 2025 19:57:57 +0300
Subject: [PATCH 099/140] doc(cloudflare): update type generation command
 (#130)

---
 pages/cloudflare/bindings.mdx | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index df0a480..5898767 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -46,7 +46,7 @@ Add bindings to your Worker by adding them to your [wrangler configuration file]
 To ensure that the `env` object from `getCloudflareContext().env` above has accurate TypeScript types, run the following Wrangler command to [generate types that match your Worker's configuration](https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental):
 
 ```
-npx wrangler types --experimental-include-runtime
+npx wrangler types --env-interface CloudflareEnv
 ```
 
 This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
@@ -54,10 +54,10 @@ This will generate a `d.ts` file and (by default) save it to `.wrangler/types/ru
 If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
 
 ```bash
-npx wrangler types --experimental-include-runtime="./runtime.d.ts"
+npx wrangler types --env-interface CloudflareEnv ./runtime.d.ts
 ```
 
-To ensure that your types are always up-to-date, make sure to run `wrangler types --experimental-include-runtime` after any changes to your config file.
+To ensure that your types are always up-to-date, make sure to run `wrangler types --env-interface CloudflareEnv` after any changes to your config file.
 
 ## Other Cloudflare APIs (`cf`, `ctx`)
 

From 93b65f28e782d075d1c1fdf17f812af13ec9805b Mon Sep 17 00:00:00 2001
From: Aryan Chaurasia <36154235+kulterryan@users.noreply.github.com>
Date: Mon, 28 Apr 2025 11:33:07 +0530
Subject: [PATCH 100/140] [cloudflare] Update examples.mdx (#122)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/examples.mdx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/pages/cloudflare/examples.mdx b/pages/cloudflare/examples.mdx
index cf9aee5..8e491a0 100644
--- a/pages/cloudflare/examples.mdx
+++ b/pages/cloudflare/examples.mdx
@@ -13,7 +13,6 @@ npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
 Basic example apps are included in the repository for `@opennextjs/cloudflare` package:
 
 - [_`create-next-app`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/create-next-app) — a Next.js project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
-- [_`api`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/api) — a minimal Next.js project with a single API route
 - [_`middleware`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/middleware) — a minimal Next.js project using middleware
 - [_`vercel-blog-starter`_](https://github.com/opennextjs/opennextjs-cloudflare/tree/main/examples/vercel-blog-starter) — a blog project using SSG
 

From e7b634b953d5ca772436f7b8aec905e6dcee9054 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 28 Apr 2025 06:03:03 -0700
Subject: [PATCH 101/140] docs(cloudflare): troubleshoot DB client error (#131)

---
 pages/cloudflare/troubleshooting.mdx | 46 ++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 4b7bdb3..6628daf 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -40,3 +40,49 @@ You may want to modify how Wrangler resolves multiple exports, such that when yo
 WRANGLER_BUILD_CONDITIONS=""
 WRANGLER_BUILD_PLATFORM="node"
 ```
+
+### `Error: Cannot perform I/O on behalf of a different request.`
+
+Some DB clients (i.e. [`postgres`](https://www.npmjs.com/package/postgres)) create a connection to the DB server when they are first instantiated and re-use it for later requests.
+This programming model is not compatible with the Workers runtime where a connection can not be re-used in a different request.
+
+The following error is generated in such a case:
+
+```text
+⨯ Error: Cannot perform I/O on behalf of a different request. I/O objects (such as streams, request/response bodies, and others) created in the context of one request handler cannot be accessed from a different request's handler. This is a limitation of Cloudflare Workers which allows us to improve overall performance. (I/O type: Writable)
+```
+
+To solve this, you should create the DB client inside a request context and not keep a global DB client.
+
+A global client would not work:
+
+```ts
+// src/lib/db.ts
+import postgres from "postgres";
+
+// `client` is global.
+// As the connection would be shared across requests, it fails on worker
+export const client = postgres(process.env.DATABASE_URL, { max: 5 });
+
+// src/app/api/route.ts
+import { client } from "@/db/db";
+
+export const dynamic = "force-dynamic";
+
+export async function GET() {
+  return new Response(JSON.stringify(await client`SELECT * FROM users;`));
+}
+```
+
+It can fixed by creating the client for each incoming request:
+
+```ts
+// src/app/api/route.ts
+export const dynamic = "force-dynamic";
+
+export async function GET() {
+  // The client is created for each incoming request and no connection is shared across requests
+  const client = postgres(process.env.DATABASE_URL, { max: 5 });
+  return new Response(JSON.stringify(await client`SELECT * FROM users;`));
+}
+```

From d7566e4271d9da8cbb6f7941378c251b933f4014 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Mon, 28 Apr 2025 18:33:37 +0200
Subject: [PATCH 102/140] [cloudflare]: add docs for `withFilter` (#132)

---
 pages/cloudflare/caching.mdx | 37 +++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 6032af7..bb02e5b 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -94,12 +94,18 @@ import { defineCloudflareConfig } from "@opennextjs/cloudflare";
 import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
 import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+//import { withFilter, softTagFilter } from "@opennextjs/cloudflare/overrides/tag-cache/tag-cache-filter";
 
 export default defineCloudflareConfig({
   incrementalCache: r2IncrementalCache,
   queue: doQueue,
   // This is only required if you use On-demand revalidation
   tagCache: d1NextTagCache,
+  //If you don't use `revalidatePath`, you can also filter internal soft tags using the `softTagFilter`
+  // tagCache: withFilter({
+  //   tagCache: d1NextTagCache,
+  //   filterFn: softTagFilter,
+  // }),
 });
 ```
 
@@ -449,7 +455,7 @@ Which one to choose should be based on two key factors:
 
 If either of these factors is significant, opting for a sharded database is recommended. Additionally, incorporating a regional cache can further enhance performance.
 
-<Tabs items={["D1NextTagCache", "doShardedTagCache"]}>
+<Tabs items={["D1NextTagCache", "doShardedTagCache", "withFilter"]}>
 <Tabs.Tab>
 
 **Create a D1 database and Service Binding**
@@ -588,5 +594,34 @@ doShardedTagCache takes the following options:
   - `numberOfHardReplicas`: Number of replicas for the hard tag shards
 - `maxWriteRetries`: The number of retries to perform when writing tags
 
+</Tabs.Tab>
+<Tabs.Tab>
+<Callout>
+  The `withFilter` option is a specialized configuration that enhances your `tagCache` by layering an additional filter. It requires another tag cache to be passed in as the tagCache (e.g., `d1NextTagCache`, `doShardedTagCache` or your own).
+</Callout>
+This enhanced tag cache selectively filters which tags trigger revalidations, allowing you to focus on a specific subset and reduce unnecessary load on the underlying tag cache. For convenience, we provide the ready-to-use `softTagFilter` that automatically filters out tags used by the `revalidatePath` function making it a no-op.
+
+Its primary purpose is to filter out soft tags (i.e., those used by `revalidatePath`) from the tag cache, which are not relevant for your application. It could also be used to filter out hard tags (i.e., those you define in your app) if one of your dependencies uses them.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import d1NextTagCache from "@opennextjs/cloudflare/overrides/tag-cache/d1-next-tag-cache";
+import { withFilter, softTagFilter } from "@opennextjs/cloudflare/overrides/tag-cache/tag-cache-filter";
+
+export default defineCloudflareConfig({
+  incrementalCache: r2IncrementalCache,
+  queue: doQueue,
+  tagCache: withFilter({
+    tagCache: d1NextTagCache,
+    filterFn: softTagFilter,
+  }),
+});
+```
+
+You can also create your own custom filter function. This function must return a boolean value indicating whether a tag should be included. It will be invoked with a single tag (as a string) as its argument. Please note that "soft tags" (i.e., those used by revalidatePath) always start with the prefix `_N_T`.
+
 </Tabs.Tab>
 </Tabs>

From 9aaefd0b54983871be60e8b1dce18410de99b1da Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 29 Apr 2025 10:49:13 +0200
Subject: [PATCH 103/140] docs(cloudflare): add `global_fetch_strictly_public`
 to get started (#133)

---
 pages/cloudflare/get-started.mdx | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 7f3c0e5..454d474 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -50,7 +50,14 @@ You can create one yourself in the root directory of your Next.js app with the n
   "main": ".open-next/worker.js",
   "name": "my-app",
   "compatibility_date": "2024-12-30",
-  "compatibility_flags": ["nodejs_compat"],
+  "compatibility_flags": [
+    // Enable Node.js API
+    // see https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag
+    "nodejs_compat",
+    // Allow to fetch URLs in your app
+    // see https://developers.cloudflare.com/workers/configuration/compatibility-flags/#global-fetch-strictly-public
+    "global_fetch_strictly_public",
+  ],
   "assets": {
     "directory": ".open-next/assets",
     "binding": "ASSETS",

From 0319b73ac3a70769b619ff78545197ae2f0dd6d5 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 30 Apr 2025 09:24:10 +0200
Subject: [PATCH 104/140] docs(cloudflare): Update the type generation section
 (#134)

---
 pages/cloudflare/bindings.mdx | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index 5898767..51734ff 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -49,13 +49,7 @@ To ensure that the `env` object from `getCloudflareContext().env` above has accu
 npx wrangler types --env-interface CloudflareEnv
 ```
 
-This will generate a `d.ts` file and (by default) save it to `.wrangler/types/runtime.d.ts`. You will be prompted in the command's output to add that file to your `tsconfig.json`'s `compilerOptions.types` array.
-
-If you would like to commit the file to git, you can provide a custom path. Here, for instance, the `runtime.d.ts` file will be saved to the root of your project:
-
-```bash
-npx wrangler types --env-interface CloudflareEnv ./runtime.d.ts
-```
+This will generate a `d.ts` file and save it to `worker-configuration.d.ts`.
 
 To ensure that your types are always up-to-date, make sure to run `wrangler types --env-interface CloudflareEnv` after any changes to your config file.
 

From a23d24049d60f05470eb8a160f2cbac118e0f91d Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 30 Apr 2025 09:44:45 +0200
Subject: [PATCH 105/140] docs(cloudflare): Node middleware not supported
 (#135)

---
 pages/cloudflare/index.mdx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 67df9c3..6f2d33d 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -42,6 +42,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Static Site Generation (SSG)](https://nextjs.org/docs/app/building-your-application/rendering/server-components#static-rendering-default)
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
+- [ ] [Node Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware#runtime) introduced in 15.2 are not yet supported
 - [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (See [this guide](/cloudflare/howtos/image) to configure [Cloudfare Images](https://developers.cloudflare.com/images/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)

From aa184b046656442b224093c95efa7e4f26faaf6c Mon Sep 17 00:00:00 2001
From: James Anderson <james@eli.cx>
Date: Wed, 30 Apr 2025 09:29:24 +0100
Subject: [PATCH 106/140] docs(cloudflare): kv prefix (#136)

---
 pages/cloudflare/caching.mdx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index bb02e5b..92d5907 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -310,6 +310,8 @@ npx wrangler@latest kv namespace create <YOUR_NAMESPACE_NAME>
 The binding name used in your app's worker is `NEXT_INC_CACHE_KV`.
 The `WORKER_SELF_REFERENCE` service binding should be a self reference to your worker where `<WORKER_NAME>` is the name in your wrangler configuration file.
 
+The prefix used by the cache keys can be configured with the `NEXT_INC_CACHE_KV_PREFIX` environment variable, and defaults to `incremental-cache`.
+
 ```jsonc
 // wrangler.jsonc
 {

From a599481d0d0c798b6a1ef48d6f671d5b2bbe46be Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 30 Apr 2025 09:52:30 +0100
Subject: [PATCH 107/140] fix enviroment typo (#137)

---
 pages/cloudflare/howtos/_meta.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index ca4bfe1..79facd0 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -2,7 +2,7 @@
   "NextAuth": "NextAuth",
   "stripeAPI": "Stripe API",
   "dev-deploy": "Develop and Deploy",
-  "env-vars": "Enviroment Variables",
+  "env-vars": "Environment Variables",
   "image": "Image Optimization",
   "custom-worker": "Custom Worker"
 }

From b3f1046d57d8604791d0c4991a5a367255b0a5cd Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 30 Apr 2025 10:23:23 +0100
Subject: [PATCH 108/140] fix cloudfare typos (#138)

---
 pages/cloudflare/howtos/image.mdx | 2 +-
 pages/cloudflare/index.mdx        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/howtos/image.mdx b/pages/cloudflare/howtos/image.mdx
index fd4e2ae..87f4103 100644
--- a/pages/cloudflare/howtos/image.mdx
+++ b/pages/cloudflare/howtos/image.mdx
@@ -61,4 +61,4 @@ export default nextConfig;
   Images using the cloudflare loader are served directly without going through the middleware.
 </Callout>
 
-See more details in the [Cloudfare Images documentation](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/).
+See more details in the [Cloudflare Images documentation](https://developers.cloudflare.com/images/transform-images/integrate-with-frameworks/).
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 6f2d33d..76a8d63 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -43,7 +43,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Server-Side Rendering (SSR)](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
 - [x] [Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware)
 - [ ] [Node Middleware](https://nextjs.org/docs/app/building-your-application/routing/middleware#runtime) introduced in 15.2 are not yet supported
-- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (See [this guide](/cloudflare/howtos/image) to configure [Cloudfare Images](https://developers.cloudflare.com/images/))
+- [x] [Image optimization](https://nextjs.org/docs/app/building-your-application/optimizing/images) (See [this guide](/cloudflare/howtos/image) to configure [Cloudflare Images](https://developers.cloudflare.com/images/))
 - [x] [Partial Prerendering (PPR)](https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering)
 - [x] [Pages Router](https://nextjs.org/docs/pages)
 - [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)

From bdd4d28c296f2e5d243a60ab3d00b08230a7e7fd Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 30 Apr 2025 11:34:05 +0100
Subject: [PATCH 109/140] add `keep_names` how-to page (#139)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/howtos/_meta.json     |  3 +-
 pages/cloudflare/howtos/keep_names.mdx | 38 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 pages/cloudflare/howtos/keep_names.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 79facd0..2c781b5 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -4,5 +4,6 @@
   "dev-deploy": "Develop and Deploy",
   "env-vars": "Environment Variables",
   "image": "Image Optimization",
-  "custom-worker": "Custom Worker"
+  "custom-worker": "Custom Worker",
+  "keep_names": "__name issues"
 }
diff --git a/pages/cloudflare/howtos/keep_names.mdx b/pages/cloudflare/howtos/keep_names.mdx
new file mode 100644
index 0000000..acd3014
--- /dev/null
+++ b/pages/cloudflare/howtos/keep_names.mdx
@@ -0,0 +1,38 @@
+import { Callout } from "nextra/components";
+
+## `__name` issues
+
+When using the OpenNext adapter, Wrangler processes the worker's code with [esbuild](https://esbuild.github.io/), and by default
+enables the [`keep-names`](https://esbuild.github.io/api/#keep-names) option. While this is generally useful for debugging, it can
+cause issues with certain Next.js libraries (e.g. [next-themes](https://www.npmjs.com/package/next-themes)) that convert scripts
+to strings. This happens because `esbuild` introduces a `__name` function at the top of modules, which may inadvertently appear
+in the generated script strings. When these strings are evaluated at runtime, the `__name` function might therefore not be defined,
+leading to errors logged in the developper console:
+
+```
+Uncaught ReferenceError: __name is not defined
+```
+
+<Callout>
+  Note that depending on your minification settings, the `__name` identifier might be minified, making the
+  error message less clear and potentially not explicitly mentioning `__name` in such cases.
+</Callout>
+
+### How to fix such issues
+
+To fix the issue you can simply set the `keep_names` option to `false` in your [`wrangler.jsonc` file](https://developers.cloudflare.com/workers/wrangler/configuration), like in the following example:
+
+```jsonc
+{
+  "$schema": "node_modules/wrangler/config-schema.json",
+  "main": ".open-next/worker.js",
+  "name": "my-app",
+  "keep_names": false,
+  /* ... */
+}
+```
+
+One potential drawback of this solution is that, depending on your minification settings, you may lose the ability to view the original
+function names in debugging tools.
+
+<Callout>You must use Wrangler version `4.13.0` or later to use this option.</Callout>

From 538d2218444c0e245e7631551ae3cb8cee1cb0f9 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 2 May 2025 15:55:42 +0200
Subject: [PATCH 110/140] doc: add details to windows support (#141)

---
 shared/WindowsSupport.mdx | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/shared/WindowsSupport.mdx b/shared/WindowsSupport.mdx
index af51736..99b2031 100644
--- a/shared/WindowsSupport.mdx
+++ b/shared/WindowsSupport.mdx
@@ -1,14 +1,17 @@
 OpenNext can be used on Windows systems but Windows full support is not guaranteed because:
 
-- historically the Next.js tooling itself has had Windows support issues
-  (and OpenNext is built on these tools)
+- Next.js tooling itself has Windows support issues and OpenNext is built on these tools
 - the OpenNext team has limited capacity and fully supporting Windows (given the point above)
   has been determined to be a lower priority, thus the effort and testing on Windows is limited
 
 Given the above, you can develop your application under Windows at your own risk. If you don't have an alternative we
 recommend either:
 
-- running OpenNext using [WSL2](https://learn.microsoft.com/en-us/windows/wsl/),
+- running OpenNext using [the Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/),
 - in a Linux Virtual Machine or
 - develop your application using the standard Next.js tooling and deploy it using OpenNext in CI/CD systems such
   as [GitHub Actions](https://github.com/features/actions) that run linux/MacOS environments
+
+Windows Subsystem for Linux (WSL) allows you to run a Linux environment on your Windows machine, without the need for
+a separate virtual machine or dual booting. Visual Studio Code has [an extension](https://code.visualstudio.com/docs/remote/wsl)
+that makes developing with WSL very easy.

From 0d450a08a15abc211f0604ecb2950de967682b88 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 2 May 2025 16:26:17 +0200
Subject: [PATCH 111/140] docs(cloudflare): remove outdated NextAuth howto
 (#142)

---
 pages/cloudflare/howtos/NextAuth.mdx | 57 ----------------------------
 pages/cloudflare/howtos/_meta.json   |  1 -
 2 files changed, 58 deletions(-)
 delete mode 100644 pages/cloudflare/howtos/NextAuth.mdx

diff --git a/pages/cloudflare/howtos/NextAuth.mdx b/pages/cloudflare/howtos/NextAuth.mdx
deleted file mode 100644
index 3882eb5..0000000
--- a/pages/cloudflare/howtos/NextAuth.mdx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Callout } from "nextra/components";
-
-## [NextAuth.js](https://next-auth.js.org/)
-
-<Callout>
-  Starting from wrangler 4.4.0, the implementation of `createCipheriv` is available and NextAuth.js should
-  work out of the box.
-</Callout>
-
-NextAuth.js is an open-source authentication solution for Next.js applications.
-
-### Solving a broken build
-
-<Callout>
-  This section offers a solution for NextAuth.js v4. Use of v5 is currently blocked by the lack of
-  `createCipheriv` implementation.
-</Callout>
-
-NextAuth.js relies on [`createCipheriv`](https://nodejs.org/docs/v22.13.1/api/crypto.html#cryptocreatecipherivalgorithm-key-iv-options) from [`node:crypto`](https://nodejs.org/docs/v22.13.1/api/crypto.html).
-
-`createCipheriv` is not currently implemented by the workerd runtime so apps using NextAuth.js with the default configuration break at build time.
-
-However you can configure NextAuth.js to use custom implementations of the `encode` and `decode` functions that do not use the unimplemented Node APIs. Implementations built on top of [`SubtleCrypto`](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto) can run on workerd.
-
-The NextAuth.js configuration file should look like:
-
-```js
-import { encode, decode } from "@/lib/webcrypto";
-
-export const NEXT_AUTH_CONFIG = {
-  // ...
-  jwt: {
-    encode,
-    decode,
-  },
-};
-```
-
-Kudos to Arnav Gupta ([`@arnavgupta00`](https://github.com/arnavgupta00)) for coming up with the solution.
-You can find an example of this on his [example repository](https://github.com/arnavgupta00/deployment-cf-workers-prisma-nextauth).
-
-Related issues: [`workers-sdk#206`](https://github.com/opennextjs/opennextjs-cloudflare/issues/206) and [`workerd#3277`](https://github.com/cloudflare/workerd/issues/3277).
-
-### Solving issues in local dev
-
-When trying to access Cloudflare bindings depending on your implementation, you might run into:
-
-`ERROR: getCloudflareContext has been called without having called initOpenNextCloudflareForDev from the Next.js config file.`
-
-You can resolve this issue, by calling `getCloudflareContext` in your `NextAuth` callback, for example like so:
-
-```js
-export const { handlers, auth, signIn, signOut } = NextAuth(async _ => {
-	let { env } = await getCloudflareContext({async: true})
-        ..
-}
-```
diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 2c781b5..401af5b 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -1,5 +1,4 @@
 {
-  "NextAuth": "NextAuth",
   "stripeAPI": "Stripe API",
   "dev-deploy": "Develop and Deploy",
   "env-vars": "Environment Variables",

From f230ba45b8e2f947c332be2056683686297827c8 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Fri, 2 May 2025 16:27:21 +0200
Subject: [PATCH 112/140] [cloudflare] added some docs for prisma and drizzle
 (#140)

---
 pages/cloudflare/howtos/_meta.json |   1 +
 pages/cloudflare/howtos/db.mdx     | 229 +++++++++++++++++++++++++++++
 2 files changed, 230 insertions(+)
 create mode 100644 pages/cloudflare/howtos/db.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 401af5b..45e3c9d 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -1,5 +1,6 @@
 {
   "stripeAPI": "Stripe API",
+  "db": "Database & ORM",
   "dev-deploy": "Develop and Deploy",
   "env-vars": "Environment Variables",
   "image": "Image Optimization",
diff --git a/pages/cloudflare/howtos/db.mdx b/pages/cloudflare/howtos/db.mdx
new file mode 100644
index 0000000..2b9d0cd
--- /dev/null
+++ b/pages/cloudflare/howtos/db.mdx
@@ -0,0 +1,229 @@
+This page will show you how to setup some popular database ORM libraries to use in OpenNext. There are some subtleties to be aware of when using these libraries in Cloudflare Workers, so we will cover those here.
+
+If you encounter issue with a specific library, please open an issue on the [OpenNext GitHub repository](https://github.com/opennextjs/opennextjs-cloudflare/issues).
+
+## Drizzle ORM
+
+[Drizzle](https://developers.cloudflare.com/d1/reference/community-projects/#drizzle-orm) is a TypeScript ORM for SQL databases. It is designed to be lightweight and easy to use, making it a great choice for Cloudflare Workers.
+There is not much specific to configure in Drizzle, but there is one important thing to note is that you don't want to have a global client.
+
+### `lib/db.ts`
+
+Instead of creating a global client, you should create a new client for each request. This is because some adapters (like Postgres) will use a connection pool, and reuse the same connection for multiple requests. This is not allowed in Cloudflare Workers, and will cause subsequent requests to fail.
+
+#### PostgreSQL
+
+Instead of that :
+
+```ts
+//lib/db.ts
+import { drizzle } from "drizzle-orm/node-postgres";
+import * as schema from "./schema/pg";
+import { Pool } from "pg";
+
+const pool = new Pool({
+  connectionString: process.env.PG_URL,
+});
+
+export const db = drizzle({ client: pool, schema });
+```
+
+You should do this instead:
+
+```ts
+//lib/db.ts
+import { drizzle } from "drizzle-orm/node-postgres";
+// You can use cache from react to cache the client during the same request
+// this is not mandatory and only has an effect for server components
+import { cache } from "react";
+import * as schema from "./schema/pg";
+import { Pool } from "pg";
+
+export const getDb = cache(() => {
+  const pool = new Pool({
+    connectionString: process.env.PG_URL,
+    // You don't want to reuse the same connection for multiple requests
+    maxUses: 1,
+  });
+  return drizzle({ client: pool, schema });
+});
+```
+
+#### D1 example
+
+```ts
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+import { drizzle } from "drizzle-orm/d1";
+import { cache } from "react";
+import * as schema from "./schema/d1";
+
+export const getDb = cache(() => {
+  const { env } = getCloudflareContext();
+  return drizzle(env.MY_D1, { schema });
+});
+
+// This is the one to use for static routes (i.e. ISR/SSG)
+export const getDbAsync = cache(async () => {
+  const { env } = await getCloudflareContext({ async: true });
+  return drizzle(env.MY_D1, { schema });
+});
+```
+
+#### Hyperdrive example
+
+```ts
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+import { drizzle } from "drizzle-orm/node-postgres";
+import { cache } from "react";
+import * as schema from "./schema/pg";
+import { Pool } from "pg";
+
+export const getDb = cache(() => {
+  const { env } = getCloudflareContext();
+  const connectionString = env.HYPERDRIVE.connectionString;
+  const pool = new Pool({
+    connectionString: process.env.PG_URL,
+    // You don't want to reuse the same connection for multiple requests
+    maxUses: 1,
+  });
+  return drizzle({ client: pool, schema });
+});
+
+// This is the one to use for static routes (i.e. ISR/SSG)
+export const getDbAsync = cache(async () => {
+  const { env } = await getCloudflareContext({ async: true });
+  const connectionString = env.HYPERDRIVE.connectionString;
+  const pool = new Pool({
+    connectionString: process.env.PG_URL,
+    // You don't want to reuse the same connection for multiple requests
+    maxUses: 1,
+  });
+  return drizzle({ client: pool, schema });
+});
+```
+
+You can then use the `getDb` function to get a new client for each request. This will ensure that you don't run into any issues with connection pooling.
+
+## Prisma ORM
+
+[Prisma](https://developers.cloudflare.com/d1/reference/community-projects/#prisma-orm) is a popular ORM for Node.js and TypeScript. It is designed to be easy to use and provides a lot of features out of the box. However, there are some subtleties to be aware of when using Prisma in Cloudflare Workers.
+
+### `schema.prisma`
+
+When using prisma in OpenNext, you do not want to provide an output directory for the generated client.
+
+```prisma
+generator client {
+  provider        = "prisma-client-js"
+  previewFeatures = ["driverAdapters"]
+}
+```
+
+This is because the generated client needs to be patched by OpenNext to work with Cloudflare Workers. If you provide an output directory, OpenNext will not be able to patch the client and it will not work.
+
+### `next.config.ts`
+
+Because prisma has some specific exports for cloudflare workers, you need to add the following to your `next.config.ts` file:
+
+```ts
+const nextConfig: NextConfig = {
+  serverExternalPackages: ["@prisma/client", ".prisma/client"],
+};
+```
+
+By doing this, this will ensure that both the generated client and the prisma client are included in the build for the `workerd` runtime.
+
+### `lib/db.ts`
+
+Instead of creating a global client, you should create a new client for each request. This is because some adapters (like Postgres) will use a connection pool, and reuse the same connection for multiple requests. This is not allowed in Cloudflare Workers, and will cause subsequent requests to fail.
+
+#### D1 example
+
+Instead of that :
+
+```ts
+//lib/db.ts
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+import { PrismaClient } from "@prisma/client";
+import { PrismaD1 } from "@prisma/adapter-d1";
+
+const { env } = getCloudflareContext();
+const adapter = new PrismaD1(env.MY_D1);
+export const db = new PrismaClient();
+```
+
+You should do this instead:
+
+```ts
+//lib/db.ts
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+// You can use cache from react to cache the client during the same request
+// this is not mandatory and only has an effect for server components
+import { cache } from "react";
+import { PrismaClient } from "@prisma/client";
+import { PrismaD1 } from "@prisma/adapter-d1";
+
+export const getDb = cache(() => {
+  const { env } = getCloudflareContext();
+  const adapter = new PrismaD1(env.MY_D1);
+  return new PrismaClient({ adapter });
+});
+
+// If you need access to `getCloudflareContext` in a static route (i.e. ISR/SSG), you should use the async version of `getCloudflareContext` to get the context.
+export const getDbAsync = async () => {
+  const { env } = await getCloudflareContext({ async: true });
+  const adapter = new PrismaD1(env.MY_D1);
+  const prisma = new PrismaClient({ adapter });
+  return prisma;
+};
+```
+
+You can then use the `getDb` function to get a new client for each request. This will ensure that you don't run into any issues with connection pooling.
+
+#### PostgreSQL
+
+You can also use Prisma with PostgreSQL. The setup is similar to the D1 setup above, but you need to use the `PrismaPostgres` adapter instead of the `PrismaD1` adapter.
+
+```ts
+import { cache } from "react";
+import { PrismaClient } from "@prisma/client";
+import { PrismaPg } from "@prisma/adapter-pg";
+
+export const getDb = cache(() => {
+  const connectionString = process.env.PG_URL ?? "";
+  const adapter = new PrismaPg({ connectionString, maxUses: 1 });
+  const prisma = new PrismaClient({ adapter });
+  return prisma;
+});
+```
+
+You can then use the `getDb` function to get a new client for each request. This will ensure that you don't run into any issues with connection pooling.
+
+#### Hyperdrive
+
+You can also use Prisma with Hyperdrive. The setup is similar to the PostgreSQL setup above.
+
+```ts
+//lib/db.ts
+import { getCloudflareContext } from "@opennextjs/cloudflare";
+// You can use cache from react to cache the client during the same request
+// this is not mandatory and only has an effect for server components
+import { cache } from "react";
+import { PrismaClient } from "@prisma/client";
+import { PrismaPg } from "@prisma/adapter-pg";
+
+export const getDb = cache(() => {
+  const { env } = getCloudflareContext();
+  const connectionString = env.HYPERDRIVE.connectionString;
+  const adapter = new PrismaPg({ connectionString, maxUses: 1 });
+  return new PrismaClient({ adapter });
+});
+
+// This is the one to use for static routes (i.e. ISR/SSG)
+export const getDbAsync = async () => {
+  const { env } = await getCloudflareContext({ async: true });
+  const connectionString = env.HYPERDRIVE.connectionString;
+  const adapter = new PrismaPg({ connectionString, maxUses: 1 });
+  return new PrismaClient({ adapter });
+};
+```

From d5cd301917ac38723e4b7e9ba048b816106b810e Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Sun, 4 May 2025 20:35:48 +0200
Subject: [PATCH 113/140] docs(cloudflare): turbopack builds are not suported
 (#145)

---
 pages/cloudflare/troubleshooting.mdx | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 6628daf..8baac43 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -86,3 +86,20 @@ export async function GET() {
   return new Response(JSON.stringify(await client`SELECT * FROM users;`));
 }
 ```
+
+### `Error: Failed to load chunk server/chunks/ssr/<chunk_name>.js`
+
+If you see an error similar to:
+
+```text
+✘ [ERROR] ⨯ Error: Failed to load chunk server/chunks/ssr/<chunk_name>.js
+
+      at loadChunkPath
+  (...)
+      at Object.loadChunk
+  (...)
+      at .open-next/server-functions/default/.next/server/app/page.js
+```
+
+You are proably using a turbopack enabled build (`next build --turbo`) which is not currently supported by OpenNext.
+Change your build command to `next build` to fix the issue.

From ee3bb9cbb249a509c138a2f067c99bb790a0e1cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjam=C3=ADn=20Vicente?=
 <62021328+benjavicente@users.noreply.github.com>
Date: Mon, 5 May 2025 10:06:55 -0400
Subject: [PATCH 114/140] docs(cloudflare): add static assets caching (#144)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/caching.mdx     | 16 ++++++++++++++++
 pages/cloudflare/get-started.mdx | 23 +++++++++++++++++------
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 92d5907..b2f127b 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -212,6 +212,22 @@ For staging, when your site receives low traffic from a single IP, you can repla
 
 ### References
 
+#### Static Assets Caching
+
+<Callout type="info">
+  The worker doesn't run **in front** of static assets, so the `headers` option of `next.config.ts` doesn't
+  apply to public files (`public`) and immutable build files (like `_next/static`).
+</Callout>
+
+By default, Cloudflare [Static Assets headers](https://developers.cloudflare.com/workers/static-assets/headers/#default-headers) use `max-age=0` with `must-revalidate`, allowing the browser to cache assets but with a revalidation request. This is the [same default behavior as the `public` folder on Next.js](https://nextjs.org/docs/app/api-reference/file-conventions/public-folder#caching).
+
+Next.js also generates _immutable_ files that don't change between builds. Those files will also be served from Static Assets. To match the [default cache behavior of immutable assets in Next.js](https://nextjs.org/docs/app/guides/self-hosting#automatic-caching), avoiding unnecessary revalidation requests, add the following header to the [`public/_headers`](https://developers.cloudflare.com/workers/static-assets/headers/#custom-headers) file:
+
+```txt
+/_next/static/*
+  Cache-Control: public,max-age=31536000,immutable
+```
+
 #### Incremental Static Regeneration (ISR)
 
 There are 3 storage options for the incremental cache:
diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 454d474..9626378 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -138,21 +138,32 @@ Add the following to the scripts field of your `package.json` file:
 - `npm run upload`: Builds your app, and then uploads a new [version](https://developers.cloudflare.com/workers/configuration/versions-and-deployments/#versions) of it to Cloudflare.
 - `cf-typegen`: Generates a `cloudflare-env.d.ts` file at the root of your project containing [the types for the `env`](https://developers.cloudflare.com/workers/wrangler/commands/#types).
 
-##### 7. Add caching with Cloudflare R2
+##### 7. Add Static Asset Caching
+
+Add a `public/_headers` file, with at least the following headers:
+
+```txt
+/_next/static/*
+  Cache-Control: public,max-age=31536000,immutable
+```
+
+See the [Static Assets Caching docs](/cloudflare/caching#static-assets-caching) for more information.
+
+##### 8. Add caching with Cloudflare R2
 
 See the [Caching docs](/cloudflare/caching) for information on enabling Next.js caching in your OpenNext project.
 
-##### 8. Remove any `export const runtime = "edge";` if present
+##### 9. Remove any `export const runtime = "edge";` if present
 
 Before deploying your app, remove the `export const runtime = "edge";` line from any of your source files.
 
 The edge runtime is not supported yet with `@opennextjs/cloudflare`.
 
-##### 9. Add `.open-next` to `.gitignore`
+##### 10. Add `.open-next` to `.gitignore`
 
 You should add `.open-next` to your `.gitignore` file to prevent the build output from being committed to your repository.
 
-##### 10. Remove `@cloudflare/next-on-pages` (if necessary)
+##### 11. Remove `@cloudflare/next-on-pages` (if necessary)
 
 If your Next.js app currently uses `@cloudflare/next-on-pages`, you'll want to remove it, and make a few changes.
 
@@ -166,7 +177,7 @@ This includes:
   (those can be replaced with `getCloudflareContext` calls from `@opennextjs/cloudflare`)
 - next-on-pages eslint rules set in your Eslint config file
 
-##### 11. Develop locally
+##### 12. Develop locally
 
 You can continue to run `next dev` when developing locally.
 
@@ -194,7 +205,7 @@ After having added the `initOpenNextCloudflareForDev()` call in your Next.js con
 In step 3, we also added the `npm run preview`, which allows you to quickly preview your app running locally in the Workers runtime,
 rather than in Node.js. This allows you to test changes in the same runtime as your app will run in when deployed to Cloudflare.
 
-##### 12. Deploy to Cloudflare Workers
+##### 13. Deploy to Cloudflare Workers
 
 Either deploy via the command line:
 

From 485d9b270c3f2250b5ea5ec39bd14241c461cf08 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 6 May 2025 16:19:35 +0200
Subject: [PATCH 115/140] docs(cloudflare): workerd build condition (#143)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
---
 pages/cloudflare/howtos/_meta.json  |  3 +-
 pages/cloudflare/howtos/workerd.mdx | 46 +++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 pages/cloudflare/howtos/workerd.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index 45e3c9d..c8fe30e 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -5,5 +5,6 @@
   "env-vars": "Environment Variables",
   "image": "Image Optimization",
   "custom-worker": "Custom Worker",
-  "keep_names": "__name issues"
+  "keep_names": "__name issues",
+  "workerd": "workerd specific packages"
 }
diff --git a/pages/cloudflare/howtos/workerd.mdx b/pages/cloudflare/howtos/workerd.mdx
new file mode 100644
index 0000000..9fbb0ff
--- /dev/null
+++ b/pages/cloudflare/howtos/workerd.mdx
@@ -0,0 +1,46 @@
+## `workerd` specific code
+
+### Configuration
+
+[`workerd`](https://github.com/cloudflare/workerd) is the runtime cloudflare uses to run Workers code.
+
+While the [`nodejs_compat`](https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag) flag makes `workerd` mostly compatible with Node.js,
+there are still minor differences. Some packages publish code for different runtimes to account for those differences. For example, `postgres` has [conditional exports](https://nodejs.org/api/packages.html#conditional-exports) in its [`package.json`](https://github.com/porsager/postgres/blob/ad0ed4476e09f41f147859cb5a42971d2b99e9c7/package.json#L8-L13):
+
+```json
+"exports": {
+  "types": "./types/index.d.ts",
+  "bun": "./src/index.js",
+  "workerd": "./cf/src/index.js",
+  "import": "./src/index.js",
+  "default": "./cjs/src/index.js"
+},
+```
+
+With such exports, Node.js applications use either `src/index.js` or `cjs/src/index.js` depending if the app use ESM or CJS.
+
+However we want to use the `workerd` specific entrypoint when using the Cloudflare adapter.
+For that, you need to instruct Next.js not to bundle packages as it would use the node conditions by default.
+
+To do that, add those packages in the `serverExternalPackages` key of your `next.config.ts`:
+
+```ts
+// node.config.ts
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  serverExternalPackages: ["@prisma/client", ".prisma/client", "postgres"],
+};
+
+import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
+initOpenNextCloudflareForDev();
+
+export default nextConfig;
+```
+
+### Packages known to have `workerd` specific code
+
+- `postgres`
+- `@prisma/client` (and the generated `.prisma/client`)
+
+Please report an issue on [the adapter GH repository](https://github.com/opennextjs/opennextjs-cloudflare/issues) to have packages added to this list.

From adf73d788aec3df8b49b79d8f7b328686aff2f68 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Tue, 6 May 2025 16:20:00 +0200
Subject: [PATCH 116/140] [cloudflare] add docs for cache interception (#146)

---
 pages/cloudflare/caching.mdx | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index b2f127b..6ffd02c 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -16,6 +16,9 @@ The `@opennextjs/cloudflare` caching supports rely on 3 components:
 - A **Queue** to synchronize and deduplicate time-based revalidations
 - A **Tag Cache** for On-demand revalidations via [`revalidateTag`](https://nextjs.org/docs/app/api-reference/functions/revalidateTag) and [`revalidatePath`](https://nextjs.org/docs/app/api-reference/functions/revalidatePath).
 
+You can also enable cache interception, to avoid calling the `NextServer` and thus loading the javascript associated with the page. It can slightly improve cold start performance for ISR/SSG route on cached routes.
+As of now, cache interception does not work with PPR and is not enabled by default.
+
 The adapter provides several implementations for each of those components configured in `open-next.config.ts`.
 
 This guide provides guidelines for common use cases before detailing all the configuration options.
@@ -106,6 +109,8 @@ export default defineCloudflareConfig({
   //   tagCache: d1NextTagCache,
   //   filterFn: softTagFilter,
   // }),
+  // Disable this if you want to use PPR
+  enableCacheInterception: true,
 });
 ```
 
@@ -181,6 +186,8 @@ export default defineCloudflareConfig({
   queue: doQueue,
   // This is only required if you use On-demand revalidation
   tagCache: doShardedTagCache({ baseShardSize: 12 }),
+  // Disable this if you want to use PPR
+  enableCacheInterception: true,
 });
 ```
 
@@ -200,6 +207,7 @@ import staticAssetsIncrementalCache from "@opennextjs/cloudflare/overrides/incre
 
 export default defineCloudflareConfig({
   incrementalCache: staticAssetsIncrementalCache,
+  enableCacheInterception: true,
 });
 ```
 

From e90f6bdb0c1f36cf6a1e9da94c626d1f1cf142e1 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 7 May 2025 09:11:00 +0200
Subject: [PATCH 117/140] docs: composable cache support (#148)

---
 pages/aws/index.mdx        | 2 +-
 pages/cloudflare/index.mdx | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/aws/index.mdx b/pages/aws/index.mdx
index 99ff485..f9c319c 100644
--- a/pages/aws/index.mdx
+++ b/pages/aws/index.mdx
@@ -42,7 +42,7 @@ OpenNext aims to support all Next.js 15 features. Some features are work in prog
 - [x] [Running in lambda@edge](/aws/config/simple_example#running-in-lambdaedge)
 - [x] [No cold start](/aws/inner_workings/components/warmer)
 - [x] Support for after
-- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
+- [x] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`)
 
 ---
 
diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index 76a8d63..ca9f797 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -48,7 +48,7 @@ We will update the list as we progress towards releasing 1.0.
 - [x] [Pages Router](https://nextjs.org/docs/pages)
 - [x] [Incremental Static Regeneration (ISR)](https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration)
 - [x] [Support for after](https://nextjs.org/blog/next-15-rc#executing-code-after-a-response-with-nextafter-experimental)
-- [ ] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`) is a Next.js 15 feature and not supported yet.
+- [x] [Composable Caching](https://nextjs.org/blog/composable-caching) (`'use cache'`)
 
 We welcome both contributions and feedback!
 

From d3b9fec4faf461dff196247e07f5dec87e2e2692 Mon Sep 17 00:00:00 2001
From: Kristofer Robin Kiik <robin@kiik.ee>
Date: Fri, 9 May 2025 12:26:42 +0300
Subject: [PATCH 118/140] Update docs about sentry server sourcemaps (#150)

---
 pages/aws/common_issues.mdx | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/pages/aws/common_issues.mdx b/pages/aws/common_issues.mdx
index c0d27e9..9718137 100644
--- a/pages/aws/common_issues.mdx
+++ b/pages/aws/common_issues.mdx
@@ -17,15 +17,30 @@ You might stumble upon this error inside cloudwatch logs: `Cannot find module 'n
 Next might incorrectly include some dependencies in the bundle. To remove them you can use this configuration inside `next.config.js`:
 
 ```javascript
-experimental: {
-    outputFileTracingExcludes: {
-      "*": ["node_modules/the-unwanted-package"],
-    },
-  },
+outputFileTracingExcludes: { // or experimental.outputFileTracingExcludes on Next < 15
+  "*": ["node_modules/the-unwanted-package"],
+},
 ```
 
 Also you should not add sharp as a dependencies unless absolutely necessary, the image optimization already has it's own version of sharp.
 
+##### Remove sourcemaps
+
+Source maps could add a lot to the bundle, excluding them from standalone output could be worth it.
+For example, Sentry does not remove server side sourcemaps, only client ones, even if "deleteSourcemapsAfterUpload" is true. [See the Sentry source code](https://github.com/getsentry/sentry-javascript/blob/develop/packages/nextjs/src/config/webpackPluginOptions.ts#L83).
+
+You could exclude sourcemaps similarly:
+
+```javascript
+outputFileTracingExcludes: {
+  "*": [
+    './**/*.js.map',
+    './**/*.mjs.map',
+    './**/*.cjs.map'
+  ],
+},
+```
+
 #### Patch fetch behaviour for ISR. Only for next@13.5.1+
 
 If you use ISR and fetch in your app, you may encounter a bug that makes your revalidate values inconsistent.

From 27e7fd2b6a6dd616c97d12696741f333ce8e2915 Mon Sep 17 00:00:00 2001
From: Brendan Irvine-Broque <birvine-broque@cloudflare.com>
Date: Mon, 12 May 2025 15:03:49 -0700
Subject: [PATCH 119/140] Clarify docs and remove pre-1.0 caveats (#152)

---
 pages/cloudflare/index.mdx | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/pages/cloudflare/index.mdx b/pages/cloudflare/index.mdx
index ca9f797..5dcdedd 100644
--- a/pages/cloudflare/index.mdx
+++ b/pages/cloudflare/index.mdx
@@ -27,15 +27,12 @@ This is an important difference from `@cloudflare/next-on-pages`, which only sup
 
 ### Supported Next.js versions
 
-`@opennextjs/cloudflare` is pre 1.0, and still in active development. We intend to support all minor and patch versions of Next.js 15 and the latest minor of Next.js 14.
+All minor and patch versions of Next.js 15 and the latest minor of Next.js 14 are supported.
 
 To help improve compatibility, we encourage you to [report bugs](https://github.com/opennextjs/opennextjs-cloudflare/issues) and contribute code!
 
 ### Supported Next.js features
 
-Some Next.js features are not yet supported are not fully tested.
-We will update the list as we progress towards releasing 1.0.
-
 - [x] [App Router](https://nextjs.org/docs/app)
 - [x] [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)
 - [x] [Dynamic routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)

From 6f2dc38c6e0c3034a6d9c6d8eac435b1cbbd6f6b Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Tue, 13 May 2025 17:14:28 +0200
Subject: [PATCH 120/140] docs(cloudflare): doc `--keep-vars` in the
 environment varaiables howto (#153)

---
 pages/cloudflare/howtos/env-vars.mdx | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/pages/cloudflare/howtos/env-vars.mdx b/pages/cloudflare/howtos/env-vars.mdx
index 2e01ba0..9ec2b04 100644
--- a/pages/cloudflare/howtos/env-vars.mdx
+++ b/pages/cloudflare/howtos/env-vars.mdx
@@ -1,3 +1,5 @@
+import { Callout } from "nextra/components";
+
 ## Environment variables
 
 This entry describe the most sensible way to handle your environment variables which works well both during local development and once your application is deployed to Cloudflare Workers.
@@ -34,3 +36,9 @@ By settings the "Build variables and secrets", the Next build executed by Worker
 #### Runtime variables
 
 Your Next application needs to access environment variables at runtime. You should always set the runtime environment variables [in the Cloudflare dashboard](https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard)
+
+<Callout type="info">
+  If you set environment variables from the dashboard, you can use the
+  [`--keep-vars`](https://developers.cloudflare.com/workers/wrangler/commands/#deploy) option of wrangler to
+  prevent them from being deleted by deployments, i.e. `opennextjs-cloudflare deploy -- --keep-vars`
+</Callout>

From 40505920d1f4eba250d2867b368b16743e14d14a Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 16 May 2025 11:23:38 +0200
Subject: [PATCH 121/140] docs(cloudflare): add details about the workerd
 condition (#154)

---
 pages/cloudflare/howtos/workerd.mdx  |  4 +++-
 pages/cloudflare/troubleshooting.mdx | 14 ++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/howtos/workerd.mdx b/pages/cloudflare/howtos/workerd.mdx
index 9fbb0ff..9ad945e 100644
--- a/pages/cloudflare/howtos/workerd.mdx
+++ b/pages/cloudflare/howtos/workerd.mdx
@@ -40,7 +40,9 @@ export default nextConfig;
 
 ### Packages known to have `workerd` specific code
 
-- `postgres`
+- `@libsql/isomorphic-ws`
 - `@prisma/client` (and the generated `.prisma/client`)
+- `jose`
+- `postgres`
 
 Please report an issue on [the adapter GH repository](https://github.com/opennextjs/opennextjs-cloudflare/issues) to have packages added to this list.
diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 8baac43..9dfc7e9 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -103,3 +103,17 @@ If you see an error similar to:
 
 You are proably using a turbopack enabled build (`next build --turbo`) which is not currently supported by OpenNext.
 Change your build command to `next build` to fix the issue.
+
+### `X [ERROR] Could not resolve "<package>"`
+
+When you see the following error during the build:
+
+```text
+⚙️ Bundling the OpenNext server...
+
+X [ERROR] Could not resolve "<package name>"
+```
+
+It might be because the package contains workerd specific code.
+
+Check this [howto](/cloudflare/howtos/workerd) for a solution.

From 6c21540f2005a1b180930d2682f74580309e1f24 Mon Sep 17 00:00:00 2001
From: Magnus <91796856+sommeeeer@users.noreply.github.com>
Date: Mon, 26 May 2025 14:00:26 +0200
Subject: [PATCH 122/140] [aws]: update compatibility page (#157)

---
 pages/aws/compatibility.mdx | 31 +++++++++++++------------------
 1 file changed, 13 insertions(+), 18 deletions(-)

diff --git a/pages/aws/compatibility.mdx b/pages/aws/compatibility.mdx
index 21a7f22..2dfb83f 100644
--- a/pages/aws/compatibility.mdx
+++ b/pages/aws/compatibility.mdx
@@ -15,19 +15,21 @@ This page will list the release of Next.js that was tested at the time of the re
 
 | OpenNext Version | Next.js Version |
 | ---------------- | --------------- |
-| 3.5.1            | 15.2.0          |
-| 3.5.0            | 15.2.0          |
-| 3.4.2            | 15.1.6          |
-| 3.4.1            | 15.1.6          |
+| 3.6.1 to 3.6.2   | 15.3.2          |
+| 3.5.8 to 3.6.0   | 15.3.1          |
+| 3.5.7            | 15.3.0          |
+| 3.5.6            | 15.2.5          |
+| 3.5.3 to 3.5.5   | 15.2.4          |
+| 3.5.2            | 15.2.2          |
+| 3.5.0 to 3.5.1   | 15.2.0          |
+| 3.4.1 to 3.4.2   | 15.1.6          |
 | 3.4.0            | 15.1.5          |
 | 3.3.1            | 15.1.3          |
 | 3.3.0            | 15.1.0          |
 | 3.2.2            | 15.0.3          |
 | 3.2.1            | 15.0.2          |
 | 3.2.0            | 15.0.1          |
-| 3.1.6            | 14.2.15         |
-| 3.1.5            | 14.2.15         |
-| 3.1.4            | 14.2.15         |
+| 3.1.4 to 3.1.6   | 14.2.15         |
 
 #### `open-next` Compatibility
 
@@ -40,15 +42,8 @@ This page will list the release of Next.js that was tested at the time of the re
 | ---------------- | --------------- |
 | 3.1.3            | 14.2.13         |
 | 3.1.2            | 14.2.8          |
-| 3.1.1            | 14.2.6          |
-| 3.1.0            | 14.2.6          |
-| 3.0.8            | 14.2.5          |
-| 3.0.7            | 14.2.5          |
-| 3.0.6            | 14.2.4          |
-| 3.0.5            | 14.2.4          |
-| 3.0.4            | 14.2.4          |
-| 3.0.3            | 14.2.4          |
-| 3.0.2            | 14.2.3          |
-| 3.0.1            | 14.2.3          |
-| 3.0.0            | 14.2.3          |
+| 3.1.0 to 3.1.1   | 14.2.6          |
+| 3.0.7 to 3.0.8   | 14.2.5          |
+| 3.0.3 to 3.0.6   | 14.2.4          |
+| 3.0.0 to 3.0.2   | 14.2.3          |
 | 2.3.9            | 14.1.4          |

From da4476423c07d577732a3cd756ed2f144a581930 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 26 May 2025 14:33:33 +0200
Subject: [PATCH 123/140] docs(cloudflare): add docs about the build script
 (#159)

---
 pages/cloudflare/get-started.mdx |    2 +
 pnpm-lock.yaml                   | 4403 ++++++++++++++++++++++++++++++
 2 files changed, 4405 insertions(+)
 create mode 100644 pnpm-lock.yaml

diff --git a/pages/cloudflare/get-started.mdx b/pages/cloudflare/get-started.mdx
index 9626378..050b8b3 100644
--- a/pages/cloudflare/get-started.mdx
+++ b/pages/cloudflare/get-started.mdx
@@ -127,12 +127,14 @@ The `NEXTJS_ENV` variable defines the environment to use when loading Next.js `.
 Add the following to the scripts field of your `package.json` file:
 
 ```json
+"build": "next build",
 "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
 "deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
 "upload": "opennextjs-cloudflare build && opennextjs-cloudflare upload",
 "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",
 ```
 
+- The `build` script must invoke the Next.js build command, it will be invoke by `opennextjs-cloudflare build`.
 - `npm run preview`: Builds your app and serves it locally, allowing you to quickly preview your app running locally in the Workers runtime, via a single command.
 - `npm run deploy`: Builds your app, and then immediately deploys it to Cloudflare.
 - `npm run upload`: Builds your app, and then uploads a new [version](https://developers.cloudflare.com/workers/configuration/versions-and-deployments/#versions) of it to Cloudflare.
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..e08b7f3
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,4403 @@
+lockfileVersion: "9.0"
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+  .:
+    dependencies:
+      "@types/node":
+        specifier: 18.11.9
+        version: 18.11.9
+      "@types/react":
+        specifier: 18.0.25
+        version: 18.0.25
+      "@types/react-dom":
+        specifier: 18.0.9
+        version: 18.0.9
+      next:
+        specifier: 13.4.12
+        version: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      nextra:
+        specifier: ^2.13.1
+        version: 2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      nextra-theme-docs:
+        specifier: ^2.13.1
+        version: 2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      react:
+        specifier: 18.2.0
+        version: 18.2.0
+      react-dom:
+        specifier: 18.2.0
+        version: 18.2.0(react@18.2.0)
+      typescript:
+        specifier: 4.9.3
+        version: 4.9.3
+    devDependencies:
+      prettier:
+        specifier: ^3.5.2
+        version: 3.5.3
+
+packages:
+  "@babel/runtime@7.26.10":
+    resolution:
+      {
+        integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==,
+      }
+    engines: { node: ">=6.9.0" }
+
+  "@braintree/sanitize-url@6.0.4":
+    resolution:
+      {
+        integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==,
+      }
+
+  "@headlessui/react@1.7.19":
+    resolution:
+      {
+        integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==,
+      }
+    engines: { node: ">=10" }
+    peerDependencies:
+      react: ^16 || ^17 || ^18
+      react-dom: ^16 || ^17 || ^18
+
+  "@mdx-js/mdx@2.3.0":
+    resolution:
+      {
+        integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==,
+      }
+
+  "@mdx-js/react@2.3.0":
+    resolution:
+      {
+        integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==,
+      }
+    peerDependencies:
+      react: ">=16"
+
+  "@napi-rs/simple-git-android-arm-eabi@0.1.19":
+    resolution:
+      {
+        integrity: sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm]
+    os: [android]
+
+  "@napi-rs/simple-git-android-arm64@0.1.19":
+    resolution:
+      {
+        integrity: sha512-ZQ0cPvY6nV9p7zrR9ZPo7hQBkDAcY/CHj3BjYNhykeUCiSNCrhvwX+WEeg5on8M1j4d5jcI/cwVG2FslfiByUg==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [android]
+
+  "@napi-rs/simple-git-darwin-arm64@0.1.19":
+    resolution:
+      {
+        integrity: sha512-viZB5TYgjA1vH+QluhxZo0WKro3xBA+1xSzYx8mcxUMO5gnAoUMwXn0ZO/6Zy6pai+aGae+cj6XihGnrBRu3Pg==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [darwin]
+
+  "@napi-rs/simple-git-darwin-x64@0.1.19":
+    resolution:
+      {
+        integrity: sha512-6dNkzSNUV5X9rsVYQbpZLyJu4Gtkl2vNJ3abBXHX/Etk0ILG5ZasO3ncznIANZQpqcbn/QPHr49J2QYAXGoKJA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [darwin]
+
+  "@napi-rs/simple-git-freebsd-x64@0.1.19":
+    resolution:
+      {
+        integrity: sha512-sB9krVIchzd20FjI2ZZ8FDsTSsXLBdnwJ6CpeVyrhXHnoszfcqxt49ocZHujAS9lMpXq7i2Nv1EXJmCy4KdhwA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [freebsd]
+
+  "@napi-rs/simple-git-linux-arm-gnueabihf@0.1.19":
+    resolution:
+      {
+        integrity: sha512-6HPn09lr9N1n5/XKfP8Np53g4fEXVxOFqNkS6rTH3Rm1lZHdazTRH62RggXLTguZwjcE+MvOLvoTIoR5kAS8+g==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-arm64-gnu@0.1.19":
+    resolution:
+      {
+        integrity: sha512-G0gISckt4cVDp3oh5Z6PV3GHJrJO6Z8bIS+9xA7vTtKdqB1i5y0n3cSFLlzQciLzhr+CajFD27doW4lEyErQ/Q==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-arm64-musl@0.1.19":
+    resolution:
+      {
+        integrity: sha512-OwTRF+H4IZYxmDFRi1IrLMfqbdIpvHeYbJl2X94NVsLVOY+3NUHvEzL3fYaVx5urBaMnIK0DD3wZLbcueWvxbA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-powerpc64le-gnu@0.1.19":
+    resolution:
+      {
+        integrity: sha512-p7zuNNVyzpRvkCt2RIGv9FX/WPcPbZ6/FRUgUTZkA2WU33mrbvNqSi4AOqCCl6mBvEd+EOw5NU4lS9ORRJvAEg==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [powerpc64le]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-s390x-gnu@0.1.19":
+    resolution:
+      {
+        integrity: sha512-6N2vwJUPLiak8GLrS0a3is0gSb0UwI2CHOOqtvQxPmv+JVI8kn3vKiUscsktdDb0wGEPeZ8PvZs0y8UWix7K4g==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [s390x]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-x64-gnu@0.1.19":
+    resolution:
+      {
+        integrity: sha512-61YfeO1J13WK7MalLgP3QlV6of2rWnVw1aqxWkAgy/lGxoOFSJ4Wid6ANVCEZk4tJpPX/XNeneqkUz5xpeb2Cw==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [linux]
+
+  "@napi-rs/simple-git-linux-x64-musl@0.1.19":
+    resolution:
+      {
+        integrity: sha512-cCTWNpMJnN3PrUBItWcs3dQKCydsIasbrS3laMzq8k7OzF93Zrp2LWDTPlLCO9brbBVpBzy2Qk5Xg9uAfe/Ukw==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [linux]
+
+  "@napi-rs/simple-git-win32-arm64-msvc@0.1.19":
+    resolution:
+      {
+        integrity: sha512-sWavb1BjeLKKBA+PbTsRSSzVNfb7V/dOpaJvkgR5d2kWFn/AHmCZHSSj/3nyZdYf0BdDC+DIvqk3daAEZ6QMVw==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [win32]
+
+  "@napi-rs/simple-git-win32-x64-msvc@0.1.19":
+    resolution:
+      {
+        integrity: sha512-FmNuPoK4+qwaSCkp8lm3sJlrxk374enW+zCE5ZksXlZzj/9BDJAULJb5QUJ7o9Y8A/G+d8LkdQLPBE2Jaxe5XA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [win32]
+
+  "@napi-rs/simple-git@0.1.19":
+    resolution:
+      {
+        integrity: sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==,
+      }
+    engines: { node: ">= 10" }
+
+  "@next/env@13.4.12":
+    resolution:
+      {
+        integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==,
+      }
+
+  "@next/swc-darwin-arm64@13.4.12":
+    resolution:
+      {
+        integrity: sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [darwin]
+
+  "@next/swc-darwin-x64@13.4.12":
+    resolution:
+      {
+        integrity: sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [darwin]
+
+  "@next/swc-linux-arm64-gnu@13.4.12":
+    resolution:
+      {
+        integrity: sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [linux]
+
+  "@next/swc-linux-arm64-musl@13.4.12":
+    resolution:
+      {
+        integrity: sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [linux]
+
+  "@next/swc-linux-x64-gnu@13.4.12":
+    resolution:
+      {
+        integrity: sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [linux]
+
+  "@next/swc-linux-x64-musl@13.4.12":
+    resolution:
+      {
+        integrity: sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [linux]
+
+  "@next/swc-win32-arm64-msvc@13.4.12":
+    resolution:
+      {
+        integrity: sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [arm64]
+    os: [win32]
+
+  "@next/swc-win32-ia32-msvc@13.4.12":
+    resolution:
+      {
+        integrity: sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [ia32]
+    os: [win32]
+
+  "@next/swc-win32-x64-msvc@13.4.12":
+    resolution:
+      {
+        integrity: sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==,
+      }
+    engines: { node: ">= 10" }
+    cpu: [x64]
+    os: [win32]
+
+  "@popperjs/core@2.11.8":
+    resolution:
+      {
+        integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==,
+      }
+
+  "@swc/helpers@0.5.1":
+    resolution:
+      {
+        integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==,
+      }
+
+  "@tanstack/react-virtual@3.13.3":
+    resolution:
+      {
+        integrity: sha512-khJmiDJCkklsDTvXxTZHfEa7H161e94eDKxKyXqg9/3LstIbRg4JWBxPD2/e3LKtklC5dxkoYzNllCMVR904FA==,
+      }
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  "@tanstack/virtual-core@3.13.3":
+    resolution:
+      {
+        integrity: sha512-9kfCeSG6zUx1I1iF4RKZrquNog3Eho1T6+LyJEDYpHjNNdDlRhXyqzTod5u6LCEBSeG0f2txkNjAq0tFbCJ4bA==,
+      }
+
+  "@theguild/remark-mermaid@0.0.5":
+    resolution:
+      {
+        integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==,
+      }
+    peerDependencies:
+      react: ^18.2.0
+
+  "@theguild/remark-npm2yarn@0.2.1":
+    resolution:
+      {
+        integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==,
+      }
+
+  "@types/acorn@4.0.6":
+    resolution:
+      {
+        integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==,
+      }
+
+  "@types/d3-scale-chromatic@3.1.0":
+    resolution:
+      {
+        integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==,
+      }
+
+  "@types/d3-scale@4.0.9":
+    resolution:
+      {
+        integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==,
+      }
+
+  "@types/d3-time@3.0.4":
+    resolution:
+      {
+        integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==,
+      }
+
+  "@types/debug@4.1.12":
+    resolution:
+      {
+        integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==,
+      }
+
+  "@types/estree-jsx@1.0.5":
+    resolution:
+      {
+        integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==,
+      }
+
+  "@types/estree@1.0.6":
+    resolution:
+      {
+        integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==,
+      }
+
+  "@types/hast@2.3.10":
+    resolution:
+      {
+        integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==,
+      }
+
+  "@types/hast@3.0.4":
+    resolution:
+      {
+        integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==,
+      }
+
+  "@types/js-yaml@4.0.9":
+    resolution:
+      {
+        integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==,
+      }
+
+  "@types/katex@0.16.7":
+    resolution:
+      {
+        integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==,
+      }
+
+  "@types/mdast@3.0.15":
+    resolution:
+      {
+        integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==,
+      }
+
+  "@types/mdast@4.0.4":
+    resolution:
+      {
+        integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==,
+      }
+
+  "@types/mdx@2.0.13":
+    resolution:
+      {
+        integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==,
+      }
+
+  "@types/ms@2.1.0":
+    resolution:
+      {
+        integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==,
+      }
+
+  "@types/node@18.11.9":
+    resolution:
+      {
+        integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==,
+      }
+
+  "@types/prop-types@15.7.14":
+    resolution:
+      {
+        integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==,
+      }
+
+  "@types/react-dom@18.0.9":
+    resolution:
+      {
+        integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==,
+      }
+
+  "@types/react@18.0.25":
+    resolution:
+      {
+        integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==,
+      }
+
+  "@types/scheduler@0.23.0":
+    resolution:
+      {
+        integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==,
+      }
+
+  "@types/unist@2.0.11":
+    resolution:
+      {
+        integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==,
+      }
+
+  "@types/unist@3.0.3":
+    resolution:
+      {
+        integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==,
+      }
+
+  "@ungap/structured-clone@1.3.0":
+    resolution:
+      {
+        integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==,
+      }
+
+  acorn-jsx@5.3.2:
+    resolution:
+      {
+        integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==,
+      }
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  acorn@8.14.1:
+    resolution:
+      {
+        integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==,
+      }
+    engines: { node: ">=0.4.0" }
+    hasBin: true
+
+  ansi-sequence-parser@1.1.3:
+    resolution:
+      {
+        integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==,
+      }
+
+  ansi-styles@3.2.1:
+    resolution:
+      {
+        integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==,
+      }
+    engines: { node: ">=4" }
+
+  arch@2.2.0:
+    resolution:
+      {
+        integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==,
+      }
+
+  arg@1.0.0:
+    resolution:
+      {
+        integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==,
+      }
+
+  argparse@1.0.10:
+    resolution:
+      {
+        integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==,
+      }
+
+  argparse@2.0.1:
+    resolution:
+      {
+        integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==,
+      }
+
+  astring@1.9.0:
+    resolution:
+      {
+        integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==,
+      }
+    hasBin: true
+
+  bail@2.0.2:
+    resolution:
+      {
+        integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==,
+      }
+
+  busboy@1.6.0:
+    resolution:
+      {
+        integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==,
+      }
+    engines: { node: ">=10.16.0" }
+
+  caniuse-lite@1.0.30001704:
+    resolution:
+      {
+        integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==,
+      }
+
+  ccount@2.0.1:
+    resolution:
+      {
+        integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==,
+      }
+
+  chalk@2.3.0:
+    resolution:
+      {
+        integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==,
+      }
+    engines: { node: ">=4" }
+
+  character-entities-html4@2.1.0:
+    resolution:
+      {
+        integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==,
+      }
+
+  character-entities-legacy@3.0.0:
+    resolution:
+      {
+        integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==,
+      }
+
+  character-entities@2.0.2:
+    resolution:
+      {
+        integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==,
+      }
+
+  character-reference-invalid@2.0.1:
+    resolution:
+      {
+        integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==,
+      }
+
+  client-only@0.0.1:
+    resolution:
+      {
+        integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==,
+      }
+
+  clipboardy@1.2.2:
+    resolution:
+      {
+        integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==,
+      }
+    engines: { node: ">=4" }
+
+  clsx@2.1.1:
+    resolution:
+      {
+        integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==,
+      }
+    engines: { node: ">=6" }
+
+  color-convert@1.9.3:
+    resolution:
+      {
+        integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==,
+      }
+
+  color-name@1.1.3:
+    resolution:
+      {
+        integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==,
+      }
+
+  comma-separated-tokens@2.0.3:
+    resolution:
+      {
+        integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==,
+      }
+
+  commander@7.2.0:
+    resolution:
+      {
+        integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==,
+      }
+    engines: { node: ">= 10" }
+
+  commander@8.3.0:
+    resolution:
+      {
+        integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==,
+      }
+    engines: { node: ">= 12" }
+
+  compute-scroll-into-view@3.1.1:
+    resolution:
+      {
+        integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==,
+      }
+
+  cose-base@1.0.3:
+    resolution:
+      {
+        integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==,
+      }
+
+  cross-spawn@5.1.0:
+    resolution:
+      {
+        integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==,
+      }
+
+  csstype@3.1.3:
+    resolution:
+      {
+        integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==,
+      }
+
+  cytoscape-cose-bilkent@4.1.0:
+    resolution:
+      {
+        integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==,
+      }
+    peerDependencies:
+      cytoscape: ^3.2.0
+
+  cytoscape@3.31.1:
+    resolution:
+      {
+        integrity: sha512-Hx5Mtb1+hnmAKaZZ/7zL1Y5HTFYOjdDswZy/jD+1WINRU8KVi1B7+vlHdsTwY+VCFucTreoyu1RDzQJ9u0d2Hw==,
+      }
+    engines: { node: ">=0.10" }
+
+  d3-array@2.12.1:
+    resolution:
+      {
+        integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==,
+      }
+
+  d3-array@3.2.4:
+    resolution:
+      {
+        integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-axis@3.0.0:
+    resolution:
+      {
+        integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==,
+      }
+    engines: { node: ">=12" }
+
+  d3-brush@3.0.0:
+    resolution:
+      {
+        integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-chord@3.0.1:
+    resolution:
+      {
+        integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==,
+      }
+    engines: { node: ">=12" }
+
+  d3-color@3.1.0:
+    resolution:
+      {
+        integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-contour@4.0.2:
+    resolution:
+      {
+        integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-delaunay@6.0.4:
+    resolution:
+      {
+        integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==,
+      }
+    engines: { node: ">=12" }
+
+  d3-dispatch@3.0.1:
+    resolution:
+      {
+        integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-drag@3.0.0:
+    resolution:
+      {
+        integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-dsv@3.0.1:
+    resolution:
+      {
+        integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==,
+      }
+    engines: { node: ">=12" }
+    hasBin: true
+
+  d3-ease@3.0.1:
+    resolution:
+      {
+        integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==,
+      }
+    engines: { node: ">=12" }
+
+  d3-fetch@3.0.1:
+    resolution:
+      {
+        integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==,
+      }
+    engines: { node: ">=12" }
+
+  d3-force@3.0.0:
+    resolution:
+      {
+        integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-format@3.1.0:
+    resolution:
+      {
+        integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-geo@3.1.1:
+    resolution:
+      {
+        integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==,
+      }
+    engines: { node: ">=12" }
+
+  d3-hierarchy@3.1.2:
+    resolution:
+      {
+        integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-interpolate@3.0.1:
+    resolution:
+      {
+        integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==,
+      }
+    engines: { node: ">=12" }
+
+  d3-path@1.0.9:
+    resolution:
+      {
+        integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==,
+      }
+
+  d3-path@3.1.0:
+    resolution:
+      {
+        integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-polygon@3.0.1:
+    resolution:
+      {
+        integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-quadtree@3.0.1:
+    resolution:
+      {
+        integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==,
+      }
+    engines: { node: ">=12" }
+
+  d3-random@3.0.1:
+    resolution:
+      {
+        integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-sankey@0.12.3:
+    resolution:
+      {
+        integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==,
+      }
+
+  d3-scale-chromatic@3.1.0:
+    resolution:
+      {
+        integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-scale@4.0.2:
+    resolution:
+      {
+        integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-selection@3.0.0:
+    resolution:
+      {
+        integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==,
+      }
+    engines: { node: ">=12" }
+
+  d3-shape@1.3.7:
+    resolution:
+      {
+        integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==,
+      }
+
+  d3-shape@3.2.0:
+    resolution:
+      {
+        integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-time-format@4.1.0:
+    resolution:
+      {
+        integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==,
+      }
+    engines: { node: ">=12" }
+
+  d3-time@3.1.0:
+    resolution:
+      {
+        integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==,
+      }
+    engines: { node: ">=12" }
+
+  d3-timer@3.0.1:
+    resolution:
+      {
+        integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==,
+      }
+    engines: { node: ">=12" }
+
+  d3-transition@3.0.1:
+    resolution:
+      {
+        integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==,
+      }
+    engines: { node: ">=12" }
+    peerDependencies:
+      d3-selection: 2 - 3
+
+  d3-zoom@3.0.0:
+    resolution:
+      {
+        integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==,
+      }
+    engines: { node: ">=12" }
+
+  d3@7.9.0:
+    resolution:
+      {
+        integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==,
+      }
+    engines: { node: ">=12" }
+
+  dagre-d3-es@7.0.10:
+    resolution:
+      {
+        integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==,
+      }
+
+  dayjs@1.11.13:
+    resolution:
+      {
+        integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==,
+      }
+
+  debug@4.4.0:
+    resolution:
+      {
+        integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==,
+      }
+    engines: { node: ">=6.0" }
+    peerDependencies:
+      supports-color: "*"
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decode-named-character-reference@1.1.0:
+    resolution:
+      {
+        integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==,
+      }
+
+  delaunator@5.0.1:
+    resolution:
+      {
+        integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==,
+      }
+
+  dequal@2.0.3:
+    resolution:
+      {
+        integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==,
+      }
+    engines: { node: ">=6" }
+
+  devlop@1.1.0:
+    resolution:
+      {
+        integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==,
+      }
+
+  diff@5.2.0:
+    resolution:
+      {
+        integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==,
+      }
+    engines: { node: ">=0.3.1" }
+
+  dompurify@3.1.6:
+    resolution:
+      {
+        integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==,
+      }
+
+  elkjs@0.9.3:
+    resolution:
+      {
+        integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==,
+      }
+
+  entities@4.5.0:
+    resolution:
+      {
+        integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==,
+      }
+    engines: { node: ">=0.12" }
+
+  escape-string-regexp@1.0.5:
+    resolution:
+      {
+        integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==,
+      }
+    engines: { node: ">=0.8.0" }
+
+  escape-string-regexp@5.0.0:
+    resolution:
+      {
+        integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==,
+      }
+    engines: { node: ">=12" }
+
+  esprima@4.0.1:
+    resolution:
+      {
+        integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==,
+      }
+    engines: { node: ">=4" }
+    hasBin: true
+
+  estree-util-attach-comments@2.1.1:
+    resolution:
+      {
+        integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==,
+      }
+
+  estree-util-build-jsx@2.2.2:
+    resolution:
+      {
+        integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==,
+      }
+
+  estree-util-is-identifier-name@2.1.0:
+    resolution:
+      {
+        integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==,
+      }
+
+  estree-util-to-js@1.2.0:
+    resolution:
+      {
+        integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==,
+      }
+
+  estree-util-value-to-estree@1.3.0:
+    resolution:
+      {
+        integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==,
+      }
+    engines: { node: ">=12.0.0" }
+
+  estree-util-visit@1.2.1:
+    resolution:
+      {
+        integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==,
+      }
+
+  estree-walker@3.0.3:
+    resolution:
+      {
+        integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==,
+      }
+
+  execa@0.8.0:
+    resolution:
+      {
+        integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==,
+      }
+    engines: { node: ">=4" }
+
+  extend-shallow@2.0.1:
+    resolution:
+      {
+        integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  extend@3.0.2:
+    resolution:
+      {
+        integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==,
+      }
+
+  flexsearch@0.7.43:
+    resolution:
+      {
+        integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==,
+      }
+
+  focus-visible@5.2.1:
+    resolution:
+      {
+        integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==,
+      }
+
+  get-stream@3.0.0:
+    resolution:
+      {
+        integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==,
+      }
+    engines: { node: ">=4" }
+
+  git-up@7.0.0:
+    resolution:
+      {
+        integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==,
+      }
+
+  git-url-parse@13.1.1:
+    resolution:
+      {
+        integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==,
+      }
+
+  github-slugger@2.0.0:
+    resolution:
+      {
+        integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==,
+      }
+
+  glob-to-regexp@0.4.1:
+    resolution:
+      {
+        integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==,
+      }
+
+  graceful-fs@4.2.11:
+    resolution:
+      {
+        integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==,
+      }
+
+  gray-matter@4.0.3:
+    resolution:
+      {
+        integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==,
+      }
+    engines: { node: ">=6.0" }
+
+  has-flag@2.0.0:
+    resolution:
+      {
+        integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  hash-obj@4.0.0:
+    resolution:
+      {
+        integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==,
+      }
+    engines: { node: ">=12" }
+
+  hast-util-from-dom@5.0.1:
+    resolution:
+      {
+        integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==,
+      }
+
+  hast-util-from-html-isomorphic@2.0.0:
+    resolution:
+      {
+        integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==,
+      }
+
+  hast-util-from-html@2.0.3:
+    resolution:
+      {
+        integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==,
+      }
+
+  hast-util-from-parse5@8.0.3:
+    resolution:
+      {
+        integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==,
+      }
+
+  hast-util-is-element@3.0.0:
+    resolution:
+      {
+        integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==,
+      }
+
+  hast-util-parse-selector@4.0.0:
+    resolution:
+      {
+        integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==,
+      }
+
+  hast-util-raw@9.1.0:
+    resolution:
+      {
+        integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==,
+      }
+
+  hast-util-to-estree@2.3.3:
+    resolution:
+      {
+        integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==,
+      }
+
+  hast-util-to-parse5@8.0.0:
+    resolution:
+      {
+        integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==,
+      }
+
+  hast-util-to-text@4.0.2:
+    resolution:
+      {
+        integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==,
+      }
+
+  hast-util-whitespace@2.0.1:
+    resolution:
+      {
+        integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==,
+      }
+
+  hastscript@9.0.1:
+    resolution:
+      {
+        integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==,
+      }
+
+  html-void-elements@3.0.0:
+    resolution:
+      {
+        integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==,
+      }
+
+  iconv-lite@0.6.3:
+    resolution:
+      {
+        integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  inline-style-parser@0.1.1:
+    resolution:
+      {
+        integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==,
+      }
+
+  internmap@1.0.1:
+    resolution:
+      {
+        integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==,
+      }
+
+  internmap@2.0.3:
+    resolution:
+      {
+        integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==,
+      }
+    engines: { node: ">=12" }
+
+  intersection-observer@0.12.2:
+    resolution:
+      {
+        integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==,
+      }
+
+  is-alphabetical@2.0.1:
+    resolution:
+      {
+        integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==,
+      }
+
+  is-alphanumerical@2.0.1:
+    resolution:
+      {
+        integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==,
+      }
+
+  is-buffer@2.0.5:
+    resolution:
+      {
+        integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==,
+      }
+    engines: { node: ">=4" }
+
+  is-decimal@2.0.1:
+    resolution:
+      {
+        integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==,
+      }
+
+  is-extendable@0.1.1:
+    resolution:
+      {
+        integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  is-hexadecimal@2.0.1:
+    resolution:
+      {
+        integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==,
+      }
+
+  is-obj@3.0.0:
+    resolution:
+      {
+        integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==,
+      }
+    engines: { node: ">=12" }
+
+  is-plain-obj@3.0.0:
+    resolution:
+      {
+        integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==,
+      }
+    engines: { node: ">=10" }
+
+  is-plain-obj@4.1.0:
+    resolution:
+      {
+        integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==,
+      }
+    engines: { node: ">=12" }
+
+  is-reference@3.0.3:
+    resolution:
+      {
+        integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==,
+      }
+
+  is-ssh@1.4.1:
+    resolution:
+      {
+        integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==,
+      }
+
+  is-stream@1.1.0:
+    resolution:
+      {
+        integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  isexe@2.0.0:
+    resolution:
+      {
+        integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==,
+      }
+
+  js-tokens@4.0.0:
+    resolution:
+      {
+        integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==,
+      }
+
+  js-yaml@3.14.1:
+    resolution:
+      {
+        integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==,
+      }
+    hasBin: true
+
+  js-yaml@4.1.0:
+    resolution:
+      {
+        integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==,
+      }
+    hasBin: true
+
+  jsonc-parser@3.3.1:
+    resolution:
+      {
+        integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==,
+      }
+
+  katex@0.16.21:
+    resolution:
+      {
+        integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==,
+      }
+    hasBin: true
+
+  khroma@2.1.0:
+    resolution:
+      {
+        integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==,
+      }
+
+  kind-of@6.0.3:
+    resolution:
+      {
+        integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  kleur@4.1.5:
+    resolution:
+      {
+        integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==,
+      }
+    engines: { node: ">=6" }
+
+  layout-base@1.0.2:
+    resolution:
+      {
+        integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==,
+      }
+
+  lodash-es@4.17.21:
+    resolution:
+      {
+        integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==,
+      }
+
+  lodash.get@4.4.2:
+    resolution:
+      {
+        integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==,
+      }
+    deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
+
+  longest-streak@3.1.0:
+    resolution:
+      {
+        integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==,
+      }
+
+  loose-envify@1.4.0:
+    resolution:
+      {
+        integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==,
+      }
+    hasBin: true
+
+  lru-cache@4.1.5:
+    resolution:
+      {
+        integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==,
+      }
+
+  markdown-extensions@1.1.1:
+    resolution:
+      {
+        integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  markdown-table@3.0.4:
+    resolution:
+      {
+        integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==,
+      }
+
+  match-sorter@6.3.4:
+    resolution:
+      {
+        integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==,
+      }
+
+  mdast-util-definitions@5.1.2:
+    resolution:
+      {
+        integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==,
+      }
+
+  mdast-util-find-and-replace@2.2.2:
+    resolution:
+      {
+        integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==,
+      }
+
+  mdast-util-from-markdown@1.3.1:
+    resolution:
+      {
+        integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==,
+      }
+
+  mdast-util-gfm-autolink-literal@1.0.3:
+    resolution:
+      {
+        integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==,
+      }
+
+  mdast-util-gfm-footnote@1.0.2:
+    resolution:
+      {
+        integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==,
+      }
+
+  mdast-util-gfm-strikethrough@1.0.3:
+    resolution:
+      {
+        integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==,
+      }
+
+  mdast-util-gfm-table@1.0.7:
+    resolution:
+      {
+        integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==,
+      }
+
+  mdast-util-gfm-task-list-item@1.0.2:
+    resolution:
+      {
+        integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==,
+      }
+
+  mdast-util-gfm@2.0.2:
+    resolution:
+      {
+        integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==,
+      }
+
+  mdast-util-math@2.0.2:
+    resolution:
+      {
+        integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==,
+      }
+
+  mdast-util-mdx-expression@1.3.2:
+    resolution:
+      {
+        integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==,
+      }
+
+  mdast-util-mdx-jsx@2.1.4:
+    resolution:
+      {
+        integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==,
+      }
+
+  mdast-util-mdx@2.0.1:
+    resolution:
+      {
+        integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==,
+      }
+
+  mdast-util-mdxjs-esm@1.3.1:
+    resolution:
+      {
+        integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==,
+      }
+
+  mdast-util-phrasing@3.0.1:
+    resolution:
+      {
+        integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==,
+      }
+
+  mdast-util-to-hast@12.3.0:
+    resolution:
+      {
+        integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==,
+      }
+
+  mdast-util-to-hast@13.2.0:
+    resolution:
+      {
+        integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==,
+      }
+
+  mdast-util-to-markdown@1.5.0:
+    resolution:
+      {
+        integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==,
+      }
+
+  mdast-util-to-string@3.2.0:
+    resolution:
+      {
+        integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==,
+      }
+
+  mermaid@10.9.3:
+    resolution:
+      {
+        integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==,
+      }
+
+  micromark-core-commonmark@1.1.0:
+    resolution:
+      {
+        integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==,
+      }
+
+  micromark-extension-gfm-autolink-literal@1.0.5:
+    resolution:
+      {
+        integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==,
+      }
+
+  micromark-extension-gfm-footnote@1.1.2:
+    resolution:
+      {
+        integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==,
+      }
+
+  micromark-extension-gfm-strikethrough@1.0.7:
+    resolution:
+      {
+        integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==,
+      }
+
+  micromark-extension-gfm-table@1.0.7:
+    resolution:
+      {
+        integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==,
+      }
+
+  micromark-extension-gfm-tagfilter@1.0.2:
+    resolution:
+      {
+        integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==,
+      }
+
+  micromark-extension-gfm-task-list-item@1.0.5:
+    resolution:
+      {
+        integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==,
+      }
+
+  micromark-extension-gfm@2.0.3:
+    resolution:
+      {
+        integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==,
+      }
+
+  micromark-extension-math@2.1.2:
+    resolution:
+      {
+        integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==,
+      }
+
+  micromark-extension-mdx-expression@1.0.8:
+    resolution:
+      {
+        integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==,
+      }
+
+  micromark-extension-mdx-jsx@1.0.5:
+    resolution:
+      {
+        integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==,
+      }
+
+  micromark-extension-mdx-md@1.0.1:
+    resolution:
+      {
+        integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==,
+      }
+
+  micromark-extension-mdxjs-esm@1.0.5:
+    resolution:
+      {
+        integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==,
+      }
+
+  micromark-extension-mdxjs@1.0.1:
+    resolution:
+      {
+        integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==,
+      }
+
+  micromark-factory-destination@1.1.0:
+    resolution:
+      {
+        integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==,
+      }
+
+  micromark-factory-label@1.1.0:
+    resolution:
+      {
+        integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==,
+      }
+
+  micromark-factory-mdx-expression@1.0.9:
+    resolution:
+      {
+        integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==,
+      }
+
+  micromark-factory-space@1.1.0:
+    resolution:
+      {
+        integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==,
+      }
+
+  micromark-factory-title@1.1.0:
+    resolution:
+      {
+        integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==,
+      }
+
+  micromark-factory-whitespace@1.1.0:
+    resolution:
+      {
+        integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==,
+      }
+
+  micromark-util-character@1.2.0:
+    resolution:
+      {
+        integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==,
+      }
+
+  micromark-util-character@2.1.1:
+    resolution:
+      {
+        integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==,
+      }
+
+  micromark-util-chunked@1.1.0:
+    resolution:
+      {
+        integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==,
+      }
+
+  micromark-util-classify-character@1.1.0:
+    resolution:
+      {
+        integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==,
+      }
+
+  micromark-util-combine-extensions@1.1.0:
+    resolution:
+      {
+        integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==,
+      }
+
+  micromark-util-decode-numeric-character-reference@1.1.0:
+    resolution:
+      {
+        integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==,
+      }
+
+  micromark-util-decode-string@1.1.0:
+    resolution:
+      {
+        integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==,
+      }
+
+  micromark-util-encode@1.1.0:
+    resolution:
+      {
+        integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==,
+      }
+
+  micromark-util-encode@2.0.1:
+    resolution:
+      {
+        integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==,
+      }
+
+  micromark-util-events-to-acorn@1.2.3:
+    resolution:
+      {
+        integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==,
+      }
+
+  micromark-util-html-tag-name@1.2.0:
+    resolution:
+      {
+        integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==,
+      }
+
+  micromark-util-normalize-identifier@1.1.0:
+    resolution:
+      {
+        integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==,
+      }
+
+  micromark-util-resolve-all@1.1.0:
+    resolution:
+      {
+        integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==,
+      }
+
+  micromark-util-sanitize-uri@1.2.0:
+    resolution:
+      {
+        integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==,
+      }
+
+  micromark-util-sanitize-uri@2.0.1:
+    resolution:
+      {
+        integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==,
+      }
+
+  micromark-util-subtokenize@1.1.0:
+    resolution:
+      {
+        integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==,
+      }
+
+  micromark-util-symbol@1.1.0:
+    resolution:
+      {
+        integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==,
+      }
+
+  micromark-util-symbol@2.0.1:
+    resolution:
+      {
+        integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==,
+      }
+
+  micromark-util-types@1.1.0:
+    resolution:
+      {
+        integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==,
+      }
+
+  micromark-util-types@2.0.2:
+    resolution:
+      {
+        integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==,
+      }
+
+  micromark@3.2.0:
+    resolution:
+      {
+        integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==,
+      }
+
+  mri@1.2.0:
+    resolution:
+      {
+        integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==,
+      }
+    engines: { node: ">=4" }
+
+  ms@2.1.3:
+    resolution:
+      {
+        integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
+      }
+
+  nanoid@3.3.9:
+    resolution:
+      {
+        integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==,
+      }
+    engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
+    hasBin: true
+
+  next-mdx-remote@4.4.1:
+    resolution:
+      {
+        integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==,
+      }
+    engines: { node: ">=14", npm: ">=7" }
+    peerDependencies:
+      react: ">=16.x <=18.x"
+      react-dom: ">=16.x <=18.x"
+
+  next-seo@6.6.0:
+    resolution:
+      {
+        integrity: sha512-0VSted/W6XNtgAtH3D+BZrMLLudqfm0D5DYNJRXHcDgan/1ZF1tDFIsWrmvQlYngALyphPfZ3ZdOqlKpKdvG6w==,
+      }
+    peerDependencies:
+      next: ^8.1.1-canary.54 || >=9.0.0
+      react: ">=16.0.0"
+      react-dom: ">=16.0.0"
+
+  next-themes@0.2.1:
+    resolution:
+      {
+        integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==,
+      }
+    peerDependencies:
+      next: "*"
+      react: "*"
+      react-dom: "*"
+
+  next@13.4.12:
+    resolution:
+      {
+        integrity: sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==,
+      }
+    engines: { node: ">=16.8.0" }
+    hasBin: true
+    peerDependencies:
+      "@opentelemetry/api": ^1.1.0
+      fibers: ">= 3.1.0"
+      react: ^18.2.0
+      react-dom: ^18.2.0
+      sass: ^1.3.0
+    peerDependenciesMeta:
+      "@opentelemetry/api":
+        optional: true
+      fibers:
+        optional: true
+      sass:
+        optional: true
+
+  nextra-theme-docs@2.13.4:
+    resolution:
+      {
+        integrity: sha512-2XOoMfwBCTYBt8ds4ZHftt9Wyf2XsykiNo02eir/XEYB+sGeUoE77kzqfidjEOKCSzOHYbK9BDMcg2+B/2vYRw==,
+      }
+    peerDependencies:
+      next: ">=9.5.3"
+      nextra: 2.13.4
+      react: ">=16.13.1"
+      react-dom: ">=16.13.1"
+
+  nextra@2.13.4:
+    resolution:
+      {
+        integrity: sha512-7of2rSBxuUa3+lbMmZwG9cqgftcoNOVQLTT6Rxf3EhBR9t1EI7b43dted8YoqSNaigdE3j1CoyNkX8N/ZzlEpw==,
+      }
+    engines: { node: ">=16" }
+    peerDependencies:
+      next: ">=9.5.3"
+      react: ">=16.13.1"
+      react-dom: ">=16.13.1"
+
+  non-layered-tidy-tree-layout@2.0.2:
+    resolution:
+      {
+        integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==,
+      }
+
+  npm-run-path@2.0.2:
+    resolution:
+      {
+        integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==,
+      }
+    engines: { node: ">=4" }
+
+  npm-to-yarn@2.2.1:
+    resolution:
+      {
+        integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==,
+      }
+    engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+
+  p-finally@1.0.0:
+    resolution:
+      {
+        integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==,
+      }
+    engines: { node: ">=4" }
+
+  p-limit@3.1.0:
+    resolution:
+      {
+        integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==,
+      }
+    engines: { node: ">=10" }
+
+  parse-entities@4.0.2:
+    resolution:
+      {
+        integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==,
+      }
+
+  parse-numeric-range@1.3.0:
+    resolution:
+      {
+        integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==,
+      }
+
+  parse-path@7.0.1:
+    resolution:
+      {
+        integrity: sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==,
+      }
+
+  parse-url@8.1.0:
+    resolution:
+      {
+        integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==,
+      }
+
+  parse5@7.2.1:
+    resolution:
+      {
+        integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==,
+      }
+
+  path-key@2.0.1:
+    resolution:
+      {
+        integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==,
+      }
+    engines: { node: ">=4" }
+
+  periscopic@3.1.0:
+    resolution:
+      {
+        integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==,
+      }
+
+  picocolors@1.1.1:
+    resolution:
+      {
+        integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==,
+      }
+
+  postcss@8.4.14:
+    resolution:
+      {
+        integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==,
+      }
+    engines: { node: ^10 || ^12 || >=14 }
+
+  prettier@3.5.3:
+    resolution:
+      {
+        integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==,
+      }
+    engines: { node: ">=14" }
+    hasBin: true
+
+  property-information@6.5.0:
+    resolution:
+      {
+        integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==,
+      }
+
+  property-information@7.0.0:
+    resolution:
+      {
+        integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==,
+      }
+
+  protocols@2.0.2:
+    resolution:
+      {
+        integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==,
+      }
+
+  pseudomap@1.0.2:
+    resolution:
+      {
+        integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==,
+      }
+
+  react-dom@18.2.0:
+    resolution:
+      {
+        integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==,
+      }
+    peerDependencies:
+      react: ^18.2.0
+
+  react@18.2.0:
+    resolution:
+      {
+        integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  reading-time@1.5.0:
+    resolution:
+      {
+        integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==,
+      }
+
+  regenerator-runtime@0.14.1:
+    resolution:
+      {
+        integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==,
+      }
+
+  rehype-katex@7.0.1:
+    resolution:
+      {
+        integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==,
+      }
+
+  rehype-pretty-code@0.9.11:
+    resolution:
+      {
+        integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==,
+      }
+    engines: { node: ">=16" }
+    peerDependencies:
+      shiki: "*"
+
+  rehype-raw@7.0.0:
+    resolution:
+      {
+        integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==,
+      }
+
+  remark-gfm@3.0.1:
+    resolution:
+      {
+        integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==,
+      }
+
+  remark-math@5.1.1:
+    resolution:
+      {
+        integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==,
+      }
+
+  remark-mdx@2.3.0:
+    resolution:
+      {
+        integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==,
+      }
+
+  remark-parse@10.0.2:
+    resolution:
+      {
+        integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==,
+      }
+
+  remark-reading-time@2.0.1:
+    resolution:
+      {
+        integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==,
+      }
+
+  remark-rehype@10.1.0:
+    resolution:
+      {
+        integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==,
+      }
+
+  remove-accents@0.5.0:
+    resolution:
+      {
+        integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==,
+      }
+
+  robust-predicates@3.0.2:
+    resolution:
+      {
+        integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==,
+      }
+
+  rw@1.3.3:
+    resolution:
+      {
+        integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==,
+      }
+
+  sade@1.8.1:
+    resolution:
+      {
+        integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==,
+      }
+    engines: { node: ">=6" }
+
+  safer-buffer@2.1.2:
+    resolution:
+      {
+        integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==,
+      }
+
+  scheduler@0.23.2:
+    resolution:
+      {
+        integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==,
+      }
+
+  scroll-into-view-if-needed@3.1.0:
+    resolution:
+      {
+        integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==,
+      }
+
+  section-matter@1.0.0:
+    resolution:
+      {
+        integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==,
+      }
+    engines: { node: ">=4" }
+
+  shebang-command@1.2.0:
+    resolution:
+      {
+        integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  shebang-regex@1.0.0:
+    resolution:
+      {
+        integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  shiki@0.14.7:
+    resolution:
+      {
+        integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==,
+      }
+
+  signal-exit@3.0.7:
+    resolution:
+      {
+        integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==,
+      }
+
+  slash@3.0.0:
+    resolution:
+      {
+        integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==,
+      }
+    engines: { node: ">=8" }
+
+  sort-keys@5.1.0:
+    resolution:
+      {
+        integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==,
+      }
+    engines: { node: ">=12" }
+
+  source-map-js@1.2.1:
+    resolution:
+      {
+        integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  source-map@0.7.4:
+    resolution:
+      {
+        integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==,
+      }
+    engines: { node: ">= 8" }
+
+  space-separated-tokens@2.0.2:
+    resolution:
+      {
+        integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==,
+      }
+
+  sprintf-js@1.0.3:
+    resolution:
+      {
+        integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==,
+      }
+
+  streamsearch@1.1.0:
+    resolution:
+      {
+        integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==,
+      }
+    engines: { node: ">=10.0.0" }
+
+  stringify-entities@4.0.4:
+    resolution:
+      {
+        integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==,
+      }
+
+  strip-bom-string@1.0.0:
+    resolution:
+      {
+        integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  strip-eof@1.0.0:
+    resolution:
+      {
+        integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  style-to-object@0.4.4:
+    resolution:
+      {
+        integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==,
+      }
+
+  styled-jsx@5.1.1:
+    resolution:
+      {
+        integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==,
+      }
+    engines: { node: ">= 12.0.0" }
+    peerDependencies:
+      "@babel/core": "*"
+      babel-plugin-macros: "*"
+      react: ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+    peerDependenciesMeta:
+      "@babel/core":
+        optional: true
+      babel-plugin-macros:
+        optional: true
+
+  stylis@4.3.6:
+    resolution:
+      {
+        integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==,
+      }
+
+  supports-color@4.5.0:
+    resolution:
+      {
+        integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==,
+      }
+    engines: { node: ">=4" }
+
+  title@3.5.3:
+    resolution:
+      {
+        integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==,
+      }
+    hasBin: true
+
+  titleize@1.0.0:
+    resolution:
+      {
+        integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==,
+      }
+    engines: { node: ">=0.10.0" }
+
+  trim-lines@3.0.1:
+    resolution:
+      {
+        integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==,
+      }
+
+  trough@2.2.0:
+    resolution:
+      {
+        integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==,
+      }
+
+  ts-dedent@2.2.0:
+    resolution:
+      {
+        integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==,
+      }
+    engines: { node: ">=6.10" }
+
+  tslib@2.8.1:
+    resolution:
+      {
+        integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==,
+      }
+
+  type-fest@1.4.0:
+    resolution:
+      {
+        integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==,
+      }
+    engines: { node: ">=10" }
+
+  typescript@4.9.3:
+    resolution:
+      {
+        integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==,
+      }
+    engines: { node: ">=4.2.0" }
+    hasBin: true
+
+  unified@10.1.2:
+    resolution:
+      {
+        integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==,
+      }
+
+  unist-util-find-after@5.0.0:
+    resolution:
+      {
+        integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==,
+      }
+
+  unist-util-generated@2.0.1:
+    resolution:
+      {
+        integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==,
+      }
+
+  unist-util-is@5.2.1:
+    resolution:
+      {
+        integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==,
+      }
+
+  unist-util-is@6.0.0:
+    resolution:
+      {
+        integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==,
+      }
+
+  unist-util-position-from-estree@1.1.2:
+    resolution:
+      {
+        integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==,
+      }
+
+  unist-util-position@4.0.4:
+    resolution:
+      {
+        integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==,
+      }
+
+  unist-util-position@5.0.0:
+    resolution:
+      {
+        integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==,
+      }
+
+  unist-util-remove-position@4.0.2:
+    resolution:
+      {
+        integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==,
+      }
+
+  unist-util-remove-position@5.0.0:
+    resolution:
+      {
+        integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==,
+      }
+
+  unist-util-remove@4.0.0:
+    resolution:
+      {
+        integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==,
+      }
+
+  unist-util-stringify-position@3.0.3:
+    resolution:
+      {
+        integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==,
+      }
+
+  unist-util-stringify-position@4.0.0:
+    resolution:
+      {
+        integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==,
+      }
+
+  unist-util-visit-parents@4.1.1:
+    resolution:
+      {
+        integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==,
+      }
+
+  unist-util-visit-parents@5.1.3:
+    resolution:
+      {
+        integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==,
+      }
+
+  unist-util-visit-parents@6.0.1:
+    resolution:
+      {
+        integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==,
+      }
+
+  unist-util-visit@3.1.0:
+    resolution:
+      {
+        integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==,
+      }
+
+  unist-util-visit@4.1.2:
+    resolution:
+      {
+        integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==,
+      }
+
+  unist-util-visit@5.0.0:
+    resolution:
+      {
+        integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==,
+      }
+
+  uuid@9.0.1:
+    resolution:
+      {
+        integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==,
+      }
+    hasBin: true
+
+  uvu@0.5.6:
+    resolution:
+      {
+        integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==,
+      }
+    engines: { node: ">=8" }
+    hasBin: true
+
+  vfile-location@5.0.3:
+    resolution:
+      {
+        integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==,
+      }
+
+  vfile-matter@3.0.1:
+    resolution:
+      {
+        integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==,
+      }
+
+  vfile-message@3.1.4:
+    resolution:
+      {
+        integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==,
+      }
+
+  vfile-message@4.0.2:
+    resolution:
+      {
+        integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==,
+      }
+
+  vfile@5.3.7:
+    resolution:
+      {
+        integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==,
+      }
+
+  vfile@6.0.3:
+    resolution:
+      {
+        integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==,
+      }
+
+  vscode-oniguruma@1.7.0:
+    resolution:
+      {
+        integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==,
+      }
+
+  vscode-textmate@8.0.0:
+    resolution:
+      {
+        integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==,
+      }
+
+  watchpack@2.4.0:
+    resolution:
+      {
+        integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==,
+      }
+    engines: { node: ">=10.13.0" }
+
+  web-namespaces@2.0.1:
+    resolution:
+      {
+        integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==,
+      }
+
+  web-worker@1.5.0:
+    resolution:
+      {
+        integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==,
+      }
+
+  which@1.3.1:
+    resolution:
+      {
+        integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==,
+      }
+    hasBin: true
+
+  yallist@2.1.2:
+    resolution:
+      {
+        integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==,
+      }
+
+  yocto-queue@0.1.0:
+    resolution:
+      {
+        integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==,
+      }
+    engines: { node: ">=10" }
+
+  zod@3.21.4:
+    resolution:
+      {
+        integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==,
+      }
+
+  zod@3.24.2:
+    resolution:
+      {
+        integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==,
+      }
+
+  zwitch@2.0.4:
+    resolution:
+      {
+        integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==,
+      }
+
+snapshots:
+  "@babel/runtime@7.26.10":
+    dependencies:
+      regenerator-runtime: 0.14.1
+
+  "@braintree/sanitize-url@6.0.4": {}
+
+  "@headlessui/react@1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)":
+    dependencies:
+      "@tanstack/react-virtual": 3.13.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      client-only: 0.0.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  "@mdx-js/mdx@2.3.0":
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      "@types/mdx": 2.0.13
+      estree-util-build-jsx: 2.2.2
+      estree-util-is-identifier-name: 2.1.0
+      estree-util-to-js: 1.2.0
+      estree-walker: 3.0.3
+      hast-util-to-estree: 2.3.3
+      markdown-extensions: 1.1.1
+      periscopic: 3.1.0
+      remark-mdx: 2.3.0
+      remark-parse: 10.0.2
+      remark-rehype: 10.1.0
+      unified: 10.1.2
+      unist-util-position-from-estree: 1.1.2
+      unist-util-stringify-position: 3.0.3
+      unist-util-visit: 4.1.2
+      vfile: 5.3.7
+    transitivePeerDependencies:
+      - supports-color
+
+  "@mdx-js/react@2.3.0(react@18.2.0)":
+    dependencies:
+      "@types/mdx": 2.0.13
+      "@types/react": 18.0.25
+      react: 18.2.0
+
+  "@napi-rs/simple-git-android-arm-eabi@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-android-arm64@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-darwin-arm64@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-darwin-x64@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-freebsd-x64@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-arm-gnueabihf@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-arm64-gnu@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-arm64-musl@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-powerpc64le-gnu@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-s390x-gnu@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-x64-gnu@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-linux-x64-musl@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-win32-arm64-msvc@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git-win32-x64-msvc@0.1.19":
+    optional: true
+
+  "@napi-rs/simple-git@0.1.19":
+    optionalDependencies:
+      "@napi-rs/simple-git-android-arm-eabi": 0.1.19
+      "@napi-rs/simple-git-android-arm64": 0.1.19
+      "@napi-rs/simple-git-darwin-arm64": 0.1.19
+      "@napi-rs/simple-git-darwin-x64": 0.1.19
+      "@napi-rs/simple-git-freebsd-x64": 0.1.19
+      "@napi-rs/simple-git-linux-arm-gnueabihf": 0.1.19
+      "@napi-rs/simple-git-linux-arm64-gnu": 0.1.19
+      "@napi-rs/simple-git-linux-arm64-musl": 0.1.19
+      "@napi-rs/simple-git-linux-powerpc64le-gnu": 0.1.19
+      "@napi-rs/simple-git-linux-s390x-gnu": 0.1.19
+      "@napi-rs/simple-git-linux-x64-gnu": 0.1.19
+      "@napi-rs/simple-git-linux-x64-musl": 0.1.19
+      "@napi-rs/simple-git-win32-arm64-msvc": 0.1.19
+      "@napi-rs/simple-git-win32-x64-msvc": 0.1.19
+
+  "@next/env@13.4.12": {}
+
+  "@next/swc-darwin-arm64@13.4.12":
+    optional: true
+
+  "@next/swc-darwin-x64@13.4.12":
+    optional: true
+
+  "@next/swc-linux-arm64-gnu@13.4.12":
+    optional: true
+
+  "@next/swc-linux-arm64-musl@13.4.12":
+    optional: true
+
+  "@next/swc-linux-x64-gnu@13.4.12":
+    optional: true
+
+  "@next/swc-linux-x64-musl@13.4.12":
+    optional: true
+
+  "@next/swc-win32-arm64-msvc@13.4.12":
+    optional: true
+
+  "@next/swc-win32-ia32-msvc@13.4.12":
+    optional: true
+
+  "@next/swc-win32-x64-msvc@13.4.12":
+    optional: true
+
+  "@popperjs/core@2.11.8": {}
+
+  "@swc/helpers@0.5.1":
+    dependencies:
+      tslib: 2.8.1
+
+  "@tanstack/react-virtual@3.13.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)":
+    dependencies:
+      "@tanstack/virtual-core": 3.13.3
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  "@tanstack/virtual-core@3.13.3": {}
+
+  "@theguild/remark-mermaid@0.0.5(react@18.2.0)":
+    dependencies:
+      mermaid: 10.9.3
+      react: 18.2.0
+      unist-util-visit: 5.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  "@theguild/remark-npm2yarn@0.2.1":
+    dependencies:
+      npm-to-yarn: 2.2.1
+      unist-util-visit: 5.0.0
+
+  "@types/acorn@4.0.6":
+    dependencies:
+      "@types/estree": 1.0.6
+
+  "@types/d3-scale-chromatic@3.1.0": {}
+
+  "@types/d3-scale@4.0.9":
+    dependencies:
+      "@types/d3-time": 3.0.4
+
+  "@types/d3-time@3.0.4": {}
+
+  "@types/debug@4.1.12":
+    dependencies:
+      "@types/ms": 2.1.0
+
+  "@types/estree-jsx@1.0.5":
+    dependencies:
+      "@types/estree": 1.0.6
+
+  "@types/estree@1.0.6": {}
+
+  "@types/hast@2.3.10":
+    dependencies:
+      "@types/unist": 2.0.11
+
+  "@types/hast@3.0.4":
+    dependencies:
+      "@types/unist": 3.0.3
+
+  "@types/js-yaml@4.0.9": {}
+
+  "@types/katex@0.16.7": {}
+
+  "@types/mdast@3.0.15":
+    dependencies:
+      "@types/unist": 2.0.11
+
+  "@types/mdast@4.0.4":
+    dependencies:
+      "@types/unist": 3.0.3
+
+  "@types/mdx@2.0.13": {}
+
+  "@types/ms@2.1.0": {}
+
+  "@types/node@18.11.9": {}
+
+  "@types/prop-types@15.7.14": {}
+
+  "@types/react-dom@18.0.9":
+    dependencies:
+      "@types/react": 18.0.25
+
+  "@types/react@18.0.25":
+    dependencies:
+      "@types/prop-types": 15.7.14
+      "@types/scheduler": 0.23.0
+      csstype: 3.1.3
+
+  "@types/scheduler@0.23.0": {}
+
+  "@types/unist@2.0.11": {}
+
+  "@types/unist@3.0.3": {}
+
+  "@ungap/structured-clone@1.3.0": {}
+
+  acorn-jsx@5.3.2(acorn@8.14.1):
+    dependencies:
+      acorn: 8.14.1
+
+  acorn@8.14.1: {}
+
+  ansi-sequence-parser@1.1.3: {}
+
+  ansi-styles@3.2.1:
+    dependencies:
+      color-convert: 1.9.3
+
+  arch@2.2.0: {}
+
+  arg@1.0.0: {}
+
+  argparse@1.0.10:
+    dependencies:
+      sprintf-js: 1.0.3
+
+  argparse@2.0.1: {}
+
+  astring@1.9.0: {}
+
+  bail@2.0.2: {}
+
+  busboy@1.6.0:
+    dependencies:
+      streamsearch: 1.1.0
+
+  caniuse-lite@1.0.30001704: {}
+
+  ccount@2.0.1: {}
+
+  chalk@2.3.0:
+    dependencies:
+      ansi-styles: 3.2.1
+      escape-string-regexp: 1.0.5
+      supports-color: 4.5.0
+
+  character-entities-html4@2.1.0: {}
+
+  character-entities-legacy@3.0.0: {}
+
+  character-entities@2.0.2: {}
+
+  character-reference-invalid@2.0.1: {}
+
+  client-only@0.0.1: {}
+
+  clipboardy@1.2.2:
+    dependencies:
+      arch: 2.2.0
+      execa: 0.8.0
+
+  clsx@2.1.1: {}
+
+  color-convert@1.9.3:
+    dependencies:
+      color-name: 1.1.3
+
+  color-name@1.1.3: {}
+
+  comma-separated-tokens@2.0.3: {}
+
+  commander@7.2.0: {}
+
+  commander@8.3.0: {}
+
+  compute-scroll-into-view@3.1.1: {}
+
+  cose-base@1.0.3:
+    dependencies:
+      layout-base: 1.0.2
+
+  cross-spawn@5.1.0:
+    dependencies:
+      lru-cache: 4.1.5
+      shebang-command: 1.2.0
+      which: 1.3.1
+
+  csstype@3.1.3: {}
+
+  cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.1):
+    dependencies:
+      cose-base: 1.0.3
+      cytoscape: 3.31.1
+
+  cytoscape@3.31.1: {}
+
+  d3-array@2.12.1:
+    dependencies:
+      internmap: 1.0.1
+
+  d3-array@3.2.4:
+    dependencies:
+      internmap: 2.0.3
+
+  d3-axis@3.0.0: {}
+
+  d3-brush@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+
+  d3-chord@3.0.1:
+    dependencies:
+      d3-path: 3.1.0
+
+  d3-color@3.1.0: {}
+
+  d3-contour@4.0.2:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-delaunay@6.0.4:
+    dependencies:
+      delaunator: 5.0.1
+
+  d3-dispatch@3.0.1: {}
+
+  d3-drag@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-selection: 3.0.0
+
+  d3-dsv@3.0.1:
+    dependencies:
+      commander: 7.2.0
+      iconv-lite: 0.6.3
+      rw: 1.3.3
+
+  d3-ease@3.0.1: {}
+
+  d3-fetch@3.0.1:
+    dependencies:
+      d3-dsv: 3.0.1
+
+  d3-force@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-quadtree: 3.0.1
+      d3-timer: 3.0.1
+
+  d3-format@3.1.0: {}
+
+  d3-geo@3.1.1:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-hierarchy@3.1.2: {}
+
+  d3-interpolate@3.0.1:
+    dependencies:
+      d3-color: 3.1.0
+
+  d3-path@1.0.9: {}
+
+  d3-path@3.1.0: {}
+
+  d3-polygon@3.0.1: {}
+
+  d3-quadtree@3.0.1: {}
+
+  d3-random@3.0.1: {}
+
+  d3-sankey@0.12.3:
+    dependencies:
+      d3-array: 2.12.1
+      d3-shape: 1.3.7
+
+  d3-scale-chromatic@3.1.0:
+    dependencies:
+      d3-color: 3.1.0
+      d3-interpolate: 3.0.1
+
+  d3-scale@4.0.2:
+    dependencies:
+      d3-array: 3.2.4
+      d3-format: 3.1.0
+      d3-interpolate: 3.0.1
+      d3-time: 3.1.0
+      d3-time-format: 4.1.0
+
+  d3-selection@3.0.0: {}
+
+  d3-shape@1.3.7:
+    dependencies:
+      d3-path: 1.0.9
+
+  d3-shape@3.2.0:
+    dependencies:
+      d3-path: 3.1.0
+
+  d3-time-format@4.1.0:
+    dependencies:
+      d3-time: 3.1.0
+
+  d3-time@3.1.0:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-timer@3.0.1: {}
+
+  d3-transition@3.0.1(d3-selection@3.0.0):
+    dependencies:
+      d3-color: 3.1.0
+      d3-dispatch: 3.0.1
+      d3-ease: 3.0.1
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-timer: 3.0.1
+
+  d3-zoom@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+
+  d3@7.9.0:
+    dependencies:
+      d3-array: 3.2.4
+      d3-axis: 3.0.0
+      d3-brush: 3.0.0
+      d3-chord: 3.0.1
+      d3-color: 3.1.0
+      d3-contour: 4.0.2
+      d3-delaunay: 6.0.4
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-dsv: 3.0.1
+      d3-ease: 3.0.1
+      d3-fetch: 3.0.1
+      d3-force: 3.0.0
+      d3-format: 3.1.0
+      d3-geo: 3.1.1
+      d3-hierarchy: 3.1.2
+      d3-interpolate: 3.0.1
+      d3-path: 3.1.0
+      d3-polygon: 3.0.1
+      d3-quadtree: 3.0.1
+      d3-random: 3.0.1
+      d3-scale: 4.0.2
+      d3-scale-chromatic: 3.1.0
+      d3-selection: 3.0.0
+      d3-shape: 3.2.0
+      d3-time: 3.1.0
+      d3-time-format: 4.1.0
+      d3-timer: 3.0.1
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+      d3-zoom: 3.0.0
+
+  dagre-d3-es@7.0.10:
+    dependencies:
+      d3: 7.9.0
+      lodash-es: 4.17.21
+
+  dayjs@1.11.13: {}
+
+  debug@4.4.0:
+    dependencies:
+      ms: 2.1.3
+
+  decode-named-character-reference@1.1.0:
+    dependencies:
+      character-entities: 2.0.2
+
+  delaunator@5.0.1:
+    dependencies:
+      robust-predicates: 3.0.2
+
+  dequal@2.0.3: {}
+
+  devlop@1.1.0:
+    dependencies:
+      dequal: 2.0.3
+
+  diff@5.2.0: {}
+
+  dompurify@3.1.6: {}
+
+  elkjs@0.9.3: {}
+
+  entities@4.5.0: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  esprima@4.0.1: {}
+
+  estree-util-attach-comments@2.1.1:
+    dependencies:
+      "@types/estree": 1.0.6
+
+  estree-util-build-jsx@2.2.2:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      estree-util-is-identifier-name: 2.1.0
+      estree-walker: 3.0.3
+
+  estree-util-is-identifier-name@2.1.0: {}
+
+  estree-util-to-js@1.2.0:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      astring: 1.9.0
+      source-map: 0.7.4
+
+  estree-util-value-to-estree@1.3.0:
+    dependencies:
+      is-plain-obj: 3.0.0
+
+  estree-util-visit@1.2.1:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      "@types/unist": 2.0.11
+
+  estree-walker@3.0.3:
+    dependencies:
+      "@types/estree": 1.0.6
+
+  execa@0.8.0:
+    dependencies:
+      cross-spawn: 5.1.0
+      get-stream: 3.0.0
+      is-stream: 1.1.0
+      npm-run-path: 2.0.2
+      p-finally: 1.0.0
+      signal-exit: 3.0.7
+      strip-eof: 1.0.0
+
+  extend-shallow@2.0.1:
+    dependencies:
+      is-extendable: 0.1.1
+
+  extend@3.0.2: {}
+
+  flexsearch@0.7.43: {}
+
+  focus-visible@5.2.1: {}
+
+  get-stream@3.0.0: {}
+
+  git-up@7.0.0:
+    dependencies:
+      is-ssh: 1.4.1
+      parse-url: 8.1.0
+
+  git-url-parse@13.1.1:
+    dependencies:
+      git-up: 7.0.0
+
+  github-slugger@2.0.0: {}
+
+  glob-to-regexp@0.4.1: {}
+
+  graceful-fs@4.2.11: {}
+
+  gray-matter@4.0.3:
+    dependencies:
+      js-yaml: 3.14.1
+      kind-of: 6.0.3
+      section-matter: 1.0.0
+      strip-bom-string: 1.0.0
+
+  has-flag@2.0.0: {}
+
+  hash-obj@4.0.0:
+    dependencies:
+      is-obj: 3.0.0
+      sort-keys: 5.1.0
+      type-fest: 1.4.0
+
+  hast-util-from-dom@5.0.1:
+    dependencies:
+      "@types/hast": 3.0.4
+      hastscript: 9.0.1
+      web-namespaces: 2.0.1
+
+  hast-util-from-html-isomorphic@2.0.0:
+    dependencies:
+      "@types/hast": 3.0.4
+      hast-util-from-dom: 5.0.1
+      hast-util-from-html: 2.0.3
+      unist-util-remove-position: 5.0.0
+
+  hast-util-from-html@2.0.3:
+    dependencies:
+      "@types/hast": 3.0.4
+      devlop: 1.1.0
+      hast-util-from-parse5: 8.0.3
+      parse5: 7.2.1
+      vfile: 6.0.3
+      vfile-message: 4.0.2
+
+  hast-util-from-parse5@8.0.3:
+    dependencies:
+      "@types/hast": 3.0.4
+      "@types/unist": 3.0.3
+      devlop: 1.1.0
+      hastscript: 9.0.1
+      property-information: 7.0.0
+      vfile: 6.0.3
+      vfile-location: 5.0.3
+      web-namespaces: 2.0.1
+
+  hast-util-is-element@3.0.0:
+    dependencies:
+      "@types/hast": 3.0.4
+
+  hast-util-parse-selector@4.0.0:
+    dependencies:
+      "@types/hast": 3.0.4
+
+  hast-util-raw@9.1.0:
+    dependencies:
+      "@types/hast": 3.0.4
+      "@types/unist": 3.0.3
+      "@ungap/structured-clone": 1.3.0
+      hast-util-from-parse5: 8.0.3
+      hast-util-to-parse5: 8.0.0
+      html-void-elements: 3.0.0
+      mdast-util-to-hast: 13.2.0
+      parse5: 7.2.1
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
+  hast-util-to-estree@2.3.3:
+    dependencies:
+      "@types/estree": 1.0.6
+      "@types/estree-jsx": 1.0.5
+      "@types/hast": 2.3.10
+      "@types/unist": 2.0.11
+      comma-separated-tokens: 2.0.3
+      estree-util-attach-comments: 2.1.1
+      estree-util-is-identifier-name: 2.1.0
+      hast-util-whitespace: 2.0.1
+      mdast-util-mdx-expression: 1.3.2
+      mdast-util-mdxjs-esm: 1.3.1
+      property-information: 6.5.0
+      space-separated-tokens: 2.0.2
+      style-to-object: 0.4.4
+      unist-util-position: 4.0.4
+      zwitch: 2.0.4
+    transitivePeerDependencies:
+      - supports-color
+
+  hast-util-to-parse5@8.0.0:
+    dependencies:
+      "@types/hast": 3.0.4
+      comma-separated-tokens: 2.0.3
+      devlop: 1.1.0
+      property-information: 6.5.0
+      space-separated-tokens: 2.0.2
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
+  hast-util-to-text@4.0.2:
+    dependencies:
+      "@types/hast": 3.0.4
+      "@types/unist": 3.0.3
+      hast-util-is-element: 3.0.0
+      unist-util-find-after: 5.0.0
+
+  hast-util-whitespace@2.0.1: {}
+
+  hastscript@9.0.1:
+    dependencies:
+      "@types/hast": 3.0.4
+      comma-separated-tokens: 2.0.3
+      hast-util-parse-selector: 4.0.0
+      property-information: 7.0.0
+      space-separated-tokens: 2.0.2
+
+  html-void-elements@3.0.0: {}
+
+  iconv-lite@0.6.3:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  inline-style-parser@0.1.1: {}
+
+  internmap@1.0.1: {}
+
+  internmap@2.0.3: {}
+
+  intersection-observer@0.12.2: {}
+
+  is-alphabetical@2.0.1: {}
+
+  is-alphanumerical@2.0.1:
+    dependencies:
+      is-alphabetical: 2.0.1
+      is-decimal: 2.0.1
+
+  is-buffer@2.0.5: {}
+
+  is-decimal@2.0.1: {}
+
+  is-extendable@0.1.1: {}
+
+  is-hexadecimal@2.0.1: {}
+
+  is-obj@3.0.0: {}
+
+  is-plain-obj@3.0.0: {}
+
+  is-plain-obj@4.1.0: {}
+
+  is-reference@3.0.3:
+    dependencies:
+      "@types/estree": 1.0.6
+
+  is-ssh@1.4.1:
+    dependencies:
+      protocols: 2.0.2
+
+  is-stream@1.1.0: {}
+
+  isexe@2.0.0: {}
+
+  js-tokens@4.0.0: {}
+
+  js-yaml@3.14.1:
+    dependencies:
+      argparse: 1.0.10
+      esprima: 4.0.1
+
+  js-yaml@4.1.0:
+    dependencies:
+      argparse: 2.0.1
+
+  jsonc-parser@3.3.1: {}
+
+  katex@0.16.21:
+    dependencies:
+      commander: 8.3.0
+
+  khroma@2.1.0: {}
+
+  kind-of@6.0.3: {}
+
+  kleur@4.1.5: {}
+
+  layout-base@1.0.2: {}
+
+  lodash-es@4.17.21: {}
+
+  lodash.get@4.4.2: {}
+
+  longest-streak@3.1.0: {}
+
+  loose-envify@1.4.0:
+    dependencies:
+      js-tokens: 4.0.0
+
+  lru-cache@4.1.5:
+    dependencies:
+      pseudomap: 1.0.2
+      yallist: 2.1.2
+
+  markdown-extensions@1.1.1: {}
+
+  markdown-table@3.0.4: {}
+
+  match-sorter@6.3.4:
+    dependencies:
+      "@babel/runtime": 7.26.10
+      remove-accents: 0.5.0
+
+  mdast-util-definitions@5.1.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      "@types/unist": 2.0.11
+      unist-util-visit: 4.1.2
+
+  mdast-util-find-and-replace@2.2.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      escape-string-regexp: 5.0.0
+      unist-util-is: 5.2.1
+      unist-util-visit-parents: 5.1.3
+
+  mdast-util-from-markdown@1.3.1:
+    dependencies:
+      "@types/mdast": 3.0.15
+      "@types/unist": 2.0.11
+      decode-named-character-reference: 1.1.0
+      mdast-util-to-string: 3.2.0
+      micromark: 3.2.0
+      micromark-util-decode-numeric-character-reference: 1.1.0
+      micromark-util-decode-string: 1.1.0
+      micromark-util-normalize-identifier: 1.1.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      unist-util-stringify-position: 3.0.3
+      uvu: 0.5.6
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-autolink-literal@1.0.3:
+    dependencies:
+      "@types/mdast": 3.0.15
+      ccount: 2.0.1
+      mdast-util-find-and-replace: 2.2.2
+      micromark-util-character: 1.2.0
+
+  mdast-util-gfm-footnote@1.0.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-to-markdown: 1.5.0
+      micromark-util-normalize-identifier: 1.1.0
+
+  mdast-util-gfm-strikethrough@1.0.3:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-to-markdown: 1.5.0
+
+  mdast-util-gfm-table@1.0.7:
+    dependencies:
+      "@types/mdast": 3.0.15
+      markdown-table: 3.0.4
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-to-markdown: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-task-list-item@1.0.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-to-markdown: 1.5.0
+
+  mdast-util-gfm@2.0.2:
+    dependencies:
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-gfm-autolink-literal: 1.0.3
+      mdast-util-gfm-footnote: 1.0.2
+      mdast-util-gfm-strikethrough: 1.0.3
+      mdast-util-gfm-table: 1.0.7
+      mdast-util-gfm-task-list-item: 1.0.2
+      mdast-util-to-markdown: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-math@2.0.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      longest-streak: 3.1.0
+      mdast-util-to-markdown: 1.5.0
+
+  mdast-util-mdx-expression@1.3.2:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      "@types/hast": 2.3.10
+      "@types/mdast": 3.0.15
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-to-markdown: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdx-jsx@2.1.4:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      "@types/hast": 2.3.10
+      "@types/mdast": 3.0.15
+      "@types/unist": 2.0.11
+      ccount: 2.0.1
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-to-markdown: 1.5.0
+      parse-entities: 4.0.2
+      stringify-entities: 4.0.4
+      unist-util-remove-position: 4.0.2
+      unist-util-stringify-position: 3.0.3
+      vfile-message: 3.1.4
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdx@2.0.1:
+    dependencies:
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-mdx-expression: 1.3.2
+      mdast-util-mdx-jsx: 2.1.4
+      mdast-util-mdxjs-esm: 1.3.1
+      mdast-util-to-markdown: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdxjs-esm@1.3.1:
+    dependencies:
+      "@types/estree-jsx": 1.0.5
+      "@types/hast": 2.3.10
+      "@types/mdast": 3.0.15
+      mdast-util-from-markdown: 1.3.1
+      mdast-util-to-markdown: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-phrasing@3.0.1:
+    dependencies:
+      "@types/mdast": 3.0.15
+      unist-util-is: 5.2.1
+
+  mdast-util-to-hast@12.3.0:
+    dependencies:
+      "@types/hast": 2.3.10
+      "@types/mdast": 3.0.15
+      mdast-util-definitions: 5.1.2
+      micromark-util-sanitize-uri: 1.2.0
+      trim-lines: 3.0.1
+      unist-util-generated: 2.0.1
+      unist-util-position: 4.0.4
+      unist-util-visit: 4.1.2
+
+  mdast-util-to-hast@13.2.0:
+    dependencies:
+      "@types/hast": 3.0.4
+      "@types/mdast": 4.0.4
+      "@ungap/structured-clone": 1.3.0
+      devlop: 1.1.0
+      micromark-util-sanitize-uri: 2.0.1
+      trim-lines: 3.0.1
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+
+  mdast-util-to-markdown@1.5.0:
+    dependencies:
+      "@types/mdast": 3.0.15
+      "@types/unist": 2.0.11
+      longest-streak: 3.1.0
+      mdast-util-phrasing: 3.0.1
+      mdast-util-to-string: 3.2.0
+      micromark-util-decode-string: 1.1.0
+      unist-util-visit: 4.1.2
+      zwitch: 2.0.4
+
+  mdast-util-to-string@3.2.0:
+    dependencies:
+      "@types/mdast": 3.0.15
+
+  mermaid@10.9.3:
+    dependencies:
+      "@braintree/sanitize-url": 6.0.4
+      "@types/d3-scale": 4.0.9
+      "@types/d3-scale-chromatic": 3.1.0
+      cytoscape: 3.31.1
+      cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.1)
+      d3: 7.9.0
+      d3-sankey: 0.12.3
+      dagre-d3-es: 7.0.10
+      dayjs: 1.11.13
+      dompurify: 3.1.6
+      elkjs: 0.9.3
+      katex: 0.16.21
+      khroma: 2.1.0
+      lodash-es: 4.17.21
+      mdast-util-from-markdown: 1.3.1
+      non-layered-tidy-tree-layout: 2.0.2
+      stylis: 4.3.6
+      ts-dedent: 2.2.0
+      uuid: 9.0.1
+      web-worker: 1.5.0
+    transitivePeerDependencies:
+      - supports-color
+
+  micromark-core-commonmark@1.1.0:
+    dependencies:
+      decode-named-character-reference: 1.1.0
+      micromark-factory-destination: 1.1.0
+      micromark-factory-label: 1.1.0
+      micromark-factory-space: 1.1.0
+      micromark-factory-title: 1.1.0
+      micromark-factory-whitespace: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-chunked: 1.1.0
+      micromark-util-classify-character: 1.1.0
+      micromark-util-html-tag-name: 1.2.0
+      micromark-util-normalize-identifier: 1.1.0
+      micromark-util-resolve-all: 1.1.0
+      micromark-util-subtokenize: 1.1.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-gfm-autolink-literal@1.0.5:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-sanitize-uri: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-extension-gfm-footnote@1.1.2:
+    dependencies:
+      micromark-core-commonmark: 1.1.0
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-normalize-identifier: 1.1.0
+      micromark-util-sanitize-uri: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-gfm-strikethrough@1.0.7:
+    dependencies:
+      micromark-util-chunked: 1.1.0
+      micromark-util-classify-character: 1.1.0
+      micromark-util-resolve-all: 1.1.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-gfm-table@1.0.7:
+    dependencies:
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-gfm-tagfilter@1.0.2:
+    dependencies:
+      micromark-util-types: 1.1.0
+
+  micromark-extension-gfm-task-list-item@1.0.5:
+    dependencies:
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-gfm@2.0.3:
+    dependencies:
+      micromark-extension-gfm-autolink-literal: 1.0.5
+      micromark-extension-gfm-footnote: 1.1.2
+      micromark-extension-gfm-strikethrough: 1.0.7
+      micromark-extension-gfm-table: 1.0.7
+      micromark-extension-gfm-tagfilter: 1.0.2
+      micromark-extension-gfm-task-list-item: 1.0.5
+      micromark-util-combine-extensions: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-extension-math@2.1.2:
+    dependencies:
+      "@types/katex": 0.16.7
+      katex: 0.16.21
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-mdx-expression@1.0.8:
+    dependencies:
+      "@types/estree": 1.0.6
+      micromark-factory-mdx-expression: 1.0.9
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-events-to-acorn: 1.2.3
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-extension-mdx-jsx@1.0.5:
+    dependencies:
+      "@types/acorn": 4.0.6
+      "@types/estree": 1.0.6
+      estree-util-is-identifier-name: 2.1.0
+      micromark-factory-mdx-expression: 1.0.9
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+      vfile-message: 3.1.4
+
+  micromark-extension-mdx-md@1.0.1:
+    dependencies:
+      micromark-util-types: 1.1.0
+
+  micromark-extension-mdxjs-esm@1.0.5:
+    dependencies:
+      "@types/estree": 1.0.6
+      micromark-core-commonmark: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-events-to-acorn: 1.2.3
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      unist-util-position-from-estree: 1.1.2
+      uvu: 0.5.6
+      vfile-message: 3.1.4
+
+  micromark-extension-mdxjs@1.0.1:
+    dependencies:
+      acorn: 8.14.1
+      acorn-jsx: 5.3.2(acorn@8.14.1)
+      micromark-extension-mdx-expression: 1.0.8
+      micromark-extension-mdx-jsx: 1.0.5
+      micromark-extension-mdx-md: 1.0.1
+      micromark-extension-mdxjs-esm: 1.0.5
+      micromark-util-combine-extensions: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-factory-destination@1.1.0:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-factory-label@1.1.0:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-factory-mdx-expression@1.0.9:
+    dependencies:
+      "@types/estree": 1.0.6
+      micromark-util-character: 1.2.0
+      micromark-util-events-to-acorn: 1.2.3
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      unist-util-position-from-estree: 1.1.2
+      uvu: 0.5.6
+      vfile-message: 3.1.4
+
+  micromark-factory-space@1.1.0:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-types: 1.1.0
+
+  micromark-factory-title@1.1.0:
+    dependencies:
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-factory-whitespace@1.1.0:
+    dependencies:
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-util-character@1.2.0:
+    dependencies:
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-util-character@2.1.1:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-chunked@1.1.0:
+    dependencies:
+      micromark-util-symbol: 1.1.0
+
+  micromark-util-classify-character@1.1.0:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-util-combine-extensions@1.1.0:
+    dependencies:
+      micromark-util-chunked: 1.1.0
+      micromark-util-types: 1.1.0
+
+  micromark-util-decode-numeric-character-reference@1.1.0:
+    dependencies:
+      micromark-util-symbol: 1.1.0
+
+  micromark-util-decode-string@1.1.0:
+    dependencies:
+      decode-named-character-reference: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-decode-numeric-character-reference: 1.1.0
+      micromark-util-symbol: 1.1.0
+
+  micromark-util-encode@1.1.0: {}
+
+  micromark-util-encode@2.0.1: {}
+
+  micromark-util-events-to-acorn@1.2.3:
+    dependencies:
+      "@types/acorn": 4.0.6
+      "@types/estree": 1.0.6
+      "@types/unist": 2.0.11
+      estree-util-visit: 1.2.1
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+      vfile-message: 3.1.4
+
+  micromark-util-html-tag-name@1.2.0: {}
+
+  micromark-util-normalize-identifier@1.1.0:
+    dependencies:
+      micromark-util-symbol: 1.1.0
+
+  micromark-util-resolve-all@1.1.0:
+    dependencies:
+      micromark-util-types: 1.1.0
+
+  micromark-util-sanitize-uri@1.2.0:
+    dependencies:
+      micromark-util-character: 1.2.0
+      micromark-util-encode: 1.1.0
+      micromark-util-symbol: 1.1.0
+
+  micromark-util-sanitize-uri@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-encode: 2.0.1
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-subtokenize@1.1.0:
+    dependencies:
+      micromark-util-chunked: 1.1.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+
+  micromark-util-symbol@1.1.0: {}
+
+  micromark-util-symbol@2.0.1: {}
+
+  micromark-util-types@1.1.0: {}
+
+  micromark-util-types@2.0.2: {}
+
+  micromark@3.2.0:
+    dependencies:
+      "@types/debug": 4.1.12
+      debug: 4.4.0
+      decode-named-character-reference: 1.1.0
+      micromark-core-commonmark: 1.1.0
+      micromark-factory-space: 1.1.0
+      micromark-util-character: 1.2.0
+      micromark-util-chunked: 1.1.0
+      micromark-util-combine-extensions: 1.1.0
+      micromark-util-decode-numeric-character-reference: 1.1.0
+      micromark-util-encode: 1.1.0
+      micromark-util-normalize-identifier: 1.1.0
+      micromark-util-resolve-all: 1.1.0
+      micromark-util-sanitize-uri: 1.2.0
+      micromark-util-subtokenize: 1.1.0
+      micromark-util-symbol: 1.1.0
+      micromark-util-types: 1.1.0
+      uvu: 0.5.6
+    transitivePeerDependencies:
+      - supports-color
+
+  mri@1.2.0: {}
+
+  ms@2.1.3: {}
+
+  nanoid@3.3.9: {}
+
+  next-mdx-remote@4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      "@mdx-js/mdx": 2.3.0
+      "@mdx-js/react": 2.3.0(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      vfile: 5.3.7
+      vfile-matter: 3.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  next-seo@6.6.0(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      next: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  next-themes@0.2.1(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      next: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      "@next/env": 13.4.12
+      "@swc/helpers": 0.5.1
+      busboy: 1.6.0
+      caniuse-lite: 1.0.30001704
+      postcss: 8.4.14
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      styled-jsx: 5.1.1(react@18.2.0)
+      watchpack: 2.4.0
+      zod: 3.21.4
+    optionalDependencies:
+      "@next/swc-darwin-arm64": 13.4.12
+      "@next/swc-darwin-x64": 13.4.12
+      "@next/swc-linux-arm64-gnu": 13.4.12
+      "@next/swc-linux-arm64-musl": 13.4.12
+      "@next/swc-linux-x64-gnu": 13.4.12
+      "@next/swc-linux-x64-musl": 13.4.12
+      "@next/swc-win32-arm64-msvc": 13.4.12
+      "@next/swc-win32-ia32-msvc": 13.4.12
+      "@next/swc-win32-x64-msvc": 13.4.12
+    transitivePeerDependencies:
+      - "@babel/core"
+      - babel-plugin-macros
+
+  nextra-theme-docs@2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      "@headlessui/react": 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      "@popperjs/core": 2.11.8
+      clsx: 2.1.1
+      escape-string-regexp: 5.0.0
+      flexsearch: 0.7.43
+      focus-visible: 5.2.1
+      git-url-parse: 13.1.1
+      intersection-observer: 0.12.2
+      match-sorter: 6.3.4
+      next: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      next-seo: 6.6.0(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      next-themes: 0.2.1(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      nextra: 2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      scroll-into-view-if-needed: 3.1.0
+      zod: 3.24.2
+
+  nextra@2.13.4(next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+    dependencies:
+      "@headlessui/react": 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      "@mdx-js/mdx": 2.3.0
+      "@mdx-js/react": 2.3.0(react@18.2.0)
+      "@napi-rs/simple-git": 0.1.19
+      "@theguild/remark-mermaid": 0.0.5(react@18.2.0)
+      "@theguild/remark-npm2yarn": 0.2.1
+      clsx: 2.1.1
+      github-slugger: 2.0.0
+      graceful-fs: 4.2.11
+      gray-matter: 4.0.3
+      katex: 0.16.21
+      lodash.get: 4.4.2
+      next: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      next-mdx-remote: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+      p-limit: 3.1.0
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      rehype-katex: 7.0.1
+      rehype-pretty-code: 0.9.11(shiki@0.14.7)
+      rehype-raw: 7.0.0
+      remark-gfm: 3.0.1
+      remark-math: 5.1.1
+      remark-reading-time: 2.0.1
+      shiki: 0.14.7
+      slash: 3.0.0
+      title: 3.5.3
+      unist-util-remove: 4.0.0
+      unist-util-visit: 5.0.0
+      zod: 3.24.2
+    transitivePeerDependencies:
+      - supports-color
+
+  non-layered-tidy-tree-layout@2.0.2: {}
+
+  npm-run-path@2.0.2:
+    dependencies:
+      path-key: 2.0.1
+
+  npm-to-yarn@2.2.1: {}
+
+  p-finally@1.0.0: {}
+
+  p-limit@3.1.0:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  parse-entities@4.0.2:
+    dependencies:
+      "@types/unist": 2.0.11
+      character-entities-legacy: 3.0.0
+      character-reference-invalid: 2.0.1
+      decode-named-character-reference: 1.1.0
+      is-alphanumerical: 2.0.1
+      is-decimal: 2.0.1
+      is-hexadecimal: 2.0.1
+
+  parse-numeric-range@1.3.0: {}
+
+  parse-path@7.0.1:
+    dependencies:
+      protocols: 2.0.2
+
+  parse-url@8.1.0:
+    dependencies:
+      parse-path: 7.0.1
+
+  parse5@7.2.1:
+    dependencies:
+      entities: 4.5.0
+
+  path-key@2.0.1: {}
+
+  periscopic@3.1.0:
+    dependencies:
+      "@types/estree": 1.0.6
+      estree-walker: 3.0.3
+      is-reference: 3.0.3
+
+  picocolors@1.1.1: {}
+
+  postcss@8.4.14:
+    dependencies:
+      nanoid: 3.3.9
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  prettier@3.5.3: {}
+
+  property-information@6.5.0: {}
+
+  property-information@7.0.0: {}
+
+  protocols@2.0.2: {}
+
+  pseudomap@1.0.2: {}
+
+  react-dom@18.2.0(react@18.2.0):
+    dependencies:
+      loose-envify: 1.4.0
+      react: 18.2.0
+      scheduler: 0.23.2
+
+  react@18.2.0:
+    dependencies:
+      loose-envify: 1.4.0
+
+  reading-time@1.5.0: {}
+
+  regenerator-runtime@0.14.1: {}
+
+  rehype-katex@7.0.1:
+    dependencies:
+      "@types/hast": 3.0.4
+      "@types/katex": 0.16.7
+      hast-util-from-html-isomorphic: 2.0.0
+      hast-util-to-text: 4.0.2
+      katex: 0.16.21
+      unist-util-visit-parents: 6.0.1
+      vfile: 6.0.3
+
+  rehype-pretty-code@0.9.11(shiki@0.14.7):
+    dependencies:
+      "@types/hast": 2.3.10
+      hash-obj: 4.0.0
+      parse-numeric-range: 1.3.0
+      shiki: 0.14.7
+
+  rehype-raw@7.0.0:
+    dependencies:
+      "@types/hast": 3.0.4
+      hast-util-raw: 9.1.0
+      vfile: 6.0.3
+
+  remark-gfm@3.0.1:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-gfm: 2.0.2
+      micromark-extension-gfm: 2.0.3
+      unified: 10.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-math@5.1.1:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-math: 2.0.2
+      micromark-extension-math: 2.1.2
+      unified: 10.1.2
+
+  remark-mdx@2.3.0:
+    dependencies:
+      mdast-util-mdx: 2.0.1
+      micromark-extension-mdxjs: 1.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-parse@10.0.2:
+    dependencies:
+      "@types/mdast": 3.0.15
+      mdast-util-from-markdown: 1.3.1
+      unified: 10.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-reading-time@2.0.1:
+    dependencies:
+      estree-util-is-identifier-name: 2.1.0
+      estree-util-value-to-estree: 1.3.0
+      reading-time: 1.5.0
+      unist-util-visit: 3.1.0
+
+  remark-rehype@10.1.0:
+    dependencies:
+      "@types/hast": 2.3.10
+      "@types/mdast": 3.0.15
+      mdast-util-to-hast: 12.3.0
+      unified: 10.1.2
+
+  remove-accents@0.5.0: {}
+
+  robust-predicates@3.0.2: {}
+
+  rw@1.3.3: {}
+
+  sade@1.8.1:
+    dependencies:
+      mri: 1.2.0
+
+  safer-buffer@2.1.2: {}
+
+  scheduler@0.23.2:
+    dependencies:
+      loose-envify: 1.4.0
+
+  scroll-into-view-if-needed@3.1.0:
+    dependencies:
+      compute-scroll-into-view: 3.1.1
+
+  section-matter@1.0.0:
+    dependencies:
+      extend-shallow: 2.0.1
+      kind-of: 6.0.3
+
+  shebang-command@1.2.0:
+    dependencies:
+      shebang-regex: 1.0.0
+
+  shebang-regex@1.0.0: {}
+
+  shiki@0.14.7:
+    dependencies:
+      ansi-sequence-parser: 1.1.3
+      jsonc-parser: 3.3.1
+      vscode-oniguruma: 1.7.0
+      vscode-textmate: 8.0.0
+
+  signal-exit@3.0.7: {}
+
+  slash@3.0.0: {}
+
+  sort-keys@5.1.0:
+    dependencies:
+      is-plain-obj: 4.1.0
+
+  source-map-js@1.2.1: {}
+
+  source-map@0.7.4: {}
+
+  space-separated-tokens@2.0.2: {}
+
+  sprintf-js@1.0.3: {}
+
+  streamsearch@1.1.0: {}
+
+  stringify-entities@4.0.4:
+    dependencies:
+      character-entities-html4: 2.1.0
+      character-entities-legacy: 3.0.0
+
+  strip-bom-string@1.0.0: {}
+
+  strip-eof@1.0.0: {}
+
+  style-to-object@0.4.4:
+    dependencies:
+      inline-style-parser: 0.1.1
+
+  styled-jsx@5.1.1(react@18.2.0):
+    dependencies:
+      client-only: 0.0.1
+      react: 18.2.0
+
+  stylis@4.3.6: {}
+
+  supports-color@4.5.0:
+    dependencies:
+      has-flag: 2.0.0
+
+  title@3.5.3:
+    dependencies:
+      arg: 1.0.0
+      chalk: 2.3.0
+      clipboardy: 1.2.2
+      titleize: 1.0.0
+
+  titleize@1.0.0: {}
+
+  trim-lines@3.0.1: {}
+
+  trough@2.2.0: {}
+
+  ts-dedent@2.2.0: {}
+
+  tslib@2.8.1: {}
+
+  type-fest@1.4.0: {}
+
+  typescript@4.9.3: {}
+
+  unified@10.1.2:
+    dependencies:
+      "@types/unist": 2.0.11
+      bail: 2.0.2
+      extend: 3.0.2
+      is-buffer: 2.0.5
+      is-plain-obj: 4.1.0
+      trough: 2.2.0
+      vfile: 5.3.7
+
+  unist-util-find-after@5.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-is: 6.0.0
+
+  unist-util-generated@2.0.1: {}
+
+  unist-util-is@5.2.1:
+    dependencies:
+      "@types/unist": 2.0.11
+
+  unist-util-is@6.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+
+  unist-util-position-from-estree@1.1.2:
+    dependencies:
+      "@types/unist": 2.0.11
+
+  unist-util-position@4.0.4:
+    dependencies:
+      "@types/unist": 2.0.11
+
+  unist-util-position@5.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+
+  unist-util-remove-position@4.0.2:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-visit: 4.1.2
+
+  unist-util-remove-position@5.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-visit: 5.0.0
+
+  unist-util-remove@4.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
+  unist-util-stringify-position@3.0.3:
+    dependencies:
+      "@types/unist": 2.0.11
+
+  unist-util-stringify-position@4.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+
+  unist-util-visit-parents@4.1.1:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-is: 5.2.1
+
+  unist-util-visit-parents@5.1.3:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-is: 5.2.1
+
+  unist-util-visit-parents@6.0.1:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-is: 6.0.0
+
+  unist-util-visit@3.1.0:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-is: 5.2.1
+      unist-util-visit-parents: 4.1.1
+
+  unist-util-visit@4.1.2:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-is: 5.2.1
+      unist-util-visit-parents: 5.1.3
+
+  unist-util-visit@5.0.0:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
+  uuid@9.0.1: {}
+
+  uvu@0.5.6:
+    dependencies:
+      dequal: 2.0.3
+      diff: 5.2.0
+      kleur: 4.1.5
+      sade: 1.8.1
+
+  vfile-location@5.0.3:
+    dependencies:
+      "@types/unist": 3.0.3
+      vfile: 6.0.3
+
+  vfile-matter@3.0.1:
+    dependencies:
+      "@types/js-yaml": 4.0.9
+      is-buffer: 2.0.5
+      js-yaml: 4.1.0
+
+  vfile-message@3.1.4:
+    dependencies:
+      "@types/unist": 2.0.11
+      unist-util-stringify-position: 3.0.3
+
+  vfile-message@4.0.2:
+    dependencies:
+      "@types/unist": 3.0.3
+      unist-util-stringify-position: 4.0.0
+
+  vfile@5.3.7:
+    dependencies:
+      "@types/unist": 2.0.11
+      is-buffer: 2.0.5
+      unist-util-stringify-position: 3.0.3
+      vfile-message: 3.1.4
+
+  vfile@6.0.3:
+    dependencies:
+      "@types/unist": 3.0.3
+      vfile-message: 4.0.2
+
+  vscode-oniguruma@1.7.0: {}
+
+  vscode-textmate@8.0.0: {}
+
+  watchpack@2.4.0:
+    dependencies:
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+
+  web-namespaces@2.0.1: {}
+
+  web-worker@1.5.0: {}
+
+  which@1.3.1:
+    dependencies:
+      isexe: 2.0.0
+
+  yallist@2.1.2: {}
+
+  yocto-queue@0.1.0: {}
+
+  zod@3.21.4: {}
+
+  zod@3.24.2: {}
+
+  zwitch@2.0.4: {}

From 68547cba2ef6e9b76e372fc2023f4252ed355f22 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Fri, 30 May 2025 07:21:23 +0200
Subject: [PATCH 124/140] [cloudflare] docs for #655 (#151)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/caching.mdx | 72 +++++++++++++++++++++++++++++++++++-
 1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 6ffd02c..c46913f 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -19,6 +19,9 @@ The `@opennextjs/cloudflare` caching supports rely on 3 components:
 You can also enable cache interception, to avoid calling the `NextServer` and thus loading the javascript associated with the page. It can slightly improve cold start performance for ISR/SSG route on cached routes.
 As of now, cache interception does not work with PPR and is not enabled by default.
 
+Additionally some components uses the [Cache Api](https://developers.cloudflare.com/workers/runtime-apis/cache/) to improve the performance of these different components.
+If you're planning on using On-Demand revalidation, you should also use the [Cache Purge component](#automatic-cache-purge) to automatically purge the cache when a page is revalidated.
+
 The adapter provides several implementations for each of those components configured in `open-next.config.ts`.
 
 This guide provides guidelines for common use cases before detailing all the configuration options.
@@ -156,6 +159,10 @@ For a larger site, you should use the `ShardedDOTagCache` that can handle a high
         "name": "NEXT_TAG_CACHE_DO_SHARDED",
         "class_name": "DOShardedTagCache",
       },
+      {
+        "name": "NEXT_CACHE_DO_PURGE",
+        "class_name": "BucketCachePurge",
+      },
     ],
   },
   "migrations": [
@@ -165,6 +172,7 @@ For a larger site, you should use the `ShardedDOTagCache` that can handle a high
         "DOQueueHandler",
         // This is only required if you use On-demand revalidation
         "DOShardedTagCache",
+        "BucketCachePurge",
       ],
     },
   ],
@@ -180,14 +188,17 @@ import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cac
 import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
 import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import { cachePurge } from "@opennextjs/cloudflare/overrides/cache-purge/index";
 
 export default defineCloudflareConfig({
-  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "short-lived" }),
+  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
   queue: doQueue,
   // This is only required if you use On-demand revalidation
   tagCache: doShardedTagCache({ baseShardSize: 12 }),
   // Disable this if you want to use PPR
   enableCacheInterception: true,
+  // you can also use the `durableObject` option to use a durable object as a cache purge
+  cachePurge: purgeCache({ type: "direct" }),
 });
 ```
 
@@ -651,3 +662,62 @@ You can also create your own custom filter function. This function must return a
 
 </Tabs.Tab>
 </Tabs>
+
+#### Automatic Cache Purge
+
+<Callout>
+
+You can only enable cache purge functionality on a zone (e.g., when using a custom domain).
+
+</Callout>
+
+The cache purge component automatically clears the cache when a page is revalidated. It is only necessary if you use On-Demand revalidation along with one of the cache components that leverage the Cache API.
+
+This component can either call the Cache API's purge function directly or route the purge request through an intermediate durable object. Using a durable object helps buffer requests and avoid reaching [API rate limits] (https://developers.cloudflare.com/cache/how-to/purge-cache/#hostname-tag-prefix-url-and-purge-everything-limits).
+
+Cache purge are only called when you call `revalidateTag`, `revalidatePath` or `res.revalidate` in the pages router. It is not called for ISR revalidation.
+
+Below is an example configuration for integrating the cache purge component in your `open-next.config.ts`:
+
+```ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
+import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import { cachePurge } from "@opennextjs/cloudflare/overrides/cache-purge/index";
+
+export default defineCloudflareConfig({
+  incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
+  queue: doQueue,
+  // This is only required if you use On-demand revalidation
+  tagCache: doShardedTagCache({ baseShardSize: 12 }),
+  // Disable this if you want to use PPR
+  enableCacheInterception: true,
+  // you can also use the `durableObject` option to use a durable object as a cache purge
+  cachePurge: purgeCache({ type: "direct" }),
+});
+```
+
+If you want to use the durable object option, you will need to add the following binding to your `wrangler.jsonc` file:
+
+```jsonc
+{
+  "durable_objects": {
+    "bindings": [
+      {
+        "name": "NEXT_CACHE_DO_PURGE",
+        "class_name": "BucketCachePurge",
+      },
+    ],
+  },
+  "migrations": [
+    {
+      "tag": "v1",
+      "new_sqlite_classes": ["BucketCachePurge"],
+    },
+  ],
+}
+```
+
+You can customize the duration of the cache purge buffering with the `NEXT_CACHE_DO_PURGE_BUFFER_TIME_IN_SECONDS` environment variable. The default is 5 seconds. It works by buffering the purge requests for a given amount of time and then sending them all at once. This is useful to avoid hitting the API rate limits.

From dbf0c771fc189a6012c379808cae50d489e77f07 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Fri, 30 May 2025 07:22:30 +0200
Subject: [PATCH 125/140] [cloudflare] docs for #500 (#155)

Co-authored-by: Nicolas Dorseuil <nicolas@gitbook.io>
Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/caching.mdx | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index c46913f..f1fed68 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -194,7 +194,18 @@ export default defineCloudflareConfig({
   incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
   queue: doQueue,
   // This is only required if you use On-demand revalidation
-  tagCache: doShardedTagCache({ baseShardSize: 12 }),
+  tagCache: doShardedTagCache({
+    baseShardSize: 12,
+    regionalCache: true, // Enable regional cache to reduce the load on the DOs
+    regionalCacheTtlSec: 5, // The TTL for the regional cache
+    shardReplication: {
+      numberOfSoftReplicas: 4,
+      numberOfHardReplicas: 2,
+      regionalReplication: {
+        defaultRegion: "enam",
+      },
+    },
+  }),
   // Disable this if you want to use PPR
   enableCacheInterception: true,
   // you can also use the `durableObject` option to use a durable object as a cache purge
@@ -629,6 +640,8 @@ doShardedTagCache takes the following options:
 - `shardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
   - `numberOfSoftReplicas`: Number of replicas for the soft tag shards
   - `numberOfHardReplicas`: Number of replicas for the hard tag shards
+  - `regionalReplicationOptions` : This setting enables you to replicate shards across different regions, thereby reducing read latency and distributing the load more evenly. By enabling this option, each shard will be replicated in all available regions. Please note that this will increase the number of Durable Objects (DOs) created and the volume of write requests sent to the DOs.
+    - `defaultRegion`: The default region to use for the replication.
 - `maxWriteRetries`: The number of retries to perform when writing tags
 
 </Tabs.Tab>

From 53ebf96c8b94df80121bce56bb14905dc6e038dc Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Fri, 30 May 2025 07:23:10 +0200
Subject: [PATCH 126/140] [cloudflare] docs for #496 (#156)

Co-authored-by: Nicolas Dorseuil <nicolas@gitbook.io>
---
 pages/cloudflare/caching.mdx | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index f1fed68..d814925 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -484,6 +484,30 @@ You can customize the behaviors of the queue with environment variables:
 
 </Callout>
 
+In certain situations, you may encounter the limits of what the Durable Object queue can manage for a single page or route. In such cases, you can utilize the queueCache to minimize the number of stale requests sent to the queue. This is achieved by adding and verifying a cache entry via the Cache API before dispatching a request to the queue. If a cache entry already exists, the request will not be sent to the queue, as it will be considered already in process.
+
+```ts
+// open-next.config.ts
+import { defineCloudflareConfig } from "@opennextjs/cloudflare";
+// ...
+import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
+import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
+import queueCache from "@opennextjs/cloudflare/overrides/queue/queue-cache";
+
+export default defineCloudflareConfig({
+  // ...
+  incrementalCache: r2IncrementalCache,
+  queue: queueCache(doQueue, {
+    regionalCacheTtlSec: 5, // The TTL for the regional cache, defaults to 5 seconds
+
+    // Whether to wait for the queue to acknowledge the request before returning
+    // When set to false, the cache will be populated asap and the queue will be called after.
+    // When set to true, the cache will be populated only after the queue ack is received.
+    waitForQueueAck: true,
+  }),
+});
+```
+
 #### Tag Cache for On-Demand Revalidation
 
 The tag revalidation mechanism can use either a [Cloudflare D1](https://developers.cloudflare.com/d1/) database or [Durable Objects](https://developers.cloudflare.com/durable-objects/) with `SqliteStorage` as its backing store for information about tags, paths, and revalidation times.

From 542b7608b5d13c66d2fe07e7af4e832d3bb060b0 Mon Sep 17 00:00:00 2001
From: Brendan Irvine-Broque <birvine-broque@cloudflare.com>
Date: Mon, 9 Jun 2025 20:54:35 -0700
Subject: [PATCH 127/140] Add docs for uploading metafile to ESBuild Bundle
 Analyzer (#160)

---
 pages/cloudflare/troubleshooting.mdx | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/pages/cloudflare/troubleshooting.mdx b/pages/cloudflare/troubleshooting.mdx
index 9dfc7e9..537e9be 100644
--- a/pages/cloudflare/troubleshooting.mdx
+++ b/pages/cloudflare/troubleshooting.mdx
@@ -16,6 +16,14 @@ The Cloudflare Account you are deploying to is on the Workers Free plan, which [
 
 When deploying your Worker, `wrangler` will show both the original and compressed sizes. Only the latter (gzipped size) matters for these limits.
 
+### "Your Worker exceeded the size limit of 10 MiB"
+
+If your Worker is larger than 10 MiB compressed — there might be unnecessary code ending up in your production bundle. You can visualize and understand this by running:
+
+1. `npx opennextjs-cloudflare build` within your project's root directory
+2. `cd .open-next/server-functions/default` to open the directory that contains the bundled code
+3. Take the file named `handler.mjs.meta.json` and use the [ESBuild Bundle Analyzer](https://esbuild.github.io/analyze/) to visualize your application's code, and understand the largest parts of your production bundle
+
 ### My app fails to build when I import a specific NPM package
 
 First, make sure that the `nodejs_compat` compatibility flag is enabled, and your compatibility date is set to on or after "2024-09-23", in your [wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/).

From 41769990341102bdbde844cfc277aa2568f67974 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 16 Jun 2025 11:09:55 +0200
Subject: [PATCH 128/140] docs(cloudflare): react-textarea-autosize uses a
 workerd build conditions (#162)

---
 pages/cloudflare/howtos/workerd.mdx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pages/cloudflare/howtos/workerd.mdx b/pages/cloudflare/howtos/workerd.mdx
index 9ad945e..2694c62 100644
--- a/pages/cloudflare/howtos/workerd.mdx
+++ b/pages/cloudflare/howtos/workerd.mdx
@@ -44,5 +44,6 @@ export default nextConfig;
 - `@prisma/client` (and the generated `.prisma/client`)
 - `jose`
 - `postgres`
+- `react-textarea-autosize`
 
 Please report an issue on [the adapter GH repository](https://github.com/opennextjs/opennextjs-cloudflare/issues) to have packages added to this list.

From d14ac9d952ec4abc05720e09f7d16b3783fd4b5c Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Mon, 16 Jun 2025 11:18:17 +0200
Subject: [PATCH 129/140] docs(cloudflare): add info about remote patterns
 (#161)

Co-authored-by: James Anderson <james@eli.cx>
---
 pages/cloudflare/howtos/image.mdx | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/pages/cloudflare/howtos/image.mdx b/pages/cloudflare/howtos/image.mdx
index 87f4103..64307e1 100644
--- a/pages/cloudflare/howtos/image.mdx
+++ b/pages/cloudflare/howtos/image.mdx
@@ -40,6 +40,13 @@ export default function cloudflareLoader({ src, width, quality }: ImageLoaderPro
 }
 ```
 
+<Callout type="warning">
+  This simple loader does not respect [Next.js
+  remotePatterns](https://nextjs.org/docs/pages/api-reference/components/image#remotepatterns). You should
+  configure [the allowed source origins](https://developers.cloudflare.com/images/transform-images/sources/)
+  in the dashboard.
+</Callout>
+
 You will then need to update your app configuration to use this loader:
 
 ```ts

From 39eb87616bbb22de6418182caed286375a15e021 Mon Sep 17 00:00:00 2001
From: Abdul S <57374241+A7U@users.noreply.github.com>
Date: Wed, 18 Jun 2025 21:06:53 +0200
Subject: [PATCH 130/140] fix(cloudflare): fix incorrect import of purgeCache
 (#163)

---
 pages/cloudflare/caching.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index d814925..4b556c2 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -188,7 +188,7 @@ import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cac
 import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
 import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
-import { cachePurge } from "@opennextjs/cloudflare/overrides/cache-purge/index";
+import { purgeCache } from "@opennextjs/cloudflare/overrides/cache-purge/index";
 
 export default defineCloudflareConfig({
   incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),
@@ -722,7 +722,7 @@ import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cac
 import { withRegionalCache } from "@opennextjs/cloudflare/overrides/incremental-cache/regional-cache";
 import doShardedTagCache from "@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache";
 import doQueue from "@opennextjs/cloudflare/overrides/queue/do-queue";
-import { cachePurge } from "@opennextjs/cloudflare/overrides/cache-purge/index";
+import { purgeCache } from "@opennextjs/cloudflare/overrides/cache-purge/index";
 
 export default defineCloudflareConfig({
   incrementalCache: withRegionalCache(r2IncrementalCache, { mode: "long-lived" }),

From 8e36ccd5c0d5f63d49240bd419107f639d73d91a Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 25 Jun 2025 20:02:28 +0100
Subject: [PATCH 131/140] Fix broken `getCloudflareContext()` link in
 bindings.mdx (#165)

---
 pages/cloudflare/bindings.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index 51734ff..c539399 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -55,7 +55,7 @@ To ensure that your types are always up-to-date, make sure to run `wrangler type
 
 ## Other Cloudflare APIs (`cf`, `ctx`)
 
-You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/get-cloudflare-context.ts):
+You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/cloudflare-context.ts):
 
 ```js
 import { getCloudflareContext } from "@opennextjs/cloudflare";

From 6dadcc260452d6ee2ea1250244e669b44dada254 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Wed, 25 Jun 2025 21:52:11 +0100
Subject: [PATCH 132/140] remove unused code line from bindings.mdx (#166)

---
 pages/cloudflare/bindings.mdx | 2 --
 1 file changed, 2 deletions(-)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index c539399..f450cb0 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -16,8 +16,6 @@ You can access [bindings](https://developers.cloudflare.com/workers/runtime-apis
 import { getCloudflareContext } from "@opennextjs/cloudflare";
 
 export async function GET(request) {
-  let responseText = "Hello World";
-
   const myKv = getCloudflareContext().env.MY_KV_NAMESPACE;
   await myKv.put("foo", "bar");
   const foo = await myKv.get("foo");

From f8dbb7e67387449ccb90b2cab5ec674da069a0ef Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Mon, 7 Jul 2025 17:43:49 +0100
Subject: [PATCH 133/140] add a section about local access in the Cloudflare
 bindings documentation (#167)

Co-authored-by: Victor Berchet <victor@suumit.com>
---
 pages/cloudflare/bindings.mdx | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/pages/cloudflare/bindings.mdx b/pages/cloudflare/bindings.mdx
index f450cb0..e86e8a6 100644
--- a/pages/cloudflare/bindings.mdx
+++ b/pages/cloudflare/bindings.mdx
@@ -51,6 +51,40 @@ This will generate a `d.ts` file and save it to `worker-configuration.d.ts`.
 
 To ensure that your types are always up-to-date, make sure to run `wrangler types --env-interface CloudflareEnv` after any changes to your config file.
 
+## Local access to bindings
+
+As presented in the [getting started](/cloudflare/get-started#12-develop-locally) your application can be both developed (`next dev`) and
+previewed (`opennextjs-cloudflare preview`) locally, in both cases bindings will be accessible from your application's code.
+
+Such bindings are by default local simulation that mimic the behavior of the actual Cloudflare resources.
+
+### Remote bindings
+
+As mentioned above, by default local emulations of the bindings are used.
+
+However [remote bindings](https://developers.cloudflare.com/workers/development-testing/#remote-bindings) can also be
+used, allowing your application code, while still running locally, to connect to remote resources associated to your
+Cloudflare account.
+
+Remote bindings are currently experimental and can be enabled it in your `next.config.ts` file:
+
+```diff
+- initOpenNextCloudflareForDev();
++ initOpenNextCloudflareForDev({
++  experimental: { remoteBindings: true }
++ });
+```
+
+When the feature is turned on all you then need to do to enable remote mode for any of your bindings
+is to set the `experimental_remote` configuration field to `true`, exactly
+as documented in the [remote bindings documentation](https://developers.cloudflare.com/workers/development-testing/#remote-bindings).
+
+<Callout>
+  Note that remote bindings will also be used during build, this can be very useful for example when using
+  features such [ISR](https://nextjs.org/docs/app/guides/incremental-static-regeneration) so that read
+  production data can be used for the site's static generation
+</Callout>
+
 ## Other Cloudflare APIs (`cf`, `ctx`)
 
 You can access context about the incoming request from the [`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cf-property-requestinitcfproperties), as well as lifecycle methods from the [`ctx` object](https://developers.cloudflare.com/workers/runtime-apis/context) from the return value of [`getCloudflareContext()`](https://github.com/opennextjs/opennextjs-cloudflare/blob/main/packages/cloudflare/src/api/cloudflare-context.ts):

From 215885facdd992878512055c439b98c75c50bdd6 Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 11 Jul 2025 13:52:43 +0200
Subject: [PATCH 134/140] docs(overrides): add Asset Resolver (#168)

---
 pages/aws/config/custom_overrides.mdx         | 18 +++++++++++++
 pages/aws/config/overrides/_meta.json         |  3 ++-
 pages/aws/config/overrides/asset_resolver.mdx | 27 +++++++++++++++++++
 3 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 pages/aws/config/overrides/asset_resolver.mdx

diff --git a/pages/aws/config/custom_overrides.mdx b/pages/aws/config/custom_overrides.mdx
index 7c86e75..7963e79 100644
--- a/pages/aws/config/custom_overrides.mdx
+++ b/pages/aws/config/custom_overrides.mdx
@@ -417,3 +417,21 @@ export default config;
 ```
 
 [Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/proxyExternalRequest) ones are `'fetch' | 'node' | 'dummy'`
+
+## Custom Asset Resolver
+
+This is used by OpenNext to resolve static assets. You can read more about it [here](/aws/config/overrides/asset_resolver). To have a custom override for the Asset Resolver, you need an `open-next.config.ts` with this:
+
+```ts
+import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
+const config = {
+  default: {},
+  middleware: {
+    assetResolver: import("./customAssetResolver").then((mod) => mod.default),
+  },
+} satisfies OpenNextConfig;
+
+export default config;
+```
+
+[Included](https://github.com/opennextjs/opennextjs-aws/tree/main/packages/open-next/src/overrides/assetResolver) one is `'dummy'`
diff --git a/pages/aws/config/overrides/_meta.json b/pages/aws/config/overrides/_meta.json
index 36719ab..2e2f585 100644
--- a/pages/aws/config/overrides/_meta.json
+++ b/pages/aws/config/overrides/_meta.json
@@ -8,5 +8,6 @@
   "proxy_external_request": "External Request Proxy",
   "origin_resolver": "Origin Resolver",
   "invoke_function": "Invoke Function for the warmer",
-  "automatic_cdn_invalidation": "Automatic CDN Invalidation"
+  "automatic_cdn_invalidation": "Automatic CDN Invalidation",
+  "asset_resolver": "Asset Resolver"
 }
diff --git a/pages/aws/config/overrides/asset_resolver.mdx b/pages/aws/config/overrides/asset_resolver.mdx
new file mode 100644
index 0000000..65b298e
--- /dev/null
+++ b/pages/aws/config/overrides/asset_resolver.mdx
@@ -0,0 +1,27 @@
+Available since `@opennextjs/aws` 3.7.0
+
+This override is used by OpenNext to serve [static assets](https://nextjs.org/docs/app/api-reference/file-conventions/public-folder) from the routing layer.
+
+It is not enabled by default as the assumption is that assets are served before reaching the Open Next server.
+
+When assets are not served before the Open Next server, you can create an Asset Resolver to serve them. It will be invoked [after the `beforeFiles` (`rewrites`) from `next.config.ts`](https://nextjs.org/docs/app/api-reference/file-conventions/middleware#execution-order).
+
+## Implementation
+
+An Asset Resolver should implement:
+
+```ts
+export interface AssetResolver {
+  name: string;
+
+  maybeGetAssetResult?: (event: InternalEvent) => Promise<InternalResult | undefined> | undefined;
+}
+```
+
+`maybeGetAssetResult` is invoked with the `InternalEvent` and should return a `Promise<InternalResult>` to serve an asset when the incoming event matches one. When it returns `Promise<undefined>` or `undefined`, the routing process keeps going to try and match Next routes.
+
+## Included Asset Resolver
+
+### dummy
+
+The dummy `AssetResolver` does nothing so it never serves assets. It is the default implementation.

From c9fce2021aa4accf5dcaff58d4dda78bf8c623db Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Fri, 11 Jul 2025 14:03:04 +0200
Subject: [PATCH 135/140] docs(cloudflare): skew protection, static assets
 (#164)

Co-authored-by: conico974 <nicodorseuil@yahoo.fr>
Co-authored-by: James Anderson <james@eli.cx>
---
 pages/cloudflare/howtos/_meta.json |  4 +-
 pages/cloudflare/howtos/assets.mdx | 56 +++++++++++++++++++
 pages/cloudflare/howtos/skew.mdx   | 88 ++++++++++++++++++++++++++++++
 3 files changed, 147 insertions(+), 1 deletion(-)
 create mode 100644 pages/cloudflare/howtos/assets.mdx
 create mode 100644 pages/cloudflare/howtos/skew.mdx

diff --git a/pages/cloudflare/howtos/_meta.json b/pages/cloudflare/howtos/_meta.json
index c8fe30e..c2190c7 100644
--- a/pages/cloudflare/howtos/_meta.json
+++ b/pages/cloudflare/howtos/_meta.json
@@ -6,5 +6,7 @@
   "image": "Image Optimization",
   "custom-worker": "Custom Worker",
   "keep_names": "__name issues",
-  "workerd": "workerd specific packages"
+  "workerd": "workerd specific packages",
+  "skew": "Skew Protection",
+  "assets": "Static assets"
 }
diff --git a/pages/cloudflare/howtos/assets.mdx b/pages/cloudflare/howtos/assets.mdx
new file mode 100644
index 0000000..6c05ebf
--- /dev/null
+++ b/pages/cloudflare/howtos/assets.mdx
@@ -0,0 +1,56 @@
+## Static assets (public folder)
+
+The [static assets of Next located in the public folder](https://nextjs.org/docs/app/api-reference/file-conventions/public-folder) are served using [Workers Static Assets](https://developers.cloudflare.com/workers/static-assets/).
+
+Workers Static Assets can intercept requests to the application ([`run_worker_first=false`](https://developers.cloudflare.com/workers/static-assets/) which is the default). This is the most cost efficient option as asset requests will not be billed in that case.
+
+Another option is to run the Worker first (`run_worker_first=true`) to offer more flexibility at the expense of a higher cost.
+
+Note that `run_worker_first` could also be set to a list of patterns - this is a great option if you need more flexibility for only a subset of the statids assets.
+
+### run_worker_first=false
+
+When `run_worker_first` is set to `false`, requests are intercepted before reaching the worker and are not billed:
+
+```jsonc
+// wrangler.jsonc
+{
+  "name": "my-app",
+  // ...
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+    // Optional as false is the default value
+    "run_worker_first": false,
+  },
+  // ...
+}
+```
+
+This is the most cost efficient option to use when you do not need to serve assets behind the middleware or Next rewrites and headers from [the Next config](https://nextjs.org/docs/app/api-reference/config/next-config-js).
+
+When `run_worker_first=false` you can still configure [headers](https://developers.cloudflare.com/workers/static-assets/headers/) and [redirects](https://developers.cloudflare.com/workers/static-assets/redirects/) via Worker Static Assets.
+
+### run_worker_first=true
+
+When `run_worker_first` is set to `true`, all the requests will reach the Worker and be billed:
+
+```jsonc
+// wrangler.jsonc
+{
+  "name": "my-app",
+  // ...
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+    "run_worker_first": true,
+  },
+  // ...
+}
+```
+
+The Open Next asset resolver will be used to retrieve the assets from the Worker.
+
+When `run_worker_first=true`, assets are served behind the middleware and Next rewrites and headers from [the Next config](https://nextjs.org/docs/app/api-reference/config/next-config-js). The [headers](https://developers.cloudflare.com/workers/static-assets/headers/) and [redirects](https://developers.cloudflare.com/workers/static-assets/redirects/) configured for the Worker Static Assets do not apply in this case.
+
+`run_worker_first=true` should be used if you plan to use skew protection.
diff --git a/pages/cloudflare/howtos/skew.mdx b/pages/cloudflare/howtos/skew.mdx
new file mode 100644
index 0000000..fe6e1a3
--- /dev/null
+++ b/pages/cloudflare/howtos/skew.mdx
@@ -0,0 +1,88 @@
+import { Callout } from "nextra/components";
+
+## Skew protection
+
+The Cloudflare adapter has _experimental support_ for skew protection based on [the preview URLs](https://developers.cloudflare.com/workers/configuration/previews/).
+
+<Callout type="info">
+  Preview URLs are disabled for [Workers that implement a Durable
+  Object](https://developers.cloudflare.com/workers/configuration/previews/#limitations). If your app uses
+  Durable Objects, they will need to be implemented in a separate Worker.
+</Callout>
+
+### How to enable the skew protection
+
+**OpenNext config**
+
+Set `cloudflare.skewProtection.enabled` to `true` to enable skew protection:
+
+```ts
+// open-next.config.ts
+export default {
+  // ...
+  cloudflare: {
+    skewProtection: {
+      enabled: true,
+      // Maximum number of previous versions to use.
+      // Optional, default to 20.
+      maxNumberOfVersions: 20,
+      // Age of the oldest version to use (from the last deplyment date)
+      // Optional, default to 7 days.
+      maxVersionAgeDays: 7,
+    },
+  },
+} satisfies OpenNextConfig;
+```
+
+**Wrangler configuration**
+
+The Worker needs to serve the correct version of the app assets. For that it need be be executed before incoming requests are matched against the assets. Set [`run_worker_first`](https://developers.cloudflare.com/workers/static-assets/binding/#run_worker_first) to `true` in your wrangler configuration to enable this behavior:
+
+```jsonc
+// wrangler.jsonc
+{
+  "name": "my-app",
+  // ...
+  "assets": {
+    "directory": ".open-next/assets",
+    "binding": "ASSETS",
+    "run_worker_first": true,
+  },
+  // ...
+}
+```
+
+**Environment variables**
+
+The following environment variables should be set when the skew protection is used:
+
+- `CF_WORKER_NAME` should be set to the name of the worker, i.e. `my-app` given the config above. If you're using environment, the name of the app should contain your env, i.e. `my-app-<env>`
+- `CF_PREVIEW_DOMAIN` is the the subdomain of `workers.dev` where the previews are deployed, i.e. `<version-name>.<domain>.workers.dev`
+- `CF_WORKERS_SCRIPTS_API_TOKEN` is an API token with the `Workers Scripts:Read` permission
+- `CF_ACCOUNT_ID` is the Cloudflare account id where the app is deployed.
+
+Those variables are used to retrieve the past deployments of your application.
+
+**Next config**
+
+You must set a different `deploymentId` in your next config each time your app is deployed. You will get an error if the `deployementId` has already been used by a previous deployment.
+
+The cloudflare adapter exports a `getDeploymentId()` function that can be used to generate a unique deployment id.
+
+```ts
+// next.config.ts
+import { getDeploymentId } from "@opennextjs/cloudflare";
+
+const nextConfig = {
+  // ...
+  deploymentId: getDeploymentId(),
+};
+```
+
+### What you should know
+
+- Because the Worker is configured to run in front of the assets Worker (`run_worker_first`), requesting an asset will count as a request to your Worker
+- Requesting an older deployment will generate 2 requests: the request to the latest version and the request to the older version
+- It is not currently possible to delete a deployment
+- Requests to an older deployment will be a few milli-seconds slower than requests to the latest version of the app
+- Request to a deployment older than the `maxNumberOfVersions` or older than `maxVersionAgeDays` will fallback to the current deployment

From 19f7fb2145efabc8e24ac4326f06dd2abbfcb01a Mon Sep 17 00:00:00 2001
From: b1ondie96 <103701664+b1ondie96@users.noreply.github.com>
Date: Fri, 18 Jul 2025 17:16:21 +0200
Subject: [PATCH 136/140] removed incorrect connection string (#169)

---
 pages/cloudflare/howtos/db.mdx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pages/cloudflare/howtos/db.mdx b/pages/cloudflare/howtos/db.mdx
index 2b9d0cd..4a8a781 100644
--- a/pages/cloudflare/howtos/db.mdx
+++ b/pages/cloudflare/howtos/db.mdx
@@ -82,7 +82,7 @@ export const getDb = cache(() => {
   const { env } = getCloudflareContext();
   const connectionString = env.HYPERDRIVE.connectionString;
   const pool = new Pool({
-    connectionString: process.env.PG_URL,
+    connectionString,
     // You don't want to reuse the same connection for multiple requests
     maxUses: 1,
   });
@@ -94,7 +94,7 @@ export const getDbAsync = cache(async () => {
   const { env } = await getCloudflareContext({ async: true });
   const connectionString = env.HYPERDRIVE.connectionString;
   const pool = new Pool({
-    connectionString: process.env.PG_URL,
+    connectionString,
     // You don't want to reuse the same connection for multiple requests
     maxUses: 1,
   });

From 08e71e892609cfdeed11145983e59512c9733b8a Mon Sep 17 00:00:00 2001
From: Victor Berchet <victor@suumit.com>
Date: Wed, 23 Jul 2025 12:34:49 +0200
Subject: [PATCH 137/140] docs[cloudflare] fix domain structure in skew
 protection (#170)

---
 pages/cloudflare/howtos/skew.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/howtos/skew.mdx b/pages/cloudflare/howtos/skew.mdx
index fe6e1a3..9c83491 100644
--- a/pages/cloudflare/howtos/skew.mdx
+++ b/pages/cloudflare/howtos/skew.mdx
@@ -57,7 +57,7 @@ The Worker needs to serve the correct version of the app assets. For that it nee
 The following environment variables should be set when the skew protection is used:
 
 - `CF_WORKER_NAME` should be set to the name of the worker, i.e. `my-app` given the config above. If you're using environment, the name of the app should contain your env, i.e. `my-app-<env>`
-- `CF_PREVIEW_DOMAIN` is the the subdomain of `workers.dev` where the previews are deployed, i.e. `<version-name>.<domain>.workers.dev`
+- `CF_PREVIEW_DOMAIN` is the the subdomain of `workers.dev` where the previews are deployed, i.e. `<version>-<worker_name>.<domain>.workers.dev`
 - `CF_WORKERS_SCRIPTS_API_TOKEN` is an API token with the `Workers Scripts:Read` permission
 - `CF_ACCOUNT_ID` is the Cloudflare account id where the app is deployed.
 

From 895e846aa4b5dd26fa06bff924e6d20ce9fe003f Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Mon, 28 Jul 2025 18:38:39 +0100
Subject: [PATCH 138/140] add note about environment variables in Cloudflare
 skew protection docs (#171)

---
 pages/cloudflare/howtos/skew.mdx | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/pages/cloudflare/howtos/skew.mdx b/pages/cloudflare/howtos/skew.mdx
index 9c83491..749f732 100644
--- a/pages/cloudflare/howtos/skew.mdx
+++ b/pages/cloudflare/howtos/skew.mdx
@@ -63,6 +63,9 @@ The following environment variables should be set when the skew protection is us
 
 Those variables are used to retrieve the past deployments of your application.
 
+Note that in this context, environment variables include both your local [Cloudflare environment variables](https://developers.cloudflare.com/workers/configuration/environment-variables/)
+and the process' environment variables. If a variable is set in both places, the process environment variable will take precedence.
+
 **Next config**
 
 You must set a different `deploymentId` in your next config each time your app is deployed. You will get an error if the `deployementId` has already been used by a previous deployment.

From dffe4e14c83bfbbbd3566ee7cd42c9c09af58f19 Mon Sep 17 00:00:00 2001
From: conico974 <nicodorseuil@yahoo.fr>
Date: Tue, 29 Jul 2025 09:41:39 +0200
Subject: [PATCH 139/140] [cloudflare]: add option to persist missing tags in
 regional cache (#172)

Co-authored-by: Nicolas Dorseuil <nicolas@gitbook.io>
---
 pages/cloudflare/caching.mdx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 4b556c2..5af4ca1 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -198,6 +198,7 @@ export default defineCloudflareConfig({
     baseShardSize: 12,
     regionalCache: true, // Enable regional cache to reduce the load on the DOs
     regionalCacheTtlSec: 5, // The TTL for the regional cache
+    regionalCacheDangerouslyPersistMissingTags: true, // Enable this to persist missing tags in the regional cache
     shardReplication: {
       numberOfSoftReplicas: 4,
       numberOfHardReplicas: 2,
@@ -661,6 +662,7 @@ doShardedTagCache takes the following options:
 - `baseShardSize`: The number of shards to use for the cache. The more shards you have, the more evenly the cache will be distributed across the shards. The default is 4. Soft (internal next tags used for `revalidatePath`) and hard tags (the ones you define in your app) will be split in different shards
 - `regionalCache`: Whether to use regional cache for the cache. The default is false. This option is useful when you want to reduce the stress on the durable object
 - `regionalCacheTtlSec`: The TTL for the regional cache. The default is 5 seconds. Increasing this value will increase the time it takes for the cache to be invalidated across regions
+- `regionalCacheDangerouslyPersistMissingTags`: This option allows you to persist missing tags in the regional cache. Without this option, only tags that have been revalidated at least once will be persisted in the regional cache. This option should only be used if you also purge the cache using the [Cache Purge component](#automatic-cache-purge) (or any similar methods). It is disabled by default.
 - `shardReplication`: Enable replicating the Shard. Shard replication will duplicate each shards into replicas to spread the load even more
   - `numberOfSoftReplicas`: Number of replicas for the soft tag shards
   - `numberOfHardReplicas`: Number of replicas for the hard tag shards

From f59e96e21441ea8b34fb68e36e4b91305db4d6c4 Mon Sep 17 00:00:00 2001
From: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Date: Thu, 14 Aug 2025 11:21:18 +0100
Subject: [PATCH 140/140] Remove incorrect space breaking link (#177)

---
 pages/cloudflare/caching.mdx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pages/cloudflare/caching.mdx b/pages/cloudflare/caching.mdx
index 5af4ca1..dff6a9d 100644
--- a/pages/cloudflare/caching.mdx
+++ b/pages/cloudflare/caching.mdx
@@ -712,7 +712,7 @@ You can only enable cache purge functionality on a zone (e.g., when using a cust
 
 The cache purge component automatically clears the cache when a page is revalidated. It is only necessary if you use On-Demand revalidation along with one of the cache components that leverage the Cache API.
 
-This component can either call the Cache API's purge function directly or route the purge request through an intermediate durable object. Using a durable object helps buffer requests and avoid reaching [API rate limits] (https://developers.cloudflare.com/cache/how-to/purge-cache/#hostname-tag-prefix-url-and-purge-everything-limits).
+This component can either call the Cache API's purge function directly or route the purge request through an intermediate durable object. Using a durable object helps buffer requests and avoid reaching [API rate limits](https://developers.cloudflare.com/cache/how-to/purge-cache/#hostname-tag-prefix-url-and-purge-everything-limits).
 
 Cache purge are only called when you call `revalidateTag`, `revalidatePath` or `res.revalidate` in the pages router. It is not called for ISR revalidation.
 
