imgforge is a Rust application that wraps Axum, Tokio, and libvips into a standalone image proxy. You can run it entirely inside Docker or install the native toolchain for bespoke builds.
imgforge targets Linux and macOS. It also runs inside containers built from Debian- or Alpine-based images as long as libvips is available. Windows development is possible through WSL2.
If you are working from a fork, replace the URL accordingly. The repository uses Git submodules only for documentation assets, so a normal clone is sufficient.
Before running the server, confirm that libvips can load dynamic modules:
ldd target/release/imgforge | grep vips
If libvips is marked as “not found,” add its library directory to LD_LIBRARY_PATH (Linux) or DYLD_LIBRARY_PATH (macOS) or install the runtime package (e.g. libvips).
imgforge now ships both as an HTTP server and as a reusable Rust crate. You can embed the processing engine directly into your application without starting the Axum server:
use imgforge::{config::Config, Imgforge};#[tokio::main]async fn main() -> anyhow::Result<()> { // Provide your HMAC key and salt (hex encoded, truncated for brevity) let mut config = Config::with_hex_keys("deadbeef", "cafebabe")?; config.allow_unsigned = true; // Optional: configure caches programmatically with CacheConfig let imgforge = Imgforge::new(config, None).await?; let result = imgforge .process_path("unsafe/resize:fit:300:300/plain/https://example.com/image.jpg") .await?; std::fs::write("resized.jpg", result.bytes)?; Ok(())}
The same API exposes metadata retrieval through image_info and accepts authenticated, signed paths just like the HTTP interface. Server deployments continue to work unchanged.
Whether you chose Docker or a native build, proceed to Quick Start to configure secrets, start the server, and perform your first image transformation.