# Smol against ImageOptim, 9 October 2026 The measurements behind the ImageOptim section of smolmac.com/benchmark and smolmac.com/imageoptim-alternative. - Machine: Apple M2 Pro, 16 GB, macOS 27.0.1 (26A434). - Tools: ImageOptim 1.9.3 (the current release, published 29 October 2023), run from its command-line binary (`ImageOptim.app/Contents/MacOS/ImageOptim `), and Smol 1.0.35, run through its MCP server. - Corpus: the 24 images of the Kodak Lossless True Color Image Suite (`https://r0k.us/graphics/kodak/kodak/kodimNN.png`), 15,394,305 bytes of PNG. Not stored here. - Two starting points, because ImageOptim keeps the format it is given: - "PNG in": the 24 originals. - "JPEG in": the same 24 images saved as JPEG with `sips -s format jpeg -s formatOptions 90`, 4,082,179 bytes. - ImageOptim settings: its shipped defaults (lossless), then lossy switched on (`LossyEnabled`) with JPEG quality (`JpegOptimMaxQuality`) 60, 70, 80 and 90 and PNG quality (`PngMinQuality`) 60, 80 and 90. 80 is its default for both. - Smol settings: JPEG 50 to 90, AVIF 45 to 85, WebP 60 to 90 from the JPEG sources; PNG 60, 75 and 90 from the PNG originals. Smol's JPEG, AVIF and WebP from the PNG originals are the 5 October rows (`../2026-10-05-image-compressors/results24.json`, same app version). - Scoring: every output against the ORIGINAL PNG (not against the JPEG source) with SSIMULACRA2 (libjxl 0.11.2) and SSIM (`ssim_lib.py`). The JPEG sources themselves score a mean of 88.70. - Matching: `match-io.py` / `publish.py`, same method as 5 October: per image, bytes needed for a target score are interpolated in log-bytes between the two nearest measured settings, then summed over the images both tools reach. - Lossless check: `magick compare -metric AE` between each ImageOptim lossless output and its input reported 0 differing pixels on all 24 PNGs and all 24 JPEGs. Files: - `io-results.json`: one row per output file: image, tool, source, format, setting, bytes, ssim, ssimulacra2 (696 rows). - `fixed-settings.txt`: totals and mean scores at each setting. `matched-output.txt`: what `match-io.py` prints. - `io-run.sh` drives ImageOptim; `smol-run2.mjs` drives and times Smol; `harvest-io.py` scores the outputs. - `publish.py` builds the public copy (`smol_v0/public/benchmark/2026-10-09/`) and the summary the site renders (`smol_v0/lib/benchmark/imageoptim-2026-10-09.json`). Run it from the workspace root after any change. Timing, 24 files, seconds, every run: - ImageOptim (process start to exit, so it includes launching the app): PNG lossless 20.71, 19.57, 23.85; PNG lossy 80 16.38, 15.19, 19.05; JPEG lossless 0.70, 0.68, 1.43; JPEG lossy 80 0.80, 0.82, 1.01. - Smol (job accepted to last output file written; the app's MCP server is already running): PNG to PNG 75 9.02, 9.78, 9.58; PNG to PNG 90 (the setting whose output matches ImageOptim's lossy 80: 5,444,974 bytes at a mean score of 81.66 against 5,470,861 at 81.78) 10.38, 10.19, 10.63; PNG to AVIF 65 11.22, 7.62, 7.33; JPEG to JPEG 75 7.75, 6.43, 7.25; JPEG to AVIF 65 6.77, 7.60, 7.17. ImageOptim was installed for this test with `brew install --cask imageoptim` and removed afterwards.