{props.filename} file. If you are not using a framework, the {props.filename} file can go directly into your {props.product === 'workers' ? static assets directory : build output directory}.
diff --git a/src/content/partials/workers/navigation_requests.mdx b/src/content/partials/workers/navigation_requests.mdx
new file mode 100644
index 000000000000000..4f68c52e90fde58
--- /dev/null
+++ b/src/content/partials/workers/navigation_requests.mdx
@@ -0,0 +1,77 @@
+---
+{}
+---
+
+import { Aside, TypeScriptExample } from "~/components";
+
+### Navigation requests
+
+If you have a Worker script (`main`), have configured `assets.not_found_handling`, and use the [`assets_navigation_prefers_asset_serving` compatibility flag](/workers/configuration/compatibility-flags/#navigation-requests-prefer-asset-serving) (or set a compatibility date of `2025-04-01` or greater), _navigation requests_ will not invoke the Worker script. A _navigation request_ is a request made with the `Sec-Fetch-Mode: navigate` header, which browsers automatically attach when navigating to a page. This reduces billable invocations of your Worker script, and is particularly useful for client-heavy applications which would otherwise invoke your Worker script very frequently and unnecessarily.
+
+
+
+
+
+#### Client-side callbacks
+
+In some cases, you might need to pass a value from a navigation request to your Worker script. For example, if you are acting as an OAuth callback, you might expect to see requests made to some route such as `/oauth/callback?code=...`. With the `assets_navigation_prefers_asset_serving` flag, your HTML assets will be server, rather than your Worker script. In this case, we recommend, either as part of your client application for this appropriate route, or with a slimmed-down endpoint-specific HTML file, passing the value to the server with client-side JavaScript.
+
+```html title="./dist/oauth/callback.html"
+
+
+
+ Loading...
+ + + +``` + +{props.not_found_handling} will provide the desired behavior. If you are building your own framework, or have specialized needs, the following diagram can provide insight into exactly how the routing decisions are made.
+
+
+{`flowchart
+ Request@{ shape: stadium, label: "Incoming request" }
+ Request-->RunWorkerFirst
+ RunWorkerFirst@{ shape: diamond, label: "Run Worker script first?" }
+ RunWorkerFirst-->|No|RequestMatchesAsset
+ RunWorkerFirst-->|Yes|WorkerScriptInvoked
+ RequestMatchesAsset@{ shape: diamond, label: "Request matches asset?" }
+ RequestMatchesAsset-->|Yes|AssetServing
+ RequestMatchesAsset-->|No|WorkerScriptPresent
+ WorkerScriptPresent@{ shape: diamond, label: "Worker script present?" }
+ WorkerScriptPresent-->|No|AssetServing
+ WorkerScriptPresent-->|Yes|RequestNavigation
+ RequestNavigation@{ shape: diamond, label: "Request is navigation request?" }
+ RequestNavigation-->|No|WorkerScriptInvoked
+ WorkerScriptInvoked@{ shape: rect, label: "Worker script invoked" }
+ WorkerScriptInvoked-.->|Asset binding|AssetServing
+ RequestNavigation-->|Yes|AssetServing
+
+ subgraph Asset serving
+ AssetServing@{ shape: diamond, label: "Request matches asset?" }
+ AssetServing-->|Yes|AssetServed
+ AssetServed@{ shape: stadium, label: "**200 OK**
asset served" }
+ AssetServing-->|No|NotFoundHandling
+
+ ${props.not_found_handling === "single-page-application" ? `subgraph single-page-application
+ NotFoundHandling@{ shape: rect, label: "Request rewritten to /index.html" }
+ NotFoundHandling-->SPAExists
+ SPAExists@{ shape: diamond, label: "HTML Page exists?" }
+ SPAExists-->|Yes|SPAServed
+ SPAExists-->|No|Generic404PageServed
+ Generic404PageServed@{ shape: stadium, label: "**404 Not Found**
null-body response served" }
+ SPAServed@{ shape: stadium, label: "**200 OK**
/index.html page served" }
+ end` : `subgraph 404-page
+ NotFoundHandling@{ shape: rect, label: "Request rewritten to ../404.html" }
+ NotFoundHandling-->404PageExists
+ 404PageExists@{ shape: diamond, label: "HTML Page exists?" }
+ 404PageExists-->|Yes|404PageServed
+ 404PageExists-->|No|404PageAtIndex
+ 404PageAtIndex@{ shape: diamond, label: "Request is for root /404.html?" }
+ 404PageAtIndex-->|Yes|Generic404PageServed
+ 404PageAtIndex-->|No|NotFoundHandling
+ Generic404PageServed@{ shape: stadium, label: "**404 Not Found**
null-body response served" }
+ 404PageServed@{ shape: stadium, label: "**404 Not Found**
404.html page served" }
+ end`}
+
+ end`}
+
+