Title: SiteRelay
Author: Usama Gierdien
Published: <strong>November 9, 2026</strong>
Last modified: November 9, 2026

---

Search plugins

![](https://ps.w.org/siterelay/assets/banner-772x250.png?rev=3791825)

![](https://ps.w.org/siterelay/assets/icon-256x256.png?rev=3791825)

# SiteRelay

 By [Usama Gierdien](https://profiles.wordpress.org/u5ama/)

[Download](https://downloads.wordpress.org/plugin/siterelay.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/siterelay/#description)
 * [Reviews](https://wordpress.org/plugins/siterelay/#reviews)
 *  [Installation](https://wordpress.org/plugins/siterelay/#installation)
 * [Development](https://wordpress.org/plugins/siterelay/#developers)

 [Support](https://wordpress.org/support/plugin/siterelay/)

## 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`, `jobs` and `subsites`.
 * 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

[⌊Home: back up, export, find & replace, import, pull or push. Every job can be 
undone.⌉⌊Home: back up, export, find & replace, import, pull or push. Every job 
can be undone.⌉[

Home: back up, export, find & replace, import, pull or push. Every job can be undone.

[⌊Pulling a subsite from a network: choose what to copy, and see what will happen
before it does.⌉⌊Pulling a subsite from a network: choose what to copy, and see 
what will happen before it does.⌉[

Pulling a subsite from a network: choose what to copy, and see what will happen 
before it does.

[⌊A backup in progress, step by step.⌉⌊A backup in progress, step by step.⌉[

A backup in progress, step by step.

[⌊Find & Replace preview: every change before and after, and nothing changed yet.⌉⌊
Find & Replace preview: every change before and after, and nothing changed yet.⌉[

Find & Replace preview: every change before and after, and nothing changed yet.

[⌊History: every job with its result, and an undo from its restore point.⌉⌊History:
every job with its result, and an undo from its restore point.⌉[

History: every job with its result, and an undo from its restore point.

[⌊Backups: copies of the site, whole or in parts, to restore or download, or one
uploaded from another site.⌉⌊Backups: copies of the site, whole or in parts, to 
restore or download, or one uploaded from another site.⌉[

Backups: copies of the site, whole or in parts, to restore or download, or one uploaded
from another site.

## Installation

 1. 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.
 2. Open Tools  SiteRelay (on a network: Network Admin  SiteRelay).
 3. 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.

Contributors

 *   [ Usama Gierdien ](https://profiles.wordpress.org/u5ama/)

[Translate “SiteRelay” into your language.](https://translate.wordpress.org/projects/wp-plugins/siterelay)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/siterelay/), check 
out the [SVN repository](https://plugins.svn.wordpress.org/siterelay/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/siterelay/) by [RSS](https://plugins.trac.wordpress.org/log/siterelay/?limit=100&mode=stop_on_copy&format=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 --subsite` with 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 pull` and `push` with `--subsite`, `--new-subsite` and `--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: `--subsite` and `wp 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 relay` commands 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.

## Meta

 *  Version **1.0.0**
 *  Last updated **13 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [backup](https://wordpress.org/plugins/tags/backup/)[migration](https://wordpress.org/plugins/tags/migration/)
   [multisite](https://wordpress.org/plugins/tags/multisite/)[staging](https://wordpress.org/plugins/tags/staging/)
   [wp-cli](https://wordpress.org/plugins/tags/wp-cli/)
 *  [Advanced View](https://wordpress.org/plugins/siterelay/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/siterelay/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/siterelay/reviews/)

## Contributors

 *   [ Usama Gierdien ](https://profiles.wordpress.org/u5ama/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/siterelay/)