Drop the whole folder, write the rules once, and get a ZIP with every file at every size you needed. Two hundred at a time, on your own machine.
The queue runs on your machine. Nothing leaves it.
No picture yet
Drop a folder. Or 200 files.
One picture opens the size matrix: every platform size, cropped where you point.Sub-folders are kept, so a folder name can go in a filename.
[ 214 files ] · what a folder looks like when it lands
/a paste works too/
—1 target · 0 filesThe queue runs on your machine. Nothing leaves it.
1What will be written
Every file, named and measured, before anything runs.
Drop a folder and this fills in: one row per file that will be written, with its name, its size and an estimate of its bytes, plus every collision and every dropped width. Nothing runs until it is on screen.
2The run
Nothing to run yet.
photo-01@1x.webp640×427 41 KB
photo-01@2x.webp1280×854 128 KB
photo-01@3x.webp1920×1281 271 KB
photo-02@1x.webp640×427 38 KB
photo-02@2x.webp1280×854 119 KB
photo-02@3x.webp1920×1281 259 KB
photo-03@1x.webp640×360 33 KB
photo-03@2x.webp1280×720 104 KB
That is the ledger, mid-run. One line per file as it is written, newest at the bottom, and the real byte count rather than the estimate.
The build button is at the top of the matrix.
Three rules over three files, and the 8 files that come out
Nothing runs until the plan has been shown, so here is one, worked out by the same function the tool uses — on a folder described rather than uploaded. Every row below, including the suffix and the note, came back from that function rather than being written here.
Only the JPEGs, held inside 1600 across, written as WebP. Nothing is enlarged, so a source already smaller than the box is written at its own size. The format choice is per rule, not per run.
Every file, cropped to a 400 square from the centre. The box gives the crop its shape and the focal point its position — the centre until you drag it in the matrix — and the plan prints the source rectangle it will draw from.
The same tile at twice the pixels, and it lands on its own filename without being told to: {w} resolves to the width the rule actually writes, so the 2x tile is -800 rather than a second -400. Name it by intent instead and the naming reference has the token for it.
3 in · 8 out · about 586 KB estimated
Source
Rule
Writes
Pixels
DSC_0041.jpg
Listing
DSC_0041-1600.webp
1600×1067
DSC_0041.jpg
Grid tile
DSC_0041-400.webp
400×400
DSC_0041.jpg
Grid tile, 2x
DSC_0041-800.webp
800×800
DSC_0102.jpg
Listing
DSC_0102-1200.webpsource is only 1200x800; written at its own size
1200×800
DSC_0102.jpg
Grid tile
DSC_0102-400.webp
400×400
DSC_0102.jpg
Grid tile, 2x
DSC_0102-800.webp
800×800
logo.png
Grid tile
logo-400.webp
400×400
logo.png
Grid tile, 2x
logo-800.webp
800×800
Some sources are smaller than the box a rule asks for. With the guard on they come out at their own size rather than the box's.
A responsive set is the same idea with the widths filled in for you, and it drops any width larger than the source rather than inventing pixels — the srcset page opens with one already built, and prints the markup beside the plan.
What Resizly does
It takes a folder rather than a file. You write the rules once, look at the list of files those rules are going to produce, and then let it run. What comes back is a ZIP, built while the run is going rather than assembled at the end, so a job that writes two gigabytes does not need two gigabytes of memory to finish.
The order on the page is the order of the job: what is queued, what the rules are, what will be written, and the run. Nothing is decoded while you are writing rules — only the first sixty-four kilobytes of each file are read, which is enough for its format, its size, its orientation and whether it is animated. That is why the count and the plan appear immediately on a folder that would take a minute to open.
A source is processed by every rule it matches, in order. That is how one photograph becomes a listing image, a grid thumbnail and a zoom view in one pass, decoded once rather than three times.
What this tool is not going to beat
“A shell script with ImageMagick on the same machine will finish faster than this page, and it always will. What you get here instead is not installing anything, seeing the file list before it is written, and being able to hand the recipe to someone who has never opened a terminal.”
Writing a rule
A rule is four things, and the card header prints all four as one line so a stack of six can be read without opening any of them:
max-w 1600 / cover centre / webp q82 / {name}-{w}.webp
What it applies to
Every file, or a filename pattern. * matches within one folder, ** matches across them, so **/product/*.jpg finds the JPEGs in every product folder in the drop and hero-* finds anything starting with hero- wherever it sits.
What it does to the pixels
A target — a maximum width, a maximum height, a maximum long edge, or an explicit box — and then one of three behaviours:
Fit
What comes out
When to use it
contain
Fits inside the box, keeps the ratio, may be smaller than the box in one direction.
Anything where the whole picture has to survive.
cover
Fills the box exactly and cuts the overflow away around a focal point (the matrix calls it Fill).
A grid of tiles, or a story and a banner cut from one photo.
pad
The whole picture, centred on a canvas exactly the box's size, padded in white, black or transparency.
A logo or a product that must not lose an edge to a crop.
inside
Contain, and never larger than the source whatever else is set.
A mixed folder where some files are already small.
Where a cover cut falls is yours to decide, per target. Drag the focal point on the original or drag inside any tile of the size matrix, type the percentages, or ask for a suggestion; the rule stores the point as a fraction of the picture, so the same rule lands on the same subject across a whole folder.
Enlarging past the source is off in every fit. Turn it on and a 900-wide photo in a 1600 rule is written at 1600, softer than it was. Leave it off and the same photo is written at 900, and the plan says so.
What it is called
A template over nine tokens, defaulting to {name}-{w}.{ext}. A literal slash makes a folder inside the archive. The tokens, the collision policy and a set of worked filenames are on the naming reference.
One control expands into several rules: a responsive set takes a width list, the pixel ratios you want and one format, and prints the srcset markup beside the plan. That job has its own page.
Files it opens
Every source is handed to the browser’s own decoder, so what opens depends on the browser you are in. JPEG, PNG, WebP and GIF open everywhere; AVIF opens in anything current; BMP, TIFF and ICO are opened by some browsers and turned away by others, and a refusal costs that one line and nothing else. HEIC, which is what a recent iPhone shoots unless it has been told otherwise, is the exception no browser handles: the first one in a run pulls down a WebAssembly codec of about a megabyte and a half, and every HEIC behind it reuses the copy already in memory. It writes JPEG, PNG and WebP.
Animated GIF and WebP are skipped with the reason logged, not flattened to a first frame nobody asked for.
A CMYK JPEG is converted to sRGB, and the row that came from it is marked.
Files with the same name in different sub-folders collide unless {parent} is in the template. The plan flags the pair before the run, never during it.
Names carrying path separators or invisible direction characters are made safe for the archive, and the substitution is shown in the plan.
Zero-byte and truncated files fail their own line and nothing else. The run carries on.
Two hundred files on a phone is a bad idea
iOS is the real ceiling. Safari holds far less in memory than a laptop, its canvas limits are lower, and when it runs out it drops the tab rather than telling you. A run that would take three minutes on a laptop can die at file 140 on an iPhone with nothing written. Use a phone for a few dozen files and a computer for the folder.
Questions
Can one photo become every social size at once?
Yes. Open it, add a set such as the Social launch kit, and the size matrix draws every target from your picture side by side. Each target has its own focal point: drag it on the original or inside the tile, or copy one to all. The ZIP names each file for its platform.
Where do the files actually go?
Into memory in this tab, and then into a ZIP your browser hands you. There is no server behind this page and no request that carries a picture. Close the tab mid-run and everything is gone, which is the same sentence read as a warning.
Two rules want to write the same filename. What happens?
The plan catches it before anything runs and shows you the pair. You choose what it does: add a number, let the later file win, or stop and refuse to run. Putting {parent} in the template is usually the real fix, because the collision is normally two sub-folders with a DSC_0001.jpg in each.
Why is 1920 missing from some of my outputs?
A responsive set drops any width larger than the source rather than inventing pixels. A 1200-wide photo in a set that asks for 1920 gets 320, 640, 960 and 1200, and the plan names the width it dropped. An ordinary rule behaves differently: it writes the file at the source's own size unless you turn enlarging on.
Can I stop half-way and keep what has already been written?
Yes. Escape stops the run and asks first, and everything written up to that point stays in the archive. Space pauses instead, which lets whatever is in flight land and picks up where it left off.
Do saved recipes follow me to another computer?
No. A recipe lives in this browser's storage on this device and holds rules only: no filenames, no dimensions, no record that a run happened. Another machine, another browser or a private window starts with none.
How many files before it stops being sensible?
On a laptop, a few hundred is ordinary and a thousand works if you leave the tab in front. On an iPhone or iPad the ceiling is far lower and Safari drops the tab rather than warning you, so a big folder belongs on a computer.
What the formats cost
Format is a per-rule field rather than a global setting, because the four outputs of one photograph rarely want the same one. What each costs, on a typical 800-pixel photograph:
Written as
Roughly
Keeps alpha
Use it when
WebP q80
40-60 KB
yes
Anything going on a web page. It is the default for a reason.
JPEG q82
70-100 KB
no
Something downstream that predates WebP and will not be argued with.
PNG
300-600 KB
yes
Flat colour, lettering, or an alpha channel that has to survive exactly.
Keep source
unchanged
as the source
A pass where only the size is meant to change.
PNG has no quality control, so the field is ignored rather than quietly doing something. Keep-source on a format no browser can write — a TIFF, a BMP, an AVIF — becomes PNG and the plan row says so, because spending quality on a file whose format you never asked to change is not a decision this tool makes on its own.
Three things it will not do with a format, and the reason in each case. It does not write AVIF: browsers encode it slowly enough that a folder of two hundred would be a different kind of wait, and the engine here is built around finishing. It does not search for a file size — you set an encoder quality and get whatever that produces, because hitting a byte count means encoding the same picture five times. And it does not flatten an animation to its first frame; an animated GIF or WebP is skipped with its reason in the plan, since a silently still animation is worse than a file that was not written.
Reference
Six pages below, three of them guides longer than this one. The reference material answers what a field does; the guides answer what to put in it, which is the slower question. About, Privacy and Terms are in the footer.