For the full list of changes, check out the Webiny 6.5.0external link release on GitHub.

Headless CMS
anchor

AI-Powered Content Generation (#5333external link)
anchor

You can now generate CMS entry content using AI directly from the entry editor. A new AI button in the editor header opens a prompt dialog — describe what you want, and the generated content populates your entry fields in real time via WebSocket. The system understands your model’s schema including nested objects, dynamic zones, validation rules, and predefined values. Rich text fields receive proper Lexical editor state through an internal conversion pipeline.

Configurable New Entry Wizard (#5354external link)
anchor

You can now inject a custom wizard UI that appears before the entry form opens. This lets you gather initial values (e.g., from a template selector or AI prompt) and pre-fill the form with those values already marked as dirty.

Redesigned Content Model Editor (#5259external link,#5289external link,#5290external link)
anchor

The content model editor has been significantly redesigned. The Edit/Preview tabs now appear as a segmented control in the top bar. The fields sidebar collapses into an 80×80 icon grid with smooth animations. Field cards have been restyled with field-type icons and updated typography. Drag-and-drop uses a proper cursor overlay with label and icon instead of the previous orange circle, and drop zones have cleaner styling. The settings panel now opens in a drawer instead of a full-screen overlay. The preview tab shows a friendly empty state with an illustration and “Switch to edit mode” button when no fields exist.

New Revision Button for Published and Unpublished Entries (#5352external link,#5353external link,#5347external link)
anchor

When editing a published or unpublished entry, you now see a “New Revision” button alongside “Publish”. Previously, if an entry was published and then unpublished, the UI didn’t make it clear how to create a new revision. The “All Revisions” option is now always visible in the revisions dropdown, and saving a locked entry automatically creates a new revision instead of failing.

Refactored CMS Architecture With Presenter/Feature Pattern (#5323external link)
anchor

Content entries, content models, and related modules have been refactored to use a new presenter/feature architecture with dependency injection. Key improvements include:

  • Folder creation no longer triggers a full ListFolders reload — the cache is populated from the create response
  • Sorting by name now works correctly for both folders and entries
  • The app-headless-cms-common package is now types-only, reducing bundle size

AI-Powered Entry Creation Wizard (#5356external link)
anchor

You can now enable AI-assisted content generation when creating new CMS entries. A new “Generate with AI” toggle in Model Settings (settings.aiEntryWizard) controls whether new entries open with an inline AI content generation form. When enabled, the wizard pre-fills the entry form with AI-generated content based on your prompt. A skip button lets you bypass the wizard and start with an empty form.

The wizard system now supports priority-based registration, so custom wizards can override the default AI wizard when needed.

Augmentable Model Settings Interface (#5391external link)
anchor

Models can now carry custom settings via a new IModelSettings augmentable interface. This allows you to attach feature flags or other metadata directly to a model definition using the .settings() fluent builder method.

The interface can be augmented from external packages to add type-safe custom properties. Models without .settings() default to an empty object.

Live Preview SDK for Next.js Applications (#5435external link)
anchor

A new set of packages enables real-time live preview for headless CMS content in Next.js applications. When editors make changes in the CMS admin, those changes appear instantly in your frontend without requiring a page refresh or republish.

The SDK includes:

  • cms-sdk — Core live preview functionality with postMessage-based editor bridge, entry store management, reference resolution, and dynamic zone support
  • cms-nextjs — Next.js-specific integration for seamless React component rendering
  • content-sdk and content-sdk-nextjs — Content delivery utilities for fetching published content

The CMS admin now includes a preview pane that renders your frontend components in an iframe, automatically syncing entry changes as you type. Dynamic zones and object fields support drag-and-drop reordering directly in the preview.

NewgetModelSDK Method With Wildcard Field Expansion (#5435external link)
anchor

The SDK now exposes a getModel method that returns full model definitions including field metadata. It supports wildcard field expansion for nested structures and automatically resolves referenced models, making it easier to build dynamic rendering logic based on your content model schema.

Stricter Datetime Field Validation (#5435external link)
anchor

The API now enforces format validation on datetime fields. Previously, malformed date strings could be saved without error. Invalid formats are now rejected at the API level with a descriptive validation message.

NewassetField Type for Images and Files (#5481external link)
anchor

A new first-class asset field type is now available in the Headless CMS field palette. This replaces the existing file field (now deprecated but still functional for existing models). The new field type provides:

  • Built-in image editing with crop and focal point controls
  • Per-entry image transforms that are baked into the delivery URL
  • A unified FmAsset GraphQL type with proper metadata handling

When you add an asset field to a content model, editors can select files from the File Manager and apply custom crops directly in the entry form. These edits are stored on the entry itself, so the same source image can be cropped differently across entries.

Existing content models using the file field will continue to work. You can migrate to the new asset field type when convenient.

Entry Revision Comparison Moved to AI Powerups (#5485external link)
anchor

The CMS entry revision comparison feature has been relocated from the /extensions folder into the @webiny/ai-powerups package. This change consolidates AI-powered features in a single package and adds proper architectural layering with UseCase, Repository, and Gateway patterns. The compareEntryRevisions GraphQL query is now nested under CmsQuery, accessed via cms { compareEntryRevisions(...) }.

New Asset Field With Non-Destructive Crop and Focal Point (#5452external link)
anchor

{/ REVIEW-PENDING @SvenAlHamad — confirm this entry, then delete this line /}

A new first-class Asset field replaces the bare-URL file field for images. It stores crop coordinates, focal point, alt text, and caption — all non-destructively. The original file is never modified; edits are applied server-side at delivery time, producing a URL that works with any frontend framework.

The Asset field exposes a resolved url in the read API with crop and focal point baked in, so frontends get a turnkey URL without knowing the delivery-param contract. The underlying src remains the pristine original.

Image editor — File Manager, CMS file fields, and the new Asset input all share the same crop/focal-point editor. Choose from aspect-ratio presets or enter a custom ratio; a live preview shows the result.

Delivery URL parameters?crop=t,l,b,r, ?aspectRatio=16:9, and ?focal=x,y join the existing ?width, ?format, and ?quality params. The server computes the largest rectangle of the requested aspect ratio inside the crop, centered on the focal point.

Existing file fields are unaffected. The legacy flat value is upgraded at render time with no migration needed.

Injectable String Formatting on the API (#5526external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

StringFormatter, Slugify, and DateFormatter are now available in @webiny/api-core, mirroring the admin-side features. Server code can inject them for consistent, decoratable formatting.

To override slug logic project-wide, decorate the fine-grained Slugify feature:

Scheduled Publish/Unpublish State Now Visible Across the CMS UI (#5441external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Previously, scheduled publish/unpublish actions were only visible inside the schedule dialog. Now the scheduled state appears everywhere users expect to see publish status:

  • Entries list “Live” column: Shows a Scheduled pill with the go-live time when an entry has a pending action. Entries can display both “Live” and “Scheduled” simultaneously when an older revision is live and a newer one is queued.
  • Entry form banner: An amber info banner appears above the form when the open entry has a scheduled action.
  • Publish/Unpublish confirm dialogs: A warning appears when the entry has a scheduled action, explaining that publishing now will cancel the scheduled action.

The UI refreshes automatically when you schedule, cancel, publish, or unpublish — no page reload required.

Fixed Image Crop Not Being Applied During Asset Delivery (#5595external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

When you cropped an image using the File Manager’s ImageEditor, the crop was saved correctly but never actually applied when the image was delivered. The image transformation pipeline was reading crop data from the wrong metadata path. This has been fixed — crops set via the ImageEditor UI are now properly applied during asset delivery.

Stable_idProperty for Object and Dynamic Zone Field Values (#5606external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

Object fields and dynamic zone fields now include a server-generated _id property on each value, giving external systems (comments, annotations, collaboration tools) a stable reference identifier for individual items within nested structures.

Key behaviors:

  • IDs are auto-generated on create/update using a 12-character alphanumeric identifier
  • Existing IDs are preserved when updating entries — only new items receive new IDs
  • Client-provided IDs are accepted; duplicates within the same array are silently regenerated
  • Existing entries return _id: null until re-saved (no data migration required)

Revision List Now Refreshes Automatically After Changes (#5614external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

After creating or deleting a revision, the revisions drawer now re-fetches the list from the API. Previously, the list stayed stale until the drawer was closed and reopened.

Improved Revision List Actions and Visibility (#5616external link,#5617external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

The revision number in the revisions list is now more visible, and the revision list actions have been reorganised for better usability.

Revision Management Improvements (#5618external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

The content entry revision system received significant usability improvements across the revision drawer, entry list, and form interfaces.

Revision drawer & list:

  • The revision list now refreshes automatically after creating, deleting, unpublishing, or editing a note
  • Version numbers are more prominent — rows display #N · Title format
  • Each revision shows a visible status tag (Draft, Published, or Previously published) instead of tooltip-only status
  • Created-by and published-by information now appears on each revision
  • You can add or edit notes on any revision, not just at publish time
  • An alert banner warns when viewing an older revision with a link to the latest
  • Unpublish action is available in the 3-dots menu for published revisions

Content entries table:

  • The Live column now shows a relative timestamp indicating when content was last published
  • Clicking the Live column header sorts entries by lastPublishedOn

Entry form:

  • Clicking ”+ New Revision” on a locked entry now navigates directly to the newly created revision URL

Timezone-Aware Scheduling (#5618external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

The scheduler dialog now includes a timezone dropdown, allowing you to pick a scheduled time in any timezone. The picker converts your selection to UTC before sending to the backend. All scheduler date displays (alert bar, table tooltip, rescheduling dialog) now show consistent UTC+02:00 format instead of the browser’s inconsistent GMT+2 output.

Fixed Revision Note Updates Overwriting Latest Revision (#5618external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

Editing a note on an older revision would inadvertently overwrite the latest revision’s content. A new updateRevision storage operation now writes only to the specific revision record without syncing to latest. This fix is implemented across DDB, DDB-ES, and SQL backends.

Fixed Stale Live Pointer After Deleting Published Revision (#5618external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

Deleting the currently published revision left a stale live pointer on the entry. The system now correctly clears the live field when you delete a published revision.

Fixed Pattern Validator Crash With Null Flags (#5618external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

Custom pattern validation fields with null or undefined flags caused new RegExp(regex, null) to crash. Falsy flags are now coerced to undefined, and validation errors now properly include field details in the GraphQL response.

Google AI Provider Support and Updated Model Lists (#5670external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

Google is now available as an AI provider for AI Powerups, joining OpenAI and Anthropic. The integration uses Google’s Gemini models including gemini-3.8-flash, gemini-3.5-pro, and gemini-2.5-flash-lite among others.

Model lists for all providers have been updated to reflect current offerings:

  • OpenAI: Added gpt-6-astra, gpt-5.5-pro, gpt-5.2, gpt-5.2-pro, gpt-5, gpt-5-pro, gpt-5-mini, and gpt-5-nano
  • Anthropic: Added claude-fable-5-1 and claude-opus-4-8, with flagship models now listed first
  • Google: 9 Gemini models available

AI models now expose deprecated and endOfLife dates when known, allowing you to see which models are approaching end-of-life. Deprecated models (o3-pro, o3, gpt-4.1-nano, o4-mini) remain available for existing presets but will be removed after their shutdown dates.

To use Google AI, set the WEBINY_API_GOOGLE_API_KEY environment variable or configure the API key through your provider preset.

Unified Preview Domain Configuration for CMS Live Preview (#5689external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

CMS live preview now reads the preview domain from Frontend Settings instead of requiring per-model configuration. The previewPrefix and previewSlug model settings have been replaced with a single previewPath setting that defines only the URL path pattern. The preview domain is managed centrally in Frontend Settings.

When a path token cannot be resolved (e.g., {values.slug} on a new entry), the entire path falls back to /new rather than displaying an incomplete URL.

The Frontend Settings permission has been moved to the Dev Tools permission group, and the “Configure Frontend” menu item is now gated by this permission.

Fixed Field Filtering and Sorting for Field IDs Containing Underscores (#5701external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Fields with underscores in their IDs (e.g., on_sale) were incorrectly parsed by the CMS query mappers. Filtering on on_sale_contains would fail with an error because the system only recognized the part before the first underscore as the field name. Sorting was even more problematic — sort directives like on_sale_DESC were silently dropped, causing queries to return unsorted results with no error.

Both mappers now correctly handle underscored field IDs:

  • Filtering matches the longest possible field ID first, so price_range_gte correctly routes to price_range even when a price field also exists.
  • Sorting allows underscores within field names and validates against the full field ID.

Additionally, when combining an explicit values object with flat field keys in a filter, the two are now merged instead of one overwriting the other.

Edit Referenced Entries Inline via Drawer (#5440external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Reference field cards now include a pencil icon that opens the referenced entry in a drawer for inline editing. You can edit and save without leaving your current entry. The drawer stays open after save so you can continue editing, and the card updates immediately without a loading flash.

CMS Preview URL Now Respects Model'spreviewPathSetting (#5705external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

The CMS preview iframe was always loading at /preview regardless of the model’s previewPath configuration. A model with previewPath = "/articles/{values.slug}" will now correctly load its preview iframe at /articles/preview.

Structured Values From AI Content Generation Use Case (#5477external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

CmsGenerateEntryContentUseCase previously returned its result pre-serialized as a JSON string, requiring callers to parse it. It now returns a structured values object directly. Transport serialization (for websocket streaming) has been moved to the transport edge.

Bulk Action API Exposed via Webiny Package (#5411external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Custom CMS bulk actions can now be authored from your project using the public webiny package. Bulk actions are automatically run as background tasks and can include AI-powered content generation with real-time websocket progress.

AI Model Configuration Now Uses Capabilities and Roles (#5693external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

AI features previously hardcoded the first configured model, requiring duplicate API key entries for multiple models from the same vendor. The configuration system now uses three distinct concepts:

  • Connections store a vendor and credential pair, so one API key covers all models from that vendor.
  • Model roles (fast, standard, vision) let you assign models by purpose rather than per-feature.
  • Capabilities allow per-feature overrides when needed, with sensible defaults otherwise.

Features declare which role they need, and the resolver picks the appropriate model. Projects upgrading from earlier versions have their existing configuration migrated automatically — the first preset becomes the standard role, preserving current behaviour.

AI features also now register their own capabilities alongside their code, so the settings screen stays in sync without manual updates. Extensions adding AI features get a settings row automatically.

The legacy providers configuration continues to work during the upgrade period but will be removed in the next major release.

Entry Collaboration With Comments and Notifications Inbox (#5619external link)
anchor

{/ REVIEW-PENDING @SvenAlHamad — confirm this entry, then delete this line /}

You can now leave comments directly on CMS entry fields, enabling real-time collaboration between content editors. Comments are anchored to specific fields — including individual items within repeatable fields — so discussions stay contextually relevant even as content changes.

A new notifications inbox surfaces comment activity, mentions, and other collaboration events in the Admin interface. The inbox integrates with the CMS comment system out of the box, and provides a bridge for custom notifications if needed.

Key capabilities:

  • Field-level comments — attach comments to any entry field; nested and repeatable fields are supported via stable internal IDs.
  • Notifications inbox — view and manage collaboration notifications from a central location in the Admin app.
  • Automatic scroll and highlight — clicking a notification or comment reference scrolls to and highlights the relevant field in the entry form.

After upgrading, you will need to redeploy your API to enable the comments and notifications backend.

Website Builder
anchor

Nuxt Starter Kit Configuration (#5265external link)
anchor

The “Configure Next.js” option has been renamed to “Configure Starter Kit” and now includes a Nuxt tab alongside Next.js. The Nuxt tab generates ready-to-use environment configuration for the Webiny Nuxt starter kitexternal link, pulling real deployment values (API key, API host, tenant ID, admin host) that you can copy directly into your project’s .env file.

Editable Object and List Fields (#5295external link)
anchor

Object fields now work in the page editor. Previously, declaring an object input on a component rendered nothing. Object fields now appear as clickable rows that open slide-out panels containing their child inputs. Lists of objects show as reorderable rows with add/remove/move controls and an empty state. Nested objects stack panels over each other with backdrop dimming, and all values persist correctly through the round-trip.

Preview Domain Trailing Slash Fix (#5332external link)
anchor

Adding a trailing slash to the preview domain (e.g., http://localhost:3000/) no longer produces broken preview links with double slashes. The domain is now normalized automatically.

Always Show "All Revisions" in Page Revision Menu (#5348external link)
anchor

The “All revisions” option in the revisions menu is now always visible when editing a page, regardless of how many revisions exist. Previously it could be hidden in certain states.

Redirects List Rewritten With ListView Component (#5261external link)
anchor

The redirects list has been rewritten using the new ListPresenter abstraction and ListView compound component. This fixes a bug where folders would not display correctly when a folder had subfolders but no redirect records.

A/B Testing for Pages (#5349external link)
anchor

You can now run A/B tests on Website Builder pages directly from the Admin UI. Create an experiment on any page, define full-page variants with different content, set traffic splits, and activate or pause experiments instantly.

How it works:

  • Create experiments — Open a page in the editor, navigate to the Experiments panel, and create a new experiment with one or more variants.
  • Edit variants — Each variant is a complete page snapshot that you edit on the normal editor canvas.
  • Set traffic splits — Configure what percentage of visitors see each variant (e.g., 50% control, 25% variant A, 25% variant B).
  • Activate and pause — Start the experiment when ready; pause it at any time to instantly revert all visitors to the control page.

SDK integration:

The SDK handles variant assignment automatically. A single getPageWithExperiment call fetches the page, determines the visitor’s bucket, and returns the appropriate variant content:

Visitor assignment is deterministic and sticky — the same visitor always sees the same variant without storing any assignment data. A wb_ab_vid cookie (random UUID, 1-year expiry, no PII) ensures consistent bucketing across sessions.

Testing and QA:

  • Force a specific variant with ?wb-variant=<variantEntryId> to preview any variant regardless of traffic split.
  • Pause an experiment to immediately revert all traffic to the control page — no cache purge required.

Variants follow your existing publishing workflow. A variant only serves to visitors after both the variant is marked “ready” and the parent page is published.

Fixed Live Preview Updates for Asset Fields (#5481external link)
anchor

Live preview in the CMS entry editor now correctly updates when you change asset field values. Previously, MobX observable proxies weren’t being unwrapped before diffing, causing preview updates to fail silently. The fix also ensures:

  • Clearing an asset sends null instead of an object with null properties
  • Asset URLs recompute immediately when crop settings change
  • The editing SDK only activates when the preview iframe is showing a CMS entry

Fixed Redirect Type Changes Not Invalidating the CDN Cache (#5505external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Changing a redirect from Permanent to Temporary (or vice versa) wrote to the database but never flushed CloudFront. The response is cached for up to a year, so the old redirect type kept being served. The type field is now included in the cache-invalidation check.

The Admin dialog also now explains the difference between the two options:

  • Temporary — browsers check with the server on each visit, so you can change or remove this redirect later.
  • Permanent — browsers remember it indefinitely and may keep redirecting even after you change or delete it.

New redirects now default to Temporary. The option you get by not choosing shouldn’t be the one you can’t undo.

Fixed Frontend API Key Missing Read Permission for Redirects (#5531external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

The installer’s auto-generated API key for the frontend was missing wb.* read permission. This caused GET /wb/redirects to return a 403, breaking redirect resolution on the frontend. The permission has been restored.

Existing environments are unaffected by new installs — if your redirects stopped working after a recent deploy, manually edit the Website Builder API key in Admin and grant it Read access.

NewcontentEntryInput Type for CMS-Connected Components (#5594external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

Website Builder components can now consume CMS entries directly via a new contentEntry input type. This enables three modes of content binding:

  • Manual single: Select a specific entry by ID
  • Manual list: Select multiple specific entries
  • Query: Define a dynamic query with model, sort, limit, and search parameters

Content entries are resolved server-side during SSR, so pages with CMS-connected components render correctly on first load. A useContentEntryList React hook is available for client-side pagination in query mode.

Redirects Now Work With Website Builder API Key (#5502external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Redirects were not resolving on websites because the Website Builder API key was missing the wb.redirect permission. The installer now grants wb.* read access, matching what the Admin UI writes when you select “Read-only” access level.

For existing environments, manually update the Website Builder API key in Admin: open it and set Website Builder → Read-only. New deployments will work automatically.

CloudFront Cache Invalidation Task Moved to Website Builder Package (#5524external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Website Builder’s redirect cache invalidation was using a CloudFront invalidation task defined in @webiny/api-file-manager-s3, creating a hidden runtime dependency. Website Builder now has its own CloudFront invalidation task, removing the cross-package coupling.

Admin
anchor

Workflow State Folder Permissions (#5331external link)
anchor

Workflow states now respect Folder Level Permissions. Users only see workflow states for records in folders they can access — restricted users no longer see states for entries or pages outside their allowed folders. As part of this change, moving entries or pages with active workflow states is now blocked to prevent permission inconsistencies.

Real-Time AI Image Enrichment Notifications (#5326external link)
anchor

When you upload an image and AI finishes generating its tags and description, you now receive an on-screen notification in real time. Only the person who uploaded the image is notified, not everyone signed in.

Content Reviews Widget Loading States (#5328external link)
anchor

The Content Reviews dashboard widgets now show skeleton placeholders while loading and a clear empty-state illustration when a tab has no items. The widget maintains a stable height across loading, populated, and empty states with no layout jump.

Form Field Context and Navigation (#5330external link)
anchor

Form field callbacks can now navigate the form tree to access sibling and parent fields via IFieldScope and IFieldNavigator. This enables computed, hidden, disabled, and required callbacks that depend on related field values. Dynamic zone copy/paste is also now supported.

Destructive Dropdown Menu Variant (#5310external link)
anchor

DropdownMenu.Item now exposes a variant="destructive" prop for delete-style actions, replacing the need to copy a long className string onto every red menu item.

Upgraded Tailwind-Merge to V3 (#5263external link)
anchor

The internal class-merging utility used for admin UI components was updated to version 3. This ensures correct conflict resolution behavior for Tailwind CSS v4 class names, including border widths, padding, and margin utilities.

Review Boxes Empty States (#5319external link)
anchor

Improved empty state handling for review boxes throughout the admin interface.

New EmptyState Design System Component (#5344external link)
anchor

A reusable EmptyState component has been added to the design system for communicating “no data” situations consistently across the Admin interface. It supports six context-appropriate illustration types (content, table, listing, layout, upload, select), optional title and description text, optional action buttons, and three sizes (small, default, large).

The Content Reviews dashboard widgets now use this shared component, which keeps the widget height stable through loading and empty states — previously the widget could jump in height once loading finished.

Renamed Frontend Integration API Key and Environment Variables (#5507external link)
anchor

The API key slug for frontend integration has been renamed from website-builder to frontend-integration, and environment variable prefixes now use NEXT_PUBLIC_WEBINY_. Existing projects using the website-builder slug will continue to work through a legacy fallback.

Tenant Theme Extension With Font Selector (#5507external link)
anchor

A new TenantThemeExtension has been added to the Next.js starter kit, enabling per-tenant theme customization including a font selector. Themes are merged at runtime based on the current tenant.

Dark Theme Support (#5316external link)
anchor

{/ REVIEW-PENDING @SvenAlHamad — confirm this entry, then delete this line /}

The Admin UI now supports multiple themes, including dark mode. You can register custom themes through an extension, and several dark themes are included as sample implementations.

Injectable String Formatting (#5517external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

StringFormatter and Slugify are now injectable features in @webiny/app-admin. They replace direct imports of the slugify npm package scattered across presenters, giving you a single, decoratable seam for slug generation.

Consumers call stringFormatter.slugify(); projects that need custom logic decorate Slugify alone rather than the whole formatter.

Fixed Redirect After Deleting the Current Folder (#5626external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

When you deleted a folder while viewing it, you could end up stranded with no visible content. Now the UI automatically navigates to the nearest surviving ancestor folder (parent → grandparent → … → root) without requiring a manual navigation or page refresh. This also works when a folder is removed from the cache externally — for example, by another component calling useDeleteFolder. The fix uses optimistic cache updates instead of refetching from the API, avoiding issues with eventually-consistent storage.

Fixed Schema Validation for Empty Non-Required Fields (#5642external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

Non-required fields with empty values (null or undefined) were incorrectly failing Zod schema validation, even though they should be allowed to remain empty. This affected scalar fields, object fields with all-empty children, and list fields with empty arrays. The validation logic now skips schema checks for non-required fields when their values are empty, while still validating populated fields and enforcing required field constraints as expected.

Unified Frontend Settings Configuration (#5667external link)
anchor

{/ REVIEW-PENDING @Pavel910 — confirm this entry, then delete this line /}

Frontend settings — including the preview domain and starter kit configuration — were previously tied to the Website Builder package. This made it awkward to configure frontend settings in projects not using Website Builder, or to share settings across multiple frontend frameworks.

A new @webiny/frontend-settings package now manages these settings centrally:

  • New GraphQL API: frontend { getSettings } and frontend { updateSettings } provide a dedicated endpoint for frontend configuration, separate from Website Builder.
  • Unified “Configure Frontend” dialog: The Dev Tools dialog now includes a domain input field with save functionality. Starter kit configuration (Next.js, Nuxt) has been relocated here from Website Builder.
  • New permission: A frontend.settings permission controls access to the frontend settings API. Website Builder’s wb.settings permission has been removed.

If you were using the Website Builder “Settings” menu item to configure the preview domain, use the “Configure Frontend” dialog in Dev Tools instead. The websiteBuilder { getSettings } query still works but now delegates to the new frontend settings repository internally.

Removed UnuseduseDataListanduseAutocompleteHooks (#5346external link)
anchor

{/ REVIEW-PENDING @brunozoric — confirm this entry, then delete this line /}

The useDataList and useAutocomplete hooks in the @webiny/app package had no usage across the codebase and have been removed. If you were importing these hooks directly, you’ll need to implement equivalent functionality in your own code.

Command Palette With Global Search and Keyboard Shortcuts (#5432external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

A new command palette is now available via ⌘K / Ctrl+K in the admin app. It provides fuzzy search over navigation destinations and registered actions, keyboard-driven navigation, and is styled according to the design system. The palette auto-derives navigation commands from your sidebar menus, supports detail views for commands that need input, and allows commands to register global keyboard shortcuts.

To register a custom command:

Command Palette No Longer Blocks Backspace in Text Fields (#5480external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Pressing Backspace in a description field, textarea, or rich-text editor was not deleting characters. The command palette’s “back out” shortcut handler was registered globally and was intercepting Backspace even when the palette was closed. This has been fixed — the handler now only activates when the palette is open and properly exempts all editable elements.

Injectable Date Formatter for Consistent Date Display (#5512external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Date formatting across the admin was inconsistent. A new injectable DateFormatter feature in @webiny/app-admin provides a single, decoratable formatter that any admin module can use. The default format is YYYY-MM-DD HH:mm in 24-hour format using the browser locale.

To override the format project-wide:

Empty State Design System Component (#5442external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

A reusable EmptyState component has been added to @webiny/admin-ui. It supports multiple illustration types (content, table, listing, layout, upload, select), optional title/description/actions, and three sizes (sm/md/lg). Widgets now use this consistent empty state component.

Admin UI Improvements for AI Models, Filters, and Task Details (#5498external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Several admin UI improvements:

  • AI Power-Ups Provider Model dropdown is now searchable and includes the latest OpenAI and Anthropic models
  • Background Tasks and Webhooks filter drawers now match the Audit Logs pattern with an icon button in the header
  • Task detail drawer labels and values are no longer visually stuck together
  • Reference field inline edit now shows a proper tooltip on hover
  • DataTable columns menu stays open when toggling multiple column checkboxes

Development
anchor

Custom GraphQL Playground Built From Scratch (#5357external link)
anchor

The GraphQL Playground has been completely rewritten, replacing the old CDN-loaded graphql-playground-react with a custom implementation built on Monaco Editor. The new playground includes several improvements:

  • Schema Docs Explorer — a right-side drawer for browsing the introspected schema with stack-based type navigation, search across type names, field names, arguments, and enum values, and clickable type references
  • Query History — localStorage-backed execution history (capped at 100 entries) with search, restore-to-active-tab, open-in-new-tab, and individual delete
  • Tab-based architecture — each tab has its own GraphQL client with independent auth and tenant headers. System tabs (Manage, Read, Preview APIs) have read-only endpoints; duplicate them to get an editable copy
  • Comment-preserving prettifier — formats queries while keeping your comments intact

The playground uses a DI-based PlaygroundTabRegistry, allowing any package to contribute its own tabs. If you need custom client behavior, implement PlaygroundClient.Interface or use the provided factories with custom getToken/getTenant overrides.

Dev Tools Permissions No Longer Duplicated Across Playground Apps (#5338external link)
anchor

The GraphQL Playground and SDK Playground apps each used to register the other app’s permissions as well as their own, which could show permissions for apps that weren’t installed. Each app now contributes only its own permissions, and they’re combined into a single “Dev Tools” group automatically.

Removed Apollo Client From Multiple Packages (#5345external link,#5342external link,#5340external link,#5339external link,#5336external link,#5335external link)
anchor

Apollo Client has been removed from several packages including ACO, Audit Logs, File Manager, Website Builder, Workflows, and Cognito. These packages now use Webiny’s internal GraphQL client infrastructure instead.

OpenSearch Client Refactored to Use Dependency Injection (#5311external link,#5301external link)
anchor

The OpenSearchContext abstraction and context.opensearch/context.elasticsearch properties have been removed. All consumers now resolve the OpenSearch client directly via the OpenSearchClient dependency injection token.

Removed Unusedapp-file-manager-s3Package (#5341external link)
anchor

The app-file-manager-s3 package has been removed as it was no longer used anywhere in the codebase.

VueshallowRefNow Properly Triggers Re-Renders (#5262external link)
anchor

When using Vue’s shallowRef in Webiny extensions, changes to the ref value were not always triggering component re-renders as expected. This has been fixed to ensure shallowRef behaves consistently with Vue’s reactivity system, properly updating the UI when the reference changes.

TypeScript 7 and Dependency Updates (#5396external link)
anchor

Webiny now uses TypeScript 7.0.2. Most dependencies have also been updated to their latest compatible versions. If you encounter type errors after upgrading, ensure your IDE and local TypeScript version are in sync with the project.

Removed@svgr/webpackDependency (#5343external link)
anchor

The @svgr/webpack package has been removed from Webiny’s dependencies. If your project relied on this package for SVG handling, you may need to add it to your own project dependencies.

Lexical Editor Aligned With Design System (#5509external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

The Lexical rich-text editor has been restyled to match the Webiny design system:

  • Toolbar uses design tokens with rounded controls and proper hover/active states
  • Icons migrated to @webiny/icons Material Symbols
  • Dropdown menus styled to match admin-ui patterns with check indicators for selected items
  • Color picker uses square swatches with proper theme color borders and a no-color swatch option
  • Link editor popover uses admin-ui form components and no longer opens at (0,0) when pressed with no selection
  • Placeholder text shows for any empty block and matches the current block’s typography

MCP Skills for Bulk Actions, AI Power Ups, and Websocket Notifications (#5434external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Three new MCP authoring skills help developers build extensions using 6.5.0 APIs:

  • api/cms-bulk-actions — custom bulk actions with background tasks and Admin UI wiring
  • api/ai-powerups-content — generating CMS content via CmsGenerateEntryContentUseCase
  • api/websocket-notifications — real-time API to Admin notifications

Fixed Tsconfig Generation Preserving Manual Excludes (#5455external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

The tsconfig generation script was overwriting any manually added exclude entries. This caused build failures in packages like create-webiny-project that need to exclude vendored files. Manual excludes are now preserved across regeneration.

GraphQL Resolver Dependencies Now Honormultiple: true(#5698external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

When using addResolver with a [abstraction, { multiple: true }] dependency tuple, the resolver was receiving a single object instead of an array. This has been fixed — multiple dependencies are now correctly resolved as arrays.

A/B Testing and AI Powerups License Flags (#5499external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

New WCP license feature flags are now consumed throughout the stack:

  • abTesting — A/B testing capability
  • aiPowerups.options.websiteBuilder.pageTranslation — WB page translation
  • aiPowerups.options.cms.entryGeneration — CMS AI entry generation
  • aiPowerups.options.cms.entryComparison — CMS AI entry comparison
  • aiPowerups.options.cms.entryTranslation — CMS AI entry translation

Features are gated at resolver/render time and missing flags are treated as disabled for backward compatibility.

AI
anchor

AI Prompt File Attachments and Audit Logging (#5384external link)
anchor

You can now attach additional files (text, PDF, DOCX) to AI prompts in both the Headless CMS and Website Builder. The files are converted to markdown and included in the prompt context, allowing the AI to reference document content when generating responses.

AI operations are now recorded in the audit logs. Each generation creates a single merged record capturing the before/after state, with detailed tabs showing the system prompt, user prompt, and LLM response in the audit log viewer.

Audit Logs UI Improvements (#5384external link)
anchor

The audit logs interface has been updated with a filter drawer, improved date/time pickers with proper ISO output, and fixed pagination when scrolling through filtered results.

File Manager
anchor

File Type Filtering in File Picker (#5384external link)
anchor

The File Manager picker now respects the accept prop to filter file listings. When you specify accepted file types, only matching files are shown in the listing while folders remain visible for navigation. Duplicate selections in multi-file mode are also now prevented.

Image Delivery Pipeline With Server-Side Transforms (#5481external link)
anchor

Images served through the File Manager now support server-side transforms including crop, format conversion, and quality adjustments. When you edit an image’s crop or focal point — whether in the File Manager, CMS asset picker, or Website Builder — the transform parameters are encoded directly into the delivery URL.

The File Manager metadata structure has been updated:

  • metadata.imageEdit moved to metadata.image
  • hotspot renamed to focalPoint throughout
  • New fields: metadata.image.{crop, focalPoint, alt, caption}

Shared Image Editor Component (#5481external link)
anchor

A unified ImageEditor component now powers image editing across the File Manager, CMS asset picker, and Website Builder file inputs. This provides a consistent editing experience with crop handles and focal point selection regardless of where you’re working with images.

Webiny SDK
anchor

Unified Asset Type (#5481external link)
anchor

The SDK now exports a canonical Asset type shared by both the CMS asset field and Website Builder file inputs. This removes the previous duplicate type definitions.

All Webiny-prefixed names have been simplified:

  • WebinyImageImage
  • WebinyAssetAsset
  • getWebinyAssetUrlgetAssetUrl

Unified Frontend SDK With Result-Based API (#5507external link)
anchor

The frontend SDK packages have been consolidated into a single unified entry point. The new @webiny/sdk-frontend and @webiny/sdk-nextjs packages replace the previous @webiny/content-sdk and @webiny/content-sdk-nextjs packages.

Initialize the SDK once with sdk.init() to access all domains — CMS, Website Builder, languages, file manager, and more — through a single configuration:

All SDK methods now return Result<T, Error> for consistent error handling across the frontend.

The configuration props have been renamed: apiHostendpoint, apiKeytoken, apiTenanttenant.

Fixed Stale Language Cache in Create Page Dialog (#5507external link)
anchor

Adding a new language in the Admin and then opening the Create Page dialog would show stale language options until a page reload. The CreateEntryRepository, UpdateEntryRepository, and DeleteEntryRepository now publish lifecycle events (EntryAfterCreateEvent, EntryAfterUpdateEvent, EntryAfterDeleteEvent) that keep the frontend cache in sync.

Page Builder
anchor

AI-Powered Page Translation (#5501external link)
anchor

You can now translate pages using AI directly from the Page Builder. When you have an AI provider configured in AI Power-Ups settings, the translate page dialog will use AI to translate the page title, snippet, and all text content within the page. For Latin-script languages (e.g., Croatian, Spanish), the page path slug is also translated automatically. Non-Latin languages (e.g., Russian, Japanese) keep the original slug to avoid URL encoding issues.

The translation works as a decorator on the built-in TranslatePageUseCase, so if no AI provider is configured, the page is still cloned as before — AI translation is a graceful enhancement rather than a requirement.

Infrastructure
anchor

EventBridge Schedule Names Now Valid for CMS Actions (#5445external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Scheduling CMS entry publish/unpublish was failing because the EventBridge Scheduler name contained invalid characters (slashes from the CMS namespace) and exceeded the 64-character limit. The schedule ID is now used directly as the EventBridge name, which is always valid.

Bug Fixes
anchor

Scheduled Actions Reload When Scheduler Overlay Closes (#5506external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Cancelling a scheduled publish from the Scheduler overlay was leaving a stale “Scheduled” tag in the entries list. Scheduled actions are now reloaded when the overlay closes.

Test Expectations Updated for Generated Object IDs (#5686external link)
anchor

{/ REVIEW-PENDING @adrians5j — confirm this entry, then delete this line /}

Several test suites were failing after stable _id generation was added to object and dynamic-zone values. Test expectations have been updated to account for the new _id field on stored objects.