Skip to content
Gaurav TiwariChangelog

Plugin changelog

GT Page Blocks Builder

Custom HTML, CSS, and JavaScript sections with previews and reusable blocks.

Latest
4.2.0
Releases
40
Updated
October 8, 2026
  1. Stable

    4.2.0

    Existing pages, sections and library blocks are unchanged.

    Read full notes 5 changes
    • AI agents through Site Agent
    • With Site Agent 0.4 or later (free), any connected agent, such as Claude, ChatGPT or Cursor, gets the Page Blocks skill automatically. It can create draft pages from sections, list and edit the sections on a page, and create, update and render library blocks.
    • gt_pb_agent() for integrations. Section markup is always written through WordPress's block serializer, so HTML, CSS and JavaScript with quotes, -- or <script> stay intact.
    • Changes to published pages are staged as an autosave unless publishing is requested, and stale reads are refused. Agents cannot turn on PHP execution.
    • A new AI agents page in the Page Blocks menu shows what a connected agent can do and how to connect one. The AI Integration settings link to it.
  2. Stable

    4.1.0

    Existing code sections, native blocks, library references, and Freeform layouts remain supported. Nothing is automatically converted. Converted native block code requires 4.1.0 or later; ordinary library rows retain their existing format.

    Read full notes 7 changes
    • A clearer visual and code workflow
    • Blank canvas template without theme header/footer, available for classic and block themes.
    • Searchable library with previews, sorting, pagination, and clear copy/linked insertion.
    • Optional Visual/Code section conversion with retained native markup and safe refusal of ambiguous/dynamic content.
    • Element and section copy, cut, and paste with keyboard support and clipboard-failure protection.
    • Smoother Auto/Freeform dragging, insertion cues, edge scrolling, and clean gesture cancellation.
    • Consistent sidebar width, starter sections, Design/Layers navigation, color controls, and safer draft/rich-text editing.
  3. Stable

    4.0.0

    Edit native WordPress blocks directly in the Page Blocks workspace. Existing code editors, library, AI, performance tools, page settings, drafts, and save-conflict checks remain available.

    Read full notes 7 changes

    Fixed library creation returning an incorrect ID after cache/integration writes, and guarded newer template-style APIs on WordPress 6.0.

    Validated with 186 passing tests (4 optional integration skips), a fresh packaged upgrade rehearsal preserving content/render/library/settings hashes, PHPStan, syntax, and package checks. Requires PHP 8.1 and WordPress 6.0.

    • Native visual editing: Edit native WordPress blocks directly in the Page Blocks workspace. Existing code editors, library, AI, performance tools, page settings, drafts, and save-conflict checks remain available.
    • Choose Fixed / Auto placement for normal layout flow or Freeform for desktop drag, resize, snapping, guides, and keyboard nudges. Mobile layouts follow block reading order.
    • Drop media files onto the canvas to upload through WordPress and insert native media blocks.
    • Use a compact Design inspector with property rows, swatches, responsive controls, and alignment icons.
    • Keep the toolbar and footer visible; respect the selected block template's content width.
    • Section selection automatically activates Visual or Code mode.
    • Compatibility: Existing code sections, legacy Page Block names, linked library references, nested blocks, third-party markup, and CSS loading settings remain supported. Stored sections are not automatically converted. Unreleased prototype sections retain their saved HTML/CSS fallback; conversion to native blocks is explicit and undoable.
  4. Stable

    3.1.0

    Adds Performance analysis to help identify expensive sections, reduces repeated CSS processing, and improves deferred loading and mobile editing.

    Read full notes 4 changes

    Existing page content and loading choices remain unchanged. Deferral is opt-in; keep hero and shared layout styles inline or non-deferred. This release also includes the per-section Defer CSS option introduced in the locally deployed 3.0.4.

    Validation: PHP/JavaScript regression suites, PHPStan, syntax checks, and local browser checks for CSP, no-JavaScript, print, and narrow-screen behavior. Full Gutenberg canvas browser verification is limited by the test browser's blob-iframe rendering; both block registrations and inspector callbacks are covered by control-level tests.

    • Open Performance in the full-page builder, or Performance → Analyze section in the Block Editor inspector, to inspect unsaved source/minified sizes, expected CSS requests, duplicate CSS, and image/script/font hints.
    • Section CSS manifests are reused during each request, with invalidation after saves and recovery for missing files. In a local 100-section fixture, parsing fell from 101 passes to 1; this is not a claim about live PageSpeed savings.
    • Deferred styles use an external loader compatible with CSP policies allowing same-origin scripts. Nonce-only policies can authorize it through WordPress's wp_script_attributes filter. The no-JavaScript fallback remains available.
    • Loading controls wrap on narrow screens.
  5. Stable

    3.0.3

    Fixes the preview jumping away while editing text directly in a hero or another section.

    Read full notes

    Inline text synchronization no longer triggers the HTML editor's preview scrolling. Pending scrolls are cancelled when the code editor loses focus, while intentional navigation within the HTML editor still works.

    Includes regression tests for inline edits, editor synchronization, and focus changes. No page-content changes or database migration are required.

  6. Stable

    3.0.2

    Fixes the 3.0.1 builder-preview regression that left later sections unstyled when an HTML container opened in one section and closed in another. Shared CSS can stay in the first section; existing page content needs no changes.

    Read full notes 4 changes

    Validated with 49 WordPress integration tests, 28 PHP unit tests, 7 JavaScript DOM tests, PHPStan, syntax checks, and local/live browser checks of the affected homepage.

    • Track preview sections without adding wrapper elements, preserving shared containers and child/sibling selectors.
    • Keep cross-section opening and closing tags intact during inline text edits.
    • Remove deleted CSS declarations from the live preview and rebuild the complete document when HTML changes.
    • Add DOM regression tests for shared containers, section selection, duplicate text, and minified preview markup.
  7. Stable

    3.0.1

    Page Blocks Builder 3.0.1 adds automatic Functionalities compatibility in the builder preview and optional CSS files for individual sections. Selecting or editing preview text follows the matching section, and saving preserves selection…

    Read full notes

    Page Blocks Builder 3.0.1 adds automatic Functionalities compatibility in the builder preview and optional CSS files for individual sections. Selecting or editing preview text follows the matching section, and saving preserves selection, WordPress blocks, and newer edits made during the request.

    Each CSS file uses the page ID and a five-character ID that changes on save. Existing sections remain inline unless file output is selected, with inline fallback when files cannot be written.

    Validation: 76 plugin tests, PHPStan, PHP/JavaScript syntax checks, and browser checks of fonts, section selection, saving, and stylesheet output.

    Licensed updates now accept packages from the exact configured HTTPS R2 bucket. The license server retains its authenticated redirect for remote clients on 3.0.0 or older.

  8. Stable

    3.0.0

    A correctness release. It repairs paths that silently corrupted or discarded work, gives the plugin a test suite and CI for the first time, and makes the upgrade itself verifiable.

    Read full notes 16 changes

    Back up your database before upgrading — the schema change is one-way. Requires PHP 8.1. Flush your page cache and CDN afterwards: generated CSS and JS filenames now carry a content hash.

    • Breaking
    • PHP 8.1 is the minimum. WordPress will not offer this to a site below it, and activation stops with a notice instead of a white screen.
    • The CSS minifier no longer collapses whitespace around :. .menu :hover stays a descendant selector instead of silently becoming .menu:hover. If a stylesheet unknowingly depended on the collapsed form, that rule changes what it matches — this fixed eight blocks on our own site whose typography had quietly stopped applying.
    • Minified JavaScript changes shape. A line comment no longer swallows the rest of the file, and newlines survive so semicolon-free code is not concatenated. Blocks whose JS silently did nothing start working.
    • Generated asset filenames carry a content hash. Every cache and CDN misses once. The old unhashed name is still written as a copy for this major version.
    • Utility-class output is switched off once during the upgrade, with a notice. The scanner never emitted anything for page blocks, so this is a zero-visual-change upgrade; turning it back on is your decision.
    • PHP execution in the block preview requires administrator access. It previously ran for anyone who could edit the post.
    • The AI panel requires manage_options. Restore with add_filter( 'gt_pb_ai_capability', fn() =&gt; 'edit_posts' );.
    • The undocumented terminal endpoint is removed.
    • Uninstalling deletes options, transients and stored AI keys. The library is dropped only if you tick the new setting.
    • Library usage counts change on block themes, where the invalidation hooks were never registered.
    • Correctness: Editing a library block reaches the visitor — in file-output mode the generated file was written once and never again. The builder stops blanking core and third-party blocks on every keystroke. Renaming a section persists. A failed save says so instead of showing a green notice over a discarded session. Inline SVG backgrounds survive the CSS sanitiser. A block detached from the library stops rendering the library version over your own copy.
    • Recovery: Library blocks keep a revision history with one-click restore. Document-level undo covers add, delete, duplicate, reorder and import. Cmd+Backspace and Cmd+D stop acting on the whole section from inside a code pane. Undo after switching sections no longer pastes the previous section's code.
    • Security: The PHP-execution checksum is keyed with the site salt, so it cannot be recomputed by whoever wrote the row; existing blocks keep working and are re-keyed in the background. The licence and update channel verifies TLS certificates and rejects package URLs that are not HTTPS on the licence host.
    • Free, with licensed updates: Every feature works without a licence key; nothing is gated. A licence buys automatic updates and support. Security releases reach every install regardless, through a separate channel — see SECURITY.md.
    • Going back: Reinstall v2.8.1. The database stays at schema 1.2, which is expected and harmless. PHP-enabled blocks strip their tags until re-saved. Detail in README.md under "Going back from 3.0.0".
  9. Stable

    2.8.1

    Security release. Update before anything else.

    Read full notes

    Privilege escalation in the block preview. PHP in a Page Block no longer runs for users who can merely edit the post. The builder's preview endpoint is reachable by anyone with edit_post — an Author, or a Contributor on their own draft — and it executed the section's PHP after deriving the content checksum from the very content it was about to run, so the check was satisfied by definition. On any site that had turned PHP blocks on, that left the site-wide constant standing alone as the only gate. Running PHP in a preview now requires administrator access, and everyone else previews with the tags stripped and a note saying so rather than silently different output.

    The update channel verifies certificates again. It was requesting with sslverify off, and the server's reply supplies the package URL WordPress downloads and installs a plugin from, so anything able to answer as the licence server could have installed arbitrary code. Certificates are now verified, the request goes through wp_safe_remote_post(), and any package, url or homepage pointing somewhere other than the licence server's own host is discarded rather than followed. A host with a genuinely broken CA bundle can opt out per-site with GT_PB_LICENSE_INSECURE. The changelog the update screen renders is escaped before display.

    The plugin declares what it needs. Requires PHP: 8.1, Requires at least: 6.0, a licence and a text-domain path. It previously declared none, so WordPress offered the update to sites that would fatal on it, and the update payload separately claimed PHP 7.4 while the code has needed 8.1 since 2.7. A site below 8.1 now gets an admin notice naming the versions instead of a white screen. Update URI is set, so the plugin can only ever be updated from its own source.

    The licence screen is reachable. It is registered under the Page Blocks menu, but the Plugins row action and both admin notices linked to options-general.php, a screen that does not exist.

    Also: the preview endpoint checks the post type, matching the builder; and the GPLv2 text the header declares now ships with the plugin.

  10. Stable

    2.8.0

    The library shows what each block looks like. Every thumbnail was an empty frame: the preview document was escaped into an HTML attribute by a helper that handles &, < and > but not quotes, so each one was cut off at the quote in…

    Read full notes 8 changes
    • The library shows what each block looks like. Every thumbnail was an empty frame: the preview document was escaped into an HTML attribute by a helper that handles &, < and > but not quotes, so each one was cut off at the quote in its own charset tag. Blocks with no markup to render — CSS-only token blocks, PHP-only blocks — say so instead of showing an empty rectangle, and thumbnails render at a desktop width and scale down, so a section built for 1200px shows the layout it actually produces.
    • Each block reports how many posts and pages place it, counted across both the editor block and the shortcode. That is the number that tells you whether a block is safe to delete. Counted in a single pass and cached, so a library of two hundred blocks does not mean two hundred table scans to draw one screen.
    • Bulk selection with duplicate, trash, restore and delete forever; sorting by recently updated, title, most used or least used; and a grid/list switch that remembers which you prefer. The shortcode is now a chip you can see and click to copy rather than an action that copied it silently.
    • Import in Page Settings is two buttons, add or replace, instead of one dialog whose Cancel meant "replace every section". Only replace confirms, and it says how many blocks the builder cannot rebuild are about to go.
    • A Build button in the block editor saves the page and opens it in the visual builder. The builder reads from the database, so saving first is what keeps unsaved editor changes from being silently absent.
    • The library and settings screens now follow the admin around them: WordPress' own status filters, search box, view switcher and row actions, real section headings instead of headings faked with table cells, and no inline styles left in the settings template.
    • Fixed block toolbar buttons were two different heights, 26px and 29.6px, because one of them was never given a height — it inherited whatever the editor's line-height produced, and WordPress 7 changed that. Both are pinned now, and the icons are 18px rather than 14px.
    • Fixed the settings screen still documented the old md_ filter name for preview injection. It shows gt_page_blocks_builder_preview_injection.
  11. Stable

    2.7.5

    Fixed: the section panel vanished off the right edge once the AI assistant had filled the code editors. Nothing was hiding it — the builder had grown wider than the window, and the panel is the last column of that row. The code area was…

    Read full notes 4 changes
    • Fixed the section panel vanished off the right edge once the AI assistant had filled the code editors. Nothing was hiding it — the builder had grown wider than the window, and the panel is the last column of that row. The code area was reporting its own content width as a minimum, which with the assistant open kept the whole builder above 1552px; a 14-inch laptop is 1512. It now fits from 1920px down to 1000px with the panel fully visible, and the tag-snippet toolbar scrolls inside its own bar instead.
    • Import in Page Settings is two buttons, Import & add and Import & replace. It was one button behind a dialog whose Cancel meant "replace every section" — the destructive choice sitting on the dismissive button. Only replace asks for confirmation, and it says how many blocks the builder cannot rebuild are about to be removed.
    • Page Settings opens with a count of what is on the page, reports the result of an import or export inline instead of through a browser alert, and stays open while you work. Exported files are named after the page rather than its post ID.
    • The AI model list keeps only the GPT-5.6 family: Sol, Terra and Luna. A site still set to an older model falls back to the default rather than sending one the API would reject.
  12. Stable

    2.7.4

    The two builder filters and the four helper functions now carry the gt_ prefix, matching everything else the plugin exposes: gt_page_blocks_builder_preview_injection, gt_page_blocks_builder_post_types, gt_page_blocks_builder_url()…

    Read full notes 3 changes
    • The two builder filters and the four helper functions now carry the gt_ prefix, matching everything else the plugin exposes: gt_page_blocks_builder_preview_injection, gt_page_blocks_builder_post_types, gt_page_blocks_builder_url(), gt_page_blocks_builder_post_types(), gt_page_blocks_builder_nonce_action() and gt_page_blocks_preview_nonce_action().
    • Every old md_-prefixed name still works. The filters run immediately before their replacements, so the current one has the last word, and the functions delegate to theirs. Each points at its replacement under WP_DEBUG while in use and is silent otherwise, so existing snippets keep working and nobody gets a notice for a hook they never touched.
    • gt_page_blocks_builder_nonce_action() still returns its original string. It identifies nonces already issued into open builder tabs and saved URLs, and renaming the value would invalidate them for nothing.
  13. Stable

    2.7.3

    Page settings live in one dialog. Title, slug, template, import and export are page-level rather than section-level, so they sit together behind one button instead of being spread across the top bar and the section panel. The slug shows the…

    Read full notes 10 changes
    • Page settings live in one dialog. Title, slug, template, import and export are page-level rather than section-level, so they sit together behind one button instead of being spread across the top bar and the section panel. The slug shows the permalink it will produce, and WordPress' own sanitised result is adopted after saving rather than what was typed.
    • Sections get an id. Where the outermost element has none, the builder writes one in — an id you wrote yourself is never touched. The edit is made on the opening tag as text rather than by reparsing the markup, so quote style, self-closing tags and indentation survive, a &gt; inside an attribute value does not end the tag early, and data-id= is not mistaken for id=. Sections named after a generated id are listed by their first ten characters of text instead.
    • Every section drags, from anywhere on its row. Reordering was HTML5 drag-and-drop on a row covered by buttons, and a mousedown on a form control does not start its draggable ancestor's drag — in practice only a 14px grip worked. Locked and linked sections reorder too, a drop can land past the last row, and the drop point is shown while dragging.
    • Clicking anything in the preview selects the section it belongs to, without disturbing the inline edit the same click opens.
    • The AI assistant applies its own answers. A reply lands in the section and the preview updates, rather than arriving as code to copy into the editor beside it; bundled CSS and JS are unpacked into their own panes, so one prompt can fill all three. Undo restores the section exactly. A "Whole page" toggle sends every section's code with the prompt, so generated markup matches the class names, spacing and variables already on the page.
    • Latest AI models, and one list behind them. The model list was duplicated in four places and had already drifted — the registered default and the request-path fallback named different models, so a saved choice could be silently replaced. GPT-5.6 Luna is the new default, alongside the Claude 5 family.
    • Locked blocks can be deleted from the section panel. Locked means the builder will not rewrite a block's markup, not that the block has to stay on the page. It asks first, and the save guard that refuses to drop blocks the builder cannot rebuild stays exactly as strict. Their empty code panes are hidden.
    • The builder keeps its own palette on any theme. It renders on a front-end route, so the active theme's stylesheet loads beside it — and themes style bare select, input, textarea, pre and details under a [data-theme] ancestor, which outranked the builder's own rules. Controls were wearing the theme's dark palette while the chrome around them stayed light, a tiled dropdown arrow filled the model picker with black triangles, and stray label and textarea margins pushed controls off their rows. The preview iframe had the mirror-image problem: a transparent body took the operating system's dark canvas while the theme supplied its light-mode text.
    • Detach a copy is a real button again, with a broken-link icon. It carried two class names this plugin has never defined and fell through to the browser's default.
    • Plainer names in the code toolbar: wpauto is Auto-format, PHP is Run PHP, and the bare "JS:" prefix is a Script label. The AI composer sends on Enter, so its button is an arrow.
  14. Stable

    2.7.2

    Previews are now mounted only while within 800px of the viewport and unmounted beyond it. On a 12-block page that means at most 3 frames live instead of 12, and 75 stylesheets instead of 300. A holder element retains each frame's measured height whether or not it is mounted, so unmounting never collapses a block or moves the scroll position.

    Read full notes 2 changes

    Preview fidelity is unchanged: a mounted frame still loads the full theme stylesheet set and theme.json global styles.

    • Fixed
    • Scrolling was slow, or stalled entirely, while blocks showed their visual preview. Every Page Block in preview mode is a separate document carrying the whole theme stylesheet set — measured at roughly 25 stylesheets and 2,200 CSS rules to style about 30 elements, duplicated per block. A page of eight blocks therefore kept around 200 stylesheets and 17,600 rules alive at once, each in its own compositing context, and scrolling paid for all of it. Switching a block to code mode destroyed its frame, which is why code mode always felt fine.
  15. Stable

    2.7.1

    Code editors were unusable inside the block canvas. wp.codeEditor loads into the admin document, but the block canvas has been an iframe since WP 6.3. A CodeMirror mounted there resolves focus and key events against the outer document, so…

    Read full notes 6 changes

    Block editor UI shipped unstyled. Styles enqueued for the editor only reach the outer admin document, so the block's own chrome had no CSS and the device-preview controls rendered as blank squares with no dashicons. The stylesheet is now registered as the block's editor_style, which is what gets it into the canvas.

    Inline block CSS could be silently dropped. Whether a block emitted its &lt;style&gt; was gated on a request-global flag raised by any block on the queried post. A block rendered from a widget, synced pattern, or template part was silenced by a flag raised on another block's behalf. CSS is now tracked per block.

    minify_css corrupted quoted strings and math functions. [style*="font-weight: 300"] and [style*="font-weight:300"] are different selectors; collapsing the space merged them. Separately, clamp(6.75rem, 6rem + 2.2vw, 9rem) requires the spaces around +, while the sibling combinator requires collapsing them. Both are now handled.

    • Fixed: Code editors were unusable inside the block canvas. wp.codeEditor loads into the admin document, but the block canvas has been an iframe since WP 6.3. A CodeMirror mounted there resolves focus and key events against the outer document, so it rendered correctly and could not be clicked into or typed in. The plain textarea is now used there, as core's Custom HTML block does. Tab in that textarea also silently discarded its indent; it now commits properly.
    • Changed
    • Previews load theme.json global styles alongside every theme stylesheet, so var() resolves as it does on the front end.
    • The CSS editor suggests the custom properties the active theme defines, harvested from its stylesheets and theme.json.
    • The block editor chrome now follows the WordPress admin: its palette, 2px radii, system font, and standard button treatment.
    • The format toggle applies wpautop(), matching its label, instead of running the whole the_content filter chain from inside a block that is itself rendering during the_content.
  16. Stable

    2.6.0

    Library blocks can be assigned to theme regions — header, hero, before/after content, sidebar, footer, 404 — and rendered by any theme via gt_pb_region( 'header' ) / gt_pb_has_region(). A blank hybrid theme can be little more than region…

    Read full notes 16 changes
    • What's Changed
    • Theme building
    • Library blocks can be assigned to theme regions — header, hero, before/after content, sidebar, footer, 404 — and rendered by any theme via gt_pb_region( 'header' ) / gt_pb_has_region(). A blank hybrid theme can be little more than region calls.
    • Hook positions now actually render: wp_head, wp_body_open, wp_footer, loop_start/loop_end, get_header/footer/sidebar, and before/after the content — priority-ordered.
    • Block rename + migration
    • The block is now gt-page-block/page-block (category: Page Blocks). The legacy marketers-delight/page-block stays registered (hidden from the inserter) so existing content keeps rendering, with a one-click transform to the new block.
    • Migration tool: Settings → Tools → Migrate blocks (with dry run), or WP-CLI wp gt-pb migrate-blocks [--dry-run] — rewrites stored content without touching post modified dates.
    • REST API (pbb/v1)
    • GET/POST /blocks, GET/PUT/DELETE /blocks/&lt;id&gt; (trash or ?force=true), POST /blocks/&lt;id&gt;/duplicate, GET /blocks/&lt;id&gt;/render — search, status filtering, pagination, and status-count headers. Read = edit_posts, write = manage_options.
    • Library admin panel
    • New card-grid library with lazy live-preview thumbnails, search, status filter tabs, duplicate / trash / restore / delete-forever, copy-shortcode, and position chips. Classic list table remains at ?view=list.
    • Block editor
    • Preview-first Page Block: rendered live preview (auto-sizing iframe with theme styles) by default; Preview/Code toggles in the block toolbar.
    • Responsive viewport presets (desktop / 768px / 390px) + dark-scheme preview toggle.
    • Collapsible live preview pane under the CodeMirror editor — server-rendered when PHP/wpautop is enabled.
    • Copy button, Save to library, and a Browse library modal to insert saved blocks.
  17. Stable

    2.4.0

    Bundles v2.1.0 through v2.4.0 — major feature release.

    Read full notes 14 changes

    Supported: tags, .class, #id, [attr="val"], {text}, &gt; child, + sibling, *N multiply, \$ numbering. Cursor auto-jumps to the first empty slot.

    Removed: Unreliable HTML class autocomplete (replaced by Emmet).

    • Emmet HTML Expansion (NEW): Type an abbreviation in the HTML editor, press Tab, get expanded HTML: - div.hero&gt;h1{Title}+p{Body} → nested section with heading and paragraph - ul.menu&gt;li.item\$*4&gt;a[href="#"]{Link} → 4-item menu with auto-numbered classes - img.avatar[alt=""] → self-closing void tag
    • Frontend CSS Layers (NEW): Three independent toggles under Page Blocks → Settings → Frontend CSS:
    • Semantic Reset (~1KB) — modern reset, accessible images, prefers-reduced-motion
    • Typography (~3KB) — system-font stack (zero external requests), responsive headings via clamp(), 65ch measure, styled lists / blockquotes / code / kbd / tables
    • Utility Classes — ~330 Tailwind-inspired classes (grid, flex, spacing, typography, colors, borders, shadows, transitions) + sm: md: lg: responsive variants. Frontend inlines ONLY the classes actually used on the page — no bloat. Builder loads the full set for autocomplete.
    • Top-Level Page Blocks Admin (NEW): Moved out of Settings to its own top-level menu: - All Page Blocks — list table with bulk actions, search, status filter - Add New — full edit form with Monaco editors, live preview, position picker - Settings — existing settings page - License — license management
    • Shortcode Library (NEW): Reusable blocks stored in a custom database table (wp_gt_page_blocks): - [page_block id="123"] — embed by ID - [page_block slug="hero-section"] — embed by slug - Theme-independent position hooks via gt_pb_get_positions() filter (wp_head, wp_footer, the_content, loop_start, etc.)
    • Bug Fixes
    • Fixed cssClasses config being serialized as JSON object (array_unique key gaps) — Array.isArray() now passes on the JS side.
    • Compatibility
    • WordPress 6.0+
    • PHP 8.1+
    • Works with any WordPress theme
    • PHPStan level 5: 0 errors
  18. Stable

    2.0.2

    Critical fix for v2.0.0/v2.0.1. The builder was stuck on "Loading Page Blocks Builder..." with no errors. Root cause: the v2.0.0 release ported the dropin's JS which expects the app element ID md-pb-builder-app, but the template HTML still used the old ID md-page-block-builder-app. The JS bailed out silently at the missing-element check.

    Read full notes 5 changes
    • Critical fix for v2.0.0/v2.0.1. The builder was stuck on "Loading Page Blocks Builder..." with no errors. Root cause: the v2.0.0 release ported the dropin's JS which expects the app element ID md-pb-builder-app, but the template HTML still used the old ID md-page-block-builder-app. The JS bailed out silently at the missing-element check.
    • Fix
    • templates/builder-shell.php: Updated app element ID to md-pb-builder-app
    • Updated wrapper class to md-pb-builder-root and loading class to md-pb-builder-loading to match the new CSS naming
    • Upgrading from v2.0.x: Just update — clear browser cache to reload the new template.
  19. Stable

    2.0.1

    Internal hardening release. No functional changes.

    Read full notes 8 changes
    • Fixes
    • Fix block_categories_all filter signature mismatch (callback registered with accepted_args=2 but only declares 1 parameter)
    • Fix esc_attr() type errors when emitting external asset tags — cast int post_id and int|false filemtime result to string before passing
    • Properly escape stylesheet id attribute in external file output
    • Remove redundant is_array() / is_string() checks against already-narrowed types
    • Verification
    • PHPStan level 5 passes with 0 errors on the entire plugin
    • All previously broken features verified working
  20. Stable

    2.0.0

    Major refactor bringing the standalone plugin to production parity with the MD theme dropin.

    Read full notes 23 changes
    • Major Features
    • AI Chat Sidebar — Multi-turn conversation replaces the inline AI bar. Persistent context, "+ New Chat" button, message history. OpenAI, Anthropic, Gemini supported. Theme CSS variables sent as system prompt context.
    • Inline Text Editing in Preview — Click any heading, paragraph, link, or list item directly in the preview iframe to edit. Enter commits, Escape cancels.
    • Live Preview Patching — No more flicker on every keystroke. CSS/content edits patch iframe DOM in place; only structural changes trigger full reload.
    • HTML Snippet Buttons — Quick-insert buttons on the HTML editor title bar: sec, div, h1-h3, p, a, img, ul, ol, span, b, i. Wraps selection or inserts empty.
    • Section Renaming — Double-click any section name in the sidebar to rename it inline.
    • SVG Icons — Replaces unicode glyphs for hide/duplicate/delete buttons.
    • Keyboard Shortcuts Overlay — ? button shows all shortcuts.
    • Export/Import — Download/upload sections as JSON, append or replace modes.
    • Settings
    • Preview Customization — New admin fields for custom CSS, head HTML, and footer JS injected into the preview iframe. No PHP filter needed for common cases.
    • AI default model changed from gpt-5.2 to claude-sonnet-4-6.
    • Fixes
    • Script injection in preview iframe: Now injected post-load via contentDocument.createElement('script') instead of inline &lt;script&gt; in srcdoc. Fixes SyntaxError: Unexpected token '&lt;' errors caused by &lt;/script&gt; parsing in srcdoc HTML.
    • SVG icon click delegation: Uses closest('[data-action]') to traverse up from clicked SVG to the button.
    • HTTPS enforcement: All preview style URLs forced to https:// to eliminate mixed content warnings.
    • AI conversation history: All three providers (OpenAI, Anthropic, Gemini) properly send the message array.
    • Removed
    • Terminal feature (was beta) — removed for production safety.
    • Compatibility
    • WordPress 6.0+
    • PHP 8.1+
    • Works with any WordPress theme (no theme dependencies)
  21. Stable

    1.3.5

    Improved

    Read full notes 4 changes
    • Improved
    • Extracted bundled CSS and JavaScript from AI-generated HTML into their section fields.
    • Improved generation instructions and parsing of AI responses.
    • Added debug diagnostics for troubleshooting response parsing.
  22. Stable

    1.3.3

    Improve OpenAI response parsing for newer output shapes used by GPT-5 models

    Read full notes 2 changes
    • Improve OpenAI response parsing for newer output shapes used by GPT-5 models
    • Return a clear error when AI output is empty instead of silently doing nothing
  23. Stable

    1.1.3

    Initial standalone release with Gutenberg block, visual builder, settings page, Rank Math integration, page templates

    Read full notes 1 change
    • Initial standalone release with Gutenberg block, visual builder, settings page, Rank Math integration, page templates
  24. Stable

    1.1.2

    Improved

    Read full notes 2 changes
    • Improved
    • Made both builder templates available to posts, pages, products, FluentCart products, and supported custom post types, including courses and lessons.
  25. Stable

    1.1.0

    Added

    Read full notes 8 changes
    • Added
    • Added browser-based autosave and draft recovery for builder sections.
    • Added Page Blocks Builder and Full Page Builder templates, with or without the theme header and footer.
    • Added Rank Math content analysis and recursive discovery of Page Blocks inside nested containers.
    • Improved
    • Loaded theme styles in editor previews.
    • Strengthened CSS sanitization and permission checks for PHP execution.
    • Added release ZIP packaging.
  26. Stable

    3.0.4

    Added a per-section Defer CSS option beside Load CSS from a file in both the visual builder and Block Editor. Off by default.

    Read full notes 4 changes
    • Added a per-section Defer CSS option beside Load CSS from a file in both the visual builder and Block Editor. Off by default.
    • Deferred files use non-blocking print media and switch to all media on load, with a noscript stylesheet fallback for visitors without JavaScript.
    • Preserve deferred loading through saves and draft recovery. Builder previews continue to apply section CSS immediately, and failed file generation retains the inline fallback.
    • Added regression coverage for mixed loading modes, duplicate CSS, head/body deduplication, preview behavior, and editor save payloads.
  27. Stable

    2.7.0

    Dropin migration: wp gt-pb migrate-library [--dry-run] [--overwrite] (or Settings -> Tools -> Import from dropin) copies the Marketers Delight md_page_blocks table into this plugin preserving block IDs, so existing [page_block id="N"]…

    Read full notes 14 changes
    • Dropin migration: wp gt-pb migrate-library [--dry-run] [--overwrite] (or Settings -> Tools -> Import from dropin) copies the Marketers Delight md_page_blocks table into this plugin preserving block IDs, so existing [page_block id="N"] shortcodes and blockId block references keep resolving.
    • Blocks can reference the library again: blockId is a registered attribute and renders the library row server-side. Editing one library block updates every placement, instead of each block carrying its own copy.
    • The block editor understands the reference: a linked block shows the library block's title, ID, and badges, previews through the library's own render route (so PHP, shortcodes, and wpautop match the front end), and hides the inline HTML/CSS/JS editors that render_block() would ignore. Missing and unpublished targets are called out instead of silently rendering nothing.
    • Library modal offers Link alongside Copy code, so a placement can follow the library or take a one-off copy, deliberately.
    • Unlink detaches a copy: the library code is written into the block's own attributes and the reference is dropped.
    • Fixed two paths that silently unlinked migrated blocks. The editor's client-side block registration did not declare blockId, so re-saving a page dropped it; the visual builder normalized it away on load and reserialized every section without it. Both now round-trip the link, and the builder locks a linked section's editors instead of accepting edits that never render.
    • marketers-delight/inline-page-block is now covered by the block-name migration alongside marketers-delight/page-block.
    • Security PHP execution now requires two independent gates — a site constant (GT_PB_ALLOW_PHP, or MD_ALLOW_PHP_SNIPPETS for sites coming from the dropin) and a save-time content checksum. Content mutated directly in the database no longer executes; it falls back to stripping PHP tags. Inline blocks need a further opt-in (GT_PB_ALLOW_INLINE_PHP / MD_ALLOW_INLINE_PHP) because post_content carries no separate checksum.
    • Display conditions work: they are saved from the block edit screen and evaluated when rendering positioned blocks (post types, page types, specific post IDs). Previously the UI existed but nothing was stored or checked.
    • Dropin md_hook_* positions are remapped to plugin positions and theme regions on import; anything with no equivalent is cleared to shortcode/block only and reported, rather than silently never rendering.
    • Schema: adds php_checksum (table version 1.1), back-filled for existing PHP-enabled blocks on upgrade.
    • Render parity with the dropin, from diffing real output on live sites: library CSS is emitted once per request and hoisted into &lt;head&gt; rather than inlined at every placement; library HTML is minified like the inline path already was.
    • Fixed minify_css() collapsing the whitespace around + inside calc(), clamp(), min() and max(). The space is required there, so clamp(6.75rem, 6rem + 2.2vw, 9rem) became invalid and the whole declaration was dropped — section padding computed to 0 and clamped font sizes fell back to inherited. + is still collapsed in sibling selectors, where that is correct.
    • Fixed minify_css() corrupting quoted strings. [style*="font-weight: 300"] and [style*="font-weight:300"] are different selectors, and collapsing the space merged them so one stopped matching. Quoted strings and url() payloads are now preserved verbatim.
  28. Stable

    2.5.0

    REST API (pbb/v1): full CRUD for library blocks plus /duplicate and /render endpoints — list filtering, search, pagination, and status counts via headers.

    Read full notes 8 changes
    • REST API (pbb/v1): full CRUD for library blocks plus /duplicate and /render endpoints — list filtering, search, pagination, and status counts via headers.
    • New library admin panel: card grid with live preview thumbnails (lazy-loaded), search, status filter tabs, duplicate / trash / restore / delete, and copy-shortcode — the classic list table remains at ?view=list.
    • Block editor: the Page Block defaults to a rendered live preview (auto-sizing iframe with theme styles) when it has content; toggle Preview/Code from the block toolbar.
    • Block editor: Browse library — search the library in a modal and insert a copy of any saved block into the current Page Block.
    • Responsive preview: desktop / tablet (768px) / mobile (390px) viewport presets, plus a dark-scheme toggle (data-theme="dark").
    • Collapsible live preview pane under the code editor — re-renders as you type (server-rendered when PHP/wpautop is on).
    • Copy button for the active code tab.
    • Save to library: promote an inline block to a reusable library Page Block (admins) straight from the editor.
  29. Stable

    2.3.1

    FIX: CSS class autocomplete was broken because PHP sent cssClasses as a JSON object (due to array_unique key gaps) instead of a JSON array. Added array_values() wrapper so Array.isArray() passes on the JS side.

    Read full notes 1 change
    • FIX CSS class autocomplete was broken because PHP sent cssClasses as a JSON object (due to array_unique key gaps) instead of a JSON array. Added array_values() wrapper so Array.isArray() passes on the JS side.
  30. Stable

    2.3.0

    NEW: Typography.min.css toggle — system-font-based typography defaults with responsive heading sizes via clamp(), proper measure (65ch), styled lists, blockquotes, code, kbd, tables. ~3KB inlined when enabled.

    Read full notes 2 changes
    • NEW Typography.min.css toggle — system-font-based typography defaults with responsive heading sizes via clamp(), proper measure (65ch), styled lists, blockquotes, code, kbd, tables. ~3KB inlined when enabled.
    • Three independent toggles under Settings → Page Blocks → Frontend CSS: Semantic Reset, Typography, Utility Classes.
  31. Stable

    2.2.0

    NEW: Semantic Reset CSS (~1KB) — modern reset with box-sizing, list defaults, accessible images, prefers-reduced-motion support. Inlined in &lt;head&gt; when enabled.

    Read full notes 2 changes
    • NEW Semantic Reset CSS (~1KB) — modern reset with box-sizing, list defaults, accessible images, prefers-reduced-motion support. Inlined in &lt;head&gt; when enabled.
    • NEW Utility Classes — ~330 Tailwind-inspired utilities (grid, flex, spacing, typography, colors, borders, shadows, etc. + sm:/md:/lg: responsive variants). Frontend inlines ONLY the rules actually used on the page (parses post_content for class names). Builder loads the full set for autocomplete.
  32. Stable

    2.1.0

    New: Top-level "Page Blocks" admin menu (moved out of Settings) with sub-pages: All Page Blocks (list table), Add New, Settings, License.

    Read full notes 5 changes
    • NEW Top-level "Page Blocks" admin menu (moved out of Settings) with sub-pages: All Page Blocks (list table), Add New, Settings, License.
    • NEW Database-backed reusable blocks with [page_block id="123"] and [page_block slug="hero-section"] shortcodes.
    • NEW Admin list table with bulk actions (trash/restore/delete), search, status filtering.
    • NEW Admin edit form with Monaco editors for HTML/CSS/JS, live preview, position picker.
    • NEW gt_pb_get_positions() filter — theme-independent WP core hooks (wp_head, wp_footer, the_content, loop_start, etc.).
  33. Stable

    1.3.4

    Fix OpenAI GPT-5 model compatibility by omitting custom temperature for gpt-5* models

    Read full notes 3 changes
    • Fix OpenAI GPT-5 model compatibility by omitting custom temperature for gpt-5* models
    • Add provider debug diagnostics (finish reason, refusal summary, usage) for AI responses
    • Add optional raw payload logging via filters for AI troubleshooting
  34. Stable

    1.3.2

    Lock AI Generate to HTML mode in visual builder and ignore non-HTML text selections

    Read full notes 2 changes
    • Lock AI Generate to HTML mode in visual builder and ignore non-HTML text selections
    • Prevent HTML from being emptied when AI returns only bundled &lt;style id="ai-generated"&gt; / &lt;script id="ai-generated"&gt; tags
  35. Stable

    1.3.1

    Default AI generation target to the HTML tab in the visual builder

    Read full notes 3 changes
    • Default AI generation target to the HTML tab in the visual builder
    • Add HTML AI bundle support with &lt;style id="ai-generated"&gt; and &lt;script id="ai-generated"&gt;
    • Move bundled AI CSS/JS out of HTML and into the CSS/JS editors automatically
  36. Stable

    1.2.1

    Add "Preview on Frontend" button in the visual builder topbar to open the live page in a new tab

    Read full notes 3 changes
    • Add "Preview on Frontend" button in the visual builder topbar to open the live page in a new tab
    • Make "Add Section" button more prominent with a full-width dashed button below the section list
    • Fix "Invalid page template" error when saving on block themes (TT4, etc.)
  37. Stable

    1.2.0

    Add CSS-in-head collection: all Page Block CSS is combined into a single &lt;style&gt; tag in &lt;head&gt;, preventing FOUC

    Read full notes 9 changes
    • Add CSS-in-head collection: all Page Block CSS is combined into a single &lt;style&gt; tag in &lt;head&gt;, preventing FOUC
    • Add external file output (output: file): CSS/JS written to cacheable files in uploads directory
    • Add output block attribute (inline or file)
    • Add save_post/delete_post hooks to regenerate and clean up external asset files
    • Add JS file collection at template_redirect for external JS serving
    • Add transient caching for theme class suggestions
    • Combine footer scripts into a single &lt;script&gt; tag
    • Fix CSS minification breaking &gt;= in media query range syntax
    • Fix sanitize_css stripping &lt;= operators via CSS-safe sanitization