Comparison with other image servers
How xtandard-image compares with imgproxy (OSS and Pro), thumbor, imaginary and weserv, feature by feature. The xtandard-image column describes the current main branch and the latest prerelease (CHANGELOG). full image means only the full and gpl images have the feature (image flavours). Features that are planned but not built yet are in the roadmap, not here.
Legend for the other columns: yes, paid (paid tier only), partial, no, and — (not compared yet). Their data comes from each project’s public docs and source, as of September 2026. Corrections are welcome: open an issue with a link to the source.
| Feature | xtandard-image | imgproxy OSS | imgproxy Pro | thumbor | imaginary | weserv |
|---|---|---|---|---|---|---|
| License | MIT | Apache-2.0 | commercial | MIT | MIT | BSD-3 |
| URLs and security | ||||||
imgproxy URL dialect (every option parsed; detection and video options need the full image) |
yes | yes | yes | no | no | no |
Query-string dialect (?url=…&w=…, imaginary endpoints) |
yes | no | no | no | yes | partial (own parameters) |
HTTP QUERY (RFC 10008) on the query dialect: the parameters in the request body (form or JSON), same signature, limits and cache entry as the GET URL (URL-DIALECTS §4.4); opt-in in the clients, since many CDNs do not cache or forward QUERY |
yes | no | no | no | no | no |
| Presets, only-presets mode | yes | yes | yes | — | — | — |
Signed URLs (imgproxy HMAC, xi_sig, imaginary sign) |
yes | yes | yes | yes | yes | no |
Encrypted source URLs (enc/) |
yes | no | paid | no | no | no |
| Mandatory source allowlist, SSRF protection incl. DNS rebinding | yes | partial (optional allowlist) | partial (optional allowlist) | — | — | — |
imgix URLs (host or prefix mount, s/expires signing, 64 parameters, watermarks) |
yes | no | no | no | no | no |
| Cloudinary / ImageKit / Cloudflare (incl. Images delivery) / Bunny / Thumbor / wsrv URLs, with their signing schemes | yes | no | no | Thumbor only | no | wsrv only |
| AWS Serverless Image Handler URLs (base64 JSON, thumbor and query forms) | yes | — | — | — | — | — |
| Other unpic providers (Next.js, Netlify, Vercel, Contentful, Shopify, … 21 in all) | yes | no | no | no | no | no |
| Sources | ||||||
| http(s), S3, GCS, Azure Blob, local filesystem | yes | yes | yes | partial (plugins) | partial (local) | partial (http) |
| FTP / FTPS / SFTP | yes | no | no | no | no | no |
| Multiple named sources | yes | partial | partial | partial | no | no |
| Formats | ||||||
| JPEG, PNG, GIF, WebP, AVIF, TIFF, BMP, ICO, SVG input | yes | yes | yes | — | — | — |
| HEIC input | yes | yes | yes | partial (plugin) | yes | yes |
| JPEG XL, JPEG 2000, UltraHDR input | yes | partial (JPEG XL) | — | — | — | — |
| AVIF / WebP / JXL output + Accept negotiation | yes | yes | yes | partial | partial | partial |
| Animated GIF / WebP (resize every frame), page and frame selection | yes | yes | yes | — | — | — |
| Camera RAW input (embedded preview or LibRaw demosaic) | yes | no | paid (loading only, v4.0) | no | no | no |
| PDF (PDFium) / PSD thumbnails | yes | no | paid | no | partial (PDF) | partial (PDF) |
HDR input (OpenEXR, Radiance, PPM/PFM; tone-mapped or preserve_hdr) |
yes | — | — | — | — | — |
| Best-format and auto-quality (DSSIM) | yes | no | paid | no | no | no |
Video thumbnails (frame at a time, keyframe, best frame; /info video metadata) |
yes (full image) |
no | paid | partial (ffmpeg engine) | no | no |
Video sprites and animations (vtt, vta) |
yes (full image) |
no | paid | no | no | no |
| GIF → MP4/WebM | yes (WebM/VP9 and AV1-in-MP4 in full, H.264 MP4 and HEVC in gpl) |
no | paid (MP4) | no | no | no |
Video transformations (/video and /q/video: trim, resize/crop/pad with gravity, fps, rotate/flip, fades, CRF or bit-rate cap, keyframe interval, MP4/WebM, codec choice; Range; signed only by default) |
yes (full/gpl image, XI_VIDEO_TRANSFORM_ENABLED) |
no | — | no | no | no |
| Audio (mute; M4A, MP3, Opus/Ogg, FLAC, WAV outputs from video or audio sources; sample rate, channels, volume, EBU R128 loudness normalisation, fades) and waveform pictures (PNG/WebP) | yes (full/gpl image) |
no | — | no | no | no |
HLS and DASH (VOD): ABR ladders, CMAF segments transcoded on request with prefetch, signed manifests with ticketed child URLs (imgproxy /video …@m3u8, Cloudinary sp_, ImageKit ik-master) |
yes (full/gpl image) |
no | — | no | no | no |
Video presets (XI_VIDEO_TRANSFORM_PRESETS: pr: on /video, preset=, Cloudinary t_, ImageKit n-) and public video without signing every URL (XI_VIDEO_TRANSFORM_UNSIGNED_POLICY=restricted: unsigned URLs only as their presets make them; streams and raw only from presets) |
yes | no | no | no | no | no |
| Processing | ||||||
| Resize, crop, gravity, smart crop, focus point (fractions or source pixels) | yes | yes | yes | yes | yes | yes |
| Extend, padding, trim | yes | yes | yes | — | — | — |
| Rotate (any angle), flip, EXIF auto-orientation | yes | yes | yes | yes | yes | yes |
| Blur, sharpen, pixelate | yes | yes | yes | partial (no pixelate) | partial | partial |
| Unsharp masking, blur areas, progressive blur | yes | no | paid | — | — | — |
| Crop aspect ratio, border, rounded corners, shape masks | yes | — | — | — | — | — |
| Watermark (image: position, offsets, scale, opacity, tiling) | yes | yes | yes | yes | yes | no |
Metadata policy (strip, keep copyright, ICC → sRGB, color_profile) |
yes | yes | yes | — | — | — |
| Colour adjustments, duotone, gradients | yes | no | paid | yes | no | yes |
| Chained pipelines | yes | no | paid | no | yes (/pipeline) |
no |
Face and object detection (face/object gravity, objects_position, crop_objects, blur/pixelate/draw detections, /info objects; every dialect’s face options; on video frames and in chained pipelines) |
yes (full image; slim answers 422) | no | paid | partial (OpenCV faces) | no | no |
Image classification (/info classify: top-k ImageNet-1k classes from MobileNetV3-Large on CPU, run only when asked; class filter) |
yes (full and gpl images; slim leaves it out and says so in X-Xi-Ignored) |
no | paid (-ml images) |
no | no | no |
| Watermarks (text, per-request URL, size, shadow, rotation, chessboard) | yes | no | paid | partial | partial (text) | no |
| Serving and operations | ||||||
/info endpoint (dimensions, EXIF, IPTC, XMP) |
yes | no | paid | partial (/meta) |
yes | partial (output=json) |
/info Pro fields (palette, dominant colours, blurhash, thumbhash, perceptual hash, hashsums) |
yes | no | paid | — | — | — |
ETag, 304, HEAD, Cache-Control, Vary, Content-DPR |
yes | yes | yes | — | — | — |
Client hints (Sec-CH-DPR, Sec-CH-Width, Save-Data, Accept-CH) |
yes | — | — | — | — | — |
raw / skip_processing passthrough, fallback image |
yes | yes | yes | — | — | — |
| Admission control (queue → 429, worker timeout → 503) | yes | yes | yes | — | — | — |
| Prometheus metrics, OpenTelemetry, health and readiness | yes | yes | yes | partial | partial | no |
| Multi-arch Docker image (cosign-signed, SBOM, provenance) | yes (the prereleases so far are unsigned) | yes | yes | — | — | — |
| Built-in result cache (memory, disk, S3, Redis) | yes (optional) | no | paid (v4) | yes | no | partial (nginx) |
| Config file (YAML, JSON, TOML) with a JSON Schema; OpenAPI 3.1 document | yes | — | — | — | — | — |
| Playground web UI | yes | — | — | — | — | — |
TypeScript URL builder and client (@xtandard/image) |
yes (not on npm yet) | — | — | — | — | — |
Sources: https://imgproxy.net/features/, https://docs.imgproxy.net/, https://thumbor.readthedocs.io/, https://github.com/h2non/imaginary, https://wsrv.nl/docs/. Corrections are welcome.