Tiny, fast image compression for Node.js using sharp.
✔ Resize by width/height • ✔ Hit a target size (KB) • ✔ Choose output format (JPEG/PNG/WebP/AVIF) • ✔ Strip metadata
npm i img-squeeze
# or for CLI
npm i -g img-squeezeimport { squeeze, squeezeMany } from "img-squeeze";
// Single file -> target 200KB, keep under 1920x1080, auto format
await squeeze("input.jpg", {
targetKB: 200,
maxW: 1920,
maxH: 1080,
format: "auto", // or "jpeg" | "png" | "webp" | "avif"
quality: 85,
minQuality: 40,
stripMeta: true,
outDir: "dist",
suffix: "min"
});
// Many files (glob)
const results = await squeezeMany("images/**/*.{jpg,jpeg,png}", {
targetKB: 180,
maxW: 1600
});
console.log(results);
img-squeeze "images/**/*.{jpg,png}" --outDir dist --targetKB 200 --maxW 1920
img-squeeze input.png --format webp --quality 80
img-squeeze input.jpg --format avif --targetKB 120 --minQuality 45
Options
maxW, maxH – resize bounds (fit: inside)
targetKB – try to reach this size or below (iterative quality/scale)
quality – start quality for lossy formats (default 85)
minQuality – floor (default 40)
format – auto | jpeg | png | webp | avif
stripMeta – remove EXIF/ICC metadata (default true)
suffix – filename suffix (default min)
outDir – output directory (default: same folder as input)
Notes
Requires Node.js 18+
Input formats: JPG/JPEG/PNG/WebP/AVIF
If targetKB is set, the tool reduces quality first, then scales down a bit if needed.
npm install
node -e "import('./index.js').then(async m => console.log(await m.squeeze('sample.jpg', {targetKB:200,