This changelog follows Keep a Changelog. Releases use Semantic Versioning.
Unreleased
0.5.0 - 2026-10-26
Changed
- Released with
image_pipe0.5.0.
0.4.0 - 2026-10-23
Added
- With
:validate_against,ImagePipe.URL.validate/1warns about acroporregionthat covers the whole frame, as an:inert_optionissue withdetail: :full_frame. It also warns about the options only that crop or region made useful, such asanchor.
Changed
- Parsing a URL takes less time, most of all for a URL without presets or
unsetwhen no request defaults are set. - A
watermark_source:loses an optional leading/, as the main source does, so itswm-src64value and its deterministicwm-enctoken change. - A URL's
anchor-offset,extend-at, orextend-offsetno longer replaces the crop target or canvas from a preset or the request defaults, and itsunsetremoves only that option. Before,anchor-offset=5,5dropped a preset'sanchor, andextend-at=unsetdropped itsextend. - A
trimtolerance above2147483647is rejected, both in a URL and byImagePipe.URL.group/2. - Errors from parsing a URL state the accepted range for sizes, offsets,
pad,wm-gap,dpr,zoom,crop-ratio,detect,blur,progressive-blur,sharpen,pixelate,contrast,saturation, and thetrimtolerance, and show whichgradientvalues are optional. - An invalid value given to the URL builder appears in its error, with the
accepted range for numbers, as in
invalid value for :dpr option: expected a number above 0, at most 2147483647, got: 0. An invalid source isn't repeated in its error. - Breaking: The
:presetsin:validate_againstmust be a map with string keys. Change a list of{name, fragment}pairs to a map such as%{"card" => "w=400"}.ImagePipe.URL.config/1raises anArgumentErrorthat names:presetsfor any other value, instead of aProtocol.UndefinedError. - A
regionwhose x or y is0pctgives the same plan as one written with0. detect=all:3, one weight for every class, gives the same plan asdetect=all.crop=100pct,100pctwithoutcrop-ratio, andregion=0,0,100pct,100pct, give the same plan as the request without them.autoqualityandmax-bytesare reported as ignored options withformat=webpand losslesswebp-options, as withformat=png.- Checking and decoding the percent escapes of a
srcsource takes less time, up to about 0.5 ms less for an 8 KB source.
Removed
- Breaking:
request_watermarksinvalidate_against, and the:watermark_source_disabledissue. Servers accept every watermark source that a configured source serves. Remove the option fromvalidate_against. - Breaking:
mount:onImagePipe.URL.Helpers. Start an instance with the mount's URL settings and pass its name asinstance:.
Fixed
- The URL builder's validation against a server's presets resolves them the way the server does: a value that a later layer unsets or replaces no longer removes what it would have replaced, and a preset that names other presets gives the same result as listing them.
ImagePipe.URL.url/3returns{:error, :invalid_source}for a source that is just/or holds a NUL byte, which the server refuses.ImagePipe.URL.group/2rejects such awatermark_source:.- Checking a URL with
:validate_againstapplies the request defaults to the URL's first group, as the server does, even when that group holds onlyunsetoptions or names a preset the check doesn't know. Before, the defaults were checked with the next group, so the check could disagree with the server. - A preset in
:validate_againstwith a group holding onlyunsetoptions is a pipeline preset, as on the server, so adding other options to it is an error, and a first group like that clears the request defaults. Before, the check dropped that group. - An issue that
validate/1reports with:validate_againstnames the group as the builder numbers it. Before, when a group held onlyunsetoptions, issues in later groups named the group before theirs. - With
preset_lookup: true,ImagePipe.URL.validate/1reports a conflict between two options the plan sets, such asquality:withautoquality: true, even when the plan names a preset missing from:presets, andImagePipe.URL.url/3returns{:error, {:invalid_request, issues}}. Before,ImagePipe.URL.url/3built a URL the server rejects with400.
0.3.0 - 2026-10-18
Added
- The
kernelresize option (resize: [kernel: :nearest]in the builder) sets the filter a group's resize uses:nearest,linear,cubic,mitchell,lanczos2,lanczos3(the default),mks2013, ormks2021. - The
priorityrequest option (priority: :lowin the builder) lets a request wait for spare capacity in the server's processing pool.
Changed
- Breaking:
ImagePipe.URL.config/1raisesArgumentErrorwhen a preset or the request defaults in:validate_againstset options that can't be combined, such asanchor=top/detect=faceorq=80/autoquality=50. It also raises when they name a watermark that the:watermarkslist leaves out, or usewm-src64orwm-encwithrequest_watermarks: false. A server running the matchingimage_piperelease fails at startup with the same presets. Remove one of the conflicting options, or the watermark option, from the server's presets and the builder's copy.
Fixed
ImagePipe.URL.new/1rejectsfilename: "unset"andcachebuster: "unset"instead of building a URL without them. In a URL,unsetclears an option.ImagePipe.URL.group/2rejects the detection class"unset", which URLs don't accept.- A float of 2^53 or more, such as
rotate: 1.0e300or a trim tolerance of1.0e308, keeps its exact value in the built URL. The URL used to carry a nearby whole number instead, sorotate: 1.0e300built a URL that rotated by 280 degrees rather than 0.
0.2.0 - 2026-10-13
Removed
- Breaking:
ImagePipe.Plan.Source.Path,ImagePipe.Plan.Source.URL, andImagePipe.Plan.Source.Object. They are nowImagePipe.Source.Path,ImagePipe.Source.URL, andImagePipe.Source.Objectinimage_pipe, whose custom source adapters receive them. - The dependency on
mime. The package depends only onnimble_optionsandcolorat runtime.
0.1.0 - 2026-10-09
Added
First release of the ImagePipe URL builder.
- Build typed processing plans and generate image URLs with explicit processing groups and output options.
- Validate processing options, reference named presets with request overrides, and optionally check plans against the serving mount's presets.
- Sign URLs, set expiry, and encrypt source references.
- Generate URLs in applications that use an external image service, without libvips, NIFs, or image processing dependencies.