ConfigsApr 16, 2026·3 min read

imgproxy — Fast Secure Image Processing Server in Go

Resize, crop, and convert images on-the-fly with imgproxy. A blazing-fast Go server powered by libvips for production-grade image transformation at scale.

TL;DR
imgproxy resizes, crops, and converts images on-the-fly using libvips for production-grade performance.
§01

What it is

imgproxy is a standalone image processing server written in Go and powered by libvips. It resizes, crops, and converts images on-the-fly via URL parameters, eliminating the need for pre-generated image variants. You point it at your source images (S3, GCS, local filesystem), and it serves transformed versions in real time.

Frontend developers, platform engineers, and content teams use imgproxy to deliver optimized images without maintaining a build pipeline for every size and format combination.

§02

How it saves time or tokens

imgproxy removes the need to pre-generate dozens of image variants (thumbnails, retina, WebP, AVIF) at upload time. Instead, you request the exact dimensions and format you need via URL parameters, and imgproxy generates them on demand with caching. This eliminates storage bloat and the engineering overhead of image processing pipelines.

§03

How to use

  1. Deploy imgproxy using Docker with your image source configuration (S3 bucket, local path, or HTTP origin).
  2. Construct URLs with transformation parameters (resize, crop, format) following the imgproxy URL format.
  3. Point your frontend image tags or CDN origin to the imgproxy endpoint.
§04

Example

# Run imgproxy with Docker
docker run -p 8080:8080 \
  -e IMGPROXY_USE_S3=true \
  -e AWS_ACCESS_KEY_ID=your_key \
  -e AWS_SECRET_ACCESS_KEY=your_secret \
  darthsim/imgproxy
# URL format for resizing an image
http://localhost:8080/insecure/rs:fill:300:200/plain/s3://my-bucket/photos/original.jpg@webp

# Resize to 300x200, fill mode, convert to WebP
# rs: = resize, fill = crop to fit, @webp = output format
§05

Related on TokRepo

§06

Common pitfalls

  • Not enabling URL signing in production, which allows anyone to generate arbitrary transformations and potentially overload your server.
  • Forgetting to set memory limits, since processing very large images can consume significant RAM.
  • Serving imgproxy directly without a CDN in front, which defeats the purpose of on-the-fly generation by reprocessing the same image on every request.

Frequently Asked Questions

How does imgproxy compare to Cloudinary or Imgix?+

imgproxy is self-hosted and open source, so you control your infrastructure and pay no per-image fees. Cloudinary and Imgix are SaaS products with built-in CDNs and more transformation options. Choose imgproxy when you want full control and cost predictability.

What image formats does imgproxy support?+

imgproxy supports JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, and ICO for input. Output formats include JPEG, PNG, WebP, and AVIF. Format conversion happens automatically based on URL parameters.

Does imgproxy cache processed images?+

imgproxy itself does not cache, but it sets proper Cache-Control headers. You should place a CDN or reverse proxy (Nginx, Varnish) in front of imgproxy to cache processed images at the edge.

Can imgproxy handle SVG files?+

imgproxy can rasterize SVG files to bitmap formats. However, SVG processing has security implications, so it is disabled by default and must be explicitly enabled in the configuration.

Is imgproxy production-ready?+

Yes. imgproxy is used in production by many organizations. It is built on libvips, which is the fastest image processing library available, and the Go server handles concurrent requests efficiently with low memory overhead.

Citations (3)

Discussion

Sign in to join the discussion.
No comments yet. Be the first to share your thoughts.

Related Assets