The recipe format
A recipe is a rule stack written to a file: name.resizly.json when it is exported from the recipe bar, and _resizly/recipe.json inside every archive a run writes. It contains rules only. It cannot contain a photo, a filename or a size of anything you processed.
An example
{
"resizly": "recipe",
"version": 1,
"name": "Catalogue",
"options": { "collisions": "suffix", "archive": "by-rule" },
"rules": [
{
"label": "Listing",
"enabled": true,
"matcher": { "kind": "glob", "pattern": "**/*.jpg", "exclude": "**/raw/**" },
"transform": { "target": "box", "width": 960, "height": 960, "longEdge": 1600,
"fit": "pad", "anchor": "centre", "pad": "white", "upscale": false },
"dpr": 1,
"format": "webp",
"quality": 82,
"maxKb": 150,
"template": "{parent}/{name}-{w}.{ext}"
}
]
}Top level
| Key | Meaning | Rule the importer applies |
|---|---|---|
| resizly | always "recipe" | anything else is refused |
| version | the format version; this build writes 1 | a newer version is read for what is understood and the rest is listed as dropped |
| name | the set's name | at most 60 characters |
| options | collisions (suffix, overwrite, stop) and archive (flat, by-rule, by-group, mirror) | unknown values refused |
| rules | the ordered rule stack | 1 to 64 rules |
A rule
| Key | Values | Boundary |
|---|---|---|
| label | the target's name | 1–80 characters |
| matcher | kind (all, glob), pattern, orientation, exclude, formats, alpha, dim {side, min, max}, bytes {min, max} | an unknown matcher kind is refused, never coerced |
| transform.target | max-width, max-height, max-long-edge, max-short-edge, box, percent, physical, exact | pixels 1–16,384 |
| transform.percent | 1–400 | needed by percent |
| transform.phys | w, h, unit (cm, mm, in), dpi | needed by physical |
| transform.fit | contain, cover, inside, pad | |
| transform.focus / zoom | focal point as fractions; zoom 1–20 | cover only |
| transform.pad | white, black, transparent, edge or a six-digit hex colour | pad only |
| dpr | 1, 2 or 3 | |
| format, quality | source, jpeg, png, webp; quality 1–100 | PNG ignores quality |
| maxKb, minKb | KB ceiling and floor, 1 KB = 1,024 bytes | minKb must be below maxKb |
| dpi | 1–2400, written into JPEG and PNG | WebP has no DPI field |
| matte | white, black or a hex colour for JPEG transparency | |
| resample | browser or lanczos3 | |
| firstMatch | true stops lower rules from seeing a matched file | |
| template | the name, with tokens | 1–240 characters |
| group, safe, circle | platform label and preview-only overlays | never change a pixel |
What the importer refuses
- A file over 256 KB, before it is read into memory.
- More than 64 rules, a label over 80 characters or a template over 240.
- Any number out of its range, and any matcher kind, target or format it does not know.
A refused file leaves the saved recipes exactly as they were, and the message names the key that failed. An accepted one is shown as a read-only summary first and runs nothing.
The manifest
With Write a manifest on, the archive also holds _resizly/manifest.csv and _resizly/manifest.json. The JSON lists every source's relative path, byte size and pixel size; every output's path, target, box, format, quality, crop, placement and real bytes; and every skipped file with its reason. Drop last run's manifest.json on the queue to see what is new, changed or gone since then.
The rule fields are explained in the rule reference, the tokens in naming, and saved recipes live on recipes.


