Title: OffloadKit — Cloud Media Offloader
Author: devsyed
Published: <strong>November 10, 2026</strong>
Last modified: November 10, 2026

---

Search plugins

![](https://ps.w.org/devsyed-media-offloader/assets/banner-772x250.png?rev=3795439)

![](https://ps.w.org/devsyed-media-offloader/assets/icon-256x256.png?rev=3795439)

# OffloadKit — Cloud Media Offloader

 By [devsyed](https://profiles.wordpress.org/devsyed/)

[Download](https://downloads.wordpress.org/plugin/devsyed-media-offloader.0.1.3.zip)

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

 [Support](https://wordpress.org/support/plugin/devsyed-media-offloader/)

## Description

OffloadKit manages media offload, delivery and recovery with Cloudflare R2, AWS 
S3 and DigitalOcean Spaces. A Google Cloud Storage HMAC adapter is also available;
configure its interoperability credentials and delivery URL separately.

Uploads can be offloaded during upload or processed through the background queue.
Failed transfers retain local copies for retry. For public media with retained local
files, delivery falls back locally when a storage check confirms the remote object
is missing. Storage errors are not treated as proof that an object is missing; cloud-
only media requires repair or restoration if its remote copy is lost.

**Features**

 * Background offload of new uploads, plus bulk migration of an existing media library.
 * Optional WebP and AVIF conversion, with per-format quality settings.
 * Optional `<picture>` output with AVIF and WebP sources.
 * Non-image files — video, audio, PDF, archives — with multipart upload for large
   files.
 * File type filter: offload only chosen extensions, or everything except them.
 * Optional local file deletion, only after every variant is verified in the bucket.
 * Pull-back: restore everything to local storage and remove the offload metadata.
 * Optional Cloudflare cache purge by URL.
 * WP-CLI commands for every long-running operation.

**CDN presets**

Cloudflare setup automatically discovers an active custom domain or enabled R2.dev
delivery URL. If neither is available, you can opt in to public R2.dev delivery 
or configure a custom domain. Existing delivery URLs are preserved when reconnecting
the same bucket.

Delivery settings include CloudFront, Bunny CDN, Fastly, KeyCDN, Gcore, Cloudflare
and Azure Front Door presets, plus a custom URL / direct bucket option. Each preset
provides a URL example and setup guidance. Configure the CDN origin and HTTPS in
its dashboard, enter your complete delivery URL, save, then run Test Connection.
Selecting a preset preserves the existing URL and does not provision a CDN or enable
CDN-specific cache purging.

Legacy URL rewriting covers the full rendered template on WordPress 6.9 and later.
On WordPress 6.8, it covers post content and standard WordPress media hooks.

**Credentials**

Credentials can be defined in `wp-config.php` instead of the database, which is 
the recommended production setup:

    ```
    define( 'R2CLOUDER_PROVIDER', 'r2' ); // r2, s3, spaces or gcs
    define( 'R2CLOUDER_ACCOUNT_ID', '...' ); // r2 only
    define( 'R2CLOUDER_REGION', 'us-east-1' ); // AWS region or Spaces datacenter
    define( 'R2CLOUDER_ACCESS_KEY', '...' );
    define( 'R2CLOUDER_SECRET_KEY', '...' );
    define( 'R2CLOUDER_BUCKET', '...' );
    define( 'R2CLOUDER_PUBLIC_URL', 'https://cdn.example.com' );
    define( 'R2CLOUDER_CF_PROVISIONING_TOKEN', '...' );
    define( 'R2CLOUDER_CF_API_TOKEN', '...' );
    ```

The recommended setup accepts one Cloudflare token with Workers R2 Storage Write.
OffloadKit can create or select the bucket, derive the S3 credentials, and configure
delivery. Zone Read is optional for automatic custom-domain discovery; Cache Purge
is optional for purge-by-URL. Manual bucket-scoped credentials remain available 
under Advanced.

DigitalOcean Spaces uses the selected datacenter endpoint (for example https://nyc3.
digitaloceanspaces.com). Google Cloud Storage uses https://storage.googleapis.com
with HMAC interoperability keys, not service-account JSON credentials. Configure
a public delivery URL or CDN separately. Managed bucket migration supports R2 and
AWS S3 only.

Cloudflare® and Cloudflare R2 are trademarks of Cloudflare, Inc. This plugin is 
not affiliated with, endorsed by, or sponsored by Cloudflare, Inc.

DigitalOcean onboarding can create a new Standard Storage bucket using a Full access
Spaces key, or connect an existing bucket. New buckets are private unless you explicitly
allow public object reads. OffloadKit prefills the new bucket delivery URL; CDN 
configuration remains in DigitalOcean. Existing bucket policies are not modified.

### External Services

This plugin connects to the storage provider you select after you configure credentials
for your own account. CDN preset examples are placeholders. The plugin bundles its
own admin assets. Cloudflare tokens can also be supplied for optional setup and 
cache purging. Deactivating the plugin stops its background requests; previously
published media URLs may still be requested by visitors’ browsers.

**1. Cloudflare R2 storage API — `https://<your-account-id>.r2.cloudflarestorage.
com`**

Used to store and manage your media files. The plugin sends the contents of the 
media files you upload, their file names and MIME types, and an AWS Signature Version
4 request signature derived from the R2 access key you configure. Requests are made
when a file is offloaded, verified, listed or deleted, and during the connection
test on the settings screen. No visitor data and no personal data beyond what your
own media files contain is transmitted.

**1b. AWS S3 storage API — `https://<bucket>.s3.<region>.amazonaws.com`**

Used only when you choose AWS S3 as the provider. The same data is sent as for R2:
media file contents, file names, MIME types and an AWS Signature Version 4 request
signature derived from the IAM access key you configure.

AWS terms: https://aws.amazon.com/service-terms/
 AWS privacy notice: https://aws.
amazon.com/privacy/

**Additional storage providers**

DigitalOcean Spaces requests go to https://.digitaloceanspaces.com. Google Cloud
Storage requests go to https://storage.googleapis.com. Only the selected provider
receives media contents, file names, MIME types and signed storage requests, during
offloading, verification, listing, deletion and connection tests.

DigitalOcean terms: https://www.digitalocean.com/legal/terms-of-service-agreement

DigitalOcean privacy: https://www.digitalocean.com/legal/privacy-policy Google Cloud
terms: https://cloud.google.com/terms Google privacy: https://policies.google.com/
privacy

**1c. Bucket migration services — `https://api.cloudflare.com` and `https://datasync.
<region>.amazonaws.com`**

Used only when you start a bucket migration. S3 to R2 migrations send the source
bucket name, region and access keys, and the target bucket and keys, to Cloudflare
Super Slurper. R2 to S3 migrations send the R2 endpoint, bucket and access keys 
to AWS DataSync, signed with the target IAM keys. Both services copy the files themselves;
the plugin sends no file contents.

Migration status checks and cancellation also contact the selected migration service.
Provider storage and migration charges may apply. The Cloudflare and AWS terms and
privacy links in this section apply to these services too.

**2. Your public delivery domain — the value you set as the public URL**

Used to serve offloaded files to visitors, and fetched during connection tests to
confirm the domain serves the bucket. Visitors’ browsers request these URLs directly;
their IP address and user agent reach your selected delivery provider.

**3. Cloudflare API — `https://api.cloudflare.com`**

Used during the optional one-token setup flow, when cache purging is enabled, or
when you choose Connect Domain or Check Status. During setup, the plugin sends the
account ID, desired bucket name and location, delivery choice, custom domain and
Zone ID when applicable, and the Cloudflare API token needed to authorize those 
operations. For cache purging, it sends media URLs after an attachment is updated,
re-offloaded, or deleted. Manual setup can avoid the provisioning flow entirely.

Cloudflare terms of service: https://www.cloudflare.com/terms/
 Cloudflare privacy
policy: https://www.cloudflare.com/privacypolicy/

## Installation

 1. Upload the OffloadKit ZIP through Plugins > Add New > Upload Plugin, then activate
    it.
 2. Open Settings > OffloadKit and select your storage provider. Use a separate test
    bucket for your first connection.
 3. Configure credentials and an HTTPS delivery URL, then run Test Connection before
    enabling media offloading.
 4. Keep local files while verifying uploads and delivery. Enable optional image conversion
    or local deletion only after checking the results and keeping independent backups.

Deactivation stops scheduled work and retains settings and media records. Uninstall
retains plugin data by default; the optional remove-data setting deletes plugin 
settings, queue and offload records, but does not delete cloud objects. Pull media
back and verify local copies before removing records for cloud-only files.

## FAQ

### Do I need a Cloudflare account?

A Cloudflare account is needed only for R2. AWS S3 and DigitalOcean Spaces use their
own accounts and credentials. For R2, setup can create or connect a bucket and configure
delivery; manual bucket credentials are also supported.

### Can I undo the offload?

The pull-back command restores recorded source files to their local WordPress paths.
It retains offload metadata if a required download or metadata update fails so you
can investigate and retry. Keep independent backups; a missing remote object cannot
be recovered without another copy.

### What are the bucket migration limitations?

Managed bucket migration supports R2 and AWS S3. Cloudflare Slurper can skip zero-
byte objects during S3-to-R2 migration; OffloadKit’s destination verification then
refuses cutover rather than accepting an incomplete transfer. Automatic repair of
skipped empty objects is not available. R2-to-S3 migration requires AWS DataSync
and the necessary IAM permissions; this direction has not completed live acceptance
testing. Keep source objects and independent backups, and verify migration with 
a separate test bucket before using it for production media.

### Does this work for protected or paid downloads?

Private storage delivery supports signed URLs, but it does not implement membership
or purchase authorization. WooCommerce and Easy Digital Downloads protected paths
are excluded from new offloads, including forced offloads. Existing cloud copies
are not automatically made private or removed; audit any previously offloaded protected
content. Do not use public media delivery as an access-control system.

Private signed URLs expire. Exclude pages and REST responses containing signed media
URLs from external full-page, reverse-proxy and CDN caches, and regenerate URLs 
for each request. OffloadKit sends private/no-store response headers, but external
caches must respect those headers. A cached page can otherwise retain an expired
URL or share a valid URL with another visitor. Legacy offload records without provider
identity need an ownership audit before switching providers.

## Reviews

![](https://secure.gravatar.com/avatar/9ad137e4bbdc81477361343487b7425312719adbefae0dc2984ab88c2476afad?
s=60&d=retro&r=g)

### 󠀁[Does what we needed](https://wordpress.org/support/topic/does-what-we-needed-6/)󠁿

 [techexpresselev](https://profiles.wordpress.org/techexpresselev/) November 10,
2026

Our developer helped us move the site’s media to Cloudflare R2 using this plugin.
Glad to have that job done. It’s worked well for us so far.

 [ Read all 1 review ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/)

## Contributors & Developers

“OffloadKit — Cloud Media Offloader” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ devsyed ](https://profiles.wordpress.org/devsyed/)

[Translate “OffloadKit — Cloud Media Offloader” into your language.](https://translate.wordpress.org/projects/wp-plugins/devsyed-media-offloader)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/devsyed-media-offloader/),
check out the [SVN repository](https://plugins.svn.wordpress.org/devsyed-media-offloader/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/devsyed-media-offloader/)
by [RSS](https://plugins.trac.wordpress.org/log/devsyed-media-offloader/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 0.1.3

 * Renamed to OffloadKit — Cloud Media Offloader, with updated admin labels and 
   help text.
 * Existing settings, storage connections and the plugin slug are unchanged.

#### 0.1.2

 * Renamed to Devsyed Media Offloader with the devsyed-media-offloader text domain.

#### 0.1.1

 * Renamed to Flex Media Offloader.
 * Updated Media Library assets, legacy URL rewriting and WP-CLI settings export.

#### 0.1.0

 * Initial development release.

## Meta

 *  Version **0.1.3**
 *  Last updated **16 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.8 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [cdn](https://wordpress.org/plugins/tags/cdn/)[cloudflare](https://wordpress.org/plugins/tags/cloudflare/)
   [media](https://wordpress.org/plugins/tags/media/)[r2](https://wordpress.org/plugins/tags/r2/)
   [webp](https://wordpress.org/plugins/tags/webp/)
 *  [Advanced View](https://wordpress.org/plugins/devsyed-media-offloader/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/?filter=1)

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

[See all reviews](https://wordpress.org/support/plugin/devsyed-media-offloader/reviews/)

## Contributors

 *   [ devsyed ](https://profiles.wordpress.org/devsyed/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/devsyed-media-offloader/)