Added
- Backup, Sync & Migrate (Pro): a complete site-portability suite. A new "Backup, Sync, and Migrate" module (on by default, with a Modules-tab kill-switch) and its own admin tab. Package a whole site (database + files) into a single portable
.emcparchive (or database-only / files-only) and restore it locally or from an uploaded archive. Backups and restores run in adaptive, time-bounded slices driven from the browser, so large sites finish reliably on modest and shared hosts. Restore rewrites the site address and Elementor page-data URLs to the destination with a serialization-safe search-replace, preserves your current login, and never toucheswp-config.phpor your salts. - Local to live migration via a thin connector. A Migrate sub-tab pushes this site to a live server with no manual upload: download the single-file EMCP Migrate Connector from the admin, install it on the destination and arm pairing, pair the two sites, then Push & Restore. The archive streams to the connector in HMAC-signed, resumable, base64-encoded packets (base64 so the payload clears the destination's firewall), and the connector runs a self-contained restore that continues past a client disconnect and never touches
wp-config.phpor salts. - One-way Sync, full or selective. A Sync sub-tab pushes to a paired target as Full (database + all files) or Selective (choose exact database tables and/or file areas: themes, plugins, uploads, or a specific path). A files-only sync never rewrites the live database.
- Content Sync: push individual content changes to a live site. A change-driven Changes to sync list shows the pages, posts, and CPTs that changed locally since they were last synced to a paired live site, each with Sync / Discard. Syncing one item updates only that page/post on the live site (its content, custom fields, taxonomy terms, and attached media: the featured image plus every image referenced in the content and Elementor data), matched by a stable sync id, with media IDs and URLs remapped so it renders correctly. No full database import, no downtime; the rest of the live site is untouched. The whole-site full/selective sync is preserved under an Advanced disclosure.
- Seven MCP tools so a connected agent can drive the whole feature:
create-backupandlist-backups(on by default);migrate-site,sync-to-live, andsync-content-item(destructive, disabled by default, requireconfirm:true);list-syncable-changesanddiscard-sync-change. Re-install the updated connector on any destination to receive content syncs. - Restore-tab server limits panel. An info box shows your current PHP upload limits next to the recommended values (green when you're set, amber when raising one would help) with a How to raise these link to the docs. The uploader adapts to any host regardless, so this is guidance for faster large uploads, not a requirement.
- Remove the connector after migrating (zero residue). A signed
Remove connectoraction (and a one-click button when a migration completes) asks the connector to unpair, purge staged data, deactivate itself, and delete its own files from the live site. Only the paired source can trigger it. - Configurable pairing window on the connector: a 5 / 10 / 15-minute selector (default 10) for how long the connector accepts a new pairing. Once paired, a site stays paired until you unpair or remove the connector.
Fixed
- Reliable large uploads, backups, and restores on any host. The backup and restore flows are now driven from the browser in short, resumable, byte-offset slices, starting from a large chunk and automatically halving and retrying at the same offset whenever a host rejects a body, converging on each host's real single-request ceiling (mod_fcgid's hidden
FcgidMaxRequestLen, nginxclient_max_body_size, a WAF, or Cloudflare's 100 MB) without needing to know it. Chunks are base64-encoded so a firewall never seesSELECT/<?php/evalsignatures, the browser holds only one chunk at a time (no "Out of Memory" tab crash on large backups), backup downloads stream without buffering the whole file in memory, and re-uploading a same-named file can't leave stale bytes. Large or firewalled hosts can still drop the.emcpintowp-content/emcp-backups/uploads/via FTP and it appears in the Restore list. Live-verified byte-for-byte on a 446 MB archive over mod_fcgid. - Migration edge cases. Fixed a push that reported "Backup archive file is missing" when the archive was present (filename vs. full-path resolution); a mid-transfer HTTP 500 on long transfers (the push is now driven in short resumable slices that no host timeout can kill); a "No route was found..." error shown after a successful restore (the connector legitimately goes offline as the DB import replaces it, so the status poll now reads that as completion); and an inability to re-pair after a full migration (the connector now regenerates rewrite rules after a restore, and pairing falls back to the permalink-independent
?rest_route=form). Also resolved a "plugin does not have a valid header" notice after a Pro update by shipping the connector source as.php.txt. - Dynamic content locked whole Theme Builder templates out of the API (#112). Editing any element of a document that contained a dynamic-valued
paragraph(for example a post date, category, or author rendered as a paragraph) failed withparagraph: invalid_value, because Elementor's atomic validation re-checks the whole tree on save and can't resolve an editor-authored dynamic value outside the live editor. Such a rejection now falls back to a direct, cache-clearing write of the already-validated data (exactly what the editor persists) instead of blocking the edit. - Pages created via MCP rendered empty when the Flexbox Container experiment is off (#111). On long-lived sites with Elementor's Container feature disabled,
add-containerandbuild-pagestored pages that rendered empty because the container element can't instantiate. Those tools now refuse up front with a clear, actionable message, anddetect-elementor-versionreportssupports_containerplus a warning so an agent knows to enable the experiment (or use the atomic tools) first. - OAuth tokens not persisted on some sites. The token endpoint could return a token while writing no row to the tokens table (a drifted or missing schema after an upgrade), so the client authenticated once and then couldn't. Issuing a token now verifies the write, self-heals the schema and retries once, and returns a clear server error instead of an unusable token if it still fails.