From 9c1fab6597592edde7ae504e58604e35141d0ae7 Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Thu, 14 May 2026 11:03:48 +0000 Subject: [PATCH 01/10] chore: generate changelog for 6.4.0 --- docs/release-notes/6.4.0/changelog.ai.txt | 8 ++ docs/release-notes/6.4.0/changelog.mdx | 108 +++++++++++++++++++++ docs/release-notes/6.4.0/upgrade-guide.mdx | 61 ++++++++++++ 3 files changed, 177 insertions(+) create mode 100644 docs/release-notes/6.4.0/changelog.ai.txt create mode 100644 docs/release-notes/6.4.0/changelog.mdx create mode 100644 docs/release-notes/6.4.0/upgrade-guide.mdx 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..d45e0b46f --- /dev/null +++ b/docs/release-notes/6.4.0/changelog.mdx @@ -0,0 +1,108 @@ +--- +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. + +## 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. + +## 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. + +### Removed `@webiny/ui` Backward-Compatibility Package ([#5196](https://github.com/webiny/webiny-js/pull/5196), [#5192](https://github.com/webiny/webiny-js/pull/5192), [#5191](https://github.com/webiny/webiny-js/pull/5191), [#5188](https://github.com/webiny/webiny-js/pull/5188)) + +The `@webiny/ui` package was a thin wrapper around `@webiny/admin-ui` kept for backward compatibility during the migration period. With all consumers now importing directly from `@webiny/admin-ui`, the package has been fully removed from the repository. This change affected `app-headless-cms`, `app-graphql-playground`, `app-trash-bin`, `app-website-builder`, `app-workflows`, `lexical-editor-actions`, `cognito`, `app-scheduler`, `app-security-access-management`, `app-admin`, and `app-audit-logs`. + +## Development + +### Replace Babel with rslib for Package Compilation ([#5173](https://github.com/webiny/webiny-js/pull/5173)) + +Package source files are now compiled using rslib in bundleless mode instead of Babel. This brings faster incremental builds in watch mode (rslib uses rspack's native watcher) and eliminates the Babel dependency from the compilation path. Declaration files (`.d.ts`) continue to be generated by the TypeScript compiler as before. The public API of `createBuildPackage` and `createWatchPackage` is unchanged — no modifications needed to any `webiny.config.js` files. + +### 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. 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..be78eaeb1 --- /dev/null +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -0,0 +1,61 @@ +--- +id: j0r1iq1r +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} +``` + + From 45f2de847efa75a84587b760eef32c7cd7ca2a10 Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Mon, 18 May 2026 16:02:24 +0000 Subject: [PATCH 02/10] chore: regenerate release notes for 6.4.0 --- docs/release-notes/6.4.0/changelog.mdx | 51 +++++++++++++++++++--- docs/release-notes/6.4.0/upgrade-guide.mdx | 2 +- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/docs/release-notes/6.4.0/changelog.mdx b/docs/release-notes/6.4.0/changelog.mdx index d45e0b46f..1c0a8e14b 100644 --- a/docs/release-notes/6.4.0/changelog.mdx +++ b/docs/release-notes/6.4.0/changelog.mdx @@ -19,6 +19,20 @@ When listing CMS content models, plugin-registered models were fetched outside t 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. + ## Webiny SDK ### Removed Standalone Entity Type Exports ([#5152](https://github.com/webiny/webiny-js/pull/5152)) @@ -71,6 +85,33 @@ The Website Builder editor now opens published and previously published page rev 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. + ## Admin ### Added MultiSelect Component ([#5200](https://github.com/webiny/webiny-js/pull/5200)) @@ -93,15 +134,15 @@ When scrolling through the audit logs list, loading more records replaced the cu 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. -### Removed `@webiny/ui` Backward-Compatibility Package ([#5196](https://github.com/webiny/webiny-js/pull/5196), [#5192](https://github.com/webiny/webiny-js/pull/5192), [#5191](https://github.com/webiny/webiny-js/pull/5191), [#5188](https://github.com/webiny/webiny-js/pull/5188)) +### Replaced File Picker Component ([#5214](https://github.com/webiny/webiny-js/pull/5214)) -The `@webiny/ui` package was a thin wrapper around `@webiny/admin-ui` kept for backward compatibility during the migration period. With all consumers now importing directly from `@webiny/admin-ui`, the package has been fully removed from the repository. This change affected `app-headless-cms`, `app-graphql-playground`, `app-trash-bin`, `app-website-builder`, `app-workflows`, `lexical-editor-actions`, `cognito`, `app-scheduler`, `app-security-access-management`, `app-admin`, and `app-audit-logs`. +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. -## Development +### Form Model Enhancements ([#5194](https://github.com/webiny/webiny-js/pull/5194)) -### Replace Babel with rslib for Package Compilation ([#5173](https://github.com/webiny/webiny-js/pull/5173)) +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. -Package source files are now compiled using rslib in bundleless mode instead of Babel. This brings faster incremental builds in watch mode (rslib uses rspack's native watcher) and eliminates the Babel dependency from the compilation path. Declaration files (`.d.ts`) continue to be generated by the TypeScript compiler as before. The public API of `createBuildPackage` and `createWatchPackage` is unchanged — no modifications needed to any `webiny.config.js` files. +## Development ### Upgraded Rsbuild and Rspack to v2 ([#5167](https://github.com/webiny/webiny-js/pull/5167)) diff --git a/docs/release-notes/6.4.0/upgrade-guide.mdx b/docs/release-notes/6.4.0/upgrade-guide.mdx index be78eaeb1..c165ff998 100644 --- a/docs/release-notes/6.4.0/upgrade-guide.mdx +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -1,5 +1,5 @@ --- -id: j0r1iq1r +id: 64v3et5u title: Upgrade from 6.3.x to 6.4.0 description: Learn how to upgrade Webiny from 6.3.x to 6.4.0. --- From c4c1f9d107d50ef805d91c609d123e0ead6a8ec2 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Mon, 18 May 2026 21:54:37 +0200 Subject: [PATCH 03/10] wip:1 (2z58r) --- docs/developer-docs/6.x/navigation.tsx | 1 + .../website-builder/preview-url-modifier.mdx | 109 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 docs/developer-docs/6.x/website-builder/preview-url-modifier.mdx diff --git a/docs/developer-docs/6.x/navigation.tsx b/docs/developer-docs/6.x/navigation.tsx index 4bae6049c..c3e98349e 100644 --- a/docs/developer-docs/6.x/navigation.tsx +++ b/docs/developer-docs/6.x/navigation.tsx @@ -125,6 +125,7 @@ export const Navigation = ({ children }: { children: React.ReactNode }) => { title={"Customize Page List Columns"} /> + + +- 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 | From dda9297b5a97167b2591b75d2ca53cc8db84ad21 Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Tue, 19 May 2026 07:40:07 +0000 Subject: [PATCH 04/10] chore: regenerate release notes for 6.4.0 --- docs/release-notes/6.4.0/upgrade-guide.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/6.4.0/upgrade-guide.mdx b/docs/release-notes/6.4.0/upgrade-guide.mdx index c165ff998..8709b2380 100644 --- a/docs/release-notes/6.4.0/upgrade-guide.mdx +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -1,5 +1,5 @@ --- -id: 64v3et5u +id: nzvacqnn title: Upgrade from 6.3.x to 6.4.0 description: Learn how to upgrade Webiny from 6.3.x to 6.4.0. --- From 6f524acea6f4d192faaacd3bf223d0796a0a5c27 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 19 May 2026 10:26:06 +0200 Subject: [PATCH 05/10] wip:2 (9yfhq) --- .../6.x/reference/extensions/infra.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/developer-docs/6.x/reference/extensions/infra.mdx b/docs/developer-docs/6.x/reference/extensions/infra.mdx index 7d9b2305f..8625a596f 100644 --- a/docs/developer-docs/6.x/reference/extensions/infra.mdx +++ b/docs/developer-docs/6.x/reference/extensions/infra.mdx @@ -274,6 +274,19 @@ Adds a fully custom Lambda function to the API application, with both an applica | `functionSrc` | `string` | Yes | Path to the Lambda handler source file | | `pulumiSrc` | `string` | Yes | Path to the Pulumi infrastructure file (must follow `ApiPulumi` abstraction) | +### Infra.Api.MaxBundleSize + +Sets the maximum allowed size of the backend (AWS Lambda) function code. If the built output exceeds this limit, the build fails immediately. The default is **4.5 MB**. + +| Prop | Type | Required | Description | +| ------ | -------- | -------- | ----------------------------- | +| `size` | `number` | Yes | Maximum bundle size in bytes. | + +```tsx +{/* Raise the API bundle size limit to 6 MB */} + +``` + ### Infra.Api.StackOutputValue Adds a custom key-value entry to the API Pulumi stack outputs. Can be used multiple times. From 793387571f4282ed19757056d77a8aa052d711ee Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 19 May 2026 14:26:43 +0200 Subject: [PATCH 06/10] wip:4 (80et2) --- .../6.x/admin/file-url-formatter.mdx | 121 ++++++++++++++++++ docs/developer-docs/6.x/navigation.tsx | 1 + 2 files changed, 122 insertions(+) create mode 100644 docs/developer-docs/6.x/admin/file-url-formatter.mdx 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..5465441cd --- /dev/null +++ b/docs/developer-docs/6.x/admin/file-url-formatter.mdx @@ -0,0 +1,121 @@ +--- +id: a3f8kd92 +title: File URL Formatter +description: Learn how to customize file and image URLs in the Webiny admin UI using the FileUrlFormatter extension point. +--- + +import { Alert } from "@/components/Alert"; + + + +- 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 + +Every image URL rendered inside a `FilePicker` component in the Webiny admin UI — thumbnails in the Headless CMS field editor, the Website Builder file input, and any custom field that uses `FilePicker` — passes through the `FileUrlFormatter` extension point before being displayed. + +The default formatter (registered by the File Manager app) appends `?width=128` to the URL so thumbnails are served at a sensible size. You can replace this behaviour entirely: remap the `width` parameter to your CDN's own syntax, add authentication tokens, rewrite the host, or apply any other transformation your image delivery pipeline requires. + + + +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 a class that implements `FileUrlFormatter.Interface`. The single required method is `format(url: URL, params?: FileUrlFormatter.Params): void`. Mutate the `url` object in place — no return value is expected. + +`params` carries the caller's intent. The `width` key is the only built-in parameter; any additional keys you pass when calling `format` are forwarded as-is and your implementation can act on them. + +```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) { + // Map the standard "width" intent to your CDN's query parameter + url.searchParams.delete("width"); + 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 + +``` + +## How It Works + +When Webiny boots it resolves the active `FileUrlFormatter` from the DI container and makes it available throughout the admin UI via `AdminUiProvider`. The `FilePicker` component's presenter applies `format(url, { width: 128 })` when building its view model, so the formatted URL is already in place before any render component sees it. + +| Scenario | Thumbnail URL | +|---|---| +| File Manager loaded, no custom formatter | `https://cdn.example.com/img.jpg?width=128` | +| Custom formatter registered | URL transformed by your `format` implementation | +| File Manager not loaded | URL unchanged | + +## Type Reference + +All types are accessed through the `FileUrlFormatter` namespace — no direct imports from internal packages needed. + +| Type | Description | +|---|---| +| `FileUrlFormatter.Interface` | Implement this in your formatter class | +| `FileUrlFormatter.Params` | Type of the `params` argument: `{ width?: number; [key: string]: unknown }` | + +## Full Example — Replacing `width` with a CDN-Specific Parameter + +```typescript extensions/fileUrlFormatter/MyFileUrlFormatter.ts +import { FileUrlFormatter } from "webiny/admin/file-manager"; + +class MyCdnFormatter implements FileUrlFormatter.Interface { + format(url: URL, params?: FileUrlFormatter.Params): void { + // Remove the standard width param + url.searchParams.delete("width"); + + // Apply your CDN's resizing syntax + if (params?.width !== undefined) { + url.searchParams.set("w", String(params.width)); + url.searchParams.set("fit", "crop"); + url.searchParams.set("auto", "format"); + } + } +} + +export const MyCdnFormatterImpl = FileUrlFormatter.createImplementation({ + implementation: MyCdnFormatter, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.x/navigation.tsx b/docs/developer-docs/6.x/navigation.tsx index c3e98349e..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 }) => { + Date: Wed, 20 May 2026 10:47:16 +0200 Subject: [PATCH 07/10] wip:5 (p8l00) --- .../6.x/admin/assets/file-url-formatter.png | Bin 0 -> 110225 bytes .../6.x/admin/file-url-formatter.mdx | 63 ++++-------------- 2 files changed, 13 insertions(+), 50 deletions(-) create mode 100644 docs/developer-docs/6.x/admin/assets/file-url-formatter.png 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 0000000000000000000000000000000000000000..72e4e187c42f56841af1ed57dcaf3f2c45f88746 GIT binary patch literal 110225 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 literal 0 HcmV?d00001 diff --git a/docs/developer-docs/6.x/admin/file-url-formatter.mdx b/docs/developer-docs/6.x/admin/file-url-formatter.mdx index 5465441cd..363e6ee87 100644 --- a/docs/developer-docs/6.x/admin/file-url-formatter.mdx +++ b/docs/developer-docs/6.x/admin/file-url-formatter.mdx @@ -1,10 +1,11 @@ --- id: a3f8kd92 title: File URL Formatter -description: Learn how to customize file and image URLs in the Webiny admin UI using the FileUrlFormatter extension point. +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"; @@ -16,9 +17,15 @@ import { Alert } from "@/components/Alert"; ## Overview -Every image URL rendered inside a `FilePicker` component in the Webiny admin UI — thumbnails in the Headless CMS field editor, the Website Builder file input, and any custom field that uses `FilePicker` — passes through the `FileUrlFormatter` extension point before being displayed. + + +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. + + -The default formatter (registered by the File Manager app) appends `?width=128` to the URL so thumbnails are served at a sensible size. You can replace this behaviour entirely: remap the `width` parameter to your CDN's own syntax, add authentication tokens, rewrite the host, or apply any other transformation your image delivery pipeline requires. +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. @@ -28,9 +35,7 @@ Only one `FileUrlFormatter` is active at a time. When you register your own impl ## Implement the Formatter -Create a class that implements `FileUrlFormatter.Interface`. The single required method is `format(url: URL, params?: FileUrlFormatter.Params): void`. Mutate the `url` object in place — no return value is expected. - -`params` carries the caller's intent. The `width` key is the only built-in parameter; any additional keys you pass when calling `format` are forwarded as-is and your implementation can act on them. +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"; @@ -38,8 +43,6 @@ import { FileUrlFormatter } from "webiny/admin/file-manager"; class MyFileUrlFormatter implements FileUrlFormatter.Interface { format(url: URL, params?: FileUrlFormatter.Params): void { if (params?.width !== undefined) { - // Map the standard "width" intent to your CDN's query parameter - url.searchParams.delete("width"); url.searchParams.set("my_width", String(params.width)); } } @@ -76,46 +79,6 @@ Then add the extension to your `webiny.config.tsx`: ``` -## How It Works - -When Webiny boots it resolves the active `FileUrlFormatter` from the DI container and makes it available throughout the admin UI via `AdminUiProvider`. The `FilePicker` component's presenter applies `format(url, { width: 128 })` when building its view model, so the formatted URL is already in place before any render component sees it. +With the extension registered, file thumbnails in the Admin app will use your formatter. Here is the result: -| Scenario | Thumbnail URL | -|---|---| -| File Manager loaded, no custom formatter | `https://cdn.example.com/img.jpg?width=128` | -| Custom formatter registered | URL transformed by your `format` implementation | -| File Manager not loaded | URL unchanged | - -## Type Reference - -All types are accessed through the `FileUrlFormatter` namespace — no direct imports from internal packages needed. - -| Type | Description | -|---|---| -| `FileUrlFormatter.Interface` | Implement this in your formatter class | -| `FileUrlFormatter.Params` | Type of the `params` argument: `{ width?: number; [key: string]: unknown }` | - -## Full Example — Replacing `width` with a CDN-Specific Parameter - -```typescript extensions/fileUrlFormatter/MyFileUrlFormatter.ts -import { FileUrlFormatter } from "webiny/admin/file-manager"; - -class MyCdnFormatter implements FileUrlFormatter.Interface { - format(url: URL, params?: FileUrlFormatter.Params): void { - // Remove the standard width param - url.searchParams.delete("width"); - - // Apply your CDN's resizing syntax - if (params?.width !== undefined) { - url.searchParams.set("w", String(params.width)); - url.searchParams.set("fit", "crop"); - url.searchParams.set("auto", "format"); - } - } -} - -export const MyCdnFormatterImpl = FileUrlFormatter.createImplementation({ - implementation: MyCdnFormatter, - dependencies: [] -}); -``` +File URL Formatter result From 75b0c5fc645186cc720ea469c4183a802eb9e27d Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Wed, 20 May 2026 09:12:49 +0000 Subject: [PATCH 08/10] chore: regenerate release notes for 6.4.0 --- docs/release-notes/6.4.0/changelog.mdx | 77 ++++++++++++++++++++++ docs/release-notes/6.4.0/upgrade-guide.mdx | 2 +- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/6.4.0/changelog.mdx b/docs/release-notes/6.4.0/changelog.mdx index 1c0a8e14b..d05e80531 100644 --- a/docs/release-notes/6.4.0/changelog.mdx +++ b/docs/release-notes/6.4.0/changelog.mdx @@ -33,6 +33,14 @@ Additionally, the `AiImageEnrichment` functionality was moved from `api-file-man 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. + ## Webiny SDK ### Removed Standalone Entity Type Exports ([#5152](https://github.com/webiny/webiny-js/pull/5152)) @@ -112,6 +120,30 @@ Website Builder page and redirect models were migrated to the `ModelFactory` pat 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. + ## Admin ### Added MultiSelect Component ([#5200](https://github.com/webiny/webiny-js/pull/5200)) @@ -142,8 +174,53 @@ The legacy `react-butterfiles` library has been replaced with a new `BrowserFile 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. + ## 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. + +## 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 + ] +}; +``` diff --git a/docs/release-notes/6.4.0/upgrade-guide.mdx b/docs/release-notes/6.4.0/upgrade-guide.mdx index 8709b2380..465595ecb 100644 --- a/docs/release-notes/6.4.0/upgrade-guide.mdx +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -1,5 +1,5 @@ --- -id: nzvacqnn +id: bg91daao title: Upgrade from 6.3.x to 6.4.0 description: Learn how to upgrade Webiny from 6.3.x to 6.4.0. --- From 42e3402ba278a319aecda0a1ca9e4290b7352b49 Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Wed, 20 May 2026 13:45:55 +0000 Subject: [PATCH 09/10] chore: regenerate release notes for 6.4.0 --- docs/release-notes/6.4.0/changelog.mdx | 18 ++++++++++++++++++ docs/release-notes/6.4.0/upgrade-guide.mdx | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/6.4.0/changelog.mdx b/docs/release-notes/6.4.0/changelog.mdx index d05e80531..47f380cc4 100644 --- a/docs/release-notes/6.4.0/changelog.mdx +++ b/docs/release-notes/6.4.0/changelog.mdx @@ -41,6 +41,24 @@ Text fields now support compression when storing large values. When enabled, the 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. + ## Webiny SDK ### Removed Standalone Entity Type Exports ([#5152](https://github.com/webiny/webiny-js/pull/5152)) diff --git a/docs/release-notes/6.4.0/upgrade-guide.mdx b/docs/release-notes/6.4.0/upgrade-guide.mdx index 465595ecb..506fe9645 100644 --- a/docs/release-notes/6.4.0/upgrade-guide.mdx +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -1,5 +1,5 @@ --- -id: bg91daao +id: vqpvg5t1 title: Upgrade from 6.3.x to 6.4.0 description: Learn how to upgrade Webiny from 6.3.x to 6.4.0. --- From 5ec6df9dab5db9c0b1230bb37b37d21e3613a5fd Mon Sep 17 00:00:00 2001 From: webiny-bot Date: Fri, 22 May 2026 09:59:57 +0000 Subject: [PATCH 10/10] chore: regenerate release notes for 6.4.0 --- docs/release-notes/6.4.0/changelog.mdx | 44 ++++++++++++++++++++++ docs/release-notes/6.4.0/upgrade-guide.mdx | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/6.4.0/changelog.mdx b/docs/release-notes/6.4.0/changelog.mdx index 47f380cc4..956b39a49 100644 --- a/docs/release-notes/6.4.0/changelog.mdx +++ b/docs/release-notes/6.4.0/changelog.mdx @@ -59,6 +59,18 @@ The hardcoded `FILE_FIELDS` import has been replaced with an injectable `FileFie 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)) @@ -162,6 +174,10 @@ The modifier applies to both the in-editor iframe URL and the page list preview 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)) @@ -220,12 +236,30 @@ export const CdnUrlFormatter = createFeature(async container => { 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)) @@ -242,3 +276,13 @@ export default { ] }; ``` + +## 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 index 506fe9645..3c5d1c394 100644 --- a/docs/release-notes/6.4.0/upgrade-guide.mdx +++ b/docs/release-notes/6.4.0/upgrade-guide.mdx @@ -1,5 +1,5 @@ --- -id: vqpvg5t1 +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. ---