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.
One command and you are ready to go:
curl -fsSL https://picturium.cc/install.sh | sh 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.
Drop files in a folder
Every file in it is already a URL. Photos, PDFs, SVGs and Office docs. No upload API.
Describe what you need
Size, crop, format, filters, watermark. Every option is a query parameter, so any <img> tag can use it.
Rendered once, served forever
libvips renders it on the first request. After that, it comes straight from 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.
Resize & crop
Set w and h, pick a fit mode, or let attention gravity find the subject before it crops.
Rotate & orient
Phone photos come out the right way up, thanks to EXIF. Turn anything else in 90° steps.
Filters & effects
Blur, sharpen, pixelate, tone, sepia, duotone. Chain them with | in a single filter parameter.
Format conversion
f=auto picks the best format each browser accepts: JPEG XL, AVIF, WebP, JPEG, PNG or GIF.
Quality control
q=high adapts to image size and format. Cap output by pixels or bytes so nothing ships too heavy.
Watermarks
Stamp a logo or text in any corner, or tile it across the image. Set a default once, server-wide.
Memory & disk cache
Results live in memory and on disk. Repeat requests never touch libvips.
Files, not just images
Render pages from PDFs, Office files and vector art, grab frames from video, and pass other files through untouched.
Try it yourself!
Drag a slider, pick a recipe or type straight into the URL. A real picturium server renders every change.
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
$ 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]:
$ docker run -d --name picturium \
-p 20045:20045 \
-v $(pwd)/media:/app/data:ro \
-v picturium-cache:/app/cache \
lamka02sk/picturium:0.2.0
$ curl -I "http://localhost:20045/sample.jpg?w=600&f=webp"
HTTP/1.1 200 OK
content-type: image/webp
[server]
host = "0.0.0.0"
port = 8080
[data]
dir = "./media"
[cache]
dir = "./cache"
[cache.disk]
limit = 8192 # MiB
[output]
quality = "high"
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.
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.
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 moreDo 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.
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 moreIs it really free?
Yes. picturium is MIT licensed and free for any use, commercial included. The source is on GitHub.
Read moreHow 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.
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.
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