{"id":324501,"date":"2026-08-06T05:38:48","date_gmt":"2026-08-06T05:38:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fleet-agent-for-wpmgr-2\/"},"modified":"2026-10-14T12:50:03","modified_gmt":"2026-10-14T12:50:03","slug":"fleet-agent-site-manager","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/fleet-agent-site-manager\/","author":13551991,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.61.166","stable_tag":"0.61.166","tested":"7.1.3","requires":"6.2","requires_php":"8.1","requires_plugins":null,"header_name":"Fleet Agent Site Manager","header_author":"WPMgr contributors","header_description":"Connects this WordPress site to a WPMgr control plane for backups, updates, monitoring, and security scanning.","assets_banners_color":"101f22","last_updated":"2026-10-14 12:50:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mosamlife\/wpmgr","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":100,"downloads":1910,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.61.127":{"tag":"0.61.127","author":"Mosamlife","date":"2026-08-06 05:38:16","revision":3636102},"0.61.131":{"tag":"0.61.131","author":"Mosamlife","date":"2026-08-10 14:43:59","revision":3640743},"0.61.139":{"tag":"0.61.139","author":"Mosamlife","date":"2026-08-17 11:44:30","revision":3651056},"0.61.146":{"tag":"0.61.146","author":"Mosamlife","date":"2026-08-26 13:38:24","revision":3667129},"0.61.148":{"tag":"0.61.148","author":"Mosamlife","date":"2026-09-05 07:30:32","revision":3682218},"0.61.149":{"tag":"0.61.149","author":"Mosamlife","date":"2026-09-11 08:20:41","revision":3691037},"0.61.150":{"tag":"0.61.150","author":"Mosamlife","date":"2026-09-28 11:56:53","revision":3717084},"0.61.151":{"tag":"0.61.151","author":"Mosamlife","date":"2026-09-28 16:26:32","revision":3717578},"0.61.152":{"tag":"0.61.152","author":"Mosamlife","date":"2026-09-29 02:37:22","revision":3718167},"0.61.153":{"tag":"0.61.153","author":"Mosamlife","date":"2026-09-30 09:47:31","revision":3720854},"0.61.154":{"tag":"0.61.154","author":"Mosamlife","date":"2026-09-30 15:36:07","revision":3721588},"0.61.155":{"tag":"0.61.155","author":"Mosamlife","date":"2026-10-01 03:43:10","revision":3722324},"0.61.156":{"tag":"0.61.156","author":"Mosamlife","date":"2026-10-02 04:35:54","revision":3724144},"0.61.157":{"tag":"0.61.157","author":"Mosamlife","date":"2026-10-02 12:52:05","revision":3724816},"0.61.158":{"tag":"0.61.158","author":"Mosamlife","date":"2026-10-08 22:13:45","revision":3735624},"0.61.159":{"tag":"0.61.159","author":"Mosamlife","date":"2026-10-09 03:23:13","revision":3735825},"0.61.160":{"tag":"0.61.160","author":"Mosamlife","date":"2026-10-09 05:02:05","revision":3735912},"0.61.166":{"tag":"0.61.166","author":"Mosamlife","date":"2026-10-14 12:50:03","revision":3746381}},"upgrade_notice":{"0.61.166":"<p>Lets a connected AI read the site&#039;s Elementor widgets and their settings, and add, change, duplicate, move and remove Elementor&#039;s own widgets on a page, following your approval settings, with undo. Undo restores the page&#039;s data rows in place. A site whose Elementor version builds widget settings only in the editor gets a plain explanation that those settings are unavailable.<\/p>","0.61.165":"<p>Lets a connected AI create and edit designed Elementor draft pages in the colours, fonts, spacing and corner style the AI chooses for them, with ready-made sections and undo. On a block theme, the page fills the screen without the theme&#039;s header and footer. Saving refreshes the stylesheet once and keeps the template and page settings; undo restores them exactly.<\/p>","0.61.164":"<p>Edits of an Elementor draft that someone has previewed now go through, and an edit or undo refused because the page is open in an editor can be tried again once it is closed. Reading the structure of an Elementor draft the AI can edit also says whether it is open in an editor or has unsaved changes.<\/p>","0.61.163":"<p>Lets a connected AI read an Elementor page and edit a draft it created, with your approval for each edit and an undo for each change. WPMgr needs this version on the site for it. Nothing is published.<\/p>","0.61.162":"<p>Backup uploads retry temporary storage errors and name the cause when they fail. Core updates are skipped on Composer-managed sites and report the installed version afterwards, and a core rollback needs an explicit instruction from WPMgr. The listing no longer says backups are encrypted: this plugin does not encrypt them.<\/p>","0.61.161":"<p>Lets a connected AI create a draft page or post in Elementor from an outline, with your approval for each request in WPMgr. Nothing is published, and undo moves the draft to the trash.<\/p>","0.61.160":"<p>Lets a connected AI create a draft page or post from an outline with real layout, with your approval for each request in WPMgr. Nothing is published. Also keeps each cache purge&#039;s report separate when one purge starts another.<\/p>","0.61.159":"<p>Adds two read-only facts to the site details sent to WPMgr: the parent theme of a child theme and, where Elementor runs, whether its Atomic editor is switched on. It changes nothing on the site.<\/p>","0.61.158":"<p>Lets a connected AI read published content and, with your approval in WPMgr, change page and post titles and excerpts, with undo. Also runs reviewed read-only tools from other plugins.<\/p>","0.61.157":"<p>Improves AI page creation: titles and text with &quot;&amp;&quot; or bracketed numbers are stored as literal text, and an interrupted request&#039;s untouched draft can be moved to the trash.<\/p>","0.61.156":"<p>Adds AI page creation, off by default and turned on per site from the Content tab. A person approves each request in WPMgr. Pages are always created as drafts by a dedicated content user that cannot log in, and can be moved to the trash while untouched.<\/p>","0.61.155":"<p>Adds a signed command the control plane uses to list the tools (abilities) a site registers and to run WPMgr&#039;s own read-only abilities. It changes nothing on the site. It sends the names, labels and descriptions of registered abilities, with each one&#039;s owner type, site facts (WordPress and PHP versions, theme and active plugin names), and, for a published page without a password that the control plane asks for, that page&#039;s title and text.<\/p>","0.61.154":"<p>Adds a read-only check the control plane can run to see which editor owns each page and whether it is a special page. It changes nothing on the site and does not send page body text or stored builder data; it sends published page titles and, for a single page, editor display names.<\/p>","0.61.153":"<p>The plugin can now carry out a cache purge limited to this site&#039;s own page cache, skipping hosting and CDN cache integrations, and report which integrations ran, when the control plane requests it.<\/p>","0.61.152":"<p>Detects when a stored key no longer opens, shows an admin notice naming which and what to do, and refuses a backup with a clear reason when the backup key cannot be used.<\/p>","0.61.151":"<p>Router log lines now escape control characters, so a command failure always reads as one line in the debug log instead of one that could break apart. What is sent to the control plane is unchanged.<\/p>","0.61.150":"<p>Command failures are now diagnosable from the dashboard: the kind of error, where it was thrown, and a redacted reason, plus a matching line in the site&#039;s debug log. Also adds a content-update command for changing an existing post&#039;s title or body; nothing in the dashboard uses it yet.<\/p>","0.61.149":"<p>Fixes a media quarantine restore that could overwrite a file recreated at the same path, and could remove a quarantined file it had declined to restore. Also tightens where the page cache and folder creation may write. Update if this site uses the unused-image quarantine.<\/p>","0.61.148":"<p>Fixes a white screen on Enroll on hosts without the native libsodium PHP extension, common on shared hosting, cPanel and CloudLinux in particular, where the plugin installed and activated normally but enrollment could not be completed. Update to complete setup on those hosts. Also removes a settings section that referenced a dashboard flow that was never built.<\/p>","0.61.147":"<p>On a multisite network, plugins activated for the whole network are now reported as active, so they stop being missing from the plugin inventory and from the update and vulnerability checks that read it. This plugin&#039;s licence is also now declared as MIT consistently across every surface that states one. Safe to update in place.<\/p>","0.61.146":"<p>The application-password two-factor control now actually takes effect: if this site has two-factor authentication enabled, an application password will stop working for a user who has a second factor enrolled or whose role requires one, returning HTTP 401. Review any integration on this site that authenticates with an application password before updating. Also fixes a database restore that could write into live tables while reporting success, and a user-agent ban that could lock administrators out of the login page.<\/p>","0.61.139":"<p>Email delivery failures are now detected on sites that send through their own SMTP setup, not only sites routed through WPMgr, and a plugin bug that reported a failed send as successful is fixed: wp_mail() now returns false on a failed send. Forms and other flows that check the result of wp_mail() will start correctly reporting failures they previously hid. Safe to update in place.<\/p>","0.61.131":"<p>Fixes a bug that could silently delete this site&#039;s working SMTP password when its email settings were saved, tested or synced from the dashboard, breaking outgoing email. Update now if this site sends mail through SMTP, SES, SendGrid, Mailgun or Postmark; the dashboard restores the password automatically on its next sync with this site.<\/p>","0.61.127":"<p>Password policies can now target the roles your site actually has, including roles added by WooCommerce, membership, LMS and booking plugins, shown in the site&#039;s own language. Safe to update in place.<\/p>","0.61.114":"<p>Updates and rollbacks on one site now run strictly one at a time, so two WordPress installers can no longer run against the same site at once and corrupt an update in progress. Safe to update in place.<\/p>","0.61.112":"<p>Fixes outgoing email failing completely when a plugin sets a Reply-To, To, Cc or Bcc header in the &quot;Name &quot; form, which WooCommerce and many form plugins do by default. Update if this site sends mail through SMTP or SendGrid.<\/p>","0.61.95":"<p>Failed backups no longer leave their working files on the site, which could be more than a gigabyte, and the cleanup no longer depends on WP-Cron. Safe to update in place.<\/p>","0.61.85":"<p>Fixes full backups failing at the upload stage on slow servers. The agent now reports progress during long archive and encryption passes. Safe to update in place.<\/p>","0.61.25":"<p>Fixes a restore bug that could silently drop plugin or theme files whose path contained a reserved drop-in name, leaving a restored site broken while reporting success. If a restore on an older version left a site broken, re-restore the same snapshot on this version.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3636102,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3636102,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3636102,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3636102,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3636102,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.61.127","0.61.131","0.61.139","0.61.146","0.61.148","0.61.149","0.61.150","0.61.151","0.61.152","0.61.153","0.61.154","0.61.155","0.61.156","0.61.157","0.61.158","0.61.159","0.61.160","0.61.166"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The WPMgr dashboard. Every site you manage in one list, with its status, pending updates and tags.","2":"This plugin's own settings screen in wp-admin before pairing: a Control-plane URL to save, then a Pairing code to enroll. Nothing happens until you supply both.","3":"One site's Backups tab: a completed run, the destination it went to, and the restore history.","4":"Updates across every connected site, with the pre-update snapshot available to roll back.","5":"Performance: Core Web Vitals from real visitors, page cache state and image optimization.","6":"Security: hardening switches, login protection, and the vulnerability findings the dashboard matched for this site."}},"plugin_section":[],"plugin_tags":[151,247,600,174442,2550],"plugin_category":[54,59],"plugin_contributors":[274597],"plugin_business_model":[],"class_list":["post-324501","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-performance","plugin_tags-security","plugin_tags-site-management","plugin_tags-updates","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-mosamlife","plugin_committers-mosamlife"],"banners":{"banner":"https:\/\/ps.w.org\/fleet-agent-site-manager\/assets\/banner-772x250.png?rev=3636102","banner_2x":"https:\/\/ps.w.org\/fleet-agent-site-manager\/assets\/banner-1544x500.png?rev=3636102","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/fleet-agent-site-manager\/assets\/icon.svg?rev=3636102","icon":"https:\/\/ps.w.org\/fleet-agent-site-manager\/assets\/icon.svg?rev=3636102","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Fleet Agent Site Manager securely connects the WordPress sites you look after to a WPMgr dashboard, so backups, updates, caching, security and performance for every one of them run from a single screen.<\/strong><\/p>\n\n<p><strong>You need a WPMgr dashboard as well as this plugin.<\/strong> Run one on your own server for free (it is open source: https:\/\/github.com\/mosamlife\/wpmgr), or use the hosted service at https:\/\/manage.wpmgr.app.<\/p>\n\n<p>Until you enter a dashboard address and complete a signed pairing, this plugin has no endpoint, opens no outbound connection and sends nothing anywhere.<\/p>\n\n<p>Every action the dashboard can ask for is on a closed, named list compiled into the plugin, and each one is verified against an Ed25519 signature tied to that pairing before it runs. There is no eval, no remote include and no remote PHP execution of any kind.<\/p>\n\n<h4>What you can do once a site is connected<\/h4>\n\n<p><strong>Backups and restore.<\/strong> Full and incremental backups of the database and files, scheduled per site or run on demand. An incremental run uses a content-addressed chunk store so only changed blocks move. Send them to storage the dashboard manages, a folder on your own server, or your own S3-compatible bucket. Restore a whole site or pick components, with a health check afterwards and an automatic rollback if the site does not come back.<\/p>\n\n<p><strong>Updates you can undo.<\/strong> Core, plugin and theme updates across every connected site, applied by WordPress's own Upgrader against WordPress.org packages. A snapshot is taken before each one, so a bad release is one click back rather than a restore from last night's backup. A watchdog recovers a site whose update died mid-write.<\/p>\n\n<p><strong>Speed.<\/strong> Disk page cache with an nginx and Apache fast path that serves a hit without booting PHP. Optional Redis object cache. Remove Unused CSS, CSS and JavaScript minification, deferred JavaScript, speculation rules, CDN rewriting, lazy iframes, and self-hosted Google Fonts, Gravatars and third-party scripts.<\/p>\n\n<p><strong>Images and fonts.<\/strong> Convert the media library to WebP and AVIF, keep the originals, and put them back if you do not like the result. An unused-image cleaner finds files nothing references. TTF, OTF and WOFF are transcoded to WOFF2.<\/p>\n\n<p><strong>Security.<\/strong> Hardening switches that stay off until you turn them on: file editor, XML-RPC, REST, author enumeration, SSL and HSTS, directory browsing, PHP execution in uploads. Login protection with per-site IP, CIDR and user-agent bans enforced at earliest boot. A hidden login address. File-integrity scanning against WordPress.org checksums and a learned per-site baseline.<\/p>\n\n<p><strong>Two-factor for your site's own users.<\/strong> Authenticator app, emailed code or single-use backup codes, with guided enrollment once you require it for a role.<\/p>\n\n<p><strong>Password policy.<\/strong> Minimum strength, reuse blocking, optional expiry, and a breach check that never lets the password or its full hash leave the site. Policies target the roles your site actually has, including roles added by WooCommerce, membership and LMS plugins.<\/p>\n\n<p><strong>Database tools.<\/strong> Scan for revisions, transients, spam and orphaned metadata, preview exactly what will go before anything is deleted, take a snapshot before any change, and run a serialization-aware search and replace.<\/p>\n\n<p><strong>File manager.<\/strong> Browse, read, write, rename, delete, chmod, search, upload, archive and extract, with a version history on writes and a restore. Guarded against executable writes and protected roots.<\/p>\n\n<p><strong>Site email.<\/strong> Route this site's outgoing mail through Amazon SES, SendGrid, Mailgun, Postmark or SMTP, with per-sender routing, automatic fallback, suppression of known-bad addresses and a full send log.<\/p>\n\n<p><strong>Real User Monitoring.<\/strong> Off by default. Turn it on and Core Web Vitals come from your actual visitors, page by page, instead of one lab score.<\/p>\n\n<p>Cache purge reaches the layer in front of WordPress too, detected automatically: Varnish, Kinsta, WP Engine, SiteGround, Cloudways, RunCloud, GridPane, SpinupWP, CloudPanel, Rocket.net and WP Cloud, plus Cloudflare once you add its API credentials to wp-config.php.<\/p>\n\n<p>The expensive work runs on the dashboard rather than on your server: unused-CSS computation, image and font encoding, vulnerability matching against a managed feed, uptime probing and site screenshots.<\/p>\n\n<p>This plugin is MIT-licensed and the dashboard is AGPL-3.0. Source for both: https:\/\/github.com\/mosamlife\/wpmgr<\/p>\n\n<h3>Privacy \/ What data is sent and where<\/h3>\n\n<p>This plugin contacts nothing until you connect it to a WPMgr control plane you choose, self-hosted or the hosted service at https:\/\/manage.wpmgr.app. There is NO default endpoint: it is inert until you supply a control-plane URL and complete a one-time, signed enrollment.<\/p>\n\n<p>Once connected, the agent communicates only with the control-plane URL you configured. It sends the following, only to that endpoint, and only for the management actions you or your schedules initiate:<\/p>\n\n<ul>\n<li>Site and environment metadata: site URL, WordPress, PHP and server versions, active theme and plugins, and Site Health diagnostics. The metadata also includes the parent theme of a child theme and, on a site running Elementor, whether Elementor's Atomic editor is switched on. Sent on connect, on a periodic heartbeat, and when you click Re-run checks. Used to display your site's status in the dashboard.<\/li>\n<li>Update inventory: the list of available core, plugin and theme updates. Sent when inventory is refreshed. Used to show and apply updates.<\/li>\n<li>Backup archives (not encrypted by this plugin): when you run or schedule a backup, the agent archives your database and\/or files and uploads them to the storage destination your control plane configured. Protection at rest comes from that destination. Archive contents may include your site's content and personal data.<\/li>\n<li>Rendered HTML: for CSS optimization (used-CSS generation), the agent submits rendered HTML of selected pages so unused CSS can be computed. Used only to produce optimized stylesheets.<\/li>\n<li>Diagnostics and activity logs: error logs, performance and cache statistics, and a record of management actions, sent so they can be surfaced in the dashboard.<\/li>\n<li>AI requests from an assistant you connect to your WPMgr dashboard: the results of the reads it asks for, such as published page and post text, titles and excerpts, media details and what reviewed abilities on the site return, and previews of the drafts and changes it proposes.<\/li>\n<\/ul>\n\n<p>The agent does not sell or share this data with third parties.<\/p>\n\n<p><strong>Real User Monitoring (when you enable it)<\/strong><\/p>\n\n<p>Real User Monitoring (RUM) is off by default and must be enabled per site. It is the one exception to the agent-as-sole-transmitter model above: the agent adds a small, public measurement script to HTML it already serves, and your visitor's own browser, not the agent, then sends anonymous performance measurements directly to the control plane.<\/p>\n\n<p>What the visitor's browser sends:<\/p>\n\n<ul>\n<li>Core Web Vitals (LCP, INP, CLS) plus TTFB and FCP, and page-load timing.<\/li>\n<li>The page path only. Query strings are stripped before transmission, so tokens, emails, and order IDs in URLs are never sent.<\/li>\n<li>Coarse, non-identifying context: browser and device type derived from the User-Agent, connection type, and an approximate country code.<\/li>\n<\/ul>\n\n<p>What is never collected: cookies, localStorage, cross-site identifiers, or the visitor's full IP address. The IP is used only transiently for rate-limiting and coarse country lookup, then discarded and never stored.<\/p>\n\n<p>This data originates from your visitors' browsers, so you (the site owner) are its data controller and must disclose it in your own site's privacy policy. If you self-host the control plane, RUM data stays entirely on your own infrastructure and never reaches WPMgr. If you use the hosted service at https:\/\/manage.wpmgr.app, that service processes the measurements on your behalf.<\/p>\n\n<p>Disable RUM at any time in the Performance settings; the script is removed from newly cached pages immediately.<\/p>\n\n<p>If you connect to the hosted WPMgr service, its Terms of Service (https:\/\/manage.wpmgr.app\/terms) and Privacy Policy (https:\/\/manage.wpmgr.app\/privacy) apply. If you self-host the control plane, you operate the receiving service and your own policies apply. You can stop all data transmission at any time by disconnecting the agent (Disconnect in the agent admin screen) or deactivating the plugin.<\/p>\n\n<p><strong>How it works \/ security<\/strong><\/p>\n\n<p>Commands arrive from the control plane over HTTPS. Each carries an Ed25519 signature produced with the key established at enrollment, and the agent verifies it before executing any action. The allow-list of permitted commands is compiled into the plugin, no mechanism exists to add new command types at runtime, and there is no eval, remote include, or remote PHP execution. Core, plugin, and theme updates are applied using WordPress's own Upgrader against wordpress.org packages only.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin contacts external hosts only after you connect it to a control plane, and only for the specific features you enable. The plugin is inert until connected. This build contains no self-update client; updates arrive through the WordPress.org directory only.<\/p>\n\n<p><strong>WPMgr control plane (the URL you supply)<\/strong><\/p>\n\n<p>What is sent: site URL and name, WordPress and PHP versions, active plugin and theme inventory, Site Health results, rendered HTML of selected pages (for used-CSS computation), backup archives, transcoded font bytes, and cache and performance statistics.\nWhen: on enrollment, diagnostics, heartbeat, backup progress, cache and performance operations, Remove Unused CSS, autologin token consumption, database clean, font transcoding, and password breach checking. Always triggered by an action or schedule you initiate, never autonomously.\nWhy: this is the dashboard that manages the site.\nHosted at https:\/\/manage.wpmgr.app, its terms and privacy policy apply. Terms: https:\/\/manage.wpmgr.app\/terms Privacy: https:\/\/manage.wpmgr.app\/privacy\nSelf-hosted, you operate the receiving service and your own policies apply.<\/p>\n\n<p><strong>Have I Been Pwned (https:\/\/haveibeenpwned.com), reached via the WPMgr control plane<\/strong><\/p>\n\n<p>What is sent: the first 5 characters of the SHA-1 hash of a candidate password, a k-anonymity range query. The site sends that prefix to the WPMgr control plane, which relays it to the Have I Been Pwned range API (https:\/\/haveibeenpwned.com\/API\/v3#searchingPwnedPasswordsByRange) and returns the matching hash suffixes. The password itself, the full hash and the user's identity never leave the site; the agent compares the remaining 35-character suffix locally.\nWhen: only while the optional password-policy breach check is enabled, and only when a site user sets or changes a password. Off by default.\nWhy: to refuse a password already known to be breached.\nTerms: https:\/\/haveibeenpwned.com\/TermsOfUse Privacy: https:\/\/haveibeenpwned.com\/Privacy\nThe control-plane hop is covered by the WPMgr terms above.<\/p>\n\n<p><strong>Object storage (configured by your control plane)<\/strong><\/p>\n\n<p>What is sent: backup archives (not encrypted by this plugin), restored backup chunks, optimized media files and transcoded font bytes, over short-lived presigned URLs the control plane supplies. No storage endpoint is hardcoded in this plugin.\nWhen: during backup, restore, and media or font optimization operations that you initiate.\nWhy: this is where your backups and optimized assets are stored.\nThe hosted service uses Google Cloud Storage (storage.googleapis.com) by default; a self-hosted operator may configure any S3-compatible destination. For the hosted default, Terms: https:\/\/cloud.google.com\/terms Privacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p><strong>ipify (https:\/\/api.ipify.org), operated by ipify (https:\/\/www.ipify.org)<\/strong><\/p>\n\n<p>What is sent: nothing. A plain GET request carrying no site data; the response is this server's public outbound IP address, cached locally for 8 hours.\nWhen: during diagnostics collection, which you run or schedule.\nWhy: to infer which host the site runs on.\nTerms: https:\/\/geo.ipify.org\/terms-of-service Privacy: https:\/\/geo.ipify.org\/privacy-policy<\/p>\n\n<p><strong>Cloudflare API (https:\/\/api.cloudflare.com), operated by Cloudflare, Inc.<\/strong><\/p>\n\n<p>What is sent: the configured Cloudflare zone ID and the API credentials you placed in wp-config.php.\nWhen: on a cache purge, and only while the Cloudflare integration is active. It stays inactive unless you define CLOUDFLARE_EMAIL and CLOUDFLARE_API_KEY, or CLOUDFLARE_API_TOKEN, in wp-config.php.\nWhy: to purge the Cloudflare edge cache so visitors do not keep an old page.\nTerms: https:\/\/www.cloudflare.com\/website-terms\/ Privacy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<p><strong>Google Fonts (https:\/\/fonts.googleapis.com, https:\/\/fonts.gstatic.com), operated by Google LLC<\/strong><\/p>\n\n<p>What is sent: the font-family request derived from the page, the same request a browser would otherwise make.\nWhen: on cache build, and only while the self-hosted fonts optimization is enabled and a page uses Google Fonts.\nWhy: to download the CSS and WOFF2 files server-side and serve them from your own domain instead.\nTerms: https:\/\/policies.google.com\/terms Privacy: https:\/\/developers.google.com\/fonts\/faq\/privacy<\/p>\n\n<p><strong>Gravatar (https:\/\/gravatar.com, https:\/\/secure.gravatar.com), operated by Automattic<\/strong><\/p>\n\n<p>What is sent: the avatar hash derived from the page.\nWhen: on cache build, and only while the self-host Gravatars optimization is enabled.\nWhy: to download avatar images server-side and serve them from your own domain instead.\nTerms: https:\/\/wordpress.com\/tos\/ Privacy: https:\/\/automattic.com\/privacy\/<\/p>\n\n<p><strong>Third-party asset hosts referenced by your own pages<\/strong><\/p>\n\n<p>What is sent: a plain GET request to a cross-origin script or stylesheet URL that your page already references.\nWhen: on cache build, and only while the self-host third-party assets optimization is enabled.\nWhy: to serve those assets from your own domain instead.\nThere is no single provider. The hosts depend entirely on what your own pages embed, and the applicable terms and privacy policies are whichever of those hosts publish.<\/p>\n\n<p><strong>Email delivery providers (only the one you select, if any)<\/strong><\/p>\n\n<p>What is sent, for every provider below: sender address, recipient addresses (To, Cc, Bcc), subject, message body (HTML and\/or plain text), and attachments or attachment metadata.\nWhen: only when that provider is the active email transport for this site and an outgoing email is sent. No provider is active until you configure one.\nWhy: to deliver this site's outgoing mail through a provider rather than the server's own mailer.<\/p>\n\n<ul>\n<li>Postmark, operated by Wildbit LLC. Endpoint: https:\/\/api.postmarkapp.com\/email Terms: https:\/\/postmarkapp.com\/terms-of-service Privacy: https:\/\/postmarkapp.com\/privacy-policy<\/li>\n<li>Amazon SES (https:\/\/aws.amazon.com\/ses\/), operated by Amazon Web Services, Inc. Endpoint: https:\/\/email.{region}.amazonaws.com\/ where {region} is your configured AWS region, for example us-east-1. The message is sent as raw MIME signed with AWS Signature Version 4. Terms: https:\/\/aws.amazon.com\/service-terms\/ Privacy: https:\/\/aws.amazon.com\/privacy\/<\/li>\n<li>Mailgun, operated by Sinch Email (formerly Mailgun Technologies, Inc.). Endpoints: https:\/\/api.mailgun.net\/v3\/{domain}\/messages (US region) or https:\/\/api.eu.mailgun.net\/v3\/{domain}\/messages (EU region). Terms: https:\/\/www.mailgun.com\/legal\/terms\/ Privacy: https:\/\/www.mailgun.com\/legal\/privacy-policy\/<\/li>\n<li>SendGrid, operated by Twilio Inc. Endpoint: https:\/\/api.sendgrid.com\/v3\/mail\/send Terms: https:\/\/www.twilio.com\/en-us\/legal\/tos Privacy: https:\/\/www.twilio.com\/en-us\/legal\/privacy<\/li>\n<li>SMTP: whichever server you configure. Your own provider's terms and privacy policy apply.<\/li>\n<\/ul>\n\n<h3>Third-party \/ Credits<\/h3>\n\n<p><strong>matthiasmullie\/minify (MIT)<\/strong><\/p>\n\n<p>CSS and JavaScript minification uses matthiasmullie\/minify (^1.3, MIT), a pure-PHP library in the plugin's Composer dependencies. Copyright (c) 2012 Matthias Mullie. Source: https:\/\/github.com\/matthiasmullie\/minify<\/p>\n\n<p><strong>matthiasmullie\/path-converter (MIT)<\/strong><\/p>\n\n<p>matthiasmullie\/path-converter (~1.1, MIT) is minify's own Composer dependency, rewriting relative paths in minified CSS, installed into the same vendor tree. Copyright (c) 2015 Matthias Mullie. Source: https:\/\/github.com\/matthiasmullie\/path-converter<\/p>\n\n<p><strong>bjeavons\/zxcvbn-php (MIT)<\/strong><\/p>\n\n<p>Password-strength scoring in the password policy uses bjeavons\/zxcvbn-php (^1.4, MIT), a pure-PHP port of zxcvbn in the plugin's Composer dependencies. Copyright (c) 2013-2014 Benjamin Jeavons. Source: https:\/\/github.com\/bjeavons\/zxcvbn-php<\/p>\n\n<p><strong>symfony\/polyfill-mbstring (MIT)<\/strong><\/p>\n\n<p>symfony\/polyfill-mbstring (&gt;=1.3.1, MIT) is zxcvbn-php's own Composer dependency, providing mbstring functions where the extension is absent, installed into the same vendor tree. Copyright (c) 2015-present Fabien Potencier and contributors. Source: https:\/\/github.com\/symfony\/polyfill-mbstring<\/p>\n\n<p>No other third-party PHP libraries are bundled beyond those credited above. Image encoding and WOFF2 font transcoding run on the control-plane service, not inside this plugin. The bundled Real User Monitoring JavaScript also carries a third-party library; see Source code below.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>This plugin ships two minified JavaScript files. Their human-readable source and build tooling are in the public repository at https:\/\/github.com\/mosamlife\/wpmgr<\/p>\n\n<ul>\n<li><strong>assets\/wpmgr-rum.min.js<\/strong> is the Real User Monitoring collector. The readable, non-minified build ships alongside the plugin at assets\/wpmgr-rum.js. TypeScript source: apps\/tracker\/src\/index.ts and apps\/tracker\/src\/vitals.ts. Build: cd apps\/tracker &amp;&amp; npm install &amp;&amp; npm run build (esbuild IIFE bundle, which also bundles Google web-vitals under its Apache-2.0 license; the same build produces both the minified and readable outputs).<\/li>\n<li><strong>assets\/wpmgr-delay.min.js<\/strong> is the deferred-script runtime. The readable source ships alongside the plugin at assets\/wpmgr-delay.js in the same repository.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate this plugin on the site you want to manage.<\/li>\n<li>Get a dashboard, if you do not have one yet. Either run WPMgr on your own server (source and install guide at https:\/\/github.com\/mosamlife\/wpmgr) or sign in at https:\/\/manage.wpmgr.app. Both give you the same dashboard.<\/li>\n<li>In the dashboard, add the site. It gives you a pairing code.<\/li>\n<li>Back on this site, open Fleet Agent Site Manager in the WordPress admin menu. Put your dashboard's address in the <strong>Control-plane URL<\/strong> field and click <strong>Save URL<\/strong>.<\/li>\n<li>Paste the pairing code into the <strong>Pairing code<\/strong> field and click <strong>Enroll<\/strong>. The site appears in your dashboard, and every management action runs from there.<\/li>\n<\/ol>\n\n<h4>What you need before you start<\/h4>\n\n<ul>\n<li>WordPress 6.2 or newer<\/li>\n<li>PHP 8.1 or newer<\/li>\n<li>A WPMgr dashboard to connect to, self-hosted or hosted<\/li>\n<\/ul>\n\n<h4>How to disconnect<\/h4>\n\n<p>Click <strong>Disconnect<\/strong> on the same settings screen, or deactivate the plugin. All outbound communication stops immediately.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20anything%20besides%20this%20plugin%3F\"><h3>Do I need anything besides this plugin?<\/h3><\/dt>\n<dd><p>Yes. This plugin is the agent that runs on your site, and it needs a WPMgr dashboard to talk to. That is either a WPMgr instance you run yourself (open source, https:\/\/github.com\/mosamlife\/wpmgr) or the hosted service at https:\/\/manage.wpmgr.app. On its own the plugin does nothing at all.<\/p><\/dd>\n<dt id=\"why%20is%20this%20called%20fleet%20agent%20site%20manager%20when%20the%20dashboard%20is%20called%20wpmgr%3F\"><h3>Why is this called Fleet Agent Site Manager when the dashboard is called WPMgr?<\/h3><\/dt>\n<dd><p>WPMgr is the project. This plugin is its agent, listed in this directory under the name the plugin directory approved, and the project's own code and documentation call it the WPMgr agent. One plugin, one repository: https:\/\/github.com\/mosamlife\/wpmgr<\/p><\/dd>\n<dt id=\"is%20self-hosting%20a%20cut-down%20version%3F\"><h3>Is self-hosting a cut-down version?<\/h3><\/dt>\n<dd><p>No. The dashboard is AGPL-3.0, has no site limit when you run it yourself, and nothing in it is gated behind a paid tier. Running it does mean running the control-plane service, PostgreSQL and object storage, plus the encoder service if you want image, font and unused-CSS optimization, and a free Wordfence Intelligence API key if you want vulnerability matching. The install guide is in the repository.<\/p><\/dd>\n<dt id=\"how%20many%20sites%20can%20one%20dashboard%20manage%3F\"><h3>How many sites can one dashboard manage?<\/h3><\/dt>\n<dd><p>Self-hosted, as many as your server will carry. The hosted service has per-plan limits, listed at https:\/\/wpmgr.app\/pricing<\/p><\/dd>\n<dt id=\"will%20it%20work%20on%20shared%20hosting%3F\"><h3>Will it work on shared hosting?<\/h3><\/dt>\n<dd><p>Yes. The work that needs real CPU runs on the dashboard, not on your server. Long jobs such as backups acknowledge the request and continue in the background instead of holding a connection open.<\/p><\/dd>\n<dt id=\"does%20it%20conflict%20with%20my%20existing%20cache%20or%20security%20plugin%3F\"><h3>Does it conflict with my existing cache or security plugin?<\/h3><\/dt>\n<dd><p>Every feature is separately optional, so you can connect a site and use only the parts you want. Leave the page cache off and keep the caching plugin you already have; backups, updates and the rest work regardless.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20dashboard%20is%20unreachable%3F\"><h3>What happens if the dashboard is unreachable?<\/h3><\/dt>\n<dd><p>Your site carries on serving. Work the dashboard schedules, such as backups, waits until it can reach the site again. Nothing on the site depends on the dashboard being up.<\/p><\/dd>\n<dt id=\"what%20runs%20on%20my%20server%2C%20and%20what%20runs%20on%20the%20dashboard%3F\"><h3>What runs on my server, and what runs on the dashboard?<\/h3><\/dt>\n<dd><p>This plugin listens for the dashboard's signed commands, carries them out, and sends a heartbeat and environment metadata so the dashboard knows the site is alive. That is all it does on your server.<\/p>\n\n<p>Everything expensive runs on the dashboard: Remove Unused CSS is computed there, image and font encoding happen there, vulnerability matching against a managed feed happens there, and uptime is probed from there rather than from inside your site. Your server never needs a headless browser or an image library.<\/p><\/dd>\n<dt id=\"where%20are%20my%20backups%20stored%2C%20and%20can%20i%20use%20my%20own%20bucket%3F\"><h3>Where are my backups stored, and can I use my own bucket?<\/h3><\/dt>\n<dd><p>Per site, choose storage the dashboard manages, a folder on your own server, or any S3-compatible bucket. Your storage credentials stay on the dashboard and never reach the site; the dashboard signs each transfer.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20phone%20home%3F\"><h3>Does this plugin phone home?<\/h3><\/dt>\n<dd><p>No. The plugin contains no default endpoint and makes zero outbound connections until you connect it to a control plane that you supply. It is completely inert on activation.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20wpmgr%20account%3F\"><h3>Do I need a WPMgr account?<\/h3><\/dt>\n<dd><p>Only if you use the hosted service at https:\/\/manage.wpmgr.app. You can also self-host the entire WPMgr control plane, and the agent works identically either way. The plugin itself has no dependency on any specific account or service.<\/p><\/dd>\n<dt id=\"is%20my%20data%20sent%20anywhere%20by%20default%3F\"><h3>Is my data sent anywhere by default?<\/h3><\/dt>\n<dd><p>No. Without an active connection to a control plane you configured, no data is sent anywhere. All transmission is initiated by commands from the control plane you enrolled, never autonomously.<\/p><\/dd>\n<dt id=\"how%20are%20updates%20handled%3F\"><h3>How are updates handled?<\/h3><\/dt>\n<dd><p>Updates to this plugin are delivered via the WordPress.org plugin directory and applied through the standard WordPress update mechanism. There is no separate update channel in this build.<\/p><\/dd>\n<dt id=\"can%20the%20control%20plane%20execute%20arbitrary%20code%20on%20my%20site%3F\"><h3>Can the control plane execute arbitrary code on my site?<\/h3><\/dt>\n<dd><p>No. The command dispatcher accepts only a closed, named allow-list of commands. Every command is verified against an Ed25519 signature tied to the enrollment key. There is no mechanism to execute arbitrary PHP, SQL, or shell code.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>All outbound communication stops immediately. The control plane can no longer reach the site. Stored cache files, optimized images, and backup archives that already exist on disk are not automatically removed, and you can clean those up from the plugin settings before deactivating.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20write%20any%20files%20outside%20its%20own%20folder%3F\"><h3>Does this plugin write any files outside its own folder?<\/h3><\/dt>\n<dd><p>Only for a small number of opt-in features that must run before WordPress finishes loading your other plugins. Enabling the optional Error Monitor writes a small must-use plugin file to wp-content\/mu-plugins\/ so a fatal error occurring during another plugin's own startup can still be captured and reported; disabling Error Monitor removes that file. The same pattern is used by the optional login-protection ban list (a must-use file that enforces IP and user-agent blocks at the earliest possible point in the request) and by the automatic update-safety watchdog, which is present only while a site is connected to a control plane (it is inert until an update is actually in progress, and is removed if you disconnect the site). No other feature writes outside the plugin's own folder.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>The entries below summarize the notable changes since 0.61.78. This project ships frequently and not every intermediate patch release is listed here. Full history: https:\/\/github.com\/mosamlife\/wpmgr\/blob\/main\/CHANGELOG.md<\/p>\n\n<h4>0.61.166<\/h4>\n\n<ul>\n<li>Added: A connected AI can read the site's Elementor widgets and their settings, and add, change, duplicate, move and remove Elementor's own widgets on a page. Each edit follows the site's approval settings in WPMgr and can be undone.<\/li>\n<li>Changed: Undo restores a page's data rows in place.<\/li>\n<li>Changed: A site whose Elementor version builds widget settings only in the editor gets a plain explanation that those settings are unavailable.<\/li>\n<\/ul>\n\n<h4>0.61.165<\/h4>\n\n<ul>\n<li>Added: A connected AI can create a designed Elementor page with sections and ready-made parts: a hero, features, stats, logos, testimonials, pricing, FAQ and a call to action. It uses the colours, fonts, spacing and corner style the AI chooses for it and is saved as a draft. On a block theme, the page fills the screen without the theme's header and footer.<\/li>\n<li>Added: The AI can edit a designed page: change any part's text, add or replace sections in the same design, and undo the change.<\/li>\n<li>Changed: Saving a designed page refreshes its stylesheet once and keeps its template and page settings. Undo restores the template and page settings exactly.<\/li>\n<\/ul>\n\n<h4>0.61.164<\/h4>\n\n<ul>\n<li>Added: Reading the structure of an Elementor draft the AI can edit now also says whether someone has it open in an editor (Elementor or the WordPress editor) or has unsaved changes to it. A published page is not checked, so its status is not reported. The read changes nothing on the site.<\/li>\n<li>Changed: An edit or an undo that is refused because someone has the page open in an editor (Elementor or the WordPress editor) now tells WPMgr it can be tried again once the editor is closed. A refusal for unsaved changes, or for a page that changed since the AI read it, is not marked that way.<\/li>\n<li>Fixed: An edit of an Elementor draft that someone has previewed now goes through. Where Elementor keeps a style record for each page, the site used to count Elementor's own update of the page's entry as a change outside the page, refuse the edit and put the page back. A change to any other page's entry, or to anything else outside the page, still refuses the edit.<\/li>\n<\/ul>\n\n<h4>0.61.163<\/h4>\n\n<ul>\n<li>Added: An AI connected through WPMgr can now read the structure of a page built in Elementor and edit a draft it created there, in one batch: set text, insert, replace, remove or move elements. Each edit waits for your approval in WPMgr and nothing is published. A published page or post built in Elementor can be read this way too, but never changed. WPMgr needs this version on the site for it.<\/li>\n<li>Added: An edit is refused, and changes nothing, when someone has the page open in Elementor or has unsaved changes to it, when the page changed after the AI read it, when it would remove or replace anything that holds an element the AI cannot edit, or on a site whose database tables cannot roll back a failed change. If Elementor's save does not leave exactly the approved page, the site puts the page back as it was.<\/li>\n<li>Added: Each edit can be undone from WPMgr, newest first. An undo puts back only what that edit wrote, so later changes such as a featured image stay. The site keeps a copy of the page from before each edit for 15 days and deletes expired copies hourly.<\/li>\n<li>Changed: Undoing an Elementor draft the AI created now also works after the AI has edited it through WPMgr, as long as nobody else has changed it.<\/li>\n<\/ul>\n\n<h4>0.61.162<\/h4>\n\n<ul>\n<li>Changed: The agent now needs an explicit instruction from WPMgr before it downgrades WordPress core. A core rollback without it is refused and changes nothing. Plugin and theme rollbacks are unchanged.<\/li>\n<li>Changed: A site that disallows file changes no longer gets core updates from WPMgr, the same as WordPress itself.<\/li>\n<li>Fixed: On a site where Composer manages WordPress core, a core update is now skipped and reported as not changing core, with a note to update core in composer.json and redeploy. A core update that fails before any core file is replaced now says core was not changed. After a core update or rollback the agent reports the version installed on disk, where it used to report the old version as up to date.<\/li>\n<li>Fixed: A backup makes up to three attempts at a chunk upload when the storage reports a temporary problem, and waits up to 120 seconds for each. When an upload still fails, the message names the storage host and the status or network error.<\/li>\n<li>Fixed: A site that refuses a signed command now says which check refused it, such as a site clock out of step with WPMgr's, instead of one general invalid-token answer.<\/li>\n<li>Fixed: Deleting the plugin now removes everything the agent saved under its wpmgr_agent_ option names on that site and, on multisite, in the network settings. A setting whose name differs only in letter case or accents is left alone.<\/li>\n<li>Fixed: A restore that fails after swapping in files or the database keeps what the automatic rollback needs. A restore that has ended keeps none of its run settings.<\/li>\n<li>Fixed: A plugin or theme update is reported as already up to date only when WordPress's update check covered it. A rejected rollback or update no longer clears maintenance mode another update put in place. A wp-config.php that mentions a framework only in a comment no longer stops the agent adding its constants. Image address rewriting leaves a value with no address to change exactly as it was.<\/li>\n<li>Fixed: The listing, and the Re-enroll and Disconnect text in WordPress admin, no longer say backup archives are encrypted. This plugin does not encrypt them. The privacy section now lists the data AI requests carry.<\/li>\n<\/ul>\n\n<h4>0.61.161<\/h4>\n\n<ul>\n<li>Added: An AI connected through WPMgr can now create a draft page or post in Elementor from an outline, with your approval for each request in WPMgr. The outline can use headings, paragraphs, lists, quotes, tables, separators, buttons, spacing, sections and columns, and images that are already in the site's media library. The draft is built from Elementor's own classic widgets, in containers or in sections and columns, whichever the site's Elementor is set up for. Nothing is published, and undo moves the draft to the trash while nobody has edited it.<\/li>\n<li>Added: A page built in Elementor this way needs Elementor 3.20 to 4.3. A request for Elementor's Atomic editor is refused, and so are a button in the outline style and an image whose alt text differs from the one saved in the media library. After Elementor saves the page, WPMgr checks that it holds exactly the approved layout and that nothing outside the page changed, and moves the draft to the trash if not.<\/li>\n<\/ul>\n\n<h4>0.61.160<\/h4>\n\n<ul>\n<li>Added: An AI connected through WPMgr can now create a draft page or post from an outline with real layout, with your approval for each request in WPMgr. The outline can use headings, paragraphs, lists, quotes, tables and separators, and images that are already in the site's media library. In the block editor it can also use buttons, spacing, sections and columns. Nothing is published, and undo moves the draft to the trash.<\/li>\n<li>Fixed: When one cache purge starts another, each purge's report of what it cleared stays separate and accurate.<\/li>\n<\/ul>\n\n<h4>0.61.159<\/h4>\n\n<ul>\n<li>Added: The agent now includes two read-only facts in the site details it sends to WPMgr: which parent theme a child theme uses and, on a site running Elementor, whether Elementor's Atomic editor is switched on. It changes nothing on the site.<\/li>\n<\/ul>\n\n<h4>0.61.158<\/h4>\n\n<ul>\n<li>Added: An AI connected through WPMgr can read the site's published pages, posts, media, categories and tags through WordPress's own REST API, as the dedicated WPMgr content user. With per-request approval in WPMgr it can change a page or post title or excerpt, with undo, and it refuses pages whose other content the WPMgr user may not save.<\/li>\n<li>Added: It can use reviewed read tools that other plugins register with the WordPress Abilities API (WordPress 7.1 or later). A read that tries to change settings or contact other servers is refused, and admin-rights changes are put back.<\/li>\n<\/ul>\n\n<h4>0.61.157<\/h4>\n\n<ul>\n<li>Improved: AI page creation. Page titles and text can contain \"&amp;\" and bracketed numbers such as [1] and are stored as literal text. A draft left behind by an interrupted AI request can be moved to the trash from WPMgr as long as nobody has edited it.<\/li>\n<\/ul>\n\n<h4>0.61.156<\/h4>\n\n<ul>\n<li>Added: AI page creation, off by default. When you turn it on for a site from its Content tab, an AI connected through WPMgr can request a new draft page (headings, paragraphs and lists, in the block editor or the classic editor), and a person approves each request in WPMgr. The page is always created as a draft by a dedicated WPMgr content user that cannot log in, and it can be moved to the trash while nobody has touched it.<\/li>\n<\/ul>\n\n<h4>0.61.155<\/h4>\n\n<ul>\n<li>Added: a signed command the control plane uses to list the tools (abilities) a site registers, and to run WPMgr's own read-only abilities: list the site's abilities, report site facts, and read the text of a published page. It changes nothing on the site. It sends the names, labels and descriptions of registered abilities, with each one's owner type, site facts (WordPress and PHP versions, theme and active plugin names), and, for a published page without a password that the control plane asks for, that page's title and text.<\/li>\n<\/ul>\n\n<h4>0.61.154<\/h4>\n\n<ul>\n<li>Added: a read-only check the control plane can run to see which editor owns each page (the classic editor, the block editor, or a page builder) and whether it is a special page such as the blog index. It changes nothing on the site. It does not send page body text or stored builder data; it sends published page titles, and for a single page, the display name of the last editor and of anyone currently editing it.<\/li>\n<\/ul>\n\n<h4>0.61.153<\/h4>\n\n<ul>\n<li>Added: the plugin can now carry out a cache purge limited to this site's own page cache, skipping hosting and CDN cache integrations, and report which detected integrations ran and which were skipped, when the control plane requests it.<\/li>\n<li>Fixed: clearing the cache for a page address that uses a non-default port now targets the same cache entry that page was stored under.<\/li>\n<\/ul>\n\n<h4>0.61.152<\/h4>\n\n<ul>\n<li>Fixed: the plugin now checks whether each key it has stored still opens under this site's current encryption key. If some do not, the WordPress admin screen shows a notice naming which keys cannot be read and what to do about it. When the backup key cannot be used, a backup is refused with a clear explanation instead of failing later. Status is reported to the dashboard along with the rest of this site's metadata. A missing backup key is only created while this site's own key pair still opens, or on a site with no stored keys yet.<\/li>\n<\/ul>\n\n<h4>0.61.151<\/h4>\n\n<ul>\n<li>Fixed: a router log line that carries an exception message now escapes control characters, so a command failure is always one readable line in the debug log, instead of one that could break across lines or lose part of its own text. What is sent back to the control plane is unchanged.<\/li>\n<\/ul>\n\n<h4>0.61.150<\/h4>\n\n<ul>\n<li>Fixed: a command that fails now reports back what broke: the kind of error, where in the plugin it was thrown, and a short reason, instead of a generic failure message. The reason passes through a redactor that removes recognised key material and absolute paths, and is withheld entirely if that cannot be done safely. The same failure is written to this site's debug log on one line, with recognised key material redacted and the path kept, so a failure can be diagnosed from the dashboard or the log without reproducing it.<\/li>\n<li>Added: a new content-update command can change the title and\/or body of an existing post or page by id. It keeps a retained copy of what it overwrites before writing, refuses to touch a document built in the block editor, and requires a fingerprint of the content it expects to replace, so a conflicting write is reported as a conflict rather than silently applied. Nothing in the dashboard uses this yet.<\/li>\n<\/ul>\n\n<h4>0.61.149<\/h4>\n\n<ul>\n<li>Fixed: restoring a file from media quarantine no longer overwrites a file that has since been recreated at the same path. A file that cannot be put back safely is now left in quarantine and reported with a reason, instead of being removed after a restore that did not happen, so nothing is lost when a restore cannot complete in full. The quarantine folder is now cleared only once every file it recorded has been accounted for and a scan confirms nothing is left behind.<\/li>\n<li>Fixed: every path the page cache reads or writes is now kept inside the cache folder.<\/li>\n<li>Fixed: creating a folder on this site now stays inside the WordPress installation even when the parent folder does not exist yet.<\/li>\n<li>Fixed: the snapshot taken before an update now tells apart \"nothing was here before\" from \"the snapshot could not be taken\". Both previously looked the same to the code that decides whether an automatic rollback is possible, so a rollback could be skipped when it was available, or attempted when there was nothing to restore. A snapshot that could not be completed is also no longer left behind as a partial copy.<\/li>\n<li>Changed: every command this plugin accepts now declares what a successful run does to the site and whether running it again is safe. This is descriptive information for the dashboard's approval and audit screens; no command behaves differently because of it.<\/li>\n<\/ul>\n\n<h4>0.61.148<\/h4>\n\n<ul>\n<li>Fixed: this plugin no longer fatals with a white screen on Enroll on a host without the native libsodium PHP extension. A memory-wiping call was made unconditionally, and WordPress's bundled polyfill throws rather than perform it; every call site now degrades to a best-effort overwrite instead. This affected shared hosting broadly, cPanel and CloudLinux hosts especially, where the plugin installed and activated normally but enrollment could not be completed.<\/li>\n<li>Changed: removed a settings-screen section that asked you to paste a minted connection key into a dashboard flow that was never built. The underlying mechanism is unchanged; only that dead, confusing step is gone.<\/li>\n<\/ul>\n\n<h4>0.61.147<\/h4>\n\n<ul>\n<li>Fixed: on a multisite network, a plugin activated for the whole network is now reported as active in this site's metadata. It was reported inactive, so it was missing from the plugin inventory and from everything that reads it, including update and vulnerability checks.<\/li>\n<li>Changed: this plugin is licensed MIT, and now says so consistently on every surface that declares a licence (the plugin header, the mu-plugin headers, this readme, composer.json and the bundled licence file). Some of those previously declared GPLv2 or later. No functional change.<\/li>\n<\/ul>\n\n<h4>0.61.146<\/h4>\n\n<ul>\n<li>Security: the application-password two-factor control now actually runs. It was registered against a name that is a core WordPress function, not a hook anything fires, so it silently never took effect on any site. Breaking change for integrations: a site with two-factor authentication enabled will have application passwords stop working for a user who has a second factor enrolled or whose role requires one, returning HTTP 401. That is the intended fix.<\/li>\n<li>Fixed: a database restore could silently drop the dump's last SQL statement while still reporting success, when the restorer could not tell whether the very end of the dump was nothing but comments. It now aborts the restore instead of finishing on an uncertain guess.<\/li>\n<li>Fixed: a database restore could also write straight into this site's live tables while still reporting success, when the step that stages a restore under a temporary table prefix could not tell which table a statement named. It now aborts the restore instead of guessing, proven end to end against a live database.<\/li>\n<li>Fixed: resending an email could send a different message than the one selected, after this site's database was restored, because the row id a resend uses is a local auto-increment counter that a restore rolls back. This site now confirms the row before sending and refuses the resend on a mismatch. An older version of this plugin still resends exactly as it always has; it simply cannot be confirmed.<\/li>\n<li>Fixed: the database tools' orphaned-data scan could fail with a fatal error every time it ran, calling a function that does not exist outside of $wpdb. It now calls the correct one.<\/li>\n<li>Fixed: editing a user's profile in wp-admin no longer fails with a critical error. WordPress does not always hand this plugin's hooks the object type they expect on a profile edit, and this plugin assumed one unconditionally.<\/li>\n<li>Fixed: the disk-size probe behind Site Health's Directory sizes panel, this plugin's own daily size walk, and every media upload on a multisite network no longer crash when the size cache is cold, which is any fresh install, any cache flush, or the first read after either.<\/li>\n<li>Fixed: a generic, operator-defined user-agent ban could 403 this site's own login page, with no recovery path, because the ban matched as an unbounded substring with no minimum length or genericity check. The login page (and a hidden login address, if configured) is now exempt, and an overly short or generic pattern is now refused outright.<\/li>\n<li>Fixed: the documented recovery constant for an admin locked out by this plugin's own auth policy (<code>WPMGR_DISABLE_SITE_2FA<\/code>) now also releases the unique-nickname rule and the automatic login lockout, instead of leaving those two still blocking recovery.<\/li>\n<\/ul>\n\n<h4>0.61.139<\/h4>\n\n<ul>\n<li>Added: this site now also reports an email delivery failure detected through WordPress's own mail-failure signal, not only failures on mail this site routes through WPMgr. Sites sending through their own SMTP setup are now covered too.<\/li>\n<li>Added: a detected failure is recorded even when this site's email log is turned off. That setting controls whether successful sends are kept for review; a failure is recorded regardless, and the recipient, subject, sender and message body are withheld from the record unless email logging is on.<\/li>\n<li>Fixed: <code>wp_mail()<\/code> reported success on a failed send, so a contact form or password reset could tell a visitor the message went out when nothing was delivered. <code>wp_mail()<\/code> now returns false on a failed send and fires WordPress's own mail-failure hook, so plugins and themes that check the result learn the truth.<\/li>\n<\/ul>\n\n<h4>0.61.131<\/h4>\n\n<ul>\n<li>Fixed: sending email from this site could silently stop working days after it had been set up and used successfully, showing as \"SMTP Error: Could not authenticate\" (GH #380). Saving, testing or syncing this site's email settings from the dashboard could send an empty password, and the site read that as an instruction to delete the working password it already had. This site no longer deletes a stored password unless the dashboard actually sends a real replacement, and it now refuses an email settings update it cannot make sense of instead of acting on the part it understood. If this site lost its password this way, the dashboard restores it the next time it syncs this site's email settings, with nothing for you to re-enter.<\/li>\n<li>Security: a password belonging to your dashboard account is no longer sent to a mail server you choose from this site's own settings page, and a stored password is no longer carried over automatically when you point this site's email at a different mail server, mailbox user or provider.<\/li>\n<\/ul>\n\n<h4>0.61.127<\/h4>\n\n<ul>\n<li>Fixed: a password policy can now target the roles the site actually has, not only the five roles a stock WordPress install ships with. On a WooCommerce store the roles that matter are the ones the store added, and a shop manager who can edit orders, refund customers and read every buyer's address could not be required to hold a strong password, because that role could not be selected. The same applied to membership, LMS and booking plugins, and to roles an agency created by hand. Enforcement was never the problem: the agent has always applied a policy to whatever role a user really holds. What was missing was any way to write the rule. Role names now also read the way they read on the site itself, in the site's own language, while the rule stays bound to the underlying role identifier, so renaming or translating a role never changes who it covers.<\/li>\n<\/ul>\n\n<h4>0.61.114<\/h4>\n\n<ul>\n<li>Fixed: two updates could be dispatched to the same site at once, for example two plugins in one bulk run, or an update and a rollback overlapping, which ran more than one WordPress installer against the same site at the same time (GH #328). A second installer can delete files the first one is still using. Updates and rollbacks on a single site now run strictly one at a time.<\/li>\n<li>Fixed: when an update fails before it has touched anything on the site, for example a corrupted download, the site no longer runs an automatic restore over a plugin or theme directory it never modified.<\/li>\n<\/ul>\n\n<h4>0.61.112<\/h4>\n\n<ul>\n<li>Fixed: outgoing email failed completely whenever a plugin set a Reply-To header in the ordinary \"Name <a href=\"mailto:email@example.com\">email@example.com<\/a>\" form, which WooCommerce, Fluent Forms and many others do by default (GH #312). The whole string, display name included, was handed to the mail transport as if it were the address; the transport rejected it, and one bad address aborted the entire message, so nothing was sent. Addresses are now parsed properly wherever a bare address is required, the display name is kept, and a single bad address costs that one recipient instead of the whole email. The same defect applied to To, Cc and Bcc on the SMTP and SendGrid providers, including headers carrying more than one address.<\/li>\n<\/ul>\n\n<h4>0.61.95<\/h4>\n\n<ul>\n<li>Fixed: a failed backup left its working files behind on the site (GH #256). One reported site was holding roughly 1.4 GB of upload parts, copied plugins and themes, and a database dump. All four paths that can give up on a backup now reclaim that working directory, and each one takes the same lock a live backup holds before deleting anything, so a backup that is merely slow is never touched. The routine cleanup of old working directories and of leftover restore files no longer depends on WP-Cron, so it also runs on a site where WP-Cron never fires.<\/li>\n<\/ul>\n\n<h4>0.61.87<\/h4>\n\n<ul>\n<li>Fixed: an interrupted backup now resumes cleanly instead of failing on a missing local chunk (GH #283). The agent deleted each chunk from local disk right after uploading it but only recorded its progress once the whole upload finished, so a worker stopped partway through resumed, was correctly told to send chunks it had already uploaded and deleted, then failed looking for them. Upload progress is now recorded durably as it goes, and no local chunk is deleted until that progress is safely persisted.<\/li>\n<\/ul>\n\n<h4>0.61.85<\/h4>\n\n<ul>\n<li>Fixed: full backups on slow servers no longer fail at the upload stage (GH #279). A large backup could go quiet during the archiving stage for long enough that the control plane wrongly marked it failed while it was still working. The agent now sends progress heartbeats during long archive and encryption passes, reports the exact control-plane status when a callback is rejected, and removes its local working files when a run ends in failure.<\/li>\n<\/ul>\n\n<h4>0.61.84<\/h4>\n\n<ul>\n<li>Fixed: backups no longer time out on OpenLiteSpeed and LiteSpeed servers (GH #274). The agent acknowledges a backup request and continues the work in the background; it previously released that acknowledgment using a PHP-FPM-only mechanism, which OpenLiteSpeed's PHP does not provide, so the connection stayed open for the entire backup. The agent now releases the acknowledgment using whichever mechanism the site's server actually supports.<\/li>\n<\/ul>\n\n<h4>0.61.82<\/h4>\n\n<ul>\n<li>Fixed: the \"disable file editor\" hardening toggle could fatal every request on a Roots\/Bedrock site (GH #268). Roots\/Bedrock manages that constant through its own config layer and throws when it is defined a second time; the agent now checks whether it is already defined (or the config file is otherwise framework-managed) before writing anything, so nothing is written in that case and the toggle still reports success. Standard WordPress installs are unaffected. The full-page cache's WP_CACHE constant is protected the same way.<\/li>\n<\/ul>\n\n<h4>0.61.81<\/h4>\n\n<ul>\n<li>Fixed: control-plane commands could fail on sites running a third-party plugin that globally decodes the Authorization header on every request, for example as part of its own JWT-based auth (GH #269). The agent now moves its own signed Authorization value out of the request before any other plugin's code runs, so this class of conflict can no longer occur.<\/li>\n<\/ul>\n\n<h4>0.61.80<\/h4>\n\n<ul>\n<li>Changed: the WordPress.org distribution build no longer adjusts WordPress's own upgrader working-directory handling during a plugin, theme, or core update. Self-hosted installs are unaffected.<\/li>\n<li>Fixed: reworded a documentation comment in the file-manager write guard that quoted an example attack payload verbatim, so security scanners no longer report a false-positive match on the plugin's own file (GH #266). No behavior changed.<\/li>\n<\/ul>\n\n<h4>0.61.79<\/h4>\n\n<ul>\n<li>Fixed: on a site installed from a plain git clone or a GitHub source download (no <code>composer install<\/code> run), activating the plugin could fail immediately with a fatal error (GH #262). The plugin's own class loader could not find a handful of its own files; it now resolves every one of them without depending on any other tool being present.<\/li>\n<\/ul>\n\n<h4>0.61.78<\/h4>\n\n<ul>\n<li>Fixed: the plugin could fail to set up its encryption key on some managed hosts (for example Hostinger and other CloudLinux\/CageFS hosts), leaving it active but unable to connect (GH #257). It now tolerates a wp-config.php with missing or partial secret salts, tries the uploads folder as an additional fallback file location, and as a last resort can store a dedicated encryption key in the database when no file location is writable. Key setup is now safe against two requests racing to set it up at the same time and against a write interrupted partway through. Already-connected sites are unaffected.<\/li>\n<\/ul>","raw_excerpt":"Securely connects this site to a WPMgr dashboard, self-hosted or hosted, so backups, updates, security and speed all run from one screen.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324501"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mosamlife"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324501"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324501"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324501"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324501"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324501"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}