Picture perfect, every time.

picturium is a fast, self-hosted media server that resizes, converts and caches (not just) your images on the fly, so every visitor gets exactly the file their screen needs.

MIT licensed Written in Rust Docker-ready

One command and you are ready to go:

curl -fsSL https://picturium.cc/install.sh | sh

Quietly serving images at

The URL is the whole pipeline.

No resize jobs, no thumbnail folders, no upload step. Describe the image you want in the link, and picturium renders it on the first request and serves it from cache after that.

01

Drop files in a folder

Every file in it is already a URL. Photos, PDFs, SVGs and Office docs. No upload API.

media/cat.jpg → /cat.jpg
02

Describe what you need

Size, crop, format, filters, watermark. Every option is a query parameter, so any <img> tag can use it.

/cat.jpg?w=600&fit=cover
03

Rendered once, served forever

libvips renders it on the first request. After that, it comes straight from cache.

1× render → ∞× cache

An image CDN, minus the bill.

Every feature below is a query parameter on your own server. No per-transform pricing, and nothing phones home.

Try it yourself!

Drag a slider, pick a recipe or type straight into the URL. A real picturium server renders every change.

GET
Recipes
Original
picturium

Photo by on Unsplash

Fit
Rotate
Gravitycenter
Tone
Effects
Format

Ready before your coffee cools.

The installer asks a few questions, pulls the image, waits until it's healthy and prints your URL. Docker is all you need.

  • Press Enter through the defaults, or skip them all
  • Turn on signed URLs and get the secret generated for you
  • Run it again to upgrade. Config and secrets stay put
  • Pinned to one version. No surprise updates
# needs Docker with the compose plugin
$ curl -fsSL https://picturium.cc/install.sh | sh

Install directory [~/picturium]:
Directory with the images to serve [~/picturium/data]: /srv/media
Port [20045]:
Listen address (127.0.0.1 if behind a reverse proxy) [0.0.0.0]:
Require signed URLs (recommended for public servers)? (y/n) [n]: y
...

Picturium 0.2.0 is running at http://127.0.0.1:20045

# later: same command upgrades to the newest release
$ curl -fsSL https://picturium.cc/install.sh | sh
Upgrade to 0.2.0? (y/n) [y]:

Fast on the first request. Instant on the second.

Every render runs on libvips and async Rust. Big sources are shrunk while they load, and identical requests arriving together are rendered once.

After that, a memory and disk cache answers instead. It comes built in, and completely for free.

axum http libvips imaging tokio async foyer cache
Median latency per request picturium picturium, cached imgproxy
webp 1920×1080 picturium 568 ms picturium, cached 2 ms imgproxy 692 ms
webp 800×600 with alpha picturium 130 ms picturium, cached 1 ms imgproxy 197 ms
webp 1600×1200 from 36 MPix picturium 604 ms picturium, cached 2 ms imgproxy 713 ms
webp from a GIF still picturium 44 ms picturium, cached 1 ms imgproxy 71 ms
jpeg 1920×1080 picturium 218 ms picturium, cached 2 ms imgproxy 214 ms
11 of 15scenarios faster at the median
0.97SSIM vs 0.93 at 1920×1080 webp, similar file size

Lower is better. First requests: caches off, 4 CPUs each, 50 requests at concurrency 4, q=80. Cached: the same URL requested again.

Questions

The things people ask before pointing picturium at their media.

What is picturium?

An HTTP server that transforms media on the fly. The path picks a file from your media folder, and the query string says what to do with it: resize, crop, filter, convert, compress. picturium renders it once with libvips and serves every later request from cache, so there is no thumbnail pipeline to build or maintain.

Read more
How is it different from Cloudinary, imgproxy, or Thumbor?

It runs on your own hardware, so there is no per-image or per-transform pricing. It also reads far more than photos: HEIC, JXL, PSD, camera RAW, SVG, PDF, Office files and video frames all go through the same URL. And it comes with an official PHP library for signed URLs and responsive markup.

Read more
Do I need to run my own server?

Yes, picturium is self-hosted. Run the one-line installer (or docker run the image yourself), point it at your media, and you're done. There is no hosted plan, and nothing phones home.

Read more
What image and file formats can it read?

Almost anything visual. Photos: JPEG, PNG, TIFF, WebP, GIF, HEIF/HEIC/AVIF, JXL, JPEG 2000, BMP, ICO and camera RAW. Design files: PSD, SVG, EPS, AI, CorelDRAW and DXF. Plus PDF, Office documents and video. It writes JPEG, WebP, PNG, GIF, AVIF and JXL, and can also return PDF and SVG.

Read more
Is it really free?

Yes. picturium is MIT licensed and free for any use, commercial included. The source is on GitHub.

Read more
How do I stop people abusing the resize endpoint?

Turn on URL signing. With a secret set, every request needs an HMAC-SHA256 token, so picturium only serves URLs your application generated. Output limits (output.max_width, max_height, max_size) cap what a single response can cost. And when every worker and queue slot is busy, it answers 503 Too many requests instead of falling over.

Read more
How does caching work?

Rendered images are kept in memory and on disk. The cache key is the source file, the effective parameters and the output format, not the literal URL, so reordered parameters still hit the cache. Responses also carry Cache-Control (one week by default) and an ETag, so browsers and any CDN in front of picturium cache them too.

Read more

Delete the thumbnail folder.

Keep one original per image and ask for every other size in the URL. One command installs picturium, and there is nothing to maintain after that.

curl -fsSL https://picturium.cc/install.sh | sh