diff --git a/docs/developer-docs/6.x/admin/assets/file-url-formatter.png b/docs/developer-docs/6.x/admin/assets/file-url-formatter.png
new file mode 100644
index 000000000..72e4e187c
Binary files /dev/null and b/docs/developer-docs/6.x/admin/assets/file-url-formatter.png differ
diff --git a/docs/developer-docs/6.x/admin/file-url-formatter.mdx b/docs/developer-docs/6.x/admin/file-url-formatter.mdx
new file mode 100644
index 000000000..363e6ee87
--- /dev/null
+++ b/docs/developer-docs/6.x/admin/file-url-formatter.mdx
@@ -0,0 +1,84 @@
+---
+id: a3f8kd92
+title: File URL Formatter
+description: Learn how to customize file and image URLs in the Webiny admin app using the FileUrlFormatter extension point.
+---
+
+import { Alert } from "@/components/Alert";
+import fileUrlFormatter from "./assets/file-url-formatter.png";
+
+
+
+- what the FileUrlFormatter extension point is and where it applies
+- how to implement and register a custom file URL formatter
+- how to remap query parameters for your own CDN or image service
+
+
+
+## Overview
+
+
+
+This extension point is most relevant if you are replacing Webiny's built-in File Manager with your own Digital Asset Manager (DAM). If you are using the default File Manager, no configuration is needed.
+
+
+
+File URLs for images displayed in the Admin app pass through the `FileUrlFormatter` extension point before being rendered.
+
+You can customize how those URLs are constructed: remap parameters to your CDN's own syntax, add authentication tokens, rewrite the host, or apply any other transformation your image delivery pipeline requires. For example, `FilePicker` calls `format(url, { width: 128 })` when rendering thumbnails — a custom formatter can intercept that and swap the standard `?width=N` for whatever your CDN expects.
+
+
+
+Only one `FileUrlFormatter` is active at a time. When you register your own implementation it replaces the File Manager default — the last implementation registered wins.
+
+
+
+## Implement the Formatter
+
+Create an implementation of `FileUrlFormatter`. The `url` object is mutable — modify it in place. `params.width` is the only supported parameter.
+
+```typescript extensions/fileUrlFormatter/MyFileUrlFormatter.ts
+import { FileUrlFormatter } from "webiny/admin/file-manager";
+
+class MyFileUrlFormatter implements FileUrlFormatter.Interface {
+ format(url: URL, params?: FileUrlFormatter.Params): void {
+ if (params?.width !== undefined) {
+ url.searchParams.set("my_width", String(params.width));
+ }
+ }
+}
+
+export const MyFileUrlFormatterImpl = FileUrlFormatter.createImplementation({
+ implementation: MyFileUrlFormatter,
+ dependencies: []
+});
+```
+
+## Register the Formatter
+
+Wrap the implementation in a feature and mount it with `RegisterFeature`:
+
+```tsx extensions/fileUrlFormatter/index.tsx
+import React from "react";
+import { createFeature, RegisterFeature } from "webiny/admin";
+import { MyFileUrlFormatterImpl } from "./MyFileUrlFormatter.js";
+
+const FileUrlFormatterFeature = createFeature({
+ name: "MyApp/FileUrlFormatter",
+ register(container) {
+ container.register(MyFileUrlFormatterImpl).inSingletonScope();
+ }
+});
+
+export default () => ;
+```
+
+Then add the extension to your `webiny.config.tsx`:
+
+```tsx webiny.config.tsx
+
+```
+
+With the extension registered, file thumbnails in the Admin app will use your formatter. Here is the result:
+
+
diff --git a/docs/developer-docs/6.x/navigation.tsx b/docs/developer-docs/6.x/navigation.tsx
index 4bae6049c..0c5aefcc5 100644
--- a/docs/developer-docs/6.x/navigation.tsx
+++ b/docs/developer-docs/6.x/navigation.tsx
@@ -48,6 +48,7 @@ export const Navigation = ({ children }: { children: React.ReactNode }) => {
+
{
title={"Customize Page List Columns"}
/>
+
+```
+
### Infra.Api.StackOutputValue
Adds a custom key-value entry to the API Pulumi stack outputs. Can be used multiple times.
diff --git a/docs/developer-docs/6.x/website-builder/preview-url-modifier.mdx b/docs/developer-docs/6.x/website-builder/preview-url-modifier.mdx
new file mode 100644
index 000000000..31fd8a38f
--- /dev/null
+++ b/docs/developer-docs/6.x/website-builder/preview-url-modifier.mdx
@@ -0,0 +1,109 @@
+---
+id: m4x7pq2n
+title: Preview URL Modifier
+description: Learn how to inject custom query parameters into Website Builder's live preview URLs.
+---
+
+import { Alert } from "@/components/Alert";
+
+
+
+- what the PreviewUrlModifier extension point is and where it applies
+- how to implement and register a custom preview URL modifier
+- how to use async operations (e.g. fetching a signed token) inside a modifier
+
+
+
+## Overview
+
+Every live preview URL that Website Builder generates — in the page editor iframe, the address bar's copy link button, and the pages list — can be customized via the `PreviewUrlModifier` extension point.
+
+When registered, the modifier receives the fully-constructed `URL` object just before it is used. You can add, remove, or change any query parameter, including ones fetched asynchronously from a remote API.
+
+
+
+Only one `PreviewUrlModifier` can be registered per project. Avoid setting parameters that start with `wb.` — those are reserved for internal Website Builder use.
+
+
+
+## Implement the Modifier
+
+Create a class that implements `PreviewUrlModifier.Interface`. The single required method is `modify(url: URL): Promise`. Mutate the `url` object in place — the return value is ignored.
+
+```typescript extensions/previewUrlModifier/MyPreviewUrlModifier.ts
+import { PreviewUrlModifier } from "webiny/admin/website-builder";
+
+class MyPreviewUrlModifier implements PreviewUrlModifier.Interface {
+ async modify(url: URL) {
+ url.searchParams.set("my-param", "my-value");
+ }
+}
+
+export default PreviewUrlModifier.createImplementation({
+ implementation: MyPreviewUrlModifier,
+ dependencies: []
+});
+```
+
+### Async Example — Fetching a Signed Token
+
+Mark the method `async` to perform any async work before the URL is handed back:
+
+```typescript extensions/previewUrlModifier/MyPreviewUrlModifier.ts
+import { PreviewUrlModifier } from "webiny/admin/website-builder";
+
+class MyPreviewUrlModifier implements PreviewUrlModifier.Interface {
+ async modify(url: URL) {
+ const token = await fetch("/api/preview-token").then(r => r.text());
+ url.searchParams.set("token", token);
+ }
+}
+
+export default PreviewUrlModifier.createImplementation({
+ implementation: MyPreviewUrlModifier,
+ dependencies: []
+});
+```
+
+## Register the Feature
+
+Wire the implementation into the DI container using `createFeature` and `RegisterFeature`:
+
+```tsx extensions/previewUrlModifier/index.tsx
+import React from "react";
+import { createFeature, RegisterFeature } from "webiny/admin";
+import MyPreviewUrlModifier from "./MyPreviewUrlModifier.js";
+
+const PreviewUrlModifierFeature = createFeature({
+ name: "MyApp/PreviewUrlModifier",
+ register(container) {
+ container.register(MyPreviewUrlModifier);
+ }
+});
+
+export default () => ;
+```
+
+Then register the extension in `webiny.config.tsx`:
+
+```tsx webiny.config.tsx
+import React from "react";
+import { Admin } from "webiny/extensions";
+
+export const Extensions = () => {
+ return (
+ <>
+ {/* ... other extensions */}
+
+ >
+ );
+};
+```
+
+## Where the Modifier Applies
+
+| Surface | Description |
+|---|---|
+| Editor iframe | The live-editing iframe in the page editor |
+| Address bar link | The "copy preview link" button in the editor toolbar |
+| Pages list | Preview icon links in the pages list table |
diff --git a/docs/release-notes/6.4.0/changelog.ai.txt b/docs/release-notes/6.4.0/changelog.ai.txt
new file mode 100644
index 000000000..01d218c6b
--- /dev/null
+++ b/docs/release-notes/6.4.0/changelog.ai.txt
@@ -0,0 +1,8 @@
+AI Context: 6.4.0 Changelog (changelog.mdx)
+
+This file tracks manual edits made after the generation script ran.
+The script reads the "Skipped PRs" section to avoid re-adding removed entries.
+
+## Skipped PRs
+
+## Manual Rewrites
diff --git a/docs/release-notes/6.4.0/changelog.mdx b/docs/release-notes/6.4.0/changelog.mdx
new file mode 100644
index 000000000..956b39a49
--- /dev/null
+++ b/docs/release-notes/6.4.0/changelog.mdx
@@ -0,0 +1,288 @@
+---
+id: ef2hssss
+title: Webiny 6.4.0 Changelog
+description: See what's new in Webiny version 6.4.0
+---
+
+import { GithubRelease } from "@/components/GithubRelease";
+import { Alert } from "@/components/Alert";
+
+
+
+## Headless CMS
+
+### CMS Models Cache Now Includes Plugin-Registered Models ([#5208](https://github.com/webiny/webiny-js/pull/5208))
+
+When listing CMS content models, plugin-registered models were fetched outside the cache boundary. Even when the cache was warm, every request triggered a fresh plugin model lookup. Plugin models are now fetched inside the cache boundary along with database models, so a cache hit returns the complete merged list without any additional lookups.
+
+### Added Revision Description Field ([#5165](https://github.com/webiny/webiny-js/pull/5165))
+
+Content model entry revisions can now include a description. When an entry is published, the revision description is stored alongside the revision metadata, making it easier to track what changed between versions.
+
+### AI Personas and Projects for Content Generation ([#5194](https://github.com/webiny/webiny-js/pull/5194), [#5202](https://github.com/webiny/webiny-js/pull/5202))
+
+The AI Powerups package now supports configurable personas and file-backed project contexts that shape AI-generated content tone and audience targeting.
+
+**Personas** are presets with a name, description, and style that influence how the AI generates content. **Projects** are file-backed contexts with token budget validation, version-tracked caching, and default persona bindings. Together, they let you define consistent content guidelines for different brands, audiences, or content types.
+
+The implementation uses a manifest-based approach where the AI model fetches project files on demand via a `read_project_file` tool instead of receiving all content upfront. Generation results now include telemetry data (files read, cache hits, tool calls made, total steps) in the websocket response.
+
+Additionally, the `AiImageEnrichment` functionality was moved from `api-file-manager` to `ai-powerups` to resolve a circular package dependency.
+
+### Fixed Ordered List Numbering in Lexical Editor ([#5194](https://github.com/webiny/webiny-js/pull/5194))
+
+Ordered list items now get correct sequential numbering when importing HTML content into the Lexical rich text editor. Previously, imported lists could display incorrect numbers.
+
+### Text Field Compression Storage ([#5213](https://github.com/webiny/webiny-js/pull/5213))
+
+Text fields now support compression when storing large values. When enabled, the field stores a compressed representation containing the compression algorithm and the compressed value. This can significantly reduce storage costs for content-heavy text fields.
+
+### Webhooks API ([#5218](https://github.com/webiny/webiny-js/pull/5218), [#5219](https://github.com/webiny/webiny-js/pull/5219))
+
+Introduced a new Webhooks system for Headless CMS. The API layer provides the foundation for defining webhook endpoints and triggering them based on content events, while the Admin UI offers a management interface for configuring webhooks directly from the dashboard.
+
+### Refactored Asset Delivery to Use Dependency Injection ([#5226](https://github.com/webiny/webiny-js/pull/5226))
+
+The asset delivery system has been migrated from a custom manual DI container to the standard `createFeature`/`createAbstraction` system from `webiny/feature`. This brings asset delivery in line with other Webiny subsystems and reduces boilerplate.
+
+Key changes:
+
+- Asset delivery interfaces and implementations moved from `delivery/AssetDelivery/` to `features/assetDelivery/`, co-locating abstractions with their default implementations
+- S3-specific concerns (`S3Client`, `S3Bucket`, config) extracted into dedicated abstractions in `api-file-manager-s3`, registered via `createS3AssetDeliveryFeature`
+- Private files support (authorizer, processor decorator) is conditionally registered based on WCP context
+
+This is an internal refactor with no changes to the public API.
+
+### Fixed File Fields Provider to Support Private Files Licensing ([#5229](https://github.com/webiny/webiny-js/pull/5229))
+
+The hardcoded `FILE_FIELDS` import has been replaced with an injectable `FileFieldsProvider` abstraction. This allows the `accessControl.type` field to be conditionally included only when private files are licensed via WCP.
+
+All SDK gateways and repositories now resolve file fields dynamically through dependency injection, ensuring that unlicensed features don't expose fields that aren't available.
+
+### Webhooks Integration for CMS Events ([#5224](https://github.com/webiny/webiny-js/pull/5224))
+
+The Webhooks package now integrates with the Headless CMS, allowing you to trigger webhooks on CMS entry lifecycle events. This enables external systems to react to content changes in real time — useful for cache invalidation, search index updates, or workflow automation.
+
+### Entry Data Factories for CMS Features ([#5205](https://github.com/webiny/webiny-js/pull/5205))
+
+CMS features can now receive entry data factories via dependency injection rather than relying on internal static methods. This change improves testability and allows you to customize how entry data is constructed in advanced use cases.
+
+### Removed Legacy APW Entry Meta Field ([#5206](https://github.com/webiny/webiny-js/pull/5206))
+
+The `meta` field previously used by the legacy Advanced Publishing Workflow (APW) has been removed from CMS entries. If you were relying on this field in custom code, you'll need to update your implementation to use the current APW APIs.
+
+## Webiny SDK
+
+### Removed Standalone Entity Type Exports ([#5152](https://github.com/webiny/webiny-js/pull/5152))
+
+Standalone domain entity types are no longer exported from `@webiny/sdk`. Types such as `FmFile`, `CmsEntryData`, `TaskStatus`, and similar low-level shapes have been removed from the public API. Method parameter types, result wrappers, and input/filter types remain exported. Consumers should rely on TypeScript inference to obtain entity shapes from method return types rather than importing these internal types directly.
+
+### WebSockets Service Now Exported from `webiny/api` ([#5203](https://github.com/webiny/webiny-js/pull/5203))
+
+The `Websockets` service abstraction was not previously accessible from the main `webiny/api` entry point, requiring deep imports to use it in custom API routes. It can now be imported directly and injected as a dependency into any `Route` implementation.
+
+```typescript
+import { Route, Websockets } from "webiny/api";
+
+interface BroadcastBody {
+ message: string;
+ type: "info" | "warning" | "success";
+}
+
+class BroadcastNotificationRoute implements Route.Interface {
+ constructor(private websockets: Websockets.Interface) {}
+
+ async execute(request: Route.Request, reply: Route.Reply) {
+ const { message, type } = request.body as BroadcastBody;
+
+ const connectionsResult = await this.websockets.listConnections();
+ if (connectionsResult.isOk() && connectionsResult.value.length > 0) {
+ await this.websockets.sendToConnections(connectionsResult.value, {
+ action: "app.notification",
+ data: { message, type, sentAt: new Date().toISOString() }
+ });
+ }
+
+ reply.send({ notified: connectionsResult.value?.length ?? 0 });
+ }
+}
+
+export default Route.createImplementation({
+ implementation: BroadcastNotificationRoute,
+ dependencies: [Websockets]
+});
+```
+
+## Website Builder
+
+### Read-Only Mode for Non-Draft Page Revisions ([#5164](https://github.com/webiny/webiny-js/pull/5164))
+
+The Website Builder editor now opens published and previously published page revisions in read-only mode. Only draft revisions remain fully editable, preventing accidental modifications to live content.
+
+### Published Pages Open Clean URL from Pages List ([#5151](https://github.com/webiny/webiny-js/pull/5151))
+
+Clicking the link icon next to a published page in the pages list now opens the page's public URL without preview query parameters. Draft and unpublished pages continue to open the preview link with `wb.*` params.
+
+### Custom Query Parameters for Live Preview URLs ([#5215](https://github.com/webiny/webiny-js/pull/5215))
+
+Previously, there was no way to inject custom query parameters into Website Builder's live preview URLs without modifying framework code. You can now register a `PreviewUrlModifier` via the DI container to append any query parameters you need to all preview URLs — including asynchronously fetched values such as signed tokens.
+
+```typescript
+import { PreviewUrlModifier } from "webiny/api-website-builder";
+
+container.register(PreviewUrlModifier, {
+ useFactory: () => ({
+ async modify(url: URL): Promise {
+ const token = await fetchSignedToken();
+ url.searchParams.set("preview_token", token);
+ }
+ })
+});
+```
+
+The modifier applies to both the in-editor iframe URL and the page list preview links.
+
+### Fixed Model Registration and GraphQL Field Registry Bug ([#5220](https://github.com/webiny/webiny-js/pull/5220))
+
+Website Builder page and redirect models were migrated to the `ModelFactory` pattern and their registrations moved to run before context plugins, matching the pattern used in other packages. Additionally, a bug was fixed where the CMS GraphQL field type registry could be constructed with no field type implementations, causing GraphQL input types to generate empty and produce a schema error.
+
+### Website Builder UI Improvements ([#5160](https://github.com/webiny/webiny-js/pull/5160))
+
+This release includes various UI improvements to the Website Builder interface.
+
+### Custom Query Parameters for Live Preview URLs ([#5222](https://github.com/webiny/webiny-js/pull/5222))
+
+Previously, there was no way to inject custom query parameters into Website Builder's live preview URLs without modifying framework code. A new `PreviewUrlModifier` extension point lets you append any query parameters to all preview URLs — including asynchronously fetched values such as signed tokens.
+
+```typescript
+import { createFeature } from "webiny/feature";
+import { PreviewUrlModifier } from "webiny/website-builder/admin";
+
+export const CustomPreviewUrl = createFeature(async container => {
+ container.register(PreviewUrlModifier, async () => ({
+ async modify(url: URL) {
+ const token = await fetchSignedToken();
+ url.searchParams.set("preview_token", token);
+ }
+ }));
+});
+```
+
+The modifier applies to both the in-editor iframe URL and the page list preview links.
+
+### Page Revision Descriptions ([#5189](https://github.com/webiny/webiny-js/pull/5189))
+
+Page revisions in Website Builder now support descriptions. When publishing a page, you can add a description to the revision to help track what changed — useful for teams collaborating on content updates.
+
+### Webhooks Integration for Pages and Redirects ([#5224](https://github.com/webiny/webiny-js/pull/5224))
+
+Website Builder now supports webhooks for page and redirect events. You can configure external endpoints to receive notifications when pages are published, unpublished, or deleted — and when redirects are created or modified.
+
+## Admin
+
+### Added MultiSelect Component ([#5200](https://github.com/webiny/webiny-js/pull/5200))
+
+A new `MultiSelect` component is now available in `@webiny/admin-ui`. It works like the existing `Select` component but allows picking multiple values via a checkbox dropdown. The trigger displays all selected labels inline by default; enable `showSelectionCount` to show a compact count summary instead (e.g. "3 items selected").
+
+### Added Toggle and ToggleGroup Components ([#5159](https://github.com/webiny/webiny-js/pull/5159))
+
+Two new form input components have been added to `@webiny/admin-ui`: `Toggle`, a button that switches between active and inactive states supporting text, icons, or both; and `ToggleGroup`, which groups multiple toggles for single or multi-select scenarios with an optional bordered container. Both components support `primary`, `outline`, `ghost`, and `ghost-negative` visual variants and integrate with the standard form validation and notes API.
+
+### Dialog Loading Overlay Now Covers the Entire Dialog ([#5168](https://github.com/webiny/webiny-js/pull/5168))
+
+The loading spinner shown while a dialog action was in progress was being clipped, appearing only over the dialog body and cutting off at the footer. It now covers the full dialog surface, including the header and footer. The `Dialog` component gains a first-class `loading` prop (`boolean | { text?: string }`) that handles overlay rendering internally.
+
+### Fixed Audit Logs Infinite Scroll Discarding Previously Loaded Records ([#5175](https://github.com/webiny/webiny-js/pull/5175))
+
+When scrolling through the audit logs list, loading more records replaced the current page instead of appending to it. Users could not scroll back to see earlier entries, and the scroll position jumped to the top on each page load. Previously loaded records are now accumulated across pages, and the scroll position is preserved when new entries are appended.
+
+### Fixed Dynamic Zone Template Gallery Bottom Spacing ([#5166](https://github.com/webiny/webiny-js/pull/5166))
+
+The template picker modal in the Dynamic Zone field was cutting off the last row of template tiles. A missing bottom margin has been added so all templates are fully visible and accessible when scrolling.
+
+### Replaced File Picker Component ([#5214](https://github.com/webiny/webiny-js/pull/5214))
+
+The legacy `react-butterfiles` library has been replaced with a new `BrowserFilePicker` component in `@webiny/app-admin`. The new component uses a presenter-based architecture with proper MIME type detection and size validation. This change affects file upload flows in the File Manager and CMS model import — no API changes are required, but the underlying implementation is now more robust.
+
+### Form Model Enhancements ([#5194](https://github.com/webiny/webiny-js/pull/5194))
+
+The form model system now supports `hiddenWhen` conditional visibility, improved error handling via `FormErrors` and `PresenterErrors`, a multi-file picker field type, and better focus management.
+
+### Lexical Form Field Type ([#5227](https://github.com/webiny/webiny-js/pull/5227))
+
+Added a `lexical` field type to the FormModel system, enabling rich text editing in custom forms via `fields.lexical()`. The field produces a value containing both the Lexical editor state and the rendered HTML.
+
+As part of this change, the Lexical editor export path moved from `webiny/admin/lexical` to `webiny/admin/ui/lexical`, and the CMS/Website Builder editor configs were renamed from `ExpandedEditorConfig`/`CompactEditorConfig` to `LexicalEditorConfig.Expanded`/`LexicalEditorConfig.Compact`.
+
+### File URL Formatter Extension Point ([#5210](https://github.com/webiny/webiny-js/pull/5210))
+
+Added a `FileUrlFormatter` extension point that allows projects to customize how file and image URLs are constructed in the admin UI. By default, the File Manager appends a `?width=128` query parameter to image URLs for responsive thumbnail delivery. Projects can replace this behaviour with their own CDN-specific URL transformation:
+
+```typescript
+import { createFeature } from "webiny/feature";
+import { FileUrlFormatter } from "webiny/file-manager/admin";
+
+export const CdnUrlFormatter = createFeature(async container => {
+ container.register(FileUrlFormatter, async () => ({
+ format(url: string, options: { width?: number }) {
+ // Remap to your CDN's resize syntax
+ return `https://cdn.example.com/resize/${options.width}/${url}`;
+ }
+ }));
+});
+```
+
+### Replaced `timeago-react` with Custom Implementation ([#5225](https://github.com/webiny/webiny-js/pull/5225))
+
+The `timeago-react` package (flagged as compromised) has been replaced with a custom `TimeAgo` component built on the Temporal API. The component API remains unchanged — existing `` usage works without modification. Live updates now use adaptive intervals that stop entirely after 1 hour of elapsed time.
+
+### Background Tasks UI ([#5232](https://github.com/webiny/webiny-js/pull/5232))
+
+A new admin interface for viewing background tasks is now available. You can list all tasks and inspect their status, making it easier to monitor long-running operations like bulk imports or scheduled jobs.
+
+## Development
+
+### Upgraded Rsbuild and Rspack to v2 ([#5167](https://github.com/webiny/webiny-js/pull/5167))
+
+The bundling toolchain used to build the Webiny Admin app and Lambda functions has been upgraded from Rsbuild v1 / Rspack v1 to Rsbuild v2 / Rspack v2, bringing improved performance, reduced installation size, and various upstream fixes.
+
+### Support for Environment-Specific `.env` Files ([#5237](https://github.com/webiny/webiny-js/pull/5237))
+
+Webiny now loads environment-specific `.env` files in addition to the base `.env`. When deploying with a given environment name, the SDK first loads `.env` for shared defaults, then loads `.env.` (e.g. `.env.production`) if it exists — values in the environment-specific file take precedence.
+
+This simplifies managing different configurations across environments without modifying the base `.env` file.
+
+### Async Encryption Interface ([#5233](https://github.com/webiny/webiny-js/pull/5233))
+
+The `encrypt` and `decrypt` methods on the `IEncryption` interface now return `Promise` instead of `string`. This change prepares the encryption abstraction for async backends like AWS KMS or hardware security modules. If you've implemented a custom encryption provider, update your methods to be async.
+
+### Fixed Gzip Decompression for Non-JSON Values ([#5198](https://github.com/webiny/webiny-js/pull/5198))
+
+The `@webiny/utils` gzip helpers now handle decompression correctly when the original value wasn't JSON-stringified before compression. Previously this would throw a parse error — now it returns the raw decompressed value if JSON parsing fails.
+
+## Infrastructure
+
+### API Bundle Size Limit ([#5221](https://github.com/webiny/webiny-js/pull/5221))
+
+Added a new `Infra.Api.MaxBundleSize` extension that enforces a configurable size limit on the API Lambda bundle at build time. The default limit is 4.5 MB. If your built bundle exceeds the limit, the build fails with a clear error message pointing to the exact config change needed to raise it:
+
+```typescript
+// webiny.config.tsx
+import { Infra } from "webiny/infra";
+
+export default {
+ extensions: [
+ Infra.Api.MaxBundleSize({ maxSize: 5 * 1024 * 1024 }) // 5 MB
+ ]
+};
+```
+
+## Webhooks
+
+### Delivery List and View UI ([#5231](https://github.com/webiny/webiny-js/pull/5231))
+
+The Webhooks admin interface now includes a delivery history view. You can list all webhook deliveries, filter by app, entity, and event type, and inspect individual delivery details including request/response payloads and status codes.
+
+### Fixed Encryption Key Storage ([#5230](https://github.com/webiny/webiny-js/pull/5230))
+
+The encryption key used for securing webhook secrets was not being persisted correctly, which could cause decryption failures after restarts. This has been fixed — encryption keys are now stored properly in the settings.
diff --git a/docs/release-notes/6.4.0/upgrade-guide.mdx b/docs/release-notes/6.4.0/upgrade-guide.mdx
new file mode 100644
index 000000000..3c5d1c394
--- /dev/null
+++ b/docs/release-notes/6.4.0/upgrade-guide.mdx
@@ -0,0 +1,61 @@
+---
+id: o7pkfroj
+title: Upgrade from 6.3.x to 6.4.0
+description: Learn how to upgrade Webiny from 6.3.x to 6.4.0.
+---
+
+import { Alert } from "@/components/Alert";
+import { AdditionalNotes } from "@/components/upgrade/AdditionalNotes";
+
+
+
+- how to upgrade Webiny from 6.3.x to 6.4.0
+
+
+
+
+
+Make sure to check out the [6.4.0 changelog](./changelog) to get familiar with the changes introduced in this release.
+
+
+
+## Step-by-Step Guide
+
+### 1. Upgrade Webiny Packages
+
+Upgrade all Webiny packages by running the following command:
+
+```bash
+yarn webiny upgrade 6.4.0 --debug
+```
+
+Note that the command above will run upgrades for all available versions of Webiny up to 6.4.0. If there are upgrades for 6.3.1, 6.3.5, they will be ran.
+
+You can omit the version to upgrade to the latest available:
+
+```bash
+yarn webiny upgrade --debug
+```
+
+Once the upgrade has finished, running the `yarn webiny --version` command in your terminal should return **6.4.0**.
+
+
+
+If the above command fails or is not available in your setup, you can run the upgrade script directly via `npx`:
+
+```bash
+npx https://github.com/webiny/webiny-upgrades-v6 6.4.0 --debug
+```
+
+
+
+### 2. Deploy Your Project
+
+Proceed by redeploying your Webiny project:
+
+```bash
+# Execute in your project root.
+yarn webiny deploy --env {environment}
+```
+
+