Self-hosted service
imazen/imageflow avatar
imazen/imageflow

imazen/imageflow: a Rust image pipeline for web servers, and what it costs to adopt

High-performance image manipulation for web servers. Includes imageflow_server, imageflow_tool, and libimageflow

4,416 stars144 forksRustAGPL-3.0

At a glance

What is it?
Imageflow ships a CLI tool, a C-ABI library and a set of language bindings for resizing and re-encoding images at request time. It is fast, it is AGPLv3 or commercial, and its server component is gone.
Who is it for?
Adopt imageflow_tool if you need process-isolated batch resizing or a JSON job graph and can accept AGPLv3 or buy a commercial exception; adopt libimageflow through an existing binding if you want in-process work and can tolerate the caveat that the Rust crate interface is not semver-aligned with tagged releases.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 3 days ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem Imageflow targets: resizing images without ImageMagick in the request path

Imageflow exists for teams that generate image variants on a server: thumbnails, responsive srcset sizes, format conversions. The README frames the pitch against ImageMagick twice, claiming imageflow_tool is "Up to 17x faster than ImageMagick" and that it "produces smaller files at higher quality", and it links the CVE search for ImageMagick as a safety argument. Treat the speed number as the project's own claim, not a measured result.

The intended users are web backend engineers. Three surfaces are offered: imageflow_tool for command-line work and process isolation, libimageflow for in-process use from another language, and bindings for Node, Go, Scala, Elixir, .NET and Ruby. If you only need a few sizes per upload, the README itself says you "may find that imageflow_tool is quite fast enough", which is a useful admission that the library route is not mandatory.

How the pieces fit: imageflow_tool, libimageflow, and a four-method C ABI

The repository is a Cargo workspace. Cargo.toml lists members including imageflow_core, imageflow_abi, imageflow_types, imageflow_riapi, imageflow_http_helpers, imageflow_tool and imageflow. That layout mirrors the product split: imageflow_core holds the engine, imageflow_abi exposes the stable C surface, imageflow_riapi parses ImageResizer-style querystrings, and imageflow_tool is the binary.

The README describes the ABI as "simple" and C-compatible, with only four methods needed to write bindings, and the C and C++ interface as stable, pointing at bindings/headers/imageflow_default.h. Two job formats exist: a querystring command compatible with ImageResizer 4, and a JSON job file. The README says JSON jobs "can have multiple inputs and outputs, and can represent any kind of operation graph", which is the real differentiator over a one-in-one-out resize call. By default the tool prints a JSON response to stdout; --response writes it to disk.

One design decision worth flagging: the Rust crate imageflow_core is usable, but the README warns that its interfaces "are not stable or semver in line with tagged releases", because those version numbers describe the C ABI. If you are writing Rust, you are on a less protected path than a C or .NET consumer.

Installing imageflow_tool and running your first querystring job

The README points at two distribution routes: self-contained binaries for Windows, Ubuntu and Mac from the GitHub releases page, and Docker images for Linux. The Docker route requires glibc and OpenSSL according to the README. Start by generating the example jobs, which the README calls the recommended entry point.

bash
imageflow_tool examples --generate

That creates an examples directory containing JSON jobs and invocation scripts. From there, the simplest real use is a querystring command, which accepts ImageResizer 4 compatible syntax:

bash
imageflow_tool v1/querystring --in source.jpg --out thumb.jpg --command "width=50&height=50&mode=crop&format=jpg"

The result is thumb.jpg, a 50 by 50 crop re-encoded as JPEG. If you prefer the Docker image, the README gives the invocation as docker run imazen/imageflow_tool, and the same subcommands apply inside the container. For multi-output work, the JSON job route takes one input and several numbered outputs:

bash
imageflow_tool v1/build --json examples/export_4_sizes/export_4_sizes.json \
  --in waterhouse.jpg \
  --out 1 waterhouse_w1600.jpg 2 waterhouse_w1200.jpg 3 waterhouse_w800.jpg 4 waterhouse_w400.jpg \
  --response operation_result.json

What you should see is four files at the widths named in the job, plus operation_result.json holding the response that would otherwise have gone to stdout. For bug reports the README offers --debug-package, which builds a .zip reproducing the problem for both v1/build and v1/querystring.

imageflow_server is gone, and the replacement lives in another repository

This is the limitation that matters most for anyone arriving from an older tutorial. The README states plainly that imageflow_server has been removed because the underlying web framework, Iron, is abandoned and no longer secure. For the last few years the project has instead suggested Imageflow.Server, described as production-ready, in the separate imageflow-dotnet-server repository, which also offers Docker deployment.

So the dynamic-imaging examples in the README, the img tags pointing at http://localhost:39876/demo_images/u3.jpg?w=300 and the srcset block, describe Imageflow.Server, not anything in this repository. Port 39876 belongs to that other product. If your plan was to run a Rust image server from this repo, the plan does not survive contact with the README.

A second boundary: the release history shown here is entirely release candidates. v2.3.1-rc01 is dated 2026-03-31, v2.3.0-rc01 2026-02-22, and v2.2.0-rc01 2025-10-23. The README carries a badge reading "state: release candidate" that links to a flaws section. The last push to the repository was on 2026-08-29. Nothing here tells you when a non-RC release lands, so pin explicitly rather than tracking a channel.

The alternative to weigh: ImageMagick, and where the difference actually sits

The obvious comparison is ImageMagick, which Imageflow names directly and benchmarks itself against. The difference is not only speed. ImageMagick is a long-lived, broadly packaged tool with a very large format surface and a command language that most engineers already half-know; the README's counterargument is its CVE history, which it links rather than summarizes.

Imageflow's approach is narrower and more structured. Operations are expressed either as ImageResizer-compatible querystrings or as a JSON job graph with multiple inputs and outputs, and the engine is exposed through a small stable C ABI so bindings are cheap to write. That is a different shape of tool: less a general-purpose image editor and more a pipeline component you embed. If your work is one-off conversions with unusual formats, ImageMagick's breadth is the safer bet. If your work is generating many derived sizes per source on a server, the job graph and the ABI are the parts Imageflow offers that ImageMagick does not.

Note also that the related searches around this name are polluted: several refer to a photo editor app and to Shutterstock, which are different products sharing the word. Do not assume a search result about "ImageFlow: Photo Editor" describes this repository.

Licence, upgrade cost and what the repository tells you about maintenance

Imageflow is AGPL-3.0. The README presents a choice, with a badge reading "license: Choose AGPLv3 or Commercial" and a link to imageresizing.net/pricing for an "AGPLv3 exception for commercial use". The practical consequence, stated without legal advice: if you link libimageflow into a network service, the AGPL's source-availability obligations are the question your legal team needs to answer, and the paid exception is the project's stated route out. Running imageflow_tool as a separate process is a different arrangement from linking the library, and that distinction is worth raising early.

Upgrade cost is shaped by the ABI promise. The README says the C and C++ interface is stable and that tagged release numbers describe the C ABI, not the Rust API. That means C, C++ and the maintained bindings have a defined contract across releases, while Rust consumers do not. The workspace also patches several dependencies to git branches in Cargo.toml, including zenjpeg and zenwebp from main and forks of libpng-sys and lcms2-sys, which is normal for an image codec project but means a build from source tracks upstream branches rather than only published crates.

Maintenance signal from the repository itself: not archived, last push on 2026-08-29. The justfile shows an active test workflow built on cargo nextest against imageflow_core's integration tests, with checksum auto-update, reference-image upload to S3 and a backfill-diffs task. That is the infrastructure of a project that still runs its own regression suite.

Editorial conclusion

Adopt imageflow_tool if you need process-isolated batch resizing or a JSON job graph and can accept AGPLv3 or buy a commercial exception; adopt libimageflow through an existing binding if you want in-process work and can tolerate the caveat that the Rust crate interface is not semver-aligned with tagged releases. Do not adopt it expecting imageflow_server: the README states that component was removed because its Iron web framework is abandoned and no longer secure, and points to Imageflow.Server in the separate imageflow-dotnet-server repository instead. Before committing, verify which release candidate you are pulling (the newest listed is v2.3.1-rc01, dated 2026-03-31), confirm your platform has a matching self-contained binary or that glibc and OpenSSL are present for the Docker image, and read the licence badge's two options against how you intend to distribute the software.

Frequently asked questions

What is imageflow_tool and how is it different from libimageflow?

imageflow_tool is the command-line binary, intended for experimenting, batch jobs, JSON jobs, or when you want process isolation. libimageflow is the library for direct in-process use from your programming language, reached through bindings or the C ABI.

Where do I download Imageflow binaries?

The README links the GitHub releases page for self-contained binaries for Windows, Ubuntu and Mac, and points to Docker images on Docker Hub for Linux, where glibc and OpenSSL are required.

Is there an Imageflow server I can run?

Not in this repository. The README states that imageflow_server has been removed because the Iron web framework is abandoned and no longer secure, and directs users to the Imageflow.Server product in the separate imageflow-dotnet-server repository.

What licence does Imageflow use?

The repository is AGPL-3.0. The README presents a choice between AGPLv3 and a commercial licence, and links imageresizing.net/pricing for an AGPLv3 exception for commercial use.

Which languages have Imageflow bindings?

The README lists Node, Go, Scala, Elixir and .NET bindings, plus basic Ruby bindings, and notes that the C and C++ interface is stable. It also says the imageflow_core Rust crate is usable but its interfaces are not stable or semver in line with tagged releases.

How do I report a bug with a reproducible package?

The README documents --debug-package, which creates a .zip file reproducing problematic behavior with both v1/build and v1/querystring, and asks users to submit bug reports that way.

Official sources

  1. imazen/imageflow on GitHub
  2. License: AGPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/imazen-imageflow.svg)](https://hysenlabs.com/projects/imazen-imageflow)