Description
SiteRelay copies a WordPress site (its database, its files, or both) to another WordPress site, and keeps a way back.
What makes SiteRelay different
- Everything is free: pull, push, backups, multisite subsites and WP-CLI. No paid version, no size caps, no account.
- Your two sites talk to each other directly. Nothing passes through a third-party service or the author’s servers.
- A way back from everything: a restore point before every change, and one click to undo it (even a push, undone on the site it went to).
- You see what will happen first: every pull and push shows a summary before it starts, and Find & Replace previews every change.
- Built for big sites: work moves in small steps that hosting time limits don’t stop, and a job can be paused, resumed or cancelled.
- Multisite both ways: bring a site into a network as a new or existing subsite, or take a subsite out, with users merged by email.
Pull and push
- Pull another site into this one, or push this site to another. SiteRelay runs on both sites; they talk to each other directly.
- Copy the whole site, just the database, or the parts you choose: themes, plugins, must-use plugins, uploads and the rest of wp-content.
- Addresses and file paths change to the receiving site’s automatically, including inside serialized data and JSON.
- Mirror mode moves aside what the receiving site has and the other doesn’t, so it matches exactly.
- Access keys decide who may pull from or push to a site, and the site mode (locked, pull-only, push-only or open) sets what it accepts at all. A site can lock itself after a push arrives.
Backups, export and import
- Full backups of the database and files, to keep on the server, download, or import on another site and restore there (the by-file way to put a site live).
- Choose what a backup holds: the database, themes, plugins, must-use plugins, uploads, the rest of wp-content and the files in the site’s root such as .htaccess and robots.txt (never WordPress itself or wp-config.php), compressed or not. Restoring replaces only what the backup holds.
- Export the database as .sql or .sql.gz, and import .sql, .sql.gz (from SiteRelay, mysqldump or phpMyAdmin) or a SiteRelay backup .zip.
- Find & replace across the database with a preview first; serialized and JSON data stay intact.
A way back
- Every pull, push, import, restore and find & replace saves a restore point first. Undo it from History; a push is undone on the site it went to.
- When the users came with what was copied, SiteRelay takes you to the login page and back to the job.
Multisite
- SiteRelay works on one subsite at a time: export, import, back up, find & replace, pull and push it.
- A site that comes into a network becomes one of its subsites, existing or new, and its users join the network, merged by email and shown before anything runs.
And
- Saved profiles and “Run again”, email and webhook notifications when a job ends, and a History of every job with a downloadable report.
- WP-CLI:
wp relay pull,push,export,import,find-replace,backups,keys,mode,jobsandsubsites. - Large sites move in small steps, so ordinary hosting time limits don’t stop them; a job can be paused, resumed or cancelled.
Security
Every request between two sites is signed with the access key’s secret (HMAC-SHA256) and can be used only once; the answers are signed too. Secrets are stored encrypted. Nothing passes through a third party: the two sites talk to each other.
SiteRelay is free: no paid version, no account, no locked features.
External services
SiteRelay uses no service of its own, and never sends data about your site to its author. It connects only to:
- The WordPress sites you connect it to. A pull or push carries what you chose to copy (database tables and files) between your site and the other site, which runs SiteRelay too, at the address in the connection string from that site’s Access keys screen. Every request is signed with that access key, and nothing passes through anyone else.
- The email addresses or webhook URL you enter under Settings Notifications, and only once you switch them on. They receive a short summary of a finished or failed job (its type and status, the other site’s address and a link to the job). A webhook can be any service that accepts a JSON POST, such as Slack’s incoming webhooks; that service’s own terms and privacy policy apply (for Slack: https://slack.com/terms-of-service and https://slack.com/trust/privacy/privacy-policy).
- This site itself: after a pull, push or restore, SiteRelay loads the site’s home page once to check that it still works, and puts the site back if it doesn’t.
Source code and building
The screens are built from the TypeScript source in ui/: run cd ui && npm ci && npm run build to write build/. The PHP source is in src/.
Screenshots






Installation
- In WordPress, go to Plugins Add New, search for “SiteRelay”, click Install Now, then Activate. On a multisite network, install it from Network Admin and click Network Activate.
- Open Tools SiteRelay (on a network: Network Admin SiteRelay).
- To pull or push, install SiteRelay on the other site too. There, create an access key under Access keys, and paste its connection string into Pull or Push here.
FAQ
-
Coming from Relay 0.9.x?
-
SiteRelay is Relay’s new name: the same plugin, now in the WordPress.org directory. Deactivate Relay, then install and activate SiteRelay from Plugins Add New. Your settings, access keys, saved connections, history and backups carry over. Then delete Relay on the Plugins screen: SiteRelay keeps your data. Sites still on Relay 0.9.x can keep pulling from and pushing to SiteRelay sites in the meantime.
-
Does SiteRelay have to be on both sites?
-
To pull or push, yes. To restore a backup on another site, only that site needs SiteRelay: download the backup here and import it there.
-
What does a backup hold?
-
By default the whole site: the database, themes, plugins, must-use plugins, uploads, the rest of wp-content, and the files in the site’s root folder, such as .htaccess, robots.txt and verification files. You can untick any of them, or leave out single files and folders in the root; other WordPress sites found there (a staging copy, say) are left out unless you tick them. WordPress’ own files and wp-config.php are never in a backup, so restoring never touches the receiving site’s WordPress or its database login. Server settings (.htaccess, .user.ini, php.ini, web.config) are put back with a site’s own backups, and from another site’s backup only when you tick them, because rules from another host can stop a site from loading.
-
Can I undo a migration?
-
Yes. SiteRelay saves a restore point before it changes anything, and History offers to undo the job. It keeps the newest restore points (2 by default; see Settings).
-
Why do I have to log in again after a pull or a restore?
-
When the users were copied too, this site now has the other site’s accounts: log in with one of those. SiteRelay takes you to the login page and brings you back to the job.
-
Is my data sent anywhere else?
-
Not your site’s data. The two sites talk to each other directly, and notifications go only to the email addresses or webhook you set. SiteRelay uses no service of its own; see External services.
-
Does SiteRelay download plugins, themes or other code?
-
Not from its author or any service. A pull or push copies the files you choose, plugins and themes included, between your own sites: only when you start it, and only with an access key the other site’s administrator created for this. SiteRelay never pulls or pushes on its own; its one scheduled task tidies up, removing old history, backups past your limit and temporary files.
-
Does SiteRelay add files outside its own folder?
-
No. Everything SiteRelay keeps is in one private folder, wp-content/uploads/siterelay, removed when you delete SiteRelay:
- exports and backups, under random names;
- restore points: the files a pull, push or restore replaced, packed into an archive shortly after the job finishes, so the job can be undone;
- while a job runs, the files on their way in and the ones they replace, in folders named after the job’s random id.
Each folder has an index.php and rules that refuse direct access, and once a job’s restore point is packed, nothing SiteRelay keeps is a file a web server could run. SiteRelay writes nothing into the mu-plugins folder or other plugins’ folders; only a pull, push or restore that you start changes the site’s own themes, plugins and uploads. On a site that ran an earlier build the folder is uploads/relay, and the wp-content folders siterelay-staging and siterelay-backups (or relay-staging and relay-backups) that earlier builds used can be deleted.
-
What does SiteRelay leave out when it copies files?
-
What a copy of the site doesn’t need: caches, logs, the backup folders of other backup and migration plugins, WordPress’ upgrade folders, an analytics plugin’s location database (that plugin downloads it again), and version-control and node_modules folders. SiteRelay’s own folders are never copied. To bring something back for one job, choose Custom and add a line starting with ! under Leave out, for example !uploads/iawp-geo-db.mmdb.
-
How do I translate SiteRelay?
-
On translate.wordpress.org, like any plugin in the directory. The template is also in the plugin: languages/siterelay.pot. Put the PHP translations in languages/siterelay-{locale}.mo and the screens’ translations in languages/siterelay-{locale}-relay-app.json.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“SiteRelay” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “SiteRelay” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.0 (2026-10-26)
- First release on WordPress.org, as SiteRelay (formerly Relay).
- Moving from Relay 0.9.x: SiteRelay asks for the old plugin to be deactivated, and deleting it afterwards keeps your data.
- The site-to-site route checks each request’s signature before it runs.
- Backups: choose the parts, include the files in the site’s root, and choose compression (big files are compressed too); restoring replaces only what the backup holds.
- When the other site’s server refuses a request as too large (a web server or firewall limit), a push sends its tables and files in smaller pieces instead of stopping, and messages say what that server answered.
- A saved connection can take the username and password its site starts asking for (for example a staging lock pushed to it), so its jobs and their undo keep working.
- Backups, exports, imports, restores and find & replace work a few seconds per request from the screens instead of 1 MB, so they finish much sooner.
- Pushes and pulls are faster: small tables travel together in one request, batches of files grow while requests are quick and stay just under the other site’s size limit once its server refuses one, each request from the screens works a few seconds, and the receiving site writes each file with a fraction of the disk operations. Request size now sets the size of a pull’s or push’s table pieces.
- History has a Report button on every row, so a job’s report downloads without opening the job.
- SiteRelay writes no code outside its own folder: the must-use helper of earlier builds is gone, and a copy left by one is removed. SiteRelay never activates a plugin, itself included: a database brought in without SiteRelay active switches it off, and the result says so. All database queries go through WordPress’ $wpdb.
- SiteRelay keeps everything in wp-content/uploads/siterelay, named after its slug (a site an earlier build set up keeps uploads/relay). A restore point’s files are packed into an archive there once its job has finished. Requests between sites read only SiteRelay’s own headers.
- wp relay export and wp relay backups download send the file to standard output, to save with a redirect (wp relay export > site.sql); wp relay jobs report prints the report.
- Every file SiteRelay writes is checked to have been written whole, and copying a folder to another disk copies its symlinks as symlinks.
- Answers between sites are JSON that WordPress outputs, and files are checked before they are opened, moved or removed instead of hiding PHP’s warnings.
- Downloads of backups and exports arrive in short pieces, so a server that ends long requests can no longer cut them short, and a backup .zip whose download stopped early is named incomplete as soon as you choose it for upload. Downloaded files are named example.co.za-…-siterelay-backup.zip.
- Updates now come from WordPress.org: the GitHub key and Settings Updates are gone, and upgrading removes the stored key.
- The screens use WordPress’ own React.
- Error messages are escaped where they’re made.
0.9.4 (2026-10-26)
- Relay’s author, Usama Gierdien (usamagierdien.co.za), is named on the Plugins screen and in “View details”.
0.9.3 (2026-10-26)
- While files are copied, the progress screen shows files and size copied out of the total, what is being copied (themes, plugins, uploads), the speed and the time left, and its bar follows the data instead of sitting near the end.
- The site pulled from or pushed to lists the files in its History too (“160 tables + 34,145 files”).
- Copies leave out more of plugins’ working data: logs, other plugins’ backups and caches, WordPress’ upgrade folders and an analytics plugin’s location database.
0.9.2 (2026-10-26)
- Relay’s “View details” window gets a banner, an icon (also shown on Dashboard Updates), and Description, Installation, FAQ and Screenshots tabs.
0.9.1 (2026-10-26)
- “Tested up to 7.1” now covers WordPress 7.1.x, so an update’s details no longer warn that Relay wasn’t tested with, say, 7.1.3.
0.9.0 (2026-10-26)
- Updates from GitHub: with a read-only GitHub key saved under Settings Updates, new versions show on the Plugins screen and install in one click (never while a migration is running).
- A version is published by pushing its v-tag: GitHub runs every check, then publishes the zip that run built.
0.8.9 (2026-10-26)
- Every screen string with a placeholder now has a note for translators saying what the placeholder is.
- When Relay can’t load a site after a switch to check it, the warning says why (for example a timeout).
0.8.8 (2026-10-23)
- Tables kept in memory (ENGINE=MEMORY), such as Wordfence Login Security’s, are copied instead of stopping a pull.
- When another site sends SQL Relay won’t run, the message says so, not that a backup contains it.
0.8.7 (2026-10-23)
- URL-encoded addresses (such as Elementor’s dynamic tag settings) change to the new site’s too.
0.8.6 (2026-10-22)
- Translations shipped in Relay’s languages folder are loaded; a translation template (languages/relay-migrate.pot) and this readme are included.
0.8.5 (2026-10-22)
- Content that appears while a loading skeleton still covers it is hidden from screen readers until it can be used.
0.8.4 (2026-10-22)
- A backup zip whose zip64 sizes are cut short is reported as damaged instead of failing with a PHP warning.
- A backup whose list of entries can’t be read stops instead of finishing empty; an undo whose record of replaced files can’t be read stops instead of skipping them.
- A response header a proxy repeats (the signature, WWW-Authenticate) is read value by value.
0.8.3 (2026-10-21)
- A network receiving a push fails the job on any error and removes what it received; a new subsite created for a push that can’t start is removed again.
wp relay push --subsitewith every table listed, in any order, takes the subsite’s users along.- Opening a pull from a subsite asks only for its addresses, not its whole description.
- A subsite backup’s download is named after the subsite; job details never count fewer tables than they list.
0.8.2 (2026-10-21)
- Pull and push name the subsite (not just its network) wherever they say whose addresses and accounts.
- Undoing a push on the other site shows straight away; WordPress’s own index.php is no longer listed as a kept plugin or theme; the address hint for a new subsite follows the network.
0.8.1 (2026-10-19)
- After a pull that brought the other site’s users, Relay takes you to the login page and back to the pull.
0.8.0 (2026-10-19)
- Multisite pull and push: a subsite on either side, existing or new, with who joins the network shown first.
- WP-CLI:
wp relay pullandpushwith--subsite,--new-subsiteand--remote-subsite.
0.7.1 (2026-10-19)
- After a restore, import or undo that brought other users, Relay takes you to the login page and back to the job.
0.7.0 (2026-10-16)
- Multisite, one subsite at a time: export, import (also into a new subsite), backups and find & replace, with users merged into the network and undone on request.
- WP-CLI:
--subsiteandwp relay subsites.
0.6.2 (2026-10-15)
- The screens work on phones.
0.6.1 (2026-10-15)
- Pull and Push redesigned: whole site, database only, or custom.
- A connection string from the site itself is refused; WP-CLI
--whole-site.
0.6.0 (2026-10-15)
- WP-CLI:
wp relaycommands for every screen.
0.5.0 (2026-10-15)
- Import of .sql and .sql.gz files, Run again, saved profiles, and email and webhook notifications.
0.4.0 (2026-10-15)
- Files in pull and push: themes, plugins, must-use plugins, uploads and the rest of wp-content, with mirror and low-disk modes.
0.3.0 (2026-10-14)
- Site-to-site database pull and push, access keys and site modes.
0.2.0 (2026-10-14)
- Backups: create, download, import and restore full-site backups.
0.1.0 (2026-10-14)
- Database export, find & replace with preview, restore points and History.
