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
348 days Since v1.0
Product
Filtered Gutenberg · 12 releases See Gutenberg MCP → Clear
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 15, 2026
MCP server v8.6.2 Patch October 15, 2026 respira_elementor_add_custom_js says where the script goes
  • respira_elementor_add_custom_js says where the script goes. The tool description now says that, like other page writes, a published page gets the script on a draft duplicate to approve and a snapshot is taken first, with target_id and snapshot_uuid in the answer. Needs the plugin release that routes the call that way; older plugins write to the live page.

  • Agents are told that Spectra, Kadence Blocks, GenerateBlocks and GreenShift write their own blocks. The block library guidance, the native_generation note in respira_get_builder_info and build_page's builder parameter now say that passing builder "kadence", "spectra", "generateblocks" or "greenshift", or writing to a page that already has the library's blocks, writes the library's blocks, and that anything a library has no block for comes back as a core block in a library_core_fallback warning. Needs the plugin release that ships the block library emitters; on older plugins new elements stay core blocks.

  • respira_update_page and respira_update_post list seo. Page and post SEO worked only as an argument the schema never mentioned, so an agent that followed the schema wrote SEO plugin keys such as _aioseo_title through meta, got success, and the page did not change. Both tools now declare seo with title, description, focus_keyword, canonical_url, robots, noindex, nofollow and the Open Graph and X card fields, written to whichever SEO plugin the site runs, and the meta description says to use seo for SEO. respira_analyze_rankmath now points at the same seo object.

  • The block library guidance matches inject_builder_content. It now says that builder "gutenberg" on a page that already has a library's blocks writes that library's blocks (with library_blocks_hint saying so), that inject reports library_blocks like build_page, and that core block names write core blocks on a library page. Needs the plugin release that ships the change; older plugins write core blocks in that case.

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 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.

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).

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.

WooCommerce add-on v4.0.1 Patch An agent orders summary could 500 the whole site on hosts that answer plugin bootstrap before WooCommerce finishes waking up
  • An agent orders summary could 500 the whole site on hosts that answer plugin bootstrap before WooCommerce finishes waking up. It now waits for WooCommerce's own readiness signal before touching order data, and falls back to an honest empty summary instead of a fatal if that signal never comes.

  • The Observe governance profile closed only 42 of 277 tools despite its own description promising every write closed. It computed its blocked set from an eleven-family category registry, and a tool in no family was never considered; it now derives the blocked set from each tool's own declared read/write flag instead, closing 162 tools including every WooCommerce write. Reported by D.L.

  • add_sale_badge and add_low_stock_badge were flagged read-only while actually writing, which meant a governance profile closing writes left them open and the transport withheld the retry fields that make an interrupted write safe to repeat. Both now correctly declare themselves as writes.

  • convert_html_to_builder with no builder specified threw a type error on any block-library site (GreenShift, Spectra, Kadence Blocks, GenerateBlocks) instead of converting, because auto-detection asked "is this Gutenberg" by name instead of by relationship; naming the builder explicitly masked the bug by skipping detection. Also fixed: a successful token mapping was reported as both mapped and unmapped in the same response, a comparison bug not a data bug.

  • All five WooCommerce card/checkout tools now declare edit_target and verification_marker in their schemas; the backend has always forwarded both, but no schema advertised them, so they were unreachable from any client.

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