Product image resizer
Why the resizer never enlarges
You asked for a 2000 px result and got a smaller file. That is the planner reading 2000 as a ceiling on the short edge and then refusing to scale up — the target locks to the size of the pixels you supplied.
What the 2000 in the Etsy target actually is
It is an upper bound applied to the short edge, not a size the output is guaranteed to reach. The planner computes its scale as `const scale = 2000 / Math.min(sourceWidth, sourceHeight);` (fix.ts:62), so the dimension being tested is always the shorter of the two you supplied, whichever way the photograph is oriented.
The 2000 is written into fix.ts by hand rather than imported from the Etsy rule module (fix.ts:62). The two values agree, but nothing in the code makes one read the other, so the agreement is incidental and should be treated as such when either file changes.
In the listing slot the recorded rule is 'atLeast' rather than exact equality (etsy.ts:161-167), and a file under a recommended size is recorded with severity 'warning' rather than as a failure (evaluate.ts:187-190) — which checks actually fail and which only warn is a separate question this page does not open.
What the planner does when your source is smaller
Everything below happens before a single pixel is written; it is the plan, not the encoder.
- The target locks to the source size.
- When the source sits below the target, planFix sets the target to the source's own dimensions instead of scaling up (fix.ts:99-108), so the planned result is the source's size exactly.
- There is no enlarge path to reach.
- No option, ordering or input type opens one. Shrinking is the only transform the planner produces, so the same file gives the same answer every time you try.
- A smaller output is the tool reporting your source back to you.
- The number you see is the size of the pixels you supplied. The only input that changes it is a file that already carries more.
- Nothing in the plan invents pixels.
- Because the planned target never exceeds the source, the resizer only ever discards pixels. It has no step that adds detail, and nothing recorded here says detail can be added at any other point either.
What comes out, by what goes in
Output type is decided by the input type alone, and the writer can produce exactly two types. File:line references were read from the repository on 2026-08-18.
| What you upload | What the resizer writes | Where it is decided |
|---|---|---|
| PNG | PNG | resize.ts:104 |
| JPEG | JPEG at quality 0.92 | resize.ts:104, resize.ts:109 |
| WebP | JPEG at quality 0.92 | accepted at product-image-resizer.tsx:250, written at resize.ts:104 |
| Anything else | Not accepted at the picker | product-image-resizer.tsx:250 |
If you need a larger result
The only thing that raises the output size is a larger source. Go back to the camera original or to the largest export you still hold, rather than to a copy that has already been reduced once — the planner reads whatever you hand it and plans down from there (fix.ts:99-108).
This is the browser resizer only. A different bound — 2048 px on the longest side, which also only ever shrinks — governs images that leave your phone for a generation, and that page owns the mechanism.
What this page does not settle
Everything above was read from the repository on 2026-08-18 and describes our own modules and our own resizer.
- Marketplace policy. The recorded values quoted here are what our rule modules held on 2026-08-18; they are not a statement of any marketplace's current published requirements.
- How a marketplace's own checker behaves. Only the behaviour of our checker and our resizer is described.
- Whether any dimension affects ranking, impressions or conversion. Nothing recorded here supports a claim of that kind, in either direction.
- Where your upload is transmitted or retained. The evidence behind this page covers what the planner computes and what the writer produces, not transport or storage, so this page makes no claim about either.
- What leaves your phone during a generation. That path has its own bound and its own page.
- Anything the mobile app does with images. This page is about the browser resizer and nothing else.
Questions
I asked for a 2000 px result and got a smaller file. Is the tool broken?
No. The 2000 is applied as a ceiling on the short edge (fix.ts:62), and when the source sits below it the plan locks to the source's own size instead of scaling up (fix.ts:99-108). A smaller output means the source was smaller.
Which dimension is the 2000 measured against?
The shorter one. The scale is 2000 divided by `Math.min(sourceWidth, sourceHeight)` (fix.ts:62), so a landscape photograph is judged on its height and a portrait photograph on its width.
Why did my WebP come back as a JPEG?
The picker accepts jpeg, png and webp (product-image-resizer.tsx:250), but the writer chooses between exactly two output types from the input type: PNG in, PNG out; anything else, JPEG at quality 0.92 (resize.ts:104, resize.ts:109).
Does running an image through the resizer improve it?
It reduces. The planner never enlarges (fix.ts:99-108), so the operation removes pixels and never adds them, and nothing recorded here supports a quality claim beyond that.
How do I actually get a 2000 px short edge?
Hand the resizer a file whose short edge is already 2000 px or more; the scale then brings that edge down onto the ceiling (fix.ts:62). Nothing inside the resizer changes the outcome for a smaller source.