Release notes · v4.2 → v9.2.23

Every release,
every story.

A single timeline. Every version Respira has shipped, with the stories behind the ones that mattered. Click into any release tagged story for the full write-up.

Connect your WordPress site
Looking for the plugin? The download and your license key are in your dashboard, one free sign-up away. No card.
794 Releases shipped
15 With a landing page
9.2.23 Latest stable
347 days Since v1.0
Product
Filtered Divi · 28 releases See Divi MCP → Clear
October 24, 2026
WordPress plugin v9.2.22 Patch October 24, 2026 On a Bricks site, asking for the theme builder's headers and footers now points to the right tools
  • On a Bricks site, asking for the theme builder's headers and footers now points to the right tools. An agent working on a Bricks site called the Divi Theme Builder tools for the header and footer and got only "Divi Theme Builder is not available", with nothing about where Bricks keeps them, so it guessed. On a Bricks site those tools now answer that Bricks keeps headers, footers and reusable sections as Bricks templates, and name the tools that list and read them (list_bricks_components, get_bricks_component). On a site with neither builder they point to get_builder_info. The tool descriptions now start with "Divi only".

  • A Bricks health check with a missing or wrong page id explains itself. bricks_health_check called without a numeric page id came back as a bare "no route" error. It now says it needs the id of the page, post or Bricks template to check, and where to get one; a page id that does not exist says the same.

  • Found while helping a customer on a Bricks staging site.

October 21, 2026
WordPress plugin v9.2.17 Patch October 21, 2026 Store pages no longer make Respira look up the site's administrators for every signed-in customer
  • Store pages no longer make Respira look up the site's administrators for every signed-in customer. Since 9.1.34 Respira checks whether the site's administrators include someone on its Respira account. On a store, the browser connection's script asked that question on every page a signed-in customer opened, and the answer was a user query that ran again each time. On a store with many customers and a plugin that adds to every user query, copies of it stacked up until the server sat at full CPU. The answer is now stored and worked out again only when an administrator is added, removed or changes email, or after an hour. Who may use Respira is unchanged. Reported by P.P.

  • featured_image sets the featured image, or says why it cannot. The site's own MCP connection told agents to send featured_image as an attachment ID or URL in text, and then quietly ignored anything that was not an object, while answering that the post was saved. It now accepts an attachment ID as a number or text, a Media Library URL (resized copies included), a remote image URL, or the old object form, on posts, pages and custom posts, when creating and when updating. 0 or an empty value removes it. A value that names no image, or names a file that is not an image, is refused and nothing is written. Every answer says which image was set, and on a draft duplicate that it goes live when the duplicate is approved. list_posts always includes featured_media. Reported by G.

  • Direct editing no longer skips the approval of plugin, user and delete tools. On a site with direct editing turned on, a REST call that sent edit_target: "live" skipped the approval step for every tool that needs one apart from redirects, so installing or deleting a plugin, deleting a user or deleting a post ran without a person being asked. Direct editing is for pages and posts, and that is all it now covers: page and post writes with page custom CSS. A tool you set to always ask still asks. The site's own MCP connection was not affected.

  • get_builder_info no longer runs out of memory on Bricks sites with a 128M limit. The Bricks element reference that ships with the plugin was read separately by three parts of the plugin, and again for every element a write checked, and the builder information cache never hit on a site without Divi, so every call rebuilt it. The reference is now read at most once per request and the cache works. On a Bricks 2.4 test site a first call went from 58.6 MB to 43.2 MB at its peak, and later calls from 89.4 MB to 27.6 MB, with the same answer. When a request is still close to its memory limit, get_builder_info leaves the per-element control schemas out, says so in memory_guard and warnings, and points to respira_bricks_design_system for them, instead of failing.

October 19, 2026
WordPress plugin v9.2.13 Patch October 19, 2026 Reviewed menu and redirect changes
  • Reviewed menu and redirect changes. A Publish only key can save an exact before/after proposal, read it by ID, approve its reviewed version, reject it, or create an undo proposal that needs its own approval. Direct writes remain forbidden. Both the proposal and live target are checked for conflicts; force cannot bypass them. Site-local private records have expiry, filtered pagination, target locks and an activity trail.

  • Durable receipts on REST and native MCP. Approval reads the target back, reports created, updated and removed IDs, and preserves partial outcomes as published, complete and named warnings. A retry returns the stored receipt without another apply. Native MCP preserves that JSON receipt on retries.

  • Activity review. Menu and redirect proposals join the existing approval queue with their complete before/after, versions and expiry. Each is reviewed individually. Approval uses the shared site-wide cache purge path.

October 15, 2026
WordPress plugin v9.2.7 Patch October 15, 2026 Kadence Blocks, Spectra, GenerateBlocks and GreenShift pages get their own blocks
  • Kadence Blocks, Spectra, GenerateBlocks and GreenShift pages get their own blocks. Until now, a new element on a block library site was a WordPress core block: ask for a Kadence row with two columns and you got a core group and core columns, with none of Kadence's controls. Now build_page, inject_builder_content and the add_* tools write the library's own blocks when you pass builder "kadence", "spectra", "generateblocks" or "greenshift", or when the page already has that library's blocks. Sections, rows and columns, headings and text, buttons, images, icons, spacers and dividers, lists, accordions and tabs each become the library's block, with the markup the library's own editor saves, its ids and the attributes it styles from (GenerateBlocks also gets the compiled CSS its front end prints, GreenShift the CSSRender flag it needs). Spectra Legacy pages get uagb/* blocks and Spectra Blocks pages spectra/* blocks; on GreenShift everything is its Advanced HTML Element, with sections laid out the way GreenShift's own guidance recommends. Anything a library has no block for is written as a WordPress core block and named in a library_core_fallback warning, and build_page says which elements are the library's in library_blocks. Without a builder on a new page you still get core blocks, plus a hint that names the builder value to pass, so a site that merely has a library installed is not switched over. Tested on a real WordPress 7.1 site with Kadence Blocks 3.8.0, Spectra Legacy 2.20.5, Spectra Blocks 1.0.11, GenerateBlocks 2.5.0 and GreenShift 13.2.1, one at a time: every block opens in the block editor without an "unexpected or invalid content" warning, the pages render with the library's styling, and existing content stays byte for byte when you add to a page.

  • WordPress 7.1 accordions, tabs and icons in the block editor. A generic accordion, tabs, icon, video, spacer, divider or list sent to build_page on a block editor page used to be saved as an empty block. They are now the core blocks WordPress itself saves: the core accordion and tabs blocks with their items and panels (details blocks on WordPress versions without them), the core icon block, a video embed, and spacer, separator and list blocks with their markup.

  • The browser door is on the screen a freshly linked site lands on. Of the people who linked a site from wp-admin in the 60 days to 15 October, 97 (29% of everyone who connected a site) never connected any agent, and most of them never opened the dashboard again. The only screen they saw after the link was Home in this plugin, and every door on it either opened respira.press in a new tab or asked for a desktop app; claude.ai and ChatGPT, which connect by address with no download and no key, were one sentence in the lede. Home's "Connect your AI assistant" card and Setup step 2 now show the site's own MCP address with a copy button and the three steps for claude.ai or ChatGPT, first. The one-click desktop installs, the copy-to-agent prompt, Respira AER and the offline key path are unchanged and follow below it. Pinned by tests/standalone/activation-browser-door.php.

  • SEO titles and descriptions reach All in One SEO again. On a site with All in One SEO 4 or later, the seo fields of update_page and update_post were saved where All in One SEO 3 kept them, years ago. The current All in One SEO keeps each post's SEO in its own table and never reads the old place, so the write said success while the page title, the meta description and All in One SEO's own editor stayed as they were. Title, description, canonical URL, robots, Open Graph and Twitter fields now go through All in One SEO's own save, only the fields you send change (a focus keyphrase or schema set in the editor stays), and reading a page's SEO back shows what All in One SEO shows. A draft duplicate starts with the live page's All in One SEO settings, and approving it carries the new ones to the live page. All in One SEO 3 sites keep the old behaviour. Tested on a real site with All in One SEO 5.0.3: the new title, description, noindex, canonical URL and Open Graph title appear in the page's head and in All in One SEO's editor.

  • A generic section on a Beaver Builder page shows its content. The shape agents send to every builder, a section holding a heading and text, was saved on Beaver with "section" and "text" as module names. Beaver has neither, so the page showed nothing but its title while the write said success. A generic section or container is now a Beaver row with the column group and column Beaver needs, columns sent without a width share the row, and generic types become Beaver's own modules (text and paragraph the Text Editor, image the Photo module, toggle the Accordion, divider the Separator), each named in a generic_type_mapped warning. A type the site has no module for, such as an accordion on Beaver Builder Lite or a spacer anywhere, now stops the write with respira_beaver_unknown_module_type and the list of modules the site has, and the page is left as it was.

  • Custom JavaScript on an Elementor page waits for approval. elementor_add_custom_js wrote its script straight to the live page, with no draft duplicate and no snapshot, so new JavaScript went live with no way back. It now works like every other page write: on a published page the script goes on a draft duplicate for a person to approve, a snapshot is taken first, and the answer says which post it wrote to and which snapshot to restore.

  • Editing the text of a library block keeps the block. Changing the text of a Kadence Advanced Heading, a Spectra button or another block library block with update_element saved the bare text in place of the block's markup, so the editor flagged it as invalid and the page lost its styling. The new text now goes inside the block's own markup, and an attribute that held the same text (Spectra's button label) changes with it.

  • The block catalogue lists what each library really ships. Spectra Legacy registers most of its blocks only in the editor, so the catalogue your AI reads was missing its container, heading and button blocks; they are listed now, as are Kadence's accordion panes and tabs. Kadence no longer lists an image overlay block that does not exist and spells its table of contents block correctly, GenerateBlocks lists its current Element, Media and Query blocks, and GreenShift lists its 31 free blocks instead of seven that exist nowhere. Pages built with Spectra Legacy are also no longer reported as full of unsupported blocks after a write.

  • GreenShift elements without styles open cleanly in the editor. An element written with a localId but no styles carried that id as a class, which GreenShift's editor does not save, so it flagged the block as invalid. The class is now written only on styled elements, as GreenShift does.

  • Two block editor slips that showed as invalid content. A heading sent with a tag setting (h1) saved an h1 while the block said level 2, and a section with an anchor saved its wrapper without the id. Both now save the way the block editor does. build_page also stopped reporting text with an ampersand as not saved, when it was on the page as "&".

  • Exhale on Flatsome writes Flatsome's own shortcodes. Converting HTML to Flatsome wrote the page as [container], [text], [heading], [image] and [leaf], none of which Flatsome registers, so the page showed them as text with curly quotes inside. The restyle path now writes [section], [row], [col], [row_inner], [col_inner], [ux_text], [ux_image], [button] and [divider], and keeps anything Flatsome has no element for (forms, tables, icons, an image that is not in the media library) as written in [ux_html]. Before anything is written, every tag is checked against the shortcodes Flatsome registers, and a page that would carry one it does not is refused instead of saved. Reported by M.T.

  • Fidelity mode runs on Flatsome. A designed page now converts in fidelity mode on Flatsome, as it does on Divi, Elementor, Bricks and the others: one root section carries the page, the source sections, rows and boxes become Flatsome rows and columns with their own classes and ids, each element keeps its markup and its classes in an HTML element, forms stay real forms, and the page's stylesheet travels with it, scoped to the page. Until now a fidelity request on Flatsome quietly fell back to the restyle path. Reported by M.T.

  • Approving a change says when a cache in front of the site may still show the old page. Approval clears the page caches it can reach, but a server or CDN cache (LiteSpeed, nginx, Varnish, Cloudflare) sits outside WordPress. When the request shows one, the approval now names it in Respira, Changes, on the approve bar of the preview, and in the approve response an agent reads, instead of reporting a bare success while the public page still serves the old copy. Reported by P.L.

  • The browser connection block on Home is readable. On the Respira Home screen a freshly linked site lands on, the claude.ai and ChatGPT address block showed without its styling: the "copy the address" button was dark text on the dark card, so it could not be seen, and the steps were centred. The block now carries its own styling, so it looks the same on Home as on Setup.

  • The approve bar finishes after an approval that names a cache. When an approval on the preview page said a cache in front of the site may still serve the old page, the bar kept saying the change was pending, the approve button read "Working..." and both buttons stayed disabled, although the change was already live. The bar now says the change was approved and published, keeps the cache note, and offers to open the live page.

  • Page and post SEO is in the tool list, and SEO plugin keys sent as meta no longer pass in silence. update_page and update_post took an seo object, but no tool list showed it, so an agent wrote All in One SEO's _aioseo_title and _aioseo_description through meta. Those are a copy All in One SEO keeps for other plugins and never reads, so the write said success and the page title did not change. The seo object is now in both tool lists, with title, description, focus keyphrase, canonical URL, robots, noindex, nofollow and the Open Graph and X card fields. All in One SEO 4 keys sent through meta are written through All in One SEO's own save and the response says so in meta_warnings. Keys of an SEO plugin the site does not run are stored as sent, with a warning that they change nothing and which seo field to use. Common spellings such as canonical and meta_description are understood, and an seo field Respira does not know is named instead of dropped.

  • An image built on a Beaver Builder page shows the image. A generic image sent to build_page or inject_builder_content on Beaver became a Photo module without saying where its picture comes from, so Beaver showed its 1x1 placeholder with no alt text, an image sent as url became the photo's link, and the response still said the image renders. An image URL (src, url, image_url) is now a URL photo, a media library id (image_id) a library photo with the address Beaver renders from, and the alt text lands where Beaver reads it, as update_element already did. A photo with nothing to show now comes back with a beaver_photo_not_set warning that says how to set the image, instead of a claim that it renders.

  • A Spectra Legacy image without a media library id opens cleanly. An image sent with only an address was saved with an empty uag-image class, which Spectra's own save leaves out, so the block editor logged a validation failure and quietly migrated the block. The class is now written only when there is an id.

  • inject_builder_content follows a page's block library. Agents often name builder "gutenberg" for any block page. On a page that already had Kadence Blocks, Spectra, GenerateBlocks or GreenShift blocks, inject_builder_content then wrote new elements as WordPress core blocks and said nothing, while build_page and the add_* tools wrote the library's blocks. It now follows the page's library too, says so in library_blocks_hint, and lists the library's elements in library_blocks as build_page does. Core block names (core/heading) still write core blocks.

October 15, 2026
WordPress plugin v9.2.6 Patch October 15, 2026 A site runs at most six Respira calls at once, and says so when it is full
  • A site runs at most six Respira calls at once, and says so when it is full. A managed host cut a site off because AI agent calls held its PHP workers until the host's time limit. The calls themselves were quick; what held the workers was waiting: agents send tool calls in bursts (up to 40 per site in five seconds), and every call in a burst takes a PHP worker while it waits for the others. Now, when six calls are already running, the next one is answered straight away with respira_site_busy, how many calls are running, and how long to wait (retry_after, also sent as a Retry-After header). Nothing runs for a busy call, so sending it again is always safe, writes included, and the Respira MCP server does that by itself. Reads keep one of the six slots for themselves, so a burst of writes can never stop an agent from checking its work. A call that ends in a crash or an exit frees its slot at once; a process the server kills outright frees it once PHP's own time limit has passed. The limit covers AI calls only: the site's pages, wp-admin and other plugins are never counted. To raise or lower it, set the respira_mcp_max_concurrent option (0 turns it off), the RESPIRA_MCP_MAX_CONCURRENT constant in wp-config.php, or the filter of the same name. respira_diagnose_connection shows the limit and how many calls are running.

  • Avada is a supported builder. Pages built with Avada Builder are read and written as Avada's own shortcodes: containers, rows, columns and Avada elements such as titles, text blocks, buttons, images, toggles, tabs, checklists and code blocks. Your AI can find, change, move and remove a single element, add elements with the add_* tools and build whole pages, and loose elements get the container, row and column Avada needs. Everything I do not model, a third-party shortcode, a newer Avada element or a Library global, is kept exactly as it was, byte for byte, and a write that would not read back the same way is refused before anything is saved. After every write I clear that page's compiled Avada CSS so the change shows, and the page's edit link opens it in Avada Live. Tested on a real Avada 7.16.2 site with Avada Builder 3.16.2: pages render, open in Avada Live, and after a save there Respira still reads and writes them byte for byte. Pricing Table, Tabs and Testimonials were rebuilt in Avada 7.16 and are marked experimental; check those in Avada Live after a change.

  • Avada support checked against Avada 7.16.2's own code. Clearing a page's compiled CSS now runs Avada's own per-page reset, the one Avada runs when you save a page, instead of a copy of it that also deleted a cache entry Avada no longer uses. A write that holds an expanded Library global (an element marked with fusion_global, the form Avada's editor works on) is refused before anything is saved: Avada would have copied it over that Library element on every page that uses it. Avada only lists its elements inside wp-admin and its own editor, never on the requests Respira answers, so the element list can now come from a scan of a real Avada Builder (scripts/generate-avada-scan.php writes it) with every element, its child items and every setting with its type, default and allowed values, and the builder info says which source it used. Writing pages on a real Avada site also showed two slips, now fixed: a checklist sent as plain words put each word into its icon setting as well as its text, and a section sent by its generic name was written as an old-style container instead of a flex one. Tabs joins Pricing Table and Testimonials as experimental, since Avada 7.16 rebuilt all three. A Library global is now placed at the level of what it holds: a saved container goes to the top of the page as it is, instead of being wrapped in a new column, where Avada would have nested a container inside a column.

  • Your AI can work with Avada's design system, Layouts and Library. It reads the global colour palette and the five typography sets with the CSS variables elements use (var(--awb-color5), var(--awb-typography1-font-family)), and changes them through Avada's own Global Options, then clears Avada's caches so the whole site shows the change. Because that restyles every page at once, it asks you first, takes a snapshot, and a restore puts the old values back and clears the caches again. Design tokens from a design direction land in the Avada palette as new colours and never overwrite one you already have. Avada Layouts can be listed, read, created and changed: which header, page title bar, content and footer section each Layout uses and which pages it applies to, the Global Layout included, and the sections themselves can be read, built and edited. A new Layout without conditions and a new section start out showing nowhere, so you can look at them in Avada Live first; changing anything already live needs your yes. The Library can be listed and read, with the exact piece to place in a page, and a global item is placed the way Avada places it, so it keeps following edits to the original. Edits to a Layout Section clear Avada's caches for the whole site, as Avada does itself. All of it was checked on a real Avada 7.16.2 site with Avada Builder 3.16.2: a global colour change rendered on the page, a new footer went live site-wide and opened in Avada Live, and a placed Library item followed an edit to the original. Layouts and the Library need Avada Builder active.

  • Elementor 4.3's accordion, background video and list elements can be built and edited. Respira knew 20 of Elementor's v4 element types and refused any write that added or changed one of the 15 that came with 4.3: the accordion (e-accordion and its item, header, title, icon and content slots), the background video (e-background-video with its content, controls, play and pause parts) and the list (e-list, its items, markers and text). All 35 are now modelled from Elementor 4.3.5's own code, with the props each one takes and the children it allows. An accordion item can be sent as { type: "e-accordion-item", title: "Question", children: [...] } and Respira builds the header, title, icon and content slots the way Elementor's editor does; list items can be plain strings. A label that lives in a child paragraph (a tab, an accordion title, the play and pause buttons) is written there when you send content to the slot. The list only exists on a site that has Elementor's e_list feature turned on, which Elementor ships hidden and off, so on other sites a list is refused with that reason instead of being saved and rendering nothing.

  • Inserting into a Divi page no longer rewrites the rest of it. Adding content with inject_builder_content (mode append, a target_path, or the new after_element_id / before_element_id) used to read the whole page into a tree and write the whole tree back. On Divi 5 that pipeline treated every existing block as fresh input: a global module reference at the top of a page (a full width global hero) was wrapped in a new section, row and column and rendered boxed, and a third party form block lost its settings. On a page still stored as Divi 4 shortcodes, a Divi Supreme carousel tag was turned into a section. Now only the new content is serialized and spliced into the stored page at one position; every other byte, including global module references, third party blocks and modules Respira does not know, stays exactly as stored, and the plugin checks that before and after the write. The response reports the inserted node's path and ids, the bytes inserted and the bytes left untouched. A page stored as Divi 4 shortcodes gets shortcodes whatever Divi version the site runs: a Divi 5 shape and the generic shape (section, row, column, then text, heading, button and the other module names) are converted the same way a full-page write converts them, in every insert mode, and a type with no Divi 4 module is refused with nothing written.

  • Chunked builds for Divi 4 and Divi 5. A large page can be built as a sequence of small inserts: the frame first, then rows and modules by path (target_path plus position, into a section or a column). A chunk_id makes a retried call a no-op instead of a duplicate, and a session_id from begin_session keeps one recovery snapshot per page for the whole build. Elementor and Bricks accept target_path inserts through the generic tree graft; get_write_capabilities reports inserts_at_path per builder, and other builders answer respira_target_path_unsupported with the list. The site's own MCP endpoint, the one claude.ai, ChatGPT and other remote connectors use, declares these parameters (target_path, position, after_element_id, before_element_id, chunk_id, session_id) and the insert and chunked build guide on inject_builder_content, word for word as the Respira MCP server does, so an agent on any connector learns it can insert instead of rewriting the page. On a builder without target_path the refusal names the builders that have it (it listed none), and get_builder_info accepts the short slug ("beaver" now finds Beaver Builder instead of answering that the site has no such builder).

  • PageSpeed audits and rendered design checks run in the background. run_pagespeed_audit can take two minutes and check_design with rendered:true about one, holding a PHP worker and an open connection the whole time. On the site's own MCP endpoint they now answer at once with a job_id, run in the background like a backup does, and respira_get_job_status returns the result when it is ready. An agent that needs the answer in the same call can send _respira_async: false. Through the Respira MCP server nothing changes for the agent: the server waits for the job and returns the finished audit. A design check of content, without rendering, is quick and still answers directly.

  • The post editor opens again on PHP 7.4. On sites running PHP 7.4, opening a post or page in wp-admin since 8.8.28 could answer with "There has been a critical error on this website." The image fallback added in 8.8.28 (when a network refuses WebP, convert the picture to a format it allows) handed WordPress a value it can only take as a variable, and PHP 7.4 then refused to load Respira's main file on the editor screens. Front end pages and AI calls were not affected. On PHP 8 the same line failed each time it ran, so that fallback never worked on any PHP version; it does now. A new test checks every by-reference argument in the plugin and compiles every file on PHP 7.4 with WordPress's functions loaded first, the way wp-admin loads them.

  • A background job runs once. On hosts where Respira starts background jobs with a request to the site itself (Apache with mod_php, some LiteSpeed setups, PHP's built-in server), a job that finished in under about a second could run a second time a minute later: an append sent with _respira_async landed twice, and a PageSpeed audit spent its free quota twice and was then reported as rate limited although it had worked. The request that queued the job wrote an old copy of it back after the job had already run, so the job looked queued again. Every write to a job record now starts from the record as it is in the database, and only if nobody changed it in between, so a finished or running job can never be put back in the queue. Present since 9.1.0; this release makes PageSpeed audits and rendered design checks run in the background by default, which made it common.

  • A write on a draft no longer says the page passed a check it never had. The render check cannot fetch a draft (its preview needs the author's login), so it skips it, but the answer said render_validator_state "pass". Draft duplicates are how Respira edits a published page, so most writes said "pass" without anything being looked at, including a page whose new modules showed nothing. A draft now reads "unverified" with the reason not_published and a note that says to open the preview; render_validator_pass is null, never false, and nothing is reported as a partial write.

  • A heading sent with a title shows its words on Breakdance, Oxygen 6 and Beaver Builder. Most agents send a heading as type heading with its words in title. Breakdance stored them where its Heading does not read, so the heading was empty; Oxygen 6 wrote its placeholder "Heading"; Beaver kept them in a field its heading module ignores. The write reported success each time. The title now goes to the field each builder renders; text, when sent, still wins.

  • Calls that another plugin stops are reported as stopped. When another plugin's hook ended a request with wp_die(), for example a nonce check meant for wp-admin that runs on every post save, the agent got WordPress's error page instead of an answer, and Respira's own record of the call stayed open with no cause. Approving a duplicate and deleting a post were the calls this hit most, because both save or trash a post. The agent now gets a proper answer naming the message (respira_mcp_halted) and is told to read the page before trying again, and the record is closed. Every other way a call can end, including an error nobody caught, now closes its record as well.

  • Pages Respira writes on Elementor 4.3 can be saved in the Elementor editor. I ran Respira's output through Elementor's own save and it refused most of it: a button link, an image, an SVG icon and a video source were stored in a shape Elementor 4.3 no longer accepts ("Settings validation failed. link: invalid_value"), so the page showed fine but the editor could not save it. Every style Respira wrote carried an empty breakpoint, which Elementor's save quietly drops, so colours and sizes vanished the first time someone pressed Update. These are now written in the shape Elementor validates, and a page written by an earlier Respira is repaired on its next edit. Before storing a new or changed v4 element, Respira now asks the running Elementor to check its settings the way its own save does: a value it would refuse, a value outside its allowed list, or a setting it does not have is refused with the element and the setting named, so nothing is saved that Elementor would throw away.

  • Element ids look like Elementor's own. The container Respira adds around loose widgets got an id like respira_container_1791993247_8a23bce, and new v4 elements one like respira_f98c36f4, which Elementor reads as a number and cannot. Two elements built in the same call could also share an id. New ids are now seven hex characters and unique on the page; existing ids are kept, so anything that finds an element by id still finds it.

  • A text edit aimed at an Elementor v4 container is refused instead of lost. Sending content to a flexbox, an accordion or an accordion item wrote a setting none of them read and reported success. It now answers with the element type and asks for the heading, paragraph or button inside it. Settings such as loop, autoplay or state on a video were mistaken for CSS and went into the style map; they are now written as the element's settings.

  • Reads and writes count the elements. If a write would store fewer elements than it received, nothing is written and the answer gives both counts (respira_children_dropped). If a read returns fewer elements than the page holds, the extract answer says so. Pages built with classic Elementor sections, columns, containers and widgets read and write exactly as before.

  • A full Divi 5 rewrite keeps the blocks it did not change. inject with mode replace, update_module and the add_* tools re-emit the whole page. Each top level block the write handed back unchanged is now stored as Divi saved it, byte for byte, and a rewrite that would restructure one of them (for example wrap a global module in a section) is refused with respira_untouched_block_rewritten and writes nothing. A global module reference is never wrapped by the scaffolding, at any level, and blocks outside the divi namespace pass through the top level untouched.

  • Reading a Divi 5 page returns global module references as references. extract_builder_content handed the agent the library item's blocks in place of each divi/global-layout reference, because Divi's own block parser, loaded by that endpoint, expands references while reading. An agent that wrote such a tree back stored a detached copy and the global link was gone; that is how a full width global hero came back as a plain section. The adapter now reads stored blocks with WordPress's own parser, so a reference stays a reference on every read and every write keeps it. To change a global module, edit the library item.

  • Replacing a page saved by the Divi 5 Visual Builder validates again. The validator treated the placeholder root Divi wraps a page in as a parent, so every section of such a page was "not top level" and a full replace of it was refused. The placeholder is now transparent, and a global module reference directly under a section or row is accepted.

  • A slow page check no longer marks a good write as failed. After each write Respira loads the page to check it renders. On slower hosts, staging sites especially, that request often ran past its 4 second limit, and the write came back with render_validator_pass: false, partial_write: true and "cURL error 28" as the error, on pages that were fine. A check that gets no answer now reports render_validator_pass: null with render_validator_state: "unverified", a reason (preview_timeout, preview_unreachable or request_time_budget) and a plain note, and the timeout error is no longer reported as a render error. The check waits 6 seconds instead of 4, a site can change that with the respira_render_validator_timeout filter up to 10 seconds, and the check never runs into the time the host allows the whole request. A page that answers with an error status or a fatal error page still fails as before. The plugin update health check still treats no answer as a problem.

  • Converting a page for "divi5" works on Divi 5 sites. Respira Exhale refused every page sent with builder "divi5", saying "the divi5 builder is not active on this site", on sites running Divi 5. Divi was detected correctly; the name "divi5" just reached no part of Respira, and any name it could not find was reported as an inactive builder. The Divi adapter now answers to divi5 and divi4 as well. When the name asks for Divi 5 and the site runs Divi 4, the answer says so, gives the Divi version, and suggests builder "divi". When it asks for Divi 4 on a Divi 5 site, the page is written as Divi 5 with a warning saying why. A builder name Respira does not know is now reported as unknown, not as inactive.

  • Edit links open the page in its own builder. The link Respira gave for editing a page was WordPress's edit link, which opens the block editor. A Divi 5 page there shows every section as an unsupported block, and a customer reasonably took the page for broken. Every edit link Respira returns (build_page, Divi page templates, Theme Builder layouts, the duplicate offered before a live edit, Respira Exhale, translations, and the approvals and feedback screens in the plugin) now opens Divi pages, 4 and 5, in the Divi Visual Builder, Theme Builder layouts in the Theme Builder, and Elementor, Bricks, Beaver Builder, Breakdance and Oxygen 6 pages in their own editors (Breakdance and Oxygen 6 through the same link their own "Edit in Breakdance" and "Edit in Oxygen" buttons use). Other pages, classic Oxygen included, keep WordPress's edit link.

  • Divi 5.15 Components and Slots survive every write. In Divi 5.15 a Component (the new name for a global module) can carry the page's own copy of its content, including Slots that hold content for that one page. A full replace of a page holding one was refused as invalid ("row should be inside a section"), and editing anything inside a Component stamped Respira's ids and a version number onto blocks that belong to Divi. Now extract, replace, append, insert at a position and element updates keep a Component reference, its Slots and every attribute exactly as stored, and an edit inside a Slot changes only the block that was edited. Verified on a Divi 5.15.1 site: the Component and its Slot content still render after each kind of write.

  • The Divi 5 module catalogue is refreshed to Divi 5.15.1. It now lists 117 module types, including the new Slot module and the Gravity Forms and Imagely Gallery modules, which Divi only registers when those plugins are active. The catalogue generator can now merge a scan of a live site with Divi's own module files, so a site without WooCommerce or Gravity Forms no longer drops those modules from the catalogue.

October 13, 2026
WordPress plugin v9.2.0 Minor October 13, 2026 Redirects have their own tools, and their own manners
  • Redirects have their own tools, and their own manners. respira_list_redirects, respira_create_redirect, respira_update_redirect and respira_delete_redirect. They exist because an agent moving a site to a new domain needed one redirect, and the only road it could find ran through a redirect plugin's settings in the database. That road works until the day it doesn't. When Redirection is active, Respira writes through Redirection itself, so the redirect sits in its screens like one you made and keeps its place in the list when it changes. Without it, Respira keeps a small list of its own and answers those addresses before WordPress starts looking for the page. Rank Math, Yoast SEO Premium, Safe Redirect Manager and Simple 301 Redirects are read, never written.

    A redirect is a promise to every visitor and every search engine, so I check it before making it. Respira refuses to move wp-admin, the login page, the REST API, cron, XML-RPC and WordPress's other own addresses, or a pattern that reaches them. It refuses a redirect that would walk visitors in a circle through any of those plugins, a second redirect for an address that already has one, and a permanent redirect to a page that answers with an error, unless you say why. A pattern that copies part of the address into the target can only send people somewhere on your own site. The home page, and any pattern that catches every address, wait for a person to say yes; on Redirection, which answers the login page too, a catch-all is refused outright. A chain longer than one hop comes back as a warning, because each extra hop is a small tax on speed and on search. Every change keeps a snapshot, so respira_restore_snapshot undoes it, and the list can follow one address through every redirect with real requests and tell you where it really ends up.

  • YOOtheme Pro is a supported builder. Respira reads and writes YOOtheme pages as YOOtheme builder layouts: sections, rows, columns and YOOtheme's own elements. Every write is saved through YOOtheme's own builder, the way its customizer saves, so a page opens in the YOOtheme customizer like one built there. Your AI gets every element's fields and allowed values from the running theme, custom elements from child themes and extensions included, and a catalog of the 75 elements of YOOtheme Pro 5.0.50 when the theme is not loaded. Column widths, the items a button, list or grid needs, and the section and row a loose element needs are added for it. A setting an element does not have is named in the response instead of being stored where YOOtheme never reads it. Builder info also reports the YOOtheme style, its variable overrides and the site templates.

  • YOOtheme site templates can be read and changed. Four tools appear on YOOtheme sites: list_yootheme_templates, get_yootheme_template, create_yootheme_template and update_yootheme_template. A template is the layout YOOtheme renders for every single post, the blog index, an archive, search or the 404 page. A new template starts disabled, so you can review it in the YOOtheme customizer before it changes the site. Changing an enabled template, or enabling one, needs your confirmation, and every write saves a snapshot first that restore_snapshot puts back.

  • Exhale converts HTML into YOOtheme Pro pages. convert_html_to_builder takes builder yootheme. Headings, text, buttons, images, video and lists become YOOtheme elements, a grid or flex layout becomes a row of columns, and a wrapper's alignment and background colour reach its section or column. Only forms, tables and icons stay as HTML. YOOtheme takes its look from its style, so the source stylesheet is not carried, and the response says so.

  • The add_ tools write YOOtheme elements.* add_button writes a Button with its item, add_accordion an Accordion with its items, and so on. YOOtheme has no spacer, progress bar or form element: the first two become a small HTML element with YOOtheme's own UIkit markup, and add_form is refused with a pointer to a form plugin's shortcode.

  • Every builder says what it can write. get_builder_info now carries write_capabilities for every builder: whether it builds pages, adds elements or only edits text, and whether a new element is native, written as core blocks, or partial. On Thrive Architect, which only edits existing text, and SeedProd, which is read only, build_page and the add_* tools now refuse before anything is written. Before, a Thrive page build failed after the page was created, add_* reported success while writing nothing, and the design ended up in a single HTML block. Every build response counts the elements written as raw HTML.

  • respira.press records the active theme. The license check and tool calls carry the theme name, its parent and whether it is a block theme. Public identifiers only.

  • A YOOtheme section shows its own background colour. YOOtheme draws a section's colour only when no predefined style is set, and every section starts on the default style, so a colour sent on its own was stored and never shown. Respira now clears the style when a colour is set, as picking a colour in the customizer does.

  • The new Spectra Blocks plugin is detected as Spectra. Spectra split into Spectra Legacy and the new Spectra Blocks in 2026, and sites on the new plugin reported no Spectra at all.

  • Font tokens reach a block theme's Global Styles. Applying a design direction to a block theme skipped every font family and filed font sizes as spacing sizes. Font families, font sizes, line heights and letter spacing now land where WordPress reads them, with body and heading fonts set from the token's role.

  • Exhale keeps WPBakery and Visual Composer apart. A Visual Composer Website Builder site got a WPBakery shortcode tree, and an explicit builder visual-composer failed as if WPBakery were missing. Each product now gets its own elements.

  • The Divi 5 module list is current with Divi 5.13, including the Charts and Payment Button modules.

October 13, 2026
WordPress plugin v9.1.33 Patch October 13, 2026 Builders are detected however early detection runs
  • Builders are detected however early detection runs. Each builder used to be detected only once it had booted in the current request, so a check that ran before the theme loaded saw no Bricks, no Divi on a renamed or child theme, and no GreenShift, then cached "block editor only" for an hour. Detection now also reads what WordPress has stored: the active plugins and the active theme with its parent. Covers Elementor, Divi (Divi 4 and 5, Extra, the Divi Builder plugin), Bricks, Beaver Builder, Brizy, WPBakery, Thrive Architect, Flatsome, Kadence Blocks, Spectra, GenerateBlocks, GreenShift, SeedProd and Visual Composer. An add-on alone (divi-pixel, bricksable) does not count as the builder. A detection run before the theme has loaded is no longer cached.

  • The weekly license check reports what the site runs. The builders and active plugin slugs used to reach respira.press only on activation and on a tracked tool call, so a site licensed earlier showed no builder on the dashboard. The license heartbeat now carries both lists.

  • A theme switch reaches the dashboard within minutes. A site that connected on a block theme and then switched to Divi kept showing "Gutenberg" on respira.press for a day, and a support reply drafted from that told the owner Respira only saw the block editor. Detection on the site was right; nothing sent it. I now send a fresh report a minute after a theme switch, a plugin activation or deactivation, an update, and once after Respira itself updates, from a request of its own so the new theme is loaded. The same lists are never sent twice, and the report never touches the licence state. Every tool call now carries the builder list too, read tools included, where before only a few write paths did. Turning usage reporting off in Settings stops the extra report.

  • Importing design tokens no longer lets a brand token take over a core color role. Before this, a brand token whose name ended in a role word, such as color.brand.dark-bg or button-primary-bg, overwrote the matching role (bg, ink, accent or border) while readiness still said ready. Now a token maps to a role only when its whole name is a role, like color.bg or color.roles.bg, and every other token keeps its own key under brand. When two tokens in one import claim the same role, I keep the first, store the other under brand and list both under conflicts. Any role an import changes is listed with its old and new value, and readiness flags it for review. Reported by D.W.

October 9, 2026
WordPress plugin v9.1.32 Patch October 9, 2026 Find and replace edits on large values
  • Find and replace edits on large values. respira_update_custom_post, respira_update_option and respira_write_theme_file take edits: a list of exact find and replace pairs applied to the value as stored, so a small change to a large stylesheet no longer means sending the whole thing. Each find must occur exactly count times (default 1) in what is stored; otherwise the call is refused, names the edit, says whether it matched zero or several times, shows excerpts of the nearest text, and writes nothing. Edits apply in order, and every guard a full write has stays in place: protected options, the snapshot, duplicate-first, approvals. The site's own MCP endpoint offers edits too. Asked for by a customer on Divi 5 with 53 KB of Additional CSS, where every change meant retyping the stylesheet into the tool call.

  • A hash of what was stored. The three tools, and respira_append_theme_file, answer with content_sha256 and content_bytes of the stored value, so a client that keeps its own copy of the file can tell whether the two agree.

  • Additional CSS changes now show on Divi. Divi writes the Customizer's Additional CSS into its own static CSS files and serves them until it marks them stale, which a plain update of the custom_css post never did: the change was stored and the public page kept the old styles until a Theme Builder layout was saved again. A write to the Additional CSS post now purges site-wide and clears Divi's static CSS (Divi 4 deletes the files, Divi 5 stamps them stale), and respira_purge_cache does the same on every call, reporting what happened under divi_static_css with the evidence it read back. A key whose user cannot edit posts is told that Divi declined the clear, instead of a silent no-op.

October 9, 2026
WordPress plugin v9.1.31 Patch October 9, 2026 Exhale restyle on Divi 4 writes Divi 4 attributes
  • Exhale restyle on Divi 4 writes Divi 4 attributes. The style map was the Divi 5 one whichever Divi the site ran, so a restyle conversion on Divi 4 stored shortcodes with names such as moduledecorationspacingdesktopvaluepaddingtop="18px", the Divi 5 attribute paths flattened by the emitter, and not one custom_padding, background_color, border_radii or box_shadow_style. Divi 4 ignores them, so the sections kept no padding or background of their own and the cards lost their background, border, radius and shadow. The map now follows the Divi runtime, the same detector every Divi write uses: a Divi 4 target gets Divi 4 attributes in Divi's own formats (custom_padding and custom_margin as top|right|bottom|left|false|false, border_radii as on|tl|tr|br|bl, a border side only with its width, style and colour together, a box shadow under box_shadow_style="preset1" with its six parts, background_image as a bare URL with Divi's own size, position and repeat words), and typography lands on the module's own font group (text_font_size, header_2_text_color, button_text_size with custom_button="on", text_orientation), where before it was dropped without a word. A Button module's background, border and radius go to button_bg_color, button_border_width, button_border_color and button_border_radius, the only names it reads. The section padding default is written per target too. Divi 5 output is byte for byte what it was.

  • The Divi 4 emitter refuses a Divi 5 attribute path. A dotted path, or one already flattened into a desktopvalue name, is no longer written to a shortcode; it is dropped and named in the build warnings as divi4_attribute_refused, once per key and module, so this class of dead attribute cannot reach a page silently again.

  • Exhale fidelity mode fits a large stylesheet instead of refusing it. The top failure of Exhale conversions in the last thirty days was respira_css_too_large (seven times on five sites, on Oxygen, Bricks, Divi and Elementor), and the refusal told the person to trim a stylesheet whose size was mostly mine. Scoping gave every selector a page prefix (45 bytes on Divi, 63 on Elementor) and every selector ending in a bare tag an editor guard (74 bytes on Divi, 531 on Elementor), so a 45 KB AI-written landing page that ships its whole component library came to 93 KB on Divi and 197 KB on Elementor, over the 150 KB cap. Three changes. The sheet is pruned to the rules this document can use before it is scoped, the document's own <style> blocks included and not only a fetched framework sheet: a rule stays when any selector of its list matches an element, judged with pseudo-elements, dynamic pseudo-classes (:hover, :focus-visible, :checked, :target), state attributes ([aria-*], [data-*], [open], [hidden]) and script-toggled classes (.is-*, .active, .open, .scrolled, .menu-open) taken off first, so .btn:hover is judged on .btn and .reveal.is-visible on .reveal; :root, html and body rules, @font-face, @keyframes and every selector the engine cannot read stay, and the count goes in the conversion warnings as rules_pruned. A selector list whose members weigh the same and carry the same guard and pseudo-element is folded into one :is(), so h1, h2, h3 pays the prefix and the guard once; :is() takes the weight of its heaviest member, so a list of mixed weight (.btn, a) is still written member by member, and nothing a rule matched before changes. When the sheet still does not fit, the refusal states the numbers: the source size, the size after pruning, the scoped size and how much of it is my scoping, with the advice following the larger share. On that 45 KB page: Divi 93 KB to 50 KB, Bricks 66 KB to 35 KB, Elementor 197 KB to 107 KB, Beaver Builder 162 KB to 87 KB, WPBakery 112 KB to 61 KB. Stored sheets are untouched, and the 9.1.28 and 9.1.30 rescope passes leave the new form alone.

  • Two small things that fixture found. A skip link as the first child of <body>, which every accessible AI-written page has, raised an undefined-index warning on every fidelity path; and the editor guard landed after a vendor pseudo-element (summary::-webkit-details-marker), which a browser drops as invalid, so the guard now sits before every pseudo-element spelling.

  • A converted row's columns keep their settings on Divi 4. The columns' own attributes were only carried when the row arrived without a column_structure, and the HTML converter always writes one, so a column's background, border and class never reached the page. They are carried whether or not the row declared its structure.

  • inject_builder_content with HTML decides its Divi target. That path never set it, so a Divi 4 site reached through it got Divi 5 attribute paths and a Divi 5 site got them without the Divi 5 handling. It now decides the way convert() does.

  • Pages converted on Divi 4 before this release still hold the dead attributes in their shortcodes. They do no harm and nothing reads them; I do not rewrite stored pages on update, because the Visual Builder drops unknown attributes on its next save anyway and a one-time rewrite would change pages nobody asked me to touch. Converting the page again writes it correctly, and the next targeted edit on such a module drops its dead attributes with a warning.

October 9, 2026
MCP server v8.4.19 Patch October 9, 2026 content_file on respira_update_custom_post, respira_write_theme_file and respira_update_option: an absolute path of a text file on this computer whose contents the server sends as content (or value), so a stylesheet that is already on disk is not retyped into the tool call
  • content_file on respira_update_custom_post, respira_write_theme_file and respira_update_option: an absolute path of a text file on this computer whose contents the server sends as content (or value), so a stylesheet that is already on disk is not retyped into the tool call. It is off until allowedContentDirs lists a folder in config.json, on the site or under preferences; the path is resolved through symlinks and has to sit inside one of those folders, .. does not escape, 2 MB is the cap, and the file has to be UTF-8 text. The answer carries the file's sha256 next to the site's content_sha256, with matches_stored saying whether the two agree. This local stdio server only: the plugin's own MCP endpoint refuses the parameter, because the site cannot read a file on your computer.

  • edits on the same three tools, handed to plugin 9.1.32 unchanged: exact find and replace pairs applied to the stored value, each one required to match exactly once (or count times) or nothing is written. The tool descriptions say to prefer edits for a small change to a large value. A plugin older than 9.1.32 is told so before anything is sent, because an older update_custom_post would ignore the parameter and report a write it did not make. Asked for by a customer on Divi 5.

  • respira_purge_cache's description says it also clears Divi's static CSS files and reports the result under divi_static_css.

  • The enabledTools and allowedContentDirs preferences in config.json survive the server's config normalisation; enabledTools used to be dropped there.

October 8, 2026
WordPress plugin v9.1.30 Patch October 8, 2026 Divi 4 sites are no longer taken for Divi 5
  • Divi 4 sites are no longer taken for Divi 5. The check asked whether the divi/section block type was registered, and I register every Divi 5 block type myself on any Divi site, so the Theme Builder wrote a Divi 4 header as Divi 5 blocks that Divi 4 could not render or open, and the HTML converter shaped Divi 4 pages for Divi 5. There is now one detector of the Divi runtime, reading Divi's own switch and version constants and never the block registry, and the module registry, the converter, the widget shortcuts, the site context and the Theme Builder routes all ask it. On Divi 4 a Theme Builder node array is stored as shortcodes, the same way build_page stores a page, and Divi 5 block markup sent as a string to a Divi 4 site is refused with a reason instead of saved blank. Divi 5 behaviour is unchanged.

  • Exhale restyle keeps the Theme Builder header and footer as they were. A page converted into Divi's own styling with the theme's template wrote its stylesheet and Divi's stood-down section and row defaults on #page-container, which also holds a Theme Builder header and footer, so the header's menu row lost its width and padding and the footer columns ran full width. I now keep every rule inside the page's own layout, at the same specificity, and pages converted before this release are corrected the moment they are read, in the front end and in the Visual Builder alike, without a reconversion. On a site with such a page, Divi's static CSS files are cleared once after the update.

October 8, 2026
WordPress plugin v9.1.29 Patch October 8, 2026 Exhale fidelity mode now lands on Divi 4
  • Exhale fidelity mode now lands on Divi 4. Before, a Divi 4 site rejected the whole conversion with "Required attribute content missing for module et_pb_text" and stored nothing, because the validator never read the settings a module carried while the shortcode writer did. I also taught the fidelity builder what Divi 4 cannot do: a nested box keeps its markup as written in a Code module instead of becoming a Group module Divi 4 does not have, headings and images keep their own tags so the page stylesheet still finds them, and a style attribute becomes a rule of its own. Divi 5 output is unchanged. In the Divi 4 Visual Builder the converted modules can be hovered, selected and edited like any other module.

  • The Divi 5 Visual Builder opens at full size on a converted page. On a page converted by Exhale in fidelity mode, the editor's workspace shrank to a small box in the corner, because the page stylesheet reached the editor's own canvas frame. The stylesheet now stays out of the editor window, and pages converted before this release are corrected when they are printed, with no reconversion. Reported by B.

  • A Divi 4 image's link is written as the link. On a Divi 4 site, respira_update_element on an image module with url replaced the picture with the link target and left the Image Link URL untouched; sending src and url together put the picture back and still did not write the link. url is the image's own link attribute, and I now leave it there; the words image_url, link and href land on it too, the way a button's url lands on button_url. The response for a Divi 4 edit now lists the attributes it wrote in changed_fields instead of an empty list, and a write where the value was already in place says which attribute already held it. Reported by D.S.

  • A site connected from the respira.press dashboard can read every meta key on a post. include=meta.all was refused for the dashboard's site token, which carried builder access only, and the refusal sent you to mint a Full key in wp-admin, which the connector never sends. The token now reads what a Full key reads unless the site's dashboard policy caps it to content or read only. A scope refusal and respira_diagnose_connection now say which credential I checked and what it can do.

  • wp-admin says when the site is behind. When a site runs an older Respira than the current release with automatic updates off, the Plugins screen and Respira's own screens say which release is out and which one the site runs, and why it matters to an agent (the newest tools answer "route not found" on an older plugin), with "Turn on automatic updates" and "Not now". "Not now" keeps it quiet until the next release. Nothing is shown under white label, while the server blocks automatic updates, or to anyone who cannot update plugins. Reported by M.M.

October 8, 2026
WordPress plugin v9.1.28 Patch October 8, 2026 Exhale's page stylesheet on Divi stays inside the page body
  • Exhale's page stylesheet on Divi stays inside the page body. A page converted in fidelity mode carries its own stylesheet, scoped to Divi's #page-container. On a site with a Theme Builder header and footer that container holds them too, so the moment the converted page left the blank template the page's rules and the reset underneath them landed on the header menu, which turned into a plain vertical list, and on the footer, whose columns stacked. Every rule is now anchored on the post's own layout (.et-l--post), on the front end and in the Visual Builder, so a Theme Builder header and footer keep their own look on a converted page. The page's body type (font, size, colour, line height) now sits on that layout too, not on the body, so a header or footer module that has no type of its own keeps the site's body type instead of taking the page's; the page's background and margins stay on the body. Pages converted before this release are corrected by the update itself: the stored stylesheet is rewritten to the new scope where it is printed, no reconversion needed. Reported by B.

October 4, 2026
WordPress plugin v9.1.21 Patch October 4, 2026 Respira Exhale pages match the file on any theme
  • Pages that look like the file.

  • Respira Exhale pages match the file on any theme. A converted page took the theme's body size where the file left it to the browser (22px on Twenty Twenty-Five instead of 16px), and on themes that change the root size (Bricks sets 62.5%) every rem in the file came out at 10px. The page now starts from the browser's text sizes and the root size the file assumes, and keeps the file's own body font, colour and line height. Measured on two test pages: 99.5% to 99.9% alike on Elementor, Breakdance, Beaver Builder, Gutenberg and Bricks, desktop and phone.

  • A paragraph with a quote stays one paragraph. A paragraph holding <q>, <cite>, <del>, <ins> or another text-level tag was split into a row of separate text elements and lost its paragraph styles.

  • The conversion report names only what is really lost. Attributes kept in an element's own markup (an svg's viewBox, aria-hidden on a list) are no longer listed as dropped.

  • Restyle mode (the path on builders without fidelity mode, and on request): a list keeps its items and links instead of Elementor's placeholder items; a rule scoped to one section (.cta .btn) styles only that section; an outline button stays transparent; and numbers written without a leading zero (.12em, .875rem) keep their value instead of becoming 12px or 875px.

  • Share links show Beaver Builder and Brizy drafts. Both builders refused to draw a draft for a logged-out visitor, so a shared draft rendered as an empty page. A share link also no longer redirects to a draft's permalink, which sent a draft without a slug to the home page.

  • Bricks keeps a block a block. A block with flex settings was turned into a container, which caps and centres it at the content width and moved layouts (a header's links jumped to the middle). On a site running the Bricks theme with another builder plugin active, Bricks is now the site's builder, as Divi already was.

  • Divi 5 buttons in Divi's own format are accepted. A button whose text sits in Divi's envelope was refused for "missing button_text".

  • Site context after a theme switch. get_site_context and get_builder_info named the previous theme and builder for up to an hour.

  • A Respira release is seen right away. list_updates with refresh and update_plugin reused a four-hour cached answer and said "no update" for Respira just after a release.

  • list_theme_builder_templates answers that it lists Divi templates only on a site without Divi, instead of failing.

  • read_page and read_post report the page template.

  • Clean errors in the chat. A PHP error, another plugin's output or an error page answering a tool call becomes one plain sentence, with no markup, server paths or keys. Error details no longer carry request headers or cookies, and a value that cannot be encoded no longer turns a result into empty text.

  • build_page takes template: the builder's blank template for a page that draws its own header and footer (Elementor canvas or header-footer, Beaver blank, Divi blank).

  • A rare plan note from Mihai on an account that gets a lot done on its plan, shown on one result at most twice a day and never as a warning. Nothing is limited or slowed. The respira_plan_note_enabled filter turns it off.

  • Skills: html-to-page (one Respira Exhale call for a finished HTML page, on any builder) and build-elementor-page (building an Elementor page by hand without the usual gaps). html-to-bricks and html-to-breakdance now describe fidelity mode as it runs.

  • Tool descriptions say how to check a draft's render (pass its share link to check_design or find_in_page), expose inject's mode and confirm_replace, point a user's own images to upload_media, and describe Elementor's widget spacing, Elementor containers and where Divi 5 styles go.

October 4, 2026
MCP server v8.4.16 Patch October 4, 2026 When the site answers with PHP warnings before its data, the data is read instead of the warnings going into the chat
  • When the site answers with PHP warnings before its data, the data is read instead of the warnings going into the chat.

  • Any other answer that is not JSON (a host page, a PHP error, plain text, a cut-off or binary body) becomes one sentence that says what answered; for a write it also says the target has to be read back before trying again.

  • Error details from the site no longer carry request headers, cookies, stack dumps or the API key, and are kept small.

  • Control characters and the site's own credentials are removed from every result. A successful result is never shortened.

  • With no site configured, the answer names the real setup page, the "Connect Cowork" button and the one-time code, instead of a bare "No WordPress site configured".

  • wordpress_build_page takes template: the builder's blank template for a page that draws its own header and footer (Elementor canvas or header-footer, Beaver blank, Divi blank).

  • check_design's url says a draft is checked through its share link.

  • A rare plan note from Mihai (respira_plan_note) on an account that gets a lot done on its plan: asked once a session in the background, shown on one successful result after the eighth, then not again for three days on the machine. Nothing is limited. RESPIRA_PLAN_NOTE=off turns it off.

  • Bundled skills: html-to-page and build-elementor-page; html-to-bricks and html-to-breakdance updated.

October 3, 2026
WordPress plugin v9.1.20 Patch October 3, 2026 JetEngine listings take element writes again
  • JetEngine listings take element writes again. update_element and batch_update on a JetEngine listing died with "array_map(): Argument #2 must be of type array, string given" before anything was written, and left an unapproved duplicate behind. JetEngine answers get_post_meta for its listing posts with a plain string where WordPress returns a list. The meta read now accepts both, and the write receipt can no longer be the reason a write fails. Reported by G. on two sites.

  • Elementor append works with Elementor's own format. mode append merged the page's existing (already simplified) elements with the new native ones, then decided how to read the whole list from the first node, which is always an existing one. The new section was never converted and the untyped-widget tripwire refused it. Each node is now read on its own; the tripwire still refuses a genuinely untyped widget, and its message names the first offending element's path, id and type. Reported by M.R.

  • Custom CSS on block pages is stored and renders. update_page, update_post and update_custom_post silently dropped custom_css on Gutenberg, Kadence, Spectra, GenerateBlocks and GreenShift pages while reporting success. It now goes to _respira_page_css, printed after the fidelity stylesheet, re-pointed to the duplicate's id for the preview and back to the original's on approval; the snapshot and write receipt cover it. A builder with nowhere to keep page CSS refuses with respira_custom_css_unsupported before any duplicate is made. Reported by J.G.

  • Divi Theme Builder page templates keep the global areas. A page-specific header or footer made through Respira went into a new template with its other areas empty, and Divi shows the theme's own header or footer in an empty area; a second layout for the same page went into a second template that lost the tie. New templates now carry the global layouts, a second layout for the same conditions goes into the existing template, updates clear the caches Divi's own save clears and list which templates render the layout, and list_theme_builder_templates warns about a dropped global area or a shared condition. Reported by C.P.

  • Divi 5 global modules use Divi's shape. save_divi_library_item now wraps the item in divi/placeholder, and the page reference carries blockName and localAttrs, as Divi's Save to Library does. A global text module no longer blanks every other text module on the page, a global code module renders, and apply_divi_library_item places the reference inside the page's wrapper. Unparsable block attributes are refused on save as they already were on update_custom_post.

  • A date set on a page duplicate survives approval. update_page wrote the explicit-date marker on a variable it never defines.

  • An ability refused by its own plugin says why. WordPress's ability_invalid_permissions arrived as a bare 500. Respira now runs the plugin's permission check again with the same input and user and answers 403 with the ability, the WordPress user and roles, the plugin's own reason and the fix when it is known (WPForms create-form: wp-admin, WPForms, Tools, AI MCP, Enable MCP Write Access). search_abilities shows the same answer as permission_check. Reported by S.G.

October 3, 2026
MCP server v8.4.15 Patch October 3, 2026 A 500 with ability_invalid_permissions from an older plugin now reads as a refusal by the ability's own permission check, not a server fault, names the WPForms MCP write switch and says retrying will not help
  • A 500 with ability_invalid_permissions from an older plugin now reads as a refusal by the ability's own permission check, not a server fault, names the WPForms MCP write switch and says retrying will not help. Plugin 9.1.20 answers 403 with the details itself.

  • update_page, update_post and update_custom_post describe where custom_css is stored on each builder and that a builder with nowhere to keep it refuses.

  • save_divi_library_item and apply_divi_library_item describe the Divi 5 shape they now write (placeholder-wrapped item, blockName and localAttrs on the reference).

October 2, 2026
WordPress plugin v9.1.15 Patch October 2, 2026 Change one theme setting without sending the rest
  • Change one theme setting without sending the rest. respira_update_option takes path, the key to change inside an option that holds many settings, such as Divi's et_divi. Send option: "et_divi", path: "custom_footer_credits" and the new credit as value: that one key changes and every other setting in the option is kept as it was, keys and passwords the agent never saw included. A dot path reaches a nested key (social.facebook_url), and a list of keys reaches a key with a dot in its name. The answer carries the old value as previous and the stored one as value, hidden as [redacted] when they look like a key. The whole option is kept as a snapshot first, so one restore puts the key back, and the activity log names the option and the key.

  • Read one key of a settings option. respira_get_option takes the same path and returns that key alone, with exists: false when it is not there. A key that looks like a password is hidden as on a full read, and reveal_secrets asks a person only when that key holds one.

  • find_in_page names the Divi footer bar credit. Asked for text in the footer bar, it now answers with the option et_divi, key custom_footer_credits, the place in wp-admin (Divi, Theme Customizer, Footer, Bottom Bar, Edit Footer Credits), the switch disable_custom_footer_credits next to it, and the exact call to change it. When the site shows Divi's own "Designed by Elegant Themes | Powered by WordPress", it says the credit is Divi's default and that setting custom_footer_credits replaces it.

  • Build a global header, footer or body, show it, then put the same one live. An agent can create a Divi Theme Builder layout unassigned, show it to you, and once you are happy, assign that same layout to every page or to the pages you choose: create_theme_builder_template now takes the layout's layout_id with kind and assignments, and no structure. Nothing is copied or rebuilt, so what goes live is what you reviewed. The checks a new template gets apply here too: every page needs confirm_live_edit before the site's default template changes, a header or footer already in place is never replaced, a layout another template already uses is refused with that template's name, and sending the same assignment again changes nothing. The answer returns a rollback that undoes the assignment and leaves the layout where it is. Works on Divi 4 and Divi 5.

  • list_theme_builder_templates lists the layouts not in use yet, under unassigned_layouts, with id, kind, name and last change, so the agent can find the one you reviewed.

  • update_theme_builder_template names the next step when there is nothing to update. For an empty slot, a template id or a layout that does not exist, it says how to put a reviewed layout live. After it updates a layout that no template uses, it says no page shows it yet.

  • A path write meets every rule a full write meets. Protected options stay closed, [redacted] is refused as a value, text stays text unless allow_type_change is sent, a PHP object is not replaced unless allow_object_overwrite is sent, and a site that asks a person before option writes asks before a path write too, naming the option and the key. A path walks arrays only: text, a PHP object or a missing key on the way is refused with the step named, and it never creates an option or the arrays on the way. Up to 6 keys of up to 128 characters each.

October 2, 2026
MCP server v8.4.13 Patch October 2, 2026 path on respira_update_option and respira_get_option (plugin 9.1.15)
  • path on respira_update_option and respira_get_option (plugin 9.1.15). Change or read one key inside an option that holds many settings, without sending the rest. Use it for theme settings such as Divi's et_divi: option: "et_divi", path: "custom_footer_credits". A dot path or a list of keys, up to 6.

  • wordpress_create_theme_builder_template takes layout_id. An agent can build a Divi global header, footer or body unassigned, show it to the person, then call the tool again with layout_id, kind and assignments to put that same layout live, without sending the structure again. name is optional when layout_id is given. The tool description states this review, then publish flow. Needs the plugin release that adds the parameter.

  • A path write waits for a plugin that knows path. Before a write with path is sent, the server confirms the site runs plugin 9.1.15 or newer. An older plugin would store the one key's value as the whole option, so on an older or unconfirmed version nothing is sent and the answer says to update Respira. A write without path is sent as before.

  • Assigning an existing layout waits for a plugin that knows layout_id. The server confirms the site runs plugin 9.1.15 or newer before it sends layout_id. An older plugin would read the call as a new, empty template, so on an older or unconfirmed version nothing is sent.

  • respira_update_option forwards approval_token when one is given, for sites that ask a person before option writes.

October 2, 2026
MCP server v8.4.10 Patch October 2, 2026 wordpress_find_in_page (plugin 9.1.11)
  • wordpress_find_in_page (plugin 9.1.11). Finds text in the HTML a visitor gets for a page, head included, and names the snippet or setting on the site that holds it: Elementor Custom Code, WPCode, the header and footer code options of WPCode, Perfmatters, Divi, Avada and Bricks, the theme's Customizer code settings. Takes post_id or url (this site only), contains, kind (any, head or jsonld) and limit. Read only.

  • wordpress_check_structured_data takes contains (plugin 9.1.11). The answer lists every JSON-LD block with its values, location and the plugin that printed it, and contains keeps the blocks that hold a value.

  • wordpress_find_element searches content, text and class on every builder (plugin 9.1.11). The description says each match names its field with a snippet and that no match is a normal answer with found: 0. wordpress_apply_builder_patch points at it for pages other than Divi 4.

September 16, 2026
AER key visual

Ready for AER: the site-side 9.0 release

Respira AER is the agent workspace in the Respira dashboard. Respira for WordPress 9.0 is the runtime installed on each site: it gives AER secure access to the site's builders, memory, approvals, snapshots and receipts without putting another chat inside wp-admin. Across 8.x the plugin learned five things one release at a time. It remembers a site and enforces its rules. It knows the site's art direction and checks work against it. It lets clients talk back through Murmur. It lands a designed page as native builder output. And it proves what change runs did. Version 9.0 brings those parts together and adds an Open in Respira AER button plus a Ready for Respira AER checklist. Murmur links and client notes, spoken ones included, show up where you work. Site memory and Art Direction are on screen next to the pages they govern. The security audit gives the same answer whether you or your agent run it from an app connected over MCP, from Respira AER or from the site's own endpoint: the known vulnerabilities that match its plugins, themes and WordPress version, checked against Wordfence Intelligence, each with the version that fixes it, and never a clean report when that database cannot be reached. Change runs leave receipts, and reversible content work keeps its snapshot or undo.

1 chat connected to all your WordPress sites
4 model providers, on your own key
0 tokens marked up by Respira
  • Security A dry run no longer skips approval on a tool that cannot dry-run (and 8 more)
  • Removes Sentry (and 5 more)
Read the full story
Show the 53 entries
  • The AER release. Your site remembers, keeps its art direction, hears your clients and checks its security when you ask, and Respira AER is the first place that uses all of it at once. Nothing breaks: keys, connections, settings and snapshots carry over, and the plugin still needs only WordPress 5.8 and PHP 7.4. 9.0 also carries the 8.9.5 and 8.9.6 fixes, among them a bug where editing an Elementor page could change its accented letters (é saved as u00e9) and its line breaks: updating fixes it, and a page that was changed can be restored from its snapshot in Activity.

    Across the 8.x line, over 130 releases in seven weeks, the plugin stopped being a bridge with builder smarts and became the site's half of an agent workspace. It remembers the site and enforces its rules at the moment of the write (site memory, 8.3 and 8.6). It knows its art direction and checks pages against it (Art Direction, 8.5 and 8.6). It lets clients talk back, typed or spoken, through Murmur links (8.9). It lands a designed page as native builder modules: a page that scored 17 out of 100 as a conversion scores 100 on Divi 5 in fidelity mode (8.8.34). And it proves what every write did, with write receipts, a sealed audit log, a guard against collateral damage and fenced untrusted text (8.3 to 8.8). Along the way it gained 32 MCP tools in five families (Murmur, Art Direction, site memory, Divi presets and library, security), GreenShift as the 17th builder, access profiles, governance on every REST write, and security scans matched against known vulnerabilities for plugins, themes and WordPress itself.

    Respira AER, which opens with this release, uses all five together, across every site you connect, from a browser on a laptop or a phone. 9.0 brings it into wp-admin: open a site or a page in Respira AER from where you work, see whether Respira AER can work on the site and why, and read your clients' Murmur notes next to the rest of the site's activity. The security audit runs when you or your agent ask for it, from any app you connect, and every app now gets the same answer, known vulnerabilities included, with tools to fix what it finds. Nothing scans on its own. And the plugin got lighter: no Sentry, no Google Fonts, no hidden old admin, and nothing on your visitors' page views. Respira AER 0.2 arrives alongside, with the same readiness checklist for each site and passes for a security review, a client report and a review loop.

  • Open this site in Respira AER from wp-admin. When your plan includes Respira AER, Home has a Respira AER card that opens this site in it, the Respira AER row in Connected apps opens it too, and the admin bar offers "Ask Respira AER about this page" on any single page or post and in the editor, with the page already named in the prompt. Provider keys stay on respira.press. None of it shows on a white-labelled site.

  • Ready for Respira AER. A checklist on Home says in plain words whether Respira AER can work on this site: the licence, whether respira.press has reached the site recently, whether the access profile or the site's policy allows writes, whether your server passes the Authorization header through, and what your plan includes. Respira AER reads the same checklist from the site, so both sides give the same reasons.

  • Client feedback in wp-admin. Activity has a Feedback tab: live Murmur review links with copy and revoke, the notes your clients left grouped by page with the element each one points at, reply and resolve, a new review link for any page, and "Open in Respira AER" on every open note. Home tells you when client notes are waiting. Below the Builder plan, existing notes stay readable and the screen says what the plan includes.

  • Your agent can write the client report. generate_activity_report reads the site's activity log for any period and returns what changed, concrete examples and time saved, on the npm server and on the plugin's own MCP endpoint. The seven Respira skills that call it now work.

  • Two new tools fix what the security audit finds. update_theme updates a theme the audit flagged. revoke_application_password removes an application password you do not recognise, using the id the audit reports. Both ask for your approval first, and the password the request itself signed in with is never revoked.

  • A new major version says what it brings before you update. An update that crosses a major version now carries a one-line notice on Dashboard, Updates and under the plugin's row on the Plugins screen: what the release brings, that nothing breaks, and the minimum WordPress and PHP versions. A notice sent by the update server takes its place when there is one.

  • What's new describes 9.0. The About screen tells the AER release and the 8.x line behind it, reads the version from the plugin itself, and no longer shows counts and versions that went stale.

  • The welcome screen shows today's three steps: link the site to respira.press, connect Respira to your AI coding tool or open Respira AER, then ask for the three most recent posts.

  • Memory and Art Direction open the right dashboard page. "Edit in dashboard" goes to this site's Memory or Art Direction page on respira.press instead of the list of sites, and both screens can hand the work to Respira AER.

  • Old Respira admin links open the current screens in one step. Logs, Thank you, Approvals and the other addresses from before 7.1 open the matching screen of the current admin. Logs and Thank you used to open the old design.

  • Add-ons lists what you can buy today, the WooCommerce add-on and White label, instead of two add-ons that were never released.

  • Plans bought before the current pricing show as Starter (legacy) or Agency (legacy) in Settings.

  • Reports, Divi migration explains the readiness scan your agent can run, instead of saying the scanner is not available.

  • The Respira menu: Prompts is back in the WordPress sidebar, and the Founders page is no longer in it.

  • Visitors' page views no longer touch Respira's tables. The list of abilities Respira exposes is rebuilt only when something it depends on changes (an update, a playbook, an Inhale choice, the WooCommerce add-on), instead of on every request.

  • Usage reporting never slows down a change. Usage events are sent after the response, without waiting for an answer, and go straight to www.respira.press. The per-call usage counts now follow the opt-out switch in Settings (respira_usage_opt_out), as the other reports already did.

  • A lapsed licence is checked at most every 15 minutes, instead of on every request that asked.

  • get_core_web_vitals measures instead of estimating. It runs Google PageSpeed Insights and returns LCP, CLS and INP from real visitors when Google has the data, and it accepts a URL and a mobile or desktop strategy.

  • On the plugin's own MCP endpoint, update_option accepts any JSON type, plus the allow_type_change and allow_object_overwrite flags, the same as the npm server.

  • The Respira admin loads no fonts from Google. Its typefaces ship inside the plugin, so wp-admin sends nothing to a font service and looks the same offline or behind a strict security policy.

  • Tested up to WordPress 7.1, written in one place. The updater kept its own copies of "requires at least", "tested up to" and "requires PHP", and they drifted from the plugin header, so the update screen kept saying 7.0. It now reads the header, and an update server that describes the new version wins. Every respira.press address the updater calls uses www, so no request loses a redirect on the way.

  • The release zip carries only what runs. One exclude list builds both the release zip and the free build. The JSX and TypeScript sources, build scripts, developer tools and .env.example no longer ship in the release zip; the free build keeps the sources, because WordPress.org asks for the readable source of every minified file. The licence files of bundled packages now ship, and the build fails if the list ever drops a file the plugin reads at runtime.

  • The readme tells the truth about what leaves your site. A first-person privacy section, and an External services section that lists every call the plugin makes: what is sent, when, why and how to stop it. The description leads with the three ways in (your AI app, Respira AER and WebMCP), the FAQ covers today's flows, and the changelog keeps the last ten releases with a link to the rest.

  • Translations have one home. The bundled WebMCP screens and messages use the Respira text domain instead of the upstream plugin's, and the header no longer points at a languages folder that never shipped. A translation placed in wp-content/languages/plugins still loads.

  • Murmur stays out of page-builder editors. A stale or revoked review session can no longer mount the Murmur bar inside Divi's Visual Builder shell or canvas; the same guard isolates the frontend editing URLs used by Elementor, Bricks, Oxygen and Beaver Builder.

  • Plugin folders with spaces can be managed. Activate, deactivate, update and delete now accept the exact folder name WordPress reports instead of rejecting the route or looking for a different, sanitized folder.

  • A host-level LiteSpeed cache is no longer invisible. When the server identifies as LiteSpeed but its WordPress purge API is unavailable, cache reports say that stale HTML may remain at the host and point to the hosting control panel. Respira does not claim to have purged a layer it cannot reach.

  • WordPress 5.8, the minimum the plugin declares, works again. Four newer PHP string functions were replaced.

  • Deactivating Respira stops all of its scheduled tasks, including the Murmur relay and background jobs.

  • The "Setup guide" links in the one-click install grid open the right page on respira.press. They used to open a missing page on your own site.

  • The Divi 5 migration readiness report links to the right page.

  • The command palette counts 17 page builders, the same as the Builders screen.

  • Divi 5 duplicates can be edited independently. A copied element and every child now get fresh internal IDs, while links and other semantic references stay unchanged.

  • The Divi 5 pricing shortcut creates Divi's real pricing structure. It writes a Pricing Tables container with a Pricing Table child and keeps the plan's content on that child.

  • Divi 4 keeps third-party modules that Divi registered. A targeted edit beside a WPForms selector no longer refuses the whole write or drops the form module on round trip.

  • The companion MCP server 8.3.25 accepts the page ID names agents already use. Duplicate Page takes original_id, page_id or post_id and rejects a missing ID before any request.

  • In Settings, Browser AI, switching off "Publish all tools" lets you pick categories, instead of switching itself back on. The last category stays on, because none would mean all.

  • Admin messages and several screens read more plainly, Home, Activity, Setup and the admin bar among them, and the notices shown when both the free and the full plugin are installed. The network admin page is now called "Network sites and seats".

  • Sentry. Respira no longer loads Sentry's script in wp-admin and no longer sends the administrator's email and name to it. The plugin is about 1.7 MB smaller.

  • The previous admin design. It loaded hidden behind the current one on every Respira screen, and could flash on a slow connection.

  • The weekly accessibility task, which recorded a scan that never ran.

  • The "Enable" switch on the optional Settings, WebMCP page, which had no effect. Its public discovery and per-tool settings stay.

  • The Respira AER key box added in 8.7.0, which no screen could reach. Provider keys for Respira AER stay on respira.press.

  • The duplicate translation loader left over from when Inhale was a standalone plugin, and the Domain Path header that pointed at a folder the plugin never had.

  • A dry run no longer skips approval on a tool that cannot dry-run. The REST route let dry_run: true past the approval gate for every tool, but only make_responsive, the design token tools and apply_design_direction preview on that flag; the rest ignored it and wrote, so update_theme or revoke_application_password could run without a token. The skip now applies only to the tools that preview. The MCP transport never had the skip.

  • The security audit runs when you ask, and every app gets the same answer. You or your agent run it from any app you connect: Claude, ChatGPT, Cursor and the others, Respira AER, or wp-admin's own endpoint. Nothing scans on its own. Every app gets the same answer from the same tool, known vulnerabilities included: which installed plugin, theme or WordPress version matches the known vulnerability database (Wordfence Intelligence, matched on respira.press), how serious it is, and which version fixes it. When the database cannot be reached, the audit says so and never reports the site as clean.

  • Core security updates follow WordPress.org. When WordPress ships a security release for your branch, Respira can apply it the same day, without waiting for a Respira update first. Moving a site to a different WordPress branch is still refused.

  • Every plugin and theme update checks the site afterwards. The result now includes a health check (the REST API, the front page, and any fatal-error page), and tells the agent to stop a batch of updates when the site stops answering normally.

  • A deep scan only reads. The one check that writes a file (a harmless test file in uploads, to see whether the server would run PHP there) now has its own switch, probe_uploads_execution, and is off unless asked for. Security scans no longer set off file-change monitors.

  • Scan coverage is honest. Each bounded scan gets its full time budget, and the check for unexpected files in WordPress core says when it stopped early instead of reading as complete.

  • Only administrators can run the security audit.

  • Switching the Security category off in Settings, Browser AI switches off every security tool. The category now holds the audit, core security updates, theme updates and application password revocation. The audit and core updates used to sit under Site and context tools, so they stayed on.

  • "Delete everything" on uninstall deletes everything. It now also removes Murmur's reviewer data (names, emails and IP hashes), the WebMCP settings and the Inhale selection. The Inhale selection stays when the standalone Inhale plugin is active, because the two share it.

July 24, 2026
Canopy key visual

Every way WordPress builds pages

Respira spoke sixteen page builders. As of 8.0 it also speaks WordPress's own Site Editor: block templates, synced patterns, block navigation and design tokens, readable and writable on the same safety contract as everything else. A navigation link changes by exact block path, not by rewriting the menu. A pattern is created, read back through WordPress, render-checked, then placed by reference. Structural edits can wait for your approval, and every write leaves a snapshot, a normalised diff and a server-render result. The WooCommerce add-on goes to 4.0 alongside it, and its storefront tools now try the native block path first, so a shop built in the Site Editor stops being a place where the store tools quietly go dark. Building all of that meant auditing the safety layer itself, which turned up two places where the safety mechanism was the thing doing the damage: a Divi serialiser rule written for brand-new pages was firing on every write path, and undoing a Theme Builder create could trash a template the agent never created. Both fixed, both pinned by permanent tests.

16+1 builders, plus the native Site Editor
2 safety bugs found by auditing the safety layer
0 writes reported done without a render check
Read the full story
Show the 11 entries
  • Canopy makes the native WordPress Site Editor a first-class target: block templates and template parts, synced and unsynced user patterns, and block navigation, all on the same staged-safety contract as the rest of Respira. Every structural write is fingerprint-guarded against stale bases, can be staged for approval, snapshots before it changes anything, and returns verified only after WordPress actually renders it. Structural writes are beta-gated per site; read-only discovery is available everywhere.

  • Native FSE structure service for templates and template parts with hierarchy/source discovery, exact block-path operations, stale-write fingerprints, structural proposals, snapshots, normalized diffs, cache invalidation, and stored/frontend verification.

  • Native user-pattern and block-navigation editing on the same structural contract: registered theme/plugin patterns remain read-only; editable user patterns support synced/unsynced state; navigation responses include compact nested paths; referenced deletes are refused by default; and successful writes require read-back plus WordPress server-render verification.

  • First-class Site Editor and Gutenberg design-token MCP surfaces.

  • Agent-facing activity list/detail endpoints linking audit entries to snapshots, proposals, approvals, and rollbacks.

  • Shared mutation-result contract for dry runs, pending approvals, verified writes, stored-but-unverified writes, rollbacks, and failures.

  • Ability discovery now labels results as Respira-native, inhaled, unavailable, or replaced by a safer Respira workflow and returns the preferred next tool.

  • Rewriting a Divi Theme Builder global layout now requires explicit confirmation. update_theme_builder_template refuses the first call with respira_tb_live_edit_confirmation_required, naming the layout and stating that the change hits every page using it and goes live rather than waiting for approval. Re-send with confirm_live_edit=true to proceed. Same handshake update_page and delete_page use for force-editing an original. This is a confirmation, not staging: a global layout cannot be staged on a duplicate the way a page can, because Divi resolves the assigned layout by id and a second copy would compete with the original rather than stand in for it. Creating a layout is deliberately not gated, since it already refuses to replace an existing global. Real staging for globals is next.

  • Plugin activation now performs dependency and platform preflight, activates in a signed one-time fresh request, probes REST/frontend boot, and narrowly rolls back only the newly activated plugin on failure.

  • Snapshot restoration understands block templates and template parts.

  • Usage telemetry includes only privacy-safe runtime, theme, target, template-source, and verification-state dimensions.

  • Structural FSE and Global Styles mutations are beta-gated per site by default; read-only template discovery remains available everywhere.

June 26, 2026
Same Story key visual

The plugin now tells the same story as your dashboard

The setup and connection screens were rebuilt around one source of truth. You link a site once, then watch the moment your first agent reaches it: the screen updates on its own and names what just happened, for example "connected. Claude just ran update_page on page #42". The plugin, the dashboard and your agent now read the same connection state, so they always agree on whether a site is connected and what access it has. One-click installs (the Desktop app, Cursor, Cowork) lead the way in, with browser sign-in still there for ChatGPT and claude.ai. Sites also arrive in the dashboard with their real WordPress title instead of a bare URL, which matters the moment you run more than one. And seven builder fixes land across Bricks, Divi, Elementor 4.x and Gutenberg.

1 source of truth for connection state
2 screens rebuilt around live state
7 builder fixes
Read the full story
Show the 9 entries
  • The setup and connection screens now show your site coming alive. They tell the same story as your respira.press dashboard: link the site once, then watch the moment an agent first reaches it. When an app connects, the screen updates on its own and names what just happened (for example "connected. Claude just ran update_page on page #42"), so you are never left guessing whether the link worked. One-click installs (the Desktop app, Cursor, Cowork) lead the way in, and signing in through the browser stays available for ChatGPT and claude.ai. The screens also read connection state from a single source now, so the plugin, the dashboard and your agent always agree on whether a site is connected and what access it has.

  • Your site now arrives in the dashboard with its real name. The plugin sends your WordPress site title when it activates and when it checks in, so a site shows up by name instead of a bare URL when you manage more than one.

  • Bricks: moving or nesting an element no longer drops its siblings. Reordering or re-parenting an element on an existing Bricks page used a nested-tree move against Bricks' flat element tree, which could leave other elements behind. Moves now reparent cleanly and keep every sibling. Reported by a customer.

  • Bricks: a link set to open in the same tab now does. Bricks decides whether to open a new tab based on whether the setting is present at all, so switching the toggle off still opened a new tab. The setting is now removed when it is off. Reported by a customer.

  • Divi: editing a single module now refreshes the cached CSS. A single-module or update-page edit on Divi did not clear Divi's static CSS cache, so a change could look like it had not applied until the next full save. The cache is now cleared and re-warmed on those edits too.

  • Divi: custom post types are no longer corrupted by certain color settings. A color setting that contained square brackets could end the shortcode early and spill raw text into the page. Those characters are now encoded so the layout stays intact. Reported by a customer.

  • Elementor 4.x: atomic elements render instead of coming back empty. Atomic (v4) elements were missing a few schema fields Elementor expects, which left them blank and could throw a 500 in the page head. Those fields are now always written. Reported by a customer.

  • Gutenberg: editing inside a Columns block no longer blanks the column wrapper. Updating an element nested under a core Columns block could wipe the column's own width and class. The wrapper is now kept intact when the structure has not changed. Reported by a customer.

  • Nested append edits are honored. An inject request that set its mode inside the content rather than at the top level was treated as a full replace. The mode is now read from either place, so an append stays an append. Reported by a customer.

June 12, 2026
Clearing key visual

What the agent writes is what actually lands on the page

A deep pass through every supported builder, closing the gaps where a write reported success but the page stayed stale or blank. Styling now lands on Oxygen, Beaver Builder, Elementor v4 Atomic, Bricks, Divi 4 and Divi 5. Brizy and Visual Composer move from read to write, with their caveats stated. Recovery gets deeper: custom CSS and page settings are captured, and globals are versioned, so deleting a Bricks global class, a Divi preset, or an Elementor kit color leaves a recovery point. And when something cannot be persisted in a way the builder reads, Respira says exactly what did not land instead of reporting success. Every fix verified on a real site by loading the actual rendered page.

12 builders verified end-to-end
2 builders moved from read to write
6 verification stages per builder
Read the full story
Show the 18 entries
  • This release is about making sure that what the agent writes is what actually lands on the page, and that you can always get back to where you were.

    When you ask an AI agent to change a site, "success" should mean the change is live, not just that a database write returned without an error. Across a deep pass through every supported builder, I found places where Respira wrote data in a shape the builder didn't read, or skipped a step the builder needed to render, and reported success anyway. The page stayed stale, or blank, and the agent had no way to know. Clearing closes those gaps. Every fix in this release was verified on a real site with the real builder installed, by loading the actual rendered page, not by trusting the write.

  • Brizy moved from read to write. Respira can now write Brizy pages that Brizy's own editor opens and the front end renders. Writes are labeled with their caveats in the docs (front-end compile depends on Brizy's compiler service, so the site needs internet).

  • Visual Composer moved from read to write. Respira now writes in VC's canonical storage format, so the editor loads the page and the front end renders. Labeled with its caveats (VC recompiles on the next editor save).

  • Globals are now versioned. Deleting a Bricks global class, a Divi preset, or an Elementor kit color now leaves a recovery point. "The agent deleted my global class" used to be unrecoverable; now you can roll it back. Restores remain themselves undoable, so recovery can never make things worse.

  • Your own custom CSS and page settings are now captured in snapshots, so the edits Respira makes to things like custom CSS are recoverable, not just the main content.

  • Loud-drop behaviour across builders. When a value cannot be persisted in a way the builder reads, Respira names exactly what did not land and tells the agent not to retry blindly. This is the systemic version of the per-builder fixes below, and it cuts the retry loops that waste tokens.

  • An internal check now runs across the test fleet to confirm that every builder function Respira calls actually exists in that builder. It would have caught several of the silent failures below the day they were written, and it now runs continuously.

  • Oxygen: generated CSS was being written without the selectors it needed, so styles never reached the page. Element styling now renders, and dynamic content resolves correctly. Code blocks that contained quotes could corrupt a page; that is fixed.

  • Beaver Builder: style edits were serving stale CSS until you re-saved in the editor, because a cache flush was calling the wrong internal method and silently never ran. Style changes now appear immediately.

  • Elementor v4 (Atomic): styling writes now route correctly and the styles wire to the element, so colors, typography, breakpoint and state styles render. Atomic styling support is now claimable, with the supported element set documented.

  • Bricks: responsive style overrides were written in a key shape Bricks doesn't parse, so tablet and mobile rules silently did nothing. They now render at the right breakpoints.

  • Divi 4: responsive values needed a flag Respira wasn't writing, so tablet and phone styles quietly voided. They now apply.

  • Divi 5: several modules were receiving content in fields the renderer ignores, so the content was invisible. Team member, pricing, video, countdown, testimonial and others now render. Unsupported responsive keys now report loudly instead of silently dropping.

  • Snapshot fidelity tightened across builders, including the case where Oxygen migrated sites were capturing nothing. Restores now bring back the builder data they're meant to.

  • Synced patterns: updates aimed at a synced pattern now return a clear message naming the actual pattern to edit, instead of silently doing nothing.

  • WPBakery: raw HTML and unknown shortcode types are now encoded and reported correctly instead of rendering as garbage or literal brackets.

  • Gutenberg: buttons now write canonical markup so they render styled, and stale helper attributes are cleaned up.

  • Brizy and Visual Composer ship with the caveats above, labeled honestly in the builder list.

  • A few deep follow-ups remain documented and in progress (Breakdance section-background CSS in some layouts; Elementor structured-property aliases, which warn clearly today).

May 9, 2026
Cowork plugin v1.0.8 Patch May 9, 2026 README accuracy pass: 30 skills
  • The README still claimed 4 auto activating skills from the v1.0.0 days. v1.0.6 actually bundled 30 skills from agent-skills-wordpress. This release fixes the docs to match what actually ships.

    What actually ships in the plugin

  • 8 slash commands for the most common workflows.

  • 30 auto activating skills, broken down as:

    • 5 operational guardrails (editing safety, builder detection, multi site context, Respira workflow, setup assistant).
    • 7 site intelligence and audit skills (onboarding, site DNA, mobile experience, technical debt, WooCommerce health, SEO + AEO, internal links).
    • 2 content and asset skills (AI image optimizer, content portability).
    • 16 builder to builder migration paths (Elementor, Divi, Beaver, WPBakery, Visual Composer, Thrive Architect, Brizy, Oxygen → Bricks / Breakdance / Oxygen / Gutenberg).
  • 1 visual reviewer sub agent that shows what changed after every edit.

  • Full access to all 180+ Respira MCP tools through the bundled @respira/wordpress-mcp-server.

  • All 12 supported page builders: Elementor, Divi 4, Divi 5, Bricks, Oxygen, Breakdance, Beaver Builder, WPBakery, Flatsome UX Builder, Brizy, Thrive Architect, Gutenberg.

  • v1.0.8 — 2026-05-09

  • Restructured "What you get" with the correct skill count.

  • Added a categorized skill list with one line descriptions per skill.

  • Bumped plugin.json to 1.0.8.

  • No code changes. README and manifest only.

    Install

    From the Anthropic plugin marketplace, search for "Respira for WordPress" and click install. Or paste https://github.com/respira-press/cowork-plugin-wordpress into Customize → Plugins → Add Custom Plugin.

    After install, run /respira:connect-site. You will need a WordPress site you can install plugins on, and a Respira account at respira.press (7 day Maker trial, no credit card required).

May 8, 2026
Bloom key visual

Every page-builder adapter promoted to deeper-intelligence parity

The biggest release since v5. Every builder adapter promoted in lockstep. Five cross-cutting Phase A invariants every adapter now inherits — render-validation gate, universal write-trace, Variables CRUD shape, source-driven catalog auto-scan, per-property typed validators — plus Phase B slices per builder that close the family-bug arcs surfaced across v6.10.x. 1076 standalone test assertions across 27 alpha cycles, zero failures.

7 builders blooming
5 cross-cutting invariants
1076 test assertions
Read the full story
Show the 17 entries
  • The cumulative GA release. Every alpha (1 through 27) rolls forward into this tag. Customer names anonymised throughout; technical details intact.

  • Every page-builder adapter promoted to deeper-intelligence parity, with five cross-cutting invariants that make the v6.10.x family-bug arcs not recur. Render-validation post-write, universal write-trace, Variables CRUD shape, source-driven catalog auto-scan, per-property typed validators.

    Phase A foundation (every adapter inherits)

  • A.1 Render-validation gate. Post-write check: HEAD-fetch the preview URL plus parser-walk the persisted blob using the parser the adapter declares. 9 parser slugs ship. Either failing surfaces partial_write: true with structured parser_error / preview_error.

  • A.2 Universal write-trace contract. Every adapter exposes build_write_trace($overrides) returning route, target, path_resolved, validator_warnings, render_validator_pass, partial_write, parser_error, preview_status, preview_response_ms, preview_error, render_validator_skipped, css_regen_strategy. Per-builder strategy declarations cover Bricks / Elementor / Beaver / Breakdance / Divi / Oxygen.

  • A.3 Variables CRUD endpoint shape. Universal /respira/v1/builder/{builder}/variables/{type} across color, typography, spacing, breakpoints. Five REST routes (GET list, POST create, GET read, PATCH update, DELETE).

  • A.4 Per-builder catalog auto-scan. Respira_Module_Catalog_Scanner replaces hand-curated registries with first-use filesystem scans; cached for 1 hour.

  • A.5 Per-property typed validators. 12 canonical type slugs (color / dimension / url / integer / number / boolean / string / enum / font_family / image_url / svg / class_list) with type-specific opts. Closes the data-vs-render gap shape from the v6.10.x family bugs.

  • A.6 PHP 8.1+ gate removed. WebMCP bridge boots on PHP 7.4 / 8.0 sites.

  • A.7 Abilities too-early-call guard. wp_get_abilities() called before init returns wp_abilities_not_yet_registered (425) instead of silent-empty.

  • Bricks: paper cuts (element-name validator with did-you-mean + _cssGlobalClasses on every schema), four missing global stores (bricks_global_variables / bricks_color_palette / bricks_breakpoints / bricks_pseudo_classes), Templates CPT first-class CRUD (PATCH / DELETE / structured conditions surface).

  • Divi: runtime-aware emit branching closes the silent-empty-render arc on Divi 4 sites (D5-shaped payloads downconvert to et_pb_* shortcodes when the site runs Divi 4); required-attrs hard error replaces 21 silent attribute drops; D5 module catalog source-driven scan from Packages/ModuleLibrary/.

  • Elementor (Atomic): $$type envelope-preserving writer for atomic v4 widgets (closes the round-trip corruption arc); 20-entry atomic catalog (9 widgets + 11 layout types); supports_children gate covers all 11 v4 layout types.

  • Oxygen: CSS regen force-load (closes the persistent empty-render arc by force-loading oxygen_vsb_cache_page_update outside admin_init); component primitive auto-catalog 7 to 42+ entries via filesystem scan; wrapper round-trip preservation (six per-component metadata fields survive extract, mutate, and re-inject); Oxygen 4 vs 6 dual-runtime catalog fork.

  • Beaver Builder: content_field_map 7 to 50 modules including PowerPack and Beaver Themer prefixes; shape_settings_for_beaver translator; Saved Rows + Theme Builder layouts surface.

  • Breakdance: widget shortcut map 20 to 70 entries covering every shipping EssentialElements\\* element; shape_settings_for_breakdance translator; Variables / CSS custom properties CRUD (closes the deferred unmapped-tokens arc from v6.11 Self-Heal).

  • WPBakery: builder-slug aliasing (vc / js_composer / visual-composer all route correctly); silent no-op canary on inject_content; catalog auto-scan 1 to 87 vc_* shortcodes via filesystem; pipe-delimited multi-key attribute encoder + decoder.

  • Customer names anonymised across the changelog, the readme, the What's New admin page, and every test file. The repo's release notes describe trial customers via generic descriptors ("an Oxygen Classic trial customer", "a Beaver Pro agency", "a Divi 5 calibration trial customer") so privacy posture matches the v6.11.0 release page convention.

  • 1076 standalone assertions across the 27 v700-bloom-* test files, 0 failures.

  • All pre-existing adapter tests still pass.

  • Every running localhost env (8881 Divi 5, 8882 Breakdance, 8883 Bricks, 8884 Elementor v4, 8886 Beaver, 8887 WPBakery, 8888 Divi 4) loads the plugin cleanly with no PHP fatals on the canonical REST surfaces (/respira/v1/diagnostic/report, /respira/v1/builder/{builder}/variables/{type}).

  • Internal alpha builds 7.0.0-alpha.1 through 7.0.0-alpha.27 (each documented separately below) sequenced the work; they are dev-only and not customer-shipped. Only this 7.0.0 tag publishes.

April 9, 2026
Storefront key visual

Twelve builders. Real commerce. One layer.

Flatsome UX Builder joins as builder #12. 15 new WooCommerce Commerce tools with storefront design intelligence. Context-aware MCP tool filtering reduces tools in context by ~40. Three coordinated releases.

12 builders supported
15 new commerce tools
172+ total tools
Read the full story
Show the 9 entries
  • Flatsome UX Builder as Builder #12: Full support for the most popular WooCommerce theme on ThemeForest (200K+ sales). Extract, inject, element ops, build_page, and snapshots all work. Detection by active theme. Shortcode-based like Divi 4, using the new shared ShortcodeParser utility.

  • ShortcodeParser utility: Shared shortcode parsing and reconstruction for Divi 4 and Flatsome. Parameterized by tag prefix, column format, and detection patterns. Strict tag allowlists prevent cross-builder content confusion.

  • Bundled WooCommerce entitlement: Studio and Founder plans now include the WooCommerce add-on at no extra cost. Maker and Builder customers continue to purchase it separately.

  • Context-aware tool filtering (MCP server v6.0.0): The MCP server now filters the tool list based on detected builder and active plugins. Bricks tools hidden when Bricks is not active, WooCommerce tools hidden when WooCommerce is not installed. Reduces tool count from ~170 to ~130 on typical sites. Fail-open: full list returned if detection fails.

  • WooCommerce snapshot safety: All existing WooCommerce write tools (create_product, update_product, update_stock) now create before/after snapshots and log to the audit trail. Previously these operations were invisible and not rollbackable.

  • Flatsome Intelligence package: 55 element definitions with attributes, types, defaults, nesting rules, and responsive patterns. 6 pre-built page patterns for AI agents.

  • Metrics undercounting: Dashboard edit count was missing direct_edit_page, direct_edit_post, create_custom_post, update_custom_post, and force_edit_custom_post actions. All write operations now counted correctly.

  • Founder plan showing "999 sites": Dashboard and billing page now show ∞ / "Unlimited" for Founder and super-admin accounts instead of the raw 999 value.

  • TagDiv/Newspaper detection: Sites running the Newspaper or Newsmag theme with TagDiv Composer now detect as "WPBakery (TagDiv)" instead of falling through to Gutenberg.

March 23, 2026
Elemental key visual

Element-level editing across 11 builders

65 new tools. Element-level editing across every supported builder, build_page declarative page creation, HTML-to-builder conversion, stock-image search, tool governance, and dynamic schemas for 12 builders.

65 new tools
151 total tools
11 builders
Read the full story
Show the 48 entries
  • Element-level operations: find_element, update_element, move_element, duplicate_element, remove_element, batch_update (atomic), reorder_elements — works across all 11 builders via tree utility or native overrides.

  • build_page: Create complete pages from a declarative structure in a single API call. Returns preview URL.

  • Stock images via Openverse: search_stock_images and sideload_image with CC attribution, domain allowlist, SSRF protection, and deduplication.

  • Tool governance: Per-tool enable/disable with fail-open safety. Single chokepoint for REST + Abilities API. Audit logging.

  • Elementor dynamic schemas: Reads control registry at runtime, maps to JSON Schema types. Settings validator with "did you mean?" suggestions.

  • Divi 5 intelligence: 40+ module definitions, 7 page patterns, flex fraction system, design tokens, 13-point payload validation with 16 actionable error messages.

  • Builder tree utility: Generic tree traversal for find/insert/remove/clone/reorder with MAX_DEPTH=50 guard. Builder-agnostic via configurable children key.

  • Version migration engine: Respira_Upgrader runs sequential migrations on plugins_loaded. Schedules snapshot cleanup, sets governance defaults.

  • Builder interface safety CI test: Scans for new abstract methods and blocks PRs — prevents the v5.0.5 incident from recurring.

  • Version negotiation: GET /respira/v1/server/compatibility endpoint + X-Respira-Plugin-Version header on all REST responses.

  • HTML-to-builder conversion: convert_html_to_builder pipeline with CSS extraction, section mapping, style translation, and fidelity scoring. XSS sanitization first, never returns empty pages. Supports Elementor, Divi 5, Gutenberg, and all other builders via fallback.

  • Bulk page operations: bulk_pages_operation for applying changes across up to 100 pages. Built-in ops: strip_inline_styles, find_and_replace, custom. Rate-limited (3/hr), mandatory snapshots, concurrent lock.

  • Widget shortcuts: 27 convenience tools (add_heading, add_button, add_image, etc.) via data-driven registry with a single dispatch endpoint.

  • Dual tool registration: All tools available as both respira_* (preferred) and wordpress_* (deprecated). MCP server instructions teach AI to use respira_* names.

  • What's New admin page: Feature overview with builder support levels table. One-time redirect + dismissible notice.

  • UTF-8 passthrough for REST responses: Respira REST endpoints now output JSON_UNESCAPED_UNICODE so multibyte characters (Chinese, Japanese, Arabic, Cyrillic, etc.) are returned as readable text instead of \uXXXX escape sequences. Only applies to the Respira namespace.

  • Frontend cache purge on live edits: Automatic invalidation of WP Super Cache, W3 Total Cache, WP Fastest Cache, LiteSpeed, Autoptimize, SG Optimizer, WP-Optimize, Kinsta, and Cloudflare after direct (live) edits and duplicate approvals. Also fires respira_after_cache_purge action for third-party plugins.

  • Tool governance admin page: New "Governance" tab in wp-admin with per-category and per-tool enable/disable toggles, powered by the existing governance API.

  • Builder support level badges: Intelligence page now shows Full Intelligence / Smart Defaults / Basic Support badges next to each detected builder.

  • LemonSqueezy key detection: License activation form now detects UUID-format keys from LemonSqueezy order emails and shows a specific error directing users to respira.press/dashboard for their Respira key.

  • RankMath analysis: analyze_rankmath tool for sites running RankMath SEO.

  • API key access profiles: Generate keys with scoped permissions — Full Access, Read Only, Content Editor, or Builder. Each key only gets the tools it needs. Works alongside governance for layered security.

  • Admin UI/UX polish: Transparent logo, alternating row colors in settings tables, improved header alignment, builder support badges, and full changelog on What's New page.

  • Beaver Builder HTML conversion: Full HTML-to-Beaver conversion pipeline with type mapping (heading, rich-text, photo, button, video, separator, html), multi-column layout support via column-group/column structures, and content merging to BB-native settings keys.

  • Builder cache invalidation on approval merge: invalidate_builder_caches() fires after duplicate approvals for Bricks (CSS regeneration), Elementor (file cache clear), Beaver Builder (asset cache delete), and Divi (page resource auto-clear).

  • Angie/Elementor integration description: Settings page clarifies that Angie is the AI assistant built into Elementor, and explains how Respira registers as an MCP server inside it.

  • Built-in AI workflow guide: MCP server instructions now teach AI models how to use Respira — per-builder content formats (Elementor, Divi 5, Gutenberg, Beaver Builder, Bricks, and all others), common task recipes (update footer text, change images, add sections), and a clear rule to never access the database directly.

  • Oxygen ct_template detection: is_builder_used() only checked ct_builder_shortcodes meta but Oxygen templates can store content in ct_builder_json only. Now checks both meta keys, matching the logic already used in extract_content().

  • Changes page empty on SQLite/WordPress Playground: The Undo page SQL query used MySQL-specific syntax (CAST(... AS UNSIGNED) and parenthesized UNION ALL subqueries) that returned empty results on SQLite-backed installs (wp-now, WordPress Playground). Changed to CAST(... AS INTEGER) and unparenthesized unions — compatible with both MySQL and SQLite.

  • Trial-to-paid license orphan sites: When a trial user upgraded to a paid license without license_id in checkout custom_data, the webhook created a new license instead of converting the existing trial, leaving orphaned site records. The order_created handler now searches for recent trial licenses belonging to the same user and converts them (porting the Strategy 4 pattern from subscription_updated). Additionally, the license activation endpoint now cleans up orphaned trial site records for the same normalized URL.

  • Duplicate "license is a duplicate" admin banners: The license form handler and the per-page-load validation both queued the same error notice, showing two identical banners. Fixed by using a unique slug with add_settings_error() for WordPress deduplication and skipping the notice on POST requests when the form handler already added one.

  • Direct edit mode not applied: update_page and inject_builder_content endpoints now check the respira_auto_duplicate setting — when direct editing is enabled and auto-duplicate is off, writes go directly to the original post instead of queuing a duplicate.

  • Trial reminder email sent to paid users: Cron job and webhook now check for existing active paid licenses before sending trial expiration emails. Orphaned trial licenses are automatically converted to status: converted when a paid license exists.

  • Gemini/Antigravity MCP schema compliance: Added missing items property to 3 array schemas in apply_builder_patch.operations, update_custom_post.categories, and update_custom_post.tags — Gemini strict validator requires items on every type: 'array'.

  • Dead support links: Replaced 6 broken /docs/support/troubleshooting links across FAQ, 404 page, footer, and sidebar with working mailto:word@respira.press contact.

  • X handle references: Updated @Respira_cafe to @respira_press in trial extension sharing messages and modal instructions.

  • Beaver Builder injection 500 error: inject_builder_content with builder: "beaver" returned "Builder not supported" because the name resolver only matched exact names — "beaver" didn't match "Beaver Builder". Now handles single-word identifiers, hyphenated slugs, and compact forms for all multi-word builder names (Beaver Builder, Visual Composer, Thrive Architect).

  • Confirmation preflight before builder validation: inject_builder_content showed a confirmation prompt ("about to edit the original live Page…") before checking whether the builder was valid, leading to a misleading UX where users confirmed an operation that then failed with a 500. Builder validation now runs before the confirmation preflight.

  • Gutenberg block validation rejects valid payloads: The validator only accepted type field but users also send blockName (native WordPress format). Now accepts both. Also unwraps {blocks: [...]} wrapper objects that AI agents commonly send instead of flat arrays.

  • inject_builder_content content parameter undocumented: Added per-builder format examples and field requirements to the MCP tool schema description so AI agents can self-correct without trial and error.

  • Thank you to the early adopters whose reports and patience shaped this release:

  • Glen & Dave — for the detailed Beaver Builder bug report with reproduction steps that led to fixing the builder name resolver, the confirmation-before-validation ordering, and the Gutenberg block format handling.

  • Sam — for the Bricks builder reports that drove CSS regeneration on inject, approval merge cache invalidation, and the comprehensive Bricks test suite.

  • Jeroen — for catching the trial-to-paid license orphan bug and the duplicate admin banner issue.

  • William — for reporting the dead support links, SQLite/Playground compatibility issues, and other site-level bugs.

  • Yoliveras — for reporting the Gemini/Antigravity MCP schema compliance issue that was blocking strict validators.

  • Rixxter — for challenging us to do better with Elementor intelligence. His report about dropped sections and lost styles during HTML-to-builder conversion led directly to the CSS extraction pipeline, section mapping, style translation, and fidelity scoring — the entire HTML-to-builder conversion system that shipped in Elemental.

  • Sergei — for the idea of shipping built-in AI workflow instructions in the MCP server so models know how to use page builder tools correctly instead of falling back to SQL queries.

  • Walter — for reporting that Chinese characters were returned as \uXXXX escapes instead of readable text, which led to the UTF-8 passthrough fix across all API responses.

Showing the most recent 148 releases. Older entries are in the release feed. Every release follows semver.org.