Image CDN

One upload. Every size. The right format.

Images are the heaviest thing on almost every page. Keep one high-quality original and let the edge resize it, crop it, convert it to WebP and cache the result — so each visitor downloads exactly what their screen needs and nothing more.

The problem

A 4000-pixel photo in a 400-pixel slot

Somebody uploads a photo straight off a phone. The theme scales it down with CSS, so it looks right — and the visitor still downloads all 2.4 megabytes of it, then throws 99% of the pixels away.

Do that four times on a product page, on a phone, on mobile data, and you have built a page that takes six seconds to appear no matter how good your hosting is.

The fix is not a faster server. It is sending fewer bytes.

Original
2.4 MB — 4000px JPEG
Resized
~900 KB — 800px JPEG
+ WebP
~590 KB
+ quality 82
~280 KB — visually identical

Illustrative figures for a typical photographic hero image. Your mileage varies with the source material — flat graphics compress far harder, dense photography rather less.

The order matters

Resizing does most of the work; format conversion and quality do the rest. Converting a 4000-pixel image to WebP without resizing it first is optimising the wrong thing.

How you use it

The transformation is in the URL

No SDK, no signing, no separate image host. Add a query parameter to an image you already serve and the edge produces that variant, caches it, and serves it to everyone who asks for the same thing afterwards.

Your original — untouched, still there
https://cdn.example.com/uploads/hero.jpg
Resize to the width you actually display
https://cdn.example.com/uploads/hero.jpg?width=800
A square thumbnail, cropped from the top so heads stay in frame
https://cdn.example.com/uploads/hero.jpg?width=400&height=400&crop_gravity=north
A 16:9 card at a lighter quality
https://cdn.example.com/uploads/hero.jpg?width=1200&aspect_ratio=16:9&quality=78
And the one you will use most: nothing at all
https://cdn.example.com/uploads/hero.jpg → WebP, automatically, per browser

Automatic WebP conversion and a default maximum size are zone settings — turn them on once and every image on the site is covered without a single URL changing. Parameters are for the cases where you want per-image control.

Coming from Bunny.net? The parameter names are deliberately compatible, so existing image URLs generally keep working when you point the hostname at us.

The full toolbox

Everything you would otherwise open Photoshop for

All of it applied on the way out, on a copy, at request time. Your original file is never modified.

Resize

Scale to a width, a height, or both. Aspect ratio is preserved unless you ask for a specific box.

width · height

Crop

Cut to an exact region, or to an aspect ratio like 16:9 or 1:1 for consistent card and thumbnail grids.

crop · aspect_ratio

Crop gravity

Nine anchor points, so a portrait cropped square keeps the face and not the shoulders.

crop_gravity

Quality

1 to 100, defaulting to 85. Below about 75 you start to see it; between 78 and 85 you generally do not.

quality

Format

Force JPEG, PNG, GIF or WebP for a specific image when you need to override the automatic choice.

format

Automatic WebP

Serve WebP to browsers that accept it, the original format to anything that does not. Decided per request.

auto_webp

Rotate and flip

Fixed rotations and mirroring — the usual rescue for photos that arrived sideways.

rotate · flip · flop

Colour adjustments

Brightness, contrast, saturation, gamma and tint, for making a mixed product catalogue look like one catalogue.

brightness · contrast · saturation

Sharpen

A little edge definition back after a heavy downscale.

sharpen
Format handling

The right format, decided per request

The browser says what it can accept; the edge answers accordingly. You do not write a single line of content negotiation.

Request arrivesAccept: image/webp JPEG or PNG source, browser takes WebP Resized + WebP Older browser, no WebP support Resized, original format Already AVIF, or SVG / ICO Passed through untouched
Files that are already efficient are left alone. Re-encoding an AVIF into WebP would make it bigger, so we do not.
Under the hood

Transformed once, then it is just a cached file

  1. A variant is requested for the first time

    The edge fetches your original, transforms it with libvips — fast, low-memory, the same engine behind most serious image pipelines — and returns the result.

  2. That exact variant is cached

    Each combination of parameters is its own cache entry, stored on local NVMe at the edge nearest the visitor who asked.

  3. Everyone after that gets a cache hit

    No transformation, no origin request. It is a static file being served fast, which is the thing a CDN is best at.

  4. Your original is never modified

    Change your mind about quality or sizes, purge, and the next request rebuilds from the untouched source. Nothing is destructive.

No build step

No regenerating thumbnails after a theme change, no gulp task, no waiting for a media library to reprocess 12,000 files.

No storage cost

Variants live in the cache, not in your storage bucket. Twenty sizes of one image still means one file you are responsible for.

No plugin

Nothing installed on your server, so nothing to conflict, nothing to update, and no extra PHP work per request.

Related: WordPress CDN · WooCommerce CDN · All features · Test your site

FAQ

Questions, answered

No. You keep one high-quality original and ask for the size you want in the URL. The edge produces that variant on the first request and caches it, so the second request is an ordinary cache hit. No build step, no export, no media-library regeneration that takes four hours.
WebP, chosen automatically per browser — it is supported by every current browser and is typically 25–35% smaller than an equivalent JPEG. Images already in AVIF, along with SVG and ICO, are passed through untouched rather than re-encoded, so nothing is made worse.
No. Automatic WebP conversion and a default maximum size need nothing but a switch in your zone settings — your existing image tags keep working. Add query parameters only where you want per-image control.
Only in file size, unless you ask it to. Quality is yours to set from 1 to 100, with a sensible default at 85 where the difference is not visible at normal viewing size. Everything else — crop, rotation, colour — happens only if you explicitly request it.
Usually a great deal. The largest element on a page is very often a hero image, so Largest Contentful Paint is frequently just an image-weight problem wearing a metric name. Resizing to the displayed size and converting to WebP is the fastest route from red to green.
They work the same way. Optimisation happens on the response, so it does not matter whether the file came from a WordPress media library, a WooCommerce product upload or a folder on disk.
The original is served instead. A bad parameter or an unusual source file never results in a broken image on your page — the worst case is an unoptimised one.
Output is capped at 4096×4096 pixels, which is far beyond what any display needs and exists purely so nobody can use your zone as a free rendering farm.

Make your images fly

Start free in two minutes — 25 GB free every month, no card required.

Start free