Beltoft Media Offload

Your images live in a bucket,
not on your web server

Media Offload puts new uploads, every generated size and the unscaled original into an S3-compatible bucket and serves them from there. MinIO works out of the box; AWS S3, DigitalOcean Spaces and Cloudflare R2 are a settings change away.

The plugin works fully without a license. The key is free and only switches on WordPress’s automatic updates.

Version 1.6.1Requires WordPress 6.2+Requires PHP 8.2+
On your server
https://dinside.dk/wp-content/uploads/2026/09/forside.jpg
After offload
https://minio.dinside.dk/medier/2026/09/forside.jpg

The rewrite happens wherever WordPress builds the URL itself, so themes, blocks and feeds follow along with no changes.

Offloading that looks after itself

Set your bucket up once. After that new files move themselves, and you can bring the old ones over whenever you like.

Moves on upload

When you add a file to the media library, it and every generated size go up to your bucket, and the public URL points there.

Deletes in both places

Delete a file in WordPress and it is removed from the bucket too. You don’t end up paying for files you thought were gone.

Test the connection first

The settings page has a test button that tells you where you stand before you move a single file. No guessing whether the keys are right.

Bring the old files along

The bulk tool works through the existing media library, so a site with ten years of images can come across too.

Run it from the terminal

wp media-offload status shows where you stand, run moves the rest, and resync picks up files belonging to already-offloaded images that never made it to the bucket. Handy on large sites and in deploys.

Not tied to one provider

Endpoint, keys, bucket, region, path-style, SSL and your own domain are all yours to set. MinIO, AWS S3, DigitalOcean Spaces and Cloudflare R2 all work.

Big files don’t topple PHP

Uploads stream from disk instead of being read into memory, so a video of several hundred megabytes won’t run your PHP memory limit into the ground.

Takes WebP and AVIF along

If another plugin has made .webp or .avif versions next to an image, they go up to the bucket alongside the original.

Keep or clear the local copy

By default the local file stays behind as a fallback. If you want the disk space back, turn on “delete local files” and they go once the upload is verified.

From install to bucket

If you already have a bucket and a key pair, there is not much more than a quarter of an hour in this.

Install the plugin

Put the folder in wp-content/plugins/beltoft-media-offload and activate it from the Plugins screen.

Point it at your bucket

Under Settings Media Offload, fill in the endpoint, access key, secret key, bucket and region. Press test and watch it connect.

Upload as you always have

New files land in the bucket on their own. To bring the old ones over, start the bulk tool and let it work.

For the large media libraries

A media library of many gigabytes is not something to sit and wait for in a browser tab. Run it from the command line instead and let it finish in its own time.

# How much has moved? wp media-offload status # Move the rest wp media-offload run # Catch anything missing from the bucket wp media-offload resync
v1.6.1
Latest version
MinIO
Works out of the box
WP 6.2+
Supported
PHP 8.2+
Requirement

What you are likely to ask

And a couple of things worth knowing before you move a whole media library.

Does it work with real AWS S3, or only MinIO?
Both. MinIO is simply what it is set up for out of the box. AWS S3, DigitalOcean Spaces and Cloudflare R2 work too, and everything — endpoint, keys, bucket, region, path-style and SSL — is set in the settings.
Will every URL in my content be rewritten?
No, and this one matters. The rewrite covers wp_get_attachment_url() and image srcset. Fixed links written straight into content, widgets and RSS feeds are left alone and keep pointing at your own server. That is fine while the local files are still there — but turn on “delete local files” and those particular links break.
What about really large files?
Files over 500 MB are not moved during the upload itself. Take those with the bulk tool or wp media-offload run, where there is enough time to finish the job.
Do I need a license?
No. Offloading, the bulk tool and WP-CLI all work without one. The free key does exactly one thing: it switches on WordPress’s automatic updates, so new versions arrive under Updates like any other plugin.
Do the local files stay?
Yes, by default. The file stays on disk as a fallback even after it lands in the bucket. If you want the space back, turn on “delete local files” and the local copy goes once the upload is verified.
Will the bucket serve WebP to browsers that support it?
Not on its own. The .webp and .avif files are uploaded alongside the original, but a bucket does not negotiate format the way nginx does. Until your reverse proxy is set up for it, browsers get the original format.
What happens if I deactivate the plugin?
WordPress stops rewriting the URLs and points at the local path again. Files that have already moved are still in the bucket, so hold off on clearing them out locally until you are sure you are staying with offloading.

Give your web server less to carry.

Free and open source. Get your license, point the plugin at your bucket, and watch your next upload land in the right place. The license costs nothing and never expires.