Skip to content

DevToolz ​

0.4.3 ​

2026-10-09

  • Changed: in the interface, Convert has a Resize the images switch, off by default. Until it is turned on, the images are only converted to the chosen format and the size fields are hidden (a run without any size never resizes; see Size methods); before, a width list (800, 1600) was filled in from the start and every image was resized twice.
  • Changed: in the interface, Image Hash starts with hazehash and dominant color ticked; blurhash and thumbhash are off.
  • Added: --no-resize switches off the sizes of a saved config for one run.

0.4.2 ​

2026-10-08

  • New: devtoolz ui starts a local web interface and opens it in the browser. It is part of the package and listens on 127.0.0.1 only, behind a one-time token in the printed address; requests with a foreign Host or Origin are refused. --port, --host, --no-open, --token and --cwd adjust it. See Web Interface.
  • New: Code checks runs eleven checks (dead exports, empty catch blocks, orphan tests, import case, circular imports, TODO comments, stale @ts-ignore, unused dependencies, package.json exports, README samples, npm scripts in the docs) on any folder you choose. An overview runs them all and shows a card for each. Findings are grouped by file, can be filtered, and open next to the code, with syntax highlighting, the line marked, and a link to the editor. Import cycles can also be shown as a graph.
  • New: Code cleanup removes comments or console calls with a review first: a scan lists the files and shows a real diff for each, nothing is selected by default, and only the files you tick are changed, after a confirmation. A file that changed after the scan is skipped. The originals are copied outside the project first, and the cleanup can be undone.
  • New: Image Hash in the interface — pick folders in a file browser with thumbnails, see how many images they hold, choose the placeholders and get a gallery that shows each image next to the placeholders decoded from its hashes, with the output ready to copy, download or write to a file.
  • New: Image Batch in the interface — converting with quick settings or a saved config, with a preview of the plan, progress, and before and after thumbnails; a form editor for configs with a JSON tab and live validation; sharpening presets with a preview that compares the image before and after; and the backups of replaced originals, with a restore.
  • Changed: image-batch accepts a --size box as a run override in the programmatic API, and each result of a run now carries the absolute paths of its source and output.

0.4.1 ​

2026-10-08

  • New: sharpen adds output sharpening after the resize, in the manner of Lightroom: for (screen, matte or glossy) and amount (low, standard or high) pick the values from a table, and the fine settings radius, flat, jagged and threshold replace any of them. Each is checked against the range sharp accepts, and a wrong value is reported with the field and the range before anything is written. A recipe that does not name sharpen is not sharpened. See Sharpening.
  • New: image-batch sharpen saves sharpening presets and manages them (sharpen new|list|show|rm; without a subcommand a terminal opens a list to show, edit, copy or delete). A preset is used by its name: "sharpen": "web-crisp" or { "preset": "web-crisp", "amount": "high" } in a config, --sharpen web-crisp on the command line. Presets live in .devtoolz/image-batch/sharpen/ of the project or in ~/.devtoolz/image-batch/sharpen/ for all projects. Six built-in presets (web-light, web-crisp, web-detail, thumbnail, print-matte, print-glossy) work without creating anything. See Sharpening presets.
  • New: the flags --sharpen, --sharpen-for, --sharpen-amount, --sharpen-radius, --sharpen-flat, --sharpen-jagged and --sharpen-threshold for image-batch, init and sharpen new. The init wizard asks about sharpening and offers the saved presets, and the recipe editor of config chooses a preset or custom values.

0.4.0 ​

2026-10-08

  • New: the image-batch command resizes, converts and recompresses raster images in bulk by rules. The rules live in a reusable config (or in flags); the folders to read and the place for the results are chosen on every run, so one config serves any project. It uses the same sharp library as image-hash.
  • New: three places for the results — -o <dir> (a separate folder that repeats the source structure, --flat drops it), --beside (next to each source) and --replace (over the source files, each in its own format, to shrink oversized originals or recompress them in place). Exactly one of them is given.
  • New: --replace is guarded. It asks for a confirmation (--yes without a terminal), copies the originals to .image-batch-backup/<date>/ with a journal.json first (--backup <dir>, --no-backup), replaces a file only when the result is smaller (--no-only-if-smaller), never processes the same file twice with the same settings, and --dry-run shows the real before and after sizes. image-batch restore <backup> puts the originals back.
  • New: sizes by widths, heights, size with a fit, scale (@2x), and by the long side (longEdge, --long), the short side (shortEdge, --short), area in megapixels (megapixels, --megapixels) and percentage (percent, --percent). The long and short side do not depend on the orientation, so one setting fits a gallery of landscape and portrait shots. matchOrientation (--match-orientation) turns a width × height box around for images of the other orientation. Sizes above the source size are not enlarged unless withoutEnlargement is false.
  • New: maxBytes (--max-size 200KB) limits the size of every file: the quality is lowered as little as needed, and a file that cannot reach the limit is reported instead of being written. It works for jpg, webp, avif, heif, jp2 and a png with a palette.
  • New: formats jpg, png, webp, avif, gif, tiff, jp2 and heif, with the options that matter for each (quality, mozjpeg, a png palette, webp lossless, avif effort, …) set in a config or with --codec, and quality levels low, medium, high and best that expand to a number per format. Lossy settings are never switched on silently, and a wrong option or value is reported with a hint before anything is written.
  • New: file names from a template — {name}, {ext}, {orig}, {dir}, {format}, {width}, {height}, {size}, {long}, {short}, {mp}, {percent}, {scale}, {index:3}, {hash}, {date} — with a sensible default for every size method. A template that would go outside the output folder, an unknown variable, or two results with the same name is an error before anything is written.
  • New: choosing the files — -r, --include, --exclude, --files-from, globs, --list, and -i, --select, an interactive list in which you untick the files you do not want.
  • New: results an earlier run already made are skipped; for any other existing file a terminal asks once (overwrite this, overwrite all, skip, skip all, quit), and without a terminal the files are skipped with exit code 1, or --overwrite, --skip-existing and --no-overwrite decide.
  • New: --hazehash (--budget), --blurhash, --thumbhash and --dominant-color with --emit <file> write a manifest of everything produced, with the placeholders, in the shape of a vue-image-kit placeholders manifest.
  • New: init creates a config, and config (config list|show|rm|new) shows, edits, copies and deletes configs. They are kept in .devtoolz/image-batch/ of the project or in ~/.devtoolz/image-batch/ for all projects, and the size method and the formats are chosen from lists.