Optimize once, deploy everywhere, pay nothing monthly.

ImageForge is an image optimization CLI for Next.js image optimization and static pipelines. It performs build-time image optimization with WebP conversion, AVIF conversion, blurDataURL generation, and hash-based image caching, then writes imageforge.json and enforces freshness in CI with --check.

$npm install -g @imageforge/cli
$npx @imageforge/cli ./public/images

Use global install for repeated runs and one-off execution commands when needed.

terminal
$ imageforge ./public/images --formats webp,avif --quality 80 --blur
imageforge v0.1.6
Run started at (example): 2026-02-11T09:30:00.000Z
Build-time optimization pass for 200 files
Formats: webp,avif Blur placeholders: enabled

Per-request billing · first-hit latency · external-service compliance risk

Comparison and cost

Direct factual comparison of ImageForge, Vercel Image Optimization, Cloudinary, and imgix. Pricing references are shown inline and dated for context.

As of February 11, 2026

Owner: ImageForge Maintainers (Product + Growth)

Processing model

ImageForge
Build-time pre-generation
Vercel Image Optimization
Runtime/on-demand optimization
Cloudinary
Runtime API transformations
imgix
Runtime URL transformations

CI quality gate

ImageForge
Built-in --check
Vercel Image Optimization
Not a CLI check mode
Cloudinary
Not a CLI check mode
imgix
Not a CLI check mode

Air-gapped compatibility

ImageForge
Local processing, no external image API
Vercel Image Optimization
Requires external runtime service
Cloudinary
Managed external service
imgix
Managed external service

Illustrative scenario values are directional and depend on plan, region, and request patterns. Use provider calculators and account analytics for exact billing projections.

How it works

1

Run

Point ImageForge at your source directory to generate WebP/AVIF derivatives and blur placeholders at build time.

imageforge ./public/images -f webp,avif
2

Check

Add --check in CI so stale outputs fail the pipeline with a rerun command your team can copy and paste.

imageforge ./public/images --check
# fails if outputs are stale
3

Ship

Read imageforge.json inside your app for dimensions, blurDataURL, and deterministic output paths.

{
  "generated": "2026-02-11T09:30:00.000Z",
  "images": {
    "hero.jpg": {
      "blurDataURL": "data:image/png;base64,iVBOR...",
      "outputs": {
        "webp": { "path": "hero.webp", "size": 98765 },
        "avif": { "path": "hero.avif", "size": 65432 }
      }
    }
  }
}

Why teams choose ImageForge

Keep image optimization predictable with build-time outputs, CI checks, and deterministic metadata your app can consume directly.

Pay once at build time

Generate deterministic WebP/AVIF assets before deploy so production traffic does not trigger transformation bills.

-f webp,avif

CI guardrails by default

Use --check to fail CI when source images changed without regenerated outputs.

--check

Fast reruns with hash cache

Content and options hashing skips unchanged files, keeping local and CI reruns predictable.

--cache

Blur placeholders and metadata

Emit blurDataURL, dimensions, and output paths in imageforge.json for direct next/image usage.

--blur

Bounded parallelism

Set --concurrency to keep large catalogs under control without overloading build workers.

--concurrency

Machine-readable run output

Use --json for structured logs in CI pipelines and internal automation tooling.

--json

Evidence snapshot - 200 source images, P2 / batch-all

See benchmark details in Methodology or browse the full evidence page.

As of March 15, 2026 - owner ImageForge Maintainers (CLI + Growth)

Dataset

200 images

P2 / batch-all

Cold wall

79.62s

input 5.1 MB, generated 1.1 MB

Warm p50

132.3ms

1508.8 img/s

Speedup

600.65x

cold vs warm mean wall

Methodology

Headline benchmark numbers are sourced from a documented benchmark evidence record and are updated through approval-gated sync PRs.

View the full benchmark report for cold/warm charts, deltas, and run metadata.

Sample Set

200 source images with a combined input size of 5.1 MB. Output target formats are WebP and AVIF under profile P2.

Runtime Environment

CLI v0.1.6, Node 22, ubuntu-24.04, dataset 1.0.0, scenario batch-all.

Command and Options

imageforge ./public/images --formats webp,avif --quality 80 --blur

Benchmark evidence source: .github/workflows/benchmark-ci.yml. Sync path: automated nightly snapshot PR to imageforge-site with manual reviewer approval.

What the Headline Numbers Mean

78% is the size delta from 5.1 MB input to 1.1 MB generated outputs in this evidence snapshot. 79.6s is the associated run duration shown in the example output.

As of March 15, 2026. Owner: ImageForge Maintainers (CLI + Growth). Artifact: benchmark workflow.

CI enforcement with --check

Use --check in CI to fail when source images need processing and keep output deterministic across branches.

Failing run

bash
$ imageforge ./public/images --check

[1/3] cached logo.png
[2/3] needs processing hero.jpg
[3/3] needs processing new-banner.png

2 image(s) need processing.
Run: imageforge ./public/images -f webp,avif
Exit code: 1

Passing run

bash
$ imageforge ./public/images --check

[1/3] cached logo.png
[2/3] cached hero.jpg
[3/3] cached new-banner.png

All images up to date.
Exit code: 0

Next.js-first integration

Import imageforge.json and feed blurDataURL and dimensions into next/image. The same manifest shape can be consumed in Astro, Nuxt, Remix, and static pipelines.

lib/imageforge.ts
// lib/imageforge.ts
import manifest from "../imageforge.json";

export function getImageMeta(src: string) {
  return manifest.images[src];
}

// app/page.tsx
import Image from "next/image";
import { getImageMeta } from "@/lib/imageforge";

const hero = getImageMeta("hero.jpg");
const heroSrc = "/images/hero.jpg";

<Image
  src={heroSrc}
  alt="Product hero banner"
  width={hero.width}
  height={hero.height}
  placeholder="blur"
  blurDataURL={hero.blurDataURL}
/>;

Who this is for

Next.js-first workflows are front and center, with the same manifest pattern usable in other frameworks and static pipelines.

cost-conscious teams

Profile: small product teams and agencies that need predictable hosting costs.

Pain: per-request optimization pricing grows faster than traffic budgets.

ImageForge fit: pre-generate optimized assets once and keep recurring image optimization spend at $0.

npx @imageforge/cli ./public/images -f webp,avif

CI/CD teams

Profile: engineering orgs that already enforce lint, typecheck, and formatting in pipeline gates.

Pain: unoptimized assets slip into deploys because image checks are manual.

ImageForge fit: add --check so stale images fail fast with an exact remediation command.

imageforge ./public/images --check

air-gapped/compliance teams

Profile: security-sensitive environments with strict data residency and egress controls.

Pain: external image APIs can violate compliance boundaries or security policy.

ImageForge fit: all processing is local in the build environment, with no third-party upload path.

imageforge ./secure-assets -f webp,avif --concurrency 4

Vercel-to-self-host migrations

Profile: teams moving to VPS, Kubernetes, or self-managed hosting for cost and control.

Pain: runtime image optimization becomes migration friction and infrastructure overhead.

ImageForge fit: generate static derivatives at build time and serve from any CDN or static host.

imageforge ./public/images --out-dir ./public/optimized

Honest limitations

ImageForge is optimized for deterministic build-time pipelines. These tradeoffs keep costs predictable and operations simple.

Responsive widths are target-based and bounded

In responsive width-set mode, requested widths are treated as targets. Effective generated widths can clamp to source dimensions and do not upscale.

Mitigation: Set width targets intentionally, inspect generated outputs, and keep width-set counts within the documented cap for your CLI version.

No runtime responsive resizing

ImageForge generates a fixed derivative set at build time. It does not resize images on-the-fly per request.

Mitigation: Generate the sizes you need ahead of time or pair outputs with a CDN strategy.

No bundled global CDN

ImageForge writes static assets and metadata, but it does not include global delivery infrastructure.

Mitigation: Deploy outputs behind Cloudflare, CloudFront, Fastly, or your existing CDN layer.

First run scales with catalog size

Large first-time catalogs can take minutes to process because work scales with source file count.

Mitigation: Hash caching keeps subsequent runs fast by processing only changed files.

Build once. Ship fast. Keep costs at zero.

Start with one command, add --check in CI, and keep deterministic image outputs in every deployment environment.

$npm install -g @imageforge/cli
$npx @imageforge/cli ./public/images
GitHub·npm package·@imageforge/cli v0.1.6·Node >= 20