Skip to main content

PBJ Studio Sync Changelog (v2.9.4): MU-Plugins Sync and a Safer Push

PBJ Studio Sync is our deployment tool for WordPress Studio: a one-way push from a local Studio (SQLite) site to a live (MySQL) site, with backup-to-file on live and a backup importer on Studio. Content moves over the WordPress REST API as native WordPress objects, so the SQLite-to-MySQL differences are handled by WordPress itself. It’s also our most actively developed plugin — here are the release notes, with recent versions in full and earlier milestones summarized.

Version 2.9.4

  • New: mu-plugins sync stage. Must-use plugin files now push like theme/plugin files — staged during the run, promoted atomically at commit — behind a “Must-use plugin files” toggle (default on). Studio’s own runtime pieces (the SQLite integration and Studio loader) are always excluded on both sides: never pushed, never touched.
  • New: opt-in mu-plugins purge (mirror). When enabled, retiring an mu-plugin on Studio retires it on live on the next push. Off by default, because many hosts install their own mu-plugins into sites and a default-on purge would silently delete them. The exclude list can never be purged, and the manifest is rebuilt from disk so incremental runs can’t purge unchanged files.

Version 2.9.3

  • Fixed: featured images survive the sync. Featured images are stored as attachment IDs, which get reassigned on the receiving site — so a synced page’s featured image could point at the wrong (or no) attachment on live. The pusher now sends the thumbnail’s file path alongside each post and the receiver re-resolves it to its own attachment ID.
  • Per-environment plugin config excluded from options sync. Security and caching plugin settings (Really Simple Security, LiteSpeed) are inherently per-environment; they’re no longer pushed, pruned, or counted on Compare.

Version 2.9.2

  • Fixed: excluded plugins are now fully unmanaged. The activation-state mirror no longer deactivates a plugin that’s active only on live (like a host’s caching plugin) just because Studio doesn’t have it active.
  • Fixed: incremental pushes no longer skip posts whose only change was postmeta. Meta edits (SEO descriptions, featured images, builder data) don’t bump a post’s modified date, so those posts used to stay stale on live. Studio now tracks meta-dirty posts and pushes them in an extra pass.

Version 2.9.1

  • Fixed: brand-new plugins pushed in a run are now activated on live — previously a plugin whose files arrived in the same push could land on live deactivated, with no error reported.
  • Fixed: syncing the front-page setting no longer 404s the live homepage. Page IDs aren’t stable across sites, so the pusher now sends the page’s slug and the receiver resolves it to its own ID.
  • The post-push front-end check now also fails on error pages (HTTP 400+), not just leaked Studio URLs.

Version 2.9.0 — hardening release

A “no silent losses” release, plus readiness for Studio’s native PHP runtime:

  • A push with errors no longer advances the incremental watermark — failed content is retried on the next push instead of being silently skipped forever.
  • Live-side promote errors now surface in the Studio UI; chunked uploads are integrity-checked and retried; failed deletions are retried on the next push.
  • A crashed run auto-clears after 10 minutes instead of blocking forever, and “wipe first” imports validate the whole backup before touching anything.
  • Native PHP runtime support (Studio 1.12+): time limits and TLS verification handled properly, with a new “Verify TLS certificates” setting.
  • Better error messages (URL, HTTP code, and body snippet on non-JSON responses) and a far more robust browser progress flow with resume-or-cancel on failures.

Earlier milestones

  • 2.8.0 — Origin-URL rewriting on push: every outbound payload is rewritten from the Studio localhost URL to the live URL (including JSON-escaped builder data and PHP-serialized values), plus a live-side URL sweep at commit and a post-push front-end assertion so a URL leak can never masquerade as a clean push.
  • 2.7.0 — A failed commit no longer reports success; no-op push warnings; a new Export & Import tab (WXR export + full backup zip from Studio); and Auto Sync (merge newest) that merges Studio and live in both directions, newest wins, strictly additive.
  • 2.6.x — Navigation menus sync, with portable references that survive the ID reassignment between sites; menu items pointing at live-only pages are kept as custom links instead of dropped.
  • 2.5.x — A push can no longer disable its own REST authentication mid-run (critical fix); Compare & Sync counts became meaningful; the Compare page’s Plugins section deliberately bypasses the exclude list.
  • 2.3.0–2.4.0 — Critical safety guards so a sync can never delete role definitions or lock an administrator out of the live site, while still letting settings and theme-mods sync across differing table prefixes.
  • 2.2.0 — Prune (true mirror): optional, confirmed deletion of destination items that don’t exist on the source, with hard protections for the sync plugin, the logged-in admin, and brick-critical options.
  • 2.1.0 — Syncs all content post types (including private CPTs like forms), and mirrors plugin active/inactive status.
  • 2.0.0 — Full-site sync: options and users become opt-in sync sections, and the Compare & Sync tab arrives with per-section Upload/Download.
  • 1.5.x — Crash-safe theme/plugin file sync via atomic staging, media deletion sync, permalink repair, and correct upload-before-posts stage ordering.
July 4, 2026

PBJ Studio Sync is our deployment tool for WordPress Studio: a one-way push from a local Studio (SQLite) site to a live (MySQL) site, with backup-to-file on live and a backup importer on Studio. Content moves over the WordPress REST API as native WordPress objects, so the SQLite-to-MySQL differences are handled by WordPress itself. It’s also our most actively developed plugin — here are the release notes, with recent versions in full and earlier milestones summarized.

Version 2.9.4

  • New: mu-plugins sync stage. Must-use plugin files now push like theme/plugin files — staged during the run, promoted atomically at commit — behind a “Must-use plugin files” toggle (default on). Studio’s own runtime pieces (the SQLite integration and Studio loader) are always excluded on both sides: never pushed, never touched.
  • New: opt-in mu-plugins purge (mirror). When enabled, retiring an mu-plugin on Studio retires it on live on the next push. Off by default, because many hosts install their own mu-plugins into sites and a default-on purge would silently delete them. The exclude list can never be purged, and the manifest is rebuilt from disk so incremental runs can’t purge unchanged files.

Version 2.9.3

  • Fixed: featured images survive the sync. Featured images are stored as attachment IDs, which get reassigned on the receiving site — so a synced page’s featured image could point at the wrong (or no) attachment on live. The pusher now sends the thumbnail’s file path alongside each post and the receiver re-resolves it to its own attachment ID.
  • Per-environment plugin config excluded from options sync. Security and caching plugin settings (Really Simple Security, LiteSpeed) are inherently per-environment; they’re no longer pushed, pruned, or counted on Compare.

Version 2.9.2

  • Fixed: excluded plugins are now fully unmanaged. The activation-state mirror no longer deactivates a plugin that’s active only on live (like a host’s caching plugin) just because Studio doesn’t have it active.
  • Fixed: incremental pushes no longer skip posts whose only change was postmeta. Meta edits (SEO descriptions, featured images, builder data) don’t bump a post’s modified date, so those posts used to stay stale on live. Studio now tracks meta-dirty posts and pushes them in an extra pass.

Version 2.9.1

  • Fixed: brand-new plugins pushed in a run are now activated on live — previously a plugin whose files arrived in the same push could land on live deactivated, with no error reported.
  • Fixed: syncing the front-page setting no longer 404s the live homepage. Page IDs aren’t stable across sites, so the pusher now sends the page’s slug and the receiver resolves it to its own ID.
  • The post-push front-end check now also fails on error pages (HTTP 400+), not just leaked Studio URLs.

Version 2.9.0 — hardening release

A “no silent losses” release, plus readiness for Studio’s native PHP runtime:

  • A push with errors no longer advances the incremental watermark — failed content is retried on the next push instead of being silently skipped forever.
  • Live-side promote errors now surface in the Studio UI; chunked uploads are integrity-checked and retried; failed deletions are retried on the next push.
  • A crashed run auto-clears after 10 minutes instead of blocking forever, and “wipe first” imports validate the whole backup before touching anything.
  • Native PHP runtime support (Studio 1.12+): time limits and TLS verification handled properly, with a new “Verify TLS certificates” setting.
  • Better error messages (URL, HTTP code, and body snippet on non-JSON responses) and a far more robust browser progress flow with resume-or-cancel on failures.

Earlier milestones

  • 2.8.0 — Origin-URL rewriting on push: every outbound payload is rewritten from the Studio localhost URL to the live URL (including JSON-escaped builder data and PHP-serialized values), plus a live-side URL sweep at commit and a post-push front-end assertion so a URL leak can never masquerade as a clean push.
  • 2.7.0 — A failed commit no longer reports success; no-op push warnings; a new Export & Import tab (WXR export + full backup zip from Studio); and Auto Sync (merge newest) that merges Studio and live in both directions, newest wins, strictly additive.
  • 2.6.x — Navigation menus sync, with portable references that survive the ID reassignment between sites; menu items pointing at live-only pages are kept as custom links instead of dropped.
  • 2.5.x — A push can no longer disable its own REST authentication mid-run (critical fix); Compare & Sync counts became meaningful; the Compare page’s Plugins section deliberately bypasses the exclude list.
  • 2.3.0–2.4.0 — Critical safety guards so a sync can never delete role definitions or lock an administrator out of the live site, while still letting settings and theme-mods sync across differing table prefixes.
  • 2.2.0 — Prune (true mirror): optional, confirmed deletion of destination items that don’t exist on the source, with hard protections for the sync plugin, the logged-in admin, and brick-critical options.
  • 2.1.0 — Syncs all content post types (including private CPTs like forms), and mirrors plugin active/inactive status.
  • 2.0.0 — Full-site sync: options and users become opt-in sync sections, and the Compare & Sync tab arrives with per-section Upload/Download.
  • 1.5.x — Crash-safe theme/plugin file sync via atomic staging, media deletion sync, permalink repair, and correct upload-before-posts stage ordering.

Latest Articles