Changelog
4.0.0-beta.1 2026-09-22
{warning} Before upgrading to Vizy 4, review the Upgrading from v3 guide for breaking changes and required migration steps.
Added
- Added a new TipTap 3 editor with configurable formatting, tables, links, images, embeds, undo and redo, accessible toolbar controls, Bubble Menus, and structured Blocks in one editing surface.
- Added named Editor Configs, managed in the control panel or as JSON files in
config/vizy/, with visual builders for capabilities, toolbars, dropdowns, Bubble Menus, and insertion controls. (#183 (opens new window)) - Added
EditorManifests::EVENT_MODIFY_EDITOR_CONFIGfor field-scoped runtime changes that participate in config normalization, manifest caching, and server-side validation. - Added shared Project Config-backed Block Types with reusable Craft field layouts, icons, colours, preview images, summaries, grouping, per-field availability, and list or grid insertion. (#60 (opens new window), #222 (opens new window), #261 (opens new window), #271 (opens new window))
- Added toolbar, gutter, and slash insertion for Blocks. (#296 (opens new window), #330 (opens new window), #360 (opens new window))
- Added responsive Layout and Column nodes with configurable presets, wrapping, resizing, reordering, and GraphQL support. (#72 (opens new window))
- Added Hosted Vizy Editors, allowing Vizy fields to be nested on Block Type field layouts with their own Editor Config and a maximum nesting depth of five. (#45 (opens new window), #125 (opens new window))
- Added a structural GraphQL API for documents, nodes, marks, layouts, Blocks, and generated Block Type fields, including filtering, ordering, limits, rendered HTML, and raw escape hatches. (#52 (opens new window), #124 (opens new window), #129 (opens new window))
- Added PHP and JavaScript extension APIs for registering TipTap nodes, marks, behaviour modules, toolbar controls, dropdowns, and rendering behaviour. (#93 (opens new window), #137 (opens new window))
- Added an automatic, resumable Vizy 3 upgrade to Craft’s plugin migrations, with durable checkpoints, verification, and advanced diagnostic and recovery commands.
- Added a raw content API for inspecting and migrating embedded field values using captured placement identities, explicit changes, dry runs, and caller-owned transactions. (#313 (opens new window), #371 (opens new window))
- Added canonical Vizy document support to Feed Me.
- Added search indexing for document text, image details, link values, Block fields, and nested Hosted Vizy content.
Changed
- Vizy now requires Craft CMS 5.9 or later.
- Vizy field values are now immutable
VizyDocumentobjects backed by versioned canonical JSON. Render fields explicitly withrender(); usequery(),all(),blocks(),content(), ortraverse()for structured access. - Block definitions are now global Block Types referenced by UID instead of field-owned definitions, while Block values remain embedded in the Vizy document rather than loading as separate Craft elements.
- Block query filters now preserve the existing enabled-only default. Request
enabled: falsefor disabled Blocks orenabled: nullfor both states. - Matrix fields remain supported on existing and new Block Type layouts. Nested Vizy is recommended for new nested content to avoid Matrix’s additional storage and processing overhead. (#314 (opens new window))
- Matrix fields use Inline Blocks inside Vizy so edits follow the containing entry’s save and draft workflow. Cards, card grids, and element indexes retain their configured appearance outside Vizy.
- The GraphQL contract now uses structural
VizyDocument,Vizy*node and mark types, and UID-qualified generated Block types. Existing Vizy 3 fragments and JSON-encodedwherearguments must be updated. - The control-panel editor has moved from Vue 3 to Web Components built with Plugin Kit. Integrations that mounted Vue components or targeted the legacy editor DOM must migrate to the supported Extensions APIs.
- Editor integrations now use named Editor Configs and the Extensions registry instead of per-field inline config,
Craft.Vizy.Config, or Vizy 3 plugin registration hooks. - Block Type templates now receive field values through the
blockvariable, and automatic field string rendering has been replaced by explicit document rendering. - Asset uploads and nested field values are finalized with the owning element save, with recoverable status for deferred or failed uploads.
- Documentation has been rewritten for Vizy 4 field setup, authoring, rendering, querying, GraphQL, extensions, limitations, and Vizy 3 upgrades. (#283 (opens new window))
Fixed
- Fixed Hyper 3 fields preventing Matrix content inside Vizy from loading or saving. (#377 (opens new window))
- Fixed duplicated entries losing Matrix content inside Vizy blocks. (#376 (opens new window))
- Fixed Matrix validation checking saved rows instead of submitted changes, and preserved pending Matrix edits when an entry fails validation.
- Fixed duplicate Matrix rows and changing row identities when saving legacy content, including temporary row identifiers on PostgreSQL; saving or backfilling also repairs duplicate stored row UIDs.
- Fixed Matrix anchors failing when a site row was missing or a new site was enabled, and limited anchor propagation to the owner’s supported sites. (#373 (opens new window))
- Fixed Matrix saves failing when Craft reused a cached field manager from outside the block layout.
- Reduced repeated Matrix owner lookups when reading and resaving Vizy content.
- Fixed competing standalone Matrix anchor creation attempts failing to resolve the winning anchor after a database collision.
- Fixed Matrix backfill missing nested Vizy, global sets, and non-primary sites, and restored dry-run, site selection, draft opt-in, and timestamp-preserving saves. (#364 (opens new window))
- Fixed removed Vizy blocks leaving their Matrix content active, including site-specific rows. Restoring a removed block restores its owned content.
- Fixed a moderate-severity cross-site scripting vulnerability in Tiptap (GHSA-cp6q-959q-f8rh (opens new window)).
Deprecated
- Deprecated
VizyDocument::getField(),getRawNodes(),renderHtml(), andrenderStaticHtml(); usefield(),content().nodes(), andrender(). - Deprecated the GraphQL
rawNodesandrenderHtmlaliases; userawor noderaw, andrenderedHtml. - Deprecated legacy editor toolbar tokens that can be converted to Vizy 4 Editor Config controls.
- Deprecated
EVENT_DEFINE_VIZY_CONFIG,EVENT_MODIFY_PURIFIER_CONFIG,registerPlugin(), and theCraft.Vizy.ConfigJavaScript API. These compatibility surfaces no longer configure the Vizy 4 editor; use named Editor Configs,EditorManifests::EVENT_MODIFY_EDITOR_CONFIG, and the Extensions APIs.
Removed
- Removed the Vizy 3
NodeCollectionfield-value contract, string-cast rendering, typed GraphQL tree, and field-local Block Type ownership. - Removed
Content::modifyFieldContent(); integrations should usecaptureFieldLocations()andmodifyFieldValues()from the raw content API. - Removed non-empty attribute-map configuration from
renderHtml()andrenderStaticHtml(); use node render events or Block templates to customize output. - Removed the unused
recursiveFieldCountsetting and the ability for a Vizy field save to modify global Block Type schema as a side effect.