Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - rubicon/diviops-module-bridge: Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork. · GitHub
Skip to content
This repository was archived by the owner on Jul 24, 2026. It is now read-only.

DiviOps Module Bridge

A small WordPress plugin that lets DiviOps Agent read and write third-party Divi 5 modules.

This plugin is built to be made obsolete. Everything it does would be better done inside DiviOps itself, and the upstream issue asks for exactly that. If the DiviOps author adds a single extension point, this repository collapses to roughly fifty lines. If they fix the namespace handling directly, it can be archived. Either outcome is a success.

The problem

DiviOps reads third-party modules perfectly well. Ask it for a page layout and it happily reports difl/faq:1 or d5bgo/bg-overlay:2. Hand that identifier straight back to module_get or module_update and it returns not_found.

That asymmetry means the only way to edit a third-party module's attributes is to rebuild the raw block markup by hand and push it through section_replace. That is error-prone in a specific and expensive way: a page carrying hundreds of $variable({...})$ tokens can lose quote escapes during reconstruction, and DiviOps' own validator will then reject every later write to that page.

Removing hand-reconstruction as a step is the entire point of this plugin.

What it covers

121 declared block types across three namespaces, discovered at runtime rather than hardcoded, so additional module plugins are picked up without a code change.

NamespacePluginDeclaredRegistered
difl/*DiviFlash112108
decm/*Divi Event Calendar Module80 (plugin inactive)
d5bgo/*Divi Background Plus11

Schema answers say which source resolved them, so a caller is never misled into placing a block whose plugin is inactive.

What it does

Bridges five DiviOps endpoints: schema_get_module, schema_list_modules, schema_get_module_dump_all, module_get, and module_update. It also stops validate_blocks from reporting third-party modules as unknown block types.

It attaches to rest_post_dispatch and acts only after DiviOps has already failed a lookup, so normal DiviOps behavior is left alone.

module_move, module_clone, module_lock, and module_unlock share the same underlying limitation and may start working incidentally. They are untested here and are not supported.

Requirements

  • WordPress 6.5 or later
  • PHP 7.4 or later
  • DiviOps Agent (the free, GPL-licensed plugin)
  • Divi 5. Divi 4 is not supported.

Relationship to DiviOps

This plugin depends on DiviOps Agent and does not modify, bundle, or redistribute any of its code. It hooks WordPress core filters only.

DiviOps Agent is GPL-2.0-or-later, and this plugin is licensed the same way for compatibility. DiviOps Agent Pro is a separate commercial product. This plugin does not touch it, and the route guard enumerates specific paths rather than matching the shared diviops/v1 namespace so that stays true.

Nothing here is a criticism of DiviOps, which does a great deal of difficult work well. This is one gap in an otherwise capable tool, and the maintainers are welcome to take any of this code under the same license.

Development

php tests/run.php

Tests run without WordPress loaded. The block-scanning and attribute-merging logic is written as dependency-free pure functions specifically so this is possible.

The acceptance gate is a differential test: for a fixture page containing both divi/* and third-party blocks, every index this plugin computes must match the one DiviOps itself reports. That test is what catches divergence when DiviOps updates.

See ARCHITECTURE.md for layout and CONTRIBUTING.md to contribute.

Contributors

Contributors

License

GPL-2.0-or-later. See LICENSE.

About

Superseded by github.com/rubicon/diviops (fork of the GPL diviops-agent). Archived: third-party Divi 5 module support moved from a companion bridge to namespace-agnostic gates in the fork.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages