Added — Loop block: {% for key, value in … %} gives each item's key along with its value, as in Twig.
Changed — Loop block: a loop over an object now gives each value directly, as in Twig; use {% for key, value in … %} instead of item.key and item.value.
Improved — AI: loops, conditions and variables can now be targeted like any other block, to move them, remove them or rewrite their content.
Improved — AI: over MCP, when the editor tab is paused or closed, the assistant is told right away and can ask you to bring it back, instead of waiting for a vague timeout.
Fixed — Security: a user allowed to edit posts could run PHP functions on the server through the list filters of a dynamic expression.
Added — Loop block: {% for key, value in … %} gives each item's key along with its value, as in Twig.
Added — Expression language: none as an alias of null, and true, false, null and none in capitals, as in Twig.
Changed — Loop block: a loop over an object now gives each value directly, as in Twig; use {% for key, value in … %} instead of item.key and item.value.
Fixed — Expression language: custom data providers, and the Request and Archive data, displayed nothing.
Fixed — Expression language: a range of letters, such as range('a', 'z'), displayed nothing.
Fixed — Expression language: the excerpt_chars filter cut through HTML tags and displayed them as text.
Fixed — Expression language: the currency_name filter displayed the currency code instead of its name.
Fixed — Expression language: the theme author, site.theme.author, displayed as HTML code.
Fixed — Loop block: a loop over a list reordered or sliced with its keys kept, or written as {% for key, value in … %}, showed nothing.
Fixed — Loop block: in the editor, a loop inside a loop over items, such as a product's variation attributes, showed nothing.
Fixed — Loop block: in the editor, a loop over a list held by the item of its parent loop showed nothing.
Fixed — Data picker: inside a loop, a variable named like the loop's items took over the suggestions, while the page displays the loop's items.
Improved — AI: the assistant now reads the declarations of the classes that are not on the page, not just their property names, so it reuses them instead of guessing their values.
Improved — AI: loops, conditions and variables can now be targeted like any other block, to move them, remove them or rewrite their content.
Improved — AI: the design tokens the assistant creates are now filed in a Tokens collection instead of landing in Uncategorized, as its CSS classes already were.
Changed — AI: a rule written by the assistant now replaces the stored one instead of being merged into it, so changing a layout no longer leaves the properties of the previous one behind.
Changed — AI: the style tool is now named update_styles (unblock/update-styles over MCP), in line with the other editing tools.
Changed — AI: the AI assistant is no longer marked as beta.
Changed — AI: the assistant's toolbar button and panel are now named Unblock AI.
Fixed — AI: once a block had been added or removed, a following edit could be applied to the wrong block.
Fixed — AI: an edit aimed at a block that no longer exists is now reported instead of silently doing nothing.
Fixed — AI: rewriting a section emptied the query of the loops it contained, and the assistant could not see that query in the first place.
Fixed — AI: an image kept through a rewrite no longer loses its link to the media library.
Fixed — AI: when the block an insertion was aimed after no longer exists, the new blocks are still added at the end but the assistant is now told, instead of leaving them misplaced without a word.
Fixed — AI: with the Generate images skill, a model unable to call the image tool announced images and produced none; the chat now says so instead of leaving you waiting.
Fixed — AI: the assistant could write product.price outside a product loop, which displayed nothing.
Improved — AI: over MCP, a tool that writes CSS answers with the resulting rules, so the assistant checks what it wrote instead of assuming.
Improved — AI: over MCP, writing CSS no longer sends the whole page back to the assistant, which kept large pages readable.
Improved — AI: over MCP, when the editor tab is paused or closed, the assistant is told right away and can ask you to bring it back, instead of waiting for a vague timeout.
Improved — AI: an open MCP session no longer ties up the server for as long as the editor tab stays open, which could slow down the site on small hosts.
Changed — AI: over MCP, an assistant now only sees and drives the editor sessions of the user it runs as.
Fixed — AI: on a site served over plain HTTP, starting an MCP session did nothing; the session ID could not be created.
Fixed — AI: copying the MCP session ID now works on a site served over plain HTTP, where the button did nothing.
Fixed — AI: an MCP session no longer drops when the editor tab stays in the background or idle for a while.
Fixed — AI: over MCP, an edit sent while the editor tab was asleep is no longer applied late when the tab wakes up, nor twice when the assistant had retried it.
Fixed — Library: the loops, conditions and variables of a pattern lost their settings when it was saved by an administrator not allowed to post unfiltered HTML, or when it came from a library that could not be verified.
Fixed — Library: a pattern holding an unusual attribute, such as a bare number, could not be saved or loaded.
Fixed — Library: saving a pattern before saving its styles left its preview unstyled, as the preview lost the classes those styles apply to.
Fixed — Library: a pattern from a library that could not be verified, or saved by a user who cannot post unfiltered HTML, could slip script into the page; the WordPress and third-party blocks it holds now come in with their default settings.
Fixed — CSS import: a variable collection tied to a selector, such as a dark mode, is no longer renamed after the collection being imported, nor duplicated when it already exists.
Fixed — CSS import: a new breakpoint used in several collections of the same stylesheet kept its rules in the first collection only; the rules of the following ones were dropped.
Fixed — Security: a user who cannot post unfiltered HTML could slip script into the page through a dynamic expression written in an unusual way.
Fixed — Security: in the editor, a user who cannot post unfiltered HTML could read data they are not allowed to see, such as the email addresses of the site and its users, through a variable.
Fixed — Security: a user allowed to edit posts could run PHP functions on the server through the list filters of a dynamic expression.
Fixed — Security: a user who cannot post unfiltered HTML could display data restricted to administrators, such as user email addresses, through a loop, a variable or an arrow function parameter named like a built-in data source.