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 Elementor · 18 releases See Elementor MCP → Clear
October 22, 2026
WordPress plugin v9.2.19 Patch October 22, 2026 Inline SVG icons show again on pages converted in fidelity mode
  • Inline SVG icons show again on pages converted in fidelity mode. The stylesheet Respira carries with a converted page starts by reverting the builder's and the theme's defaults inside the page, and that reset reached into inline SVG too. An SVG draws from presentation attributes (d, fill, stroke, cx, r), which lose to any stylesheet rule, so every path lost its shape and every icon rendered empty (reported by D.M. on Elementor, 16 icons on one page). The reset now steps around svg, math and everything inside them, on every builder. A page converted before this release is corrected where its stylesheet is printed, without a reconversion.

  • A link around a card or a call button keeps its href on Elementor. An <a> wrapped around block content (a card, a tel: link, a call to action) became a container with the link set but the tag left at div, and Elementor prints a container's link only when its tag is a, so the links rendered without an href. The container is now an <a>. A link inside such a card, which is invalid HTML, is kept as text with its class and named in the conversion report, and an image inside the card no longer adds a second link. Pages already converted keep the old containers until they are converted again or set to html_tag: a with batch_update.

  • Buttons and accessibility attributes in fidelity mode. A <button> holding an icon became a plain div and lost its aria-label; it now stays a <button>, as written, inside a text element. Buttons, headings and images keep aria-*, role and their other attributes on builders that cannot put custom attributes on a rebuilt element. Where a container's attribute cannot be carried (Elementor without Pro has no custom attributes), the conversion report now says so in a warning instead of only listing it.

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 15, 2026
MCP server v8.6.1 Patch October 15, 2026 Avada in the builder lists
  • A busy site is retried, not reported. A site on a plugin with the new per-site call limit (the release after 9.2.4) runs at most six Respira calls at once and answer the next one with HTTP 429 respira_site_busy and how long to wait, having run nothing. Claude Code and other clients send tool calls in parallel, so this is ordinary: the server now waits what the site asked, plus up to a second of jitter so a burst does not come back as one burst, and sends the same request again, up to three times, with the same Idempotency-Key. Only when the site is still full after that does the agent see the plugin's own message. The hourly rate limit (also a 429) is not retried.

  • respira_run_pagespeed_audit, respira_get_core_web_vitals and respira_check_design with rendered: true ask the plugin to run them in the background, then poll the job until it finishes and return the finished result, so the tools answer exactly as before while the site's PHP worker and connection are not held for a minute or two. An older plugin answers with the result directly and nothing changes. If a job outlives the call, the tool says it is still running and to call again shortly.

  • Avada in the builder lists. The builder tools accept avada (and fusion-builder as an alias), and the agent guidance explains Avada Builder pages: container, row, column and fusion elements, text between the tags, column widths as attributes.type, and the respira_unparsed nodes that carry third-party shortcodes byte for byte. It needs the plugin release that ships the Avada adapter. Avada support is verified on a live Avada 7.16.2 site with Avada Builder 3.16.2; the guidance asks the agent to have the three experimental elements (Pricing Table, Tabs, Testimonials) checked in Avada Live.

  • Avada design system, Layouts and Library (11 tools, listed on Avada sites). respira_get_avada_design_system reads the global colour palette and typography sets with the CSS variables to reference them by, and respira_update_avada_design_system changes them through Avada's own Global Options (site-wide, so it needs confirm_live_edit; a snapshot is taken first). respira_list_avada_layouts, respira_get_avada_layout, respira_create_avada_layout and respira_update_avada_layout read and change Avada Layouts: which header, page title bar, content and footer section each Layout uses and where it applies, the Global Layout included. respira_get_avada_layout_section, respira_create_avada_layout_section and respira_update_avada_layout_section read and write the sections themselves. respira_list_avada_library and respira_get_avada_library_item read the Library and hand back the exact node to place with the page tools. Needs the Respira plugin release that ships them; Layouts and the Library also need Avada Builder active.

  • respira_inject_builder_content publishes target_path, position, after_element_id, before_element_id, chunk_id and session_id, and sends them to the plugin. The plugin has read target_path since 7.3.5, but the schema lost it, so no agent could place content anywhere but the end of the page, and every "add a section" was a whole page rewrite. With plugin 9.2.6 an insert into a Divi page changes only the inserted bytes: global module references and third party blocks stay as stored. The tool description now carries a chunking playbook (session, frame, then rows and modules by path, each with its own chunk_id) and says which tools are safe on Divi 5 pages that hold global or third party modules. It also says that on a page stored as Divi 4 shortcodes the generic section, row, column and module shape is converted to shortcodes, not only a Divi 5 shape. The plugin's own MCP endpoint publishes the same six parameters and the same playbook, word for word, and a plugin test fails if the two drift apart.

  • Agents are told how Elementor 4 elements nest. The Elementor guidance and the build_page description now say that atomic elements (e-heading, e-paragraph and the rest) go inside atomic containers (e-flexbox, e-div-block, e-grid) and classic widgets inside sections, columns and containers, and how to send an Elementor 4.3 accordion, tabs, background video or list. Writing the accordion, background video and list families needs the plugin release that models them; older plugins refuse those writes with a 422 as before.

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 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 2, 2026
WordPress plugin v9.1.11 Patch October 2, 2026 find_in_page finds text in the page a visitor gets, and names the setting that holds it
  • find_in_page finds text in the page a visitor gets, and names the setting that holds it. A new read tool (GET /respira/v1/analyze/find-in-page, wordpress_find_in_page on the native connector) for text that is not in the page builder: schema, tracking tags, anything pasted into a header or footer code setting. Give it a post id or an address on the site and the text. It reads the published HTML, head included, and returns each match with the tag around it and 200 characters either side, or every JSON-LD block with kind: "jsonld". sources checks the places head code lives on the site (Elementor Custom Code, WPCode snippets, the WPCode legacy header and footer options, Perfmatters, the Divi, Avada and Bricks code settings, GeneratePress hook elements, the theme's Customizer code settings) and says which one holds the text, with its id or option name, a short context and the length, never the whole body. Options Respira protects are skipped, addresses on other sites are refused, and a redirect is followed only while it stays on the site.

  • check_structured_data shows the values. blocks lists every JSON-LD block on the published page: head or body, every @type (nested @graph included), size, the plugin that printed it (Rank Math, Yoast, AIOSEO, SEOPress, Schema Pro, The SEO Framework, WooCommerce, or unknown with a note that it is likely a head-code snippet or theme code), whether it is valid JSON, and the decoded JSON up to 4,000 characters. contains keeps the blocks that hold a value, each with 200 characters of context, and where_to_edit says where each one is changed. Text read from the page is sanitized and marked as data. The tool now reads the published page on every call, also when the stored content already carries JSON-LD.

  • find_element by content, text or class works on every builder. A search for text that was not on the page answered HTTP 404, which agents read as a broken tool, and a class search on Elementor never read the custom class setting. content and text now search the text of each element (headings, text editors, HTML and code widgets, buttons) on every builder Respira reads, class searches the custom class, and each match names its field with a 160 character snippet, at most 20 with truncated. Nothing found is a normal answer with found: 0 and where to look next; a page with no builder elements answers supported: false with the tools that work there. A match only in a link, an image or a style value is listed apart in in_other_settings. Divi 4 pages resolve the same element as before.

  • A published page that dies while rendering is no longer read as empty. When PHP printed a fatal error with HTTP 200, the analyzers searched the error text and analyze_aeo reported no structured data, confirmed. The page now counts as unreadable, with the reason.

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.

August 29, 2026
Cowork plugin v1.2.0 Minor August 29, 2026 41 skills, snapshot-safe migrations, corrected install docs
  • Everything since 1.1.1, released.

  • 10 skills brought to catalog parity, plus Figma to Elementor, page-template-library, prime-the-agent, stale-content-detector. 41 skills total.

  • Migration skills rewritten to be snapshot-safe with surgical find/update/batch.

  • connect-site no longer assumes it can write to ~/.respira; it hands you the move command instead.

  • Install docs corrected. The page claimed Cowork installs Node for you and would prompt if it was missing. Neither is true, and a Windows customer lost an evening to it. The prerequisite now says to install Node yourself, and troubleshooting covers the full chain: missing Node, PowerShell blocking npm and npx, and needing a full computer restart rather than just relaunching the app.

  • Two stale counts fixed against their sources: 41 skills (was thirty), 17 page builders (was 16).

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.

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.