From image-production
Use when the user wants to take a folder of images (any mix of HEIC, RAW, PNG, JPEG, TIFF, WebP) and produce a web-ready set — EXIF stripped, resized to a sensible max dimension, encoded in modern formats (AVIF + WebP, with JPEG fallback), and optimised for size. End-to-end orchestrator. Mirrors `audio-production:polish`.
npx claudepluginhub danielrosehill/claude-code-plugins --plugin image-productionThis skill uses the workspace's default tool permissions.
One-shot pipeline: ingest anything → strip EXIF → resize → encode to web formats → optimise. The "make this folder uploadable" skill.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
One-shot pipeline: ingest anything → strip EXIF → resize → encode to web formats → optimise. The "make this folder uploadable" skill.
Do not use this skill when:
convert-to-jxl, optimize-png).optimize-png/optimize-jpeg only, no resize.blog (default): max-side 2000px, AVIF q60 + WebP q80 + JPEG q82 fallback, EXIF stripped.gallery: max-side 3000px, AVIF q70 + WebP q85, EXIF stripped.thumbnail: max-side 800px, AVIF q55 + WebP q75, EXIF stripped.archival-web: max-side 4000px, AVIF q80 + WebP q90, EXIF preserved.--max-side N, --avif-q N, --webp-q N, --jpeg-q N, --keep-exif, --no-jpeg-fallback.<input>/web/. Inside: web/avif/, web/webp/, web/jpg/ parallel trees so the user can pick which set to upload.--recursive. Mirrors subdirectory layout.Pre-flight: verify install-deps shows green for: magick/convert, exiftool, vipsthumbnail, avifenc, cwebp (already present for existing convert-to-webp), cjpeg-mozjpeg or cjpeg (for JPEG fallback), oxipng, jpegoptim. Missing optional tools are skipped (and the corresponding output format is dropped from the pipeline with a one-line note).
Stage 1: Decode/normalise inputs. Walk the input tree; classify each file:
heif-convert (or via vipsthumbnail if libvips has libheif). Fail loud if neither is available.darktable-cli "<input>" "<staged>.tiff" if installed, else vips copy (libvips has rudimentary RAW). If neither path works, skip the file with a flagged warning.Stage 2: Strip EXIF. Unless --keep-exif set:
exiftool -all= -tagsfromfile @ -Orientation -ColorSpace -overwrite_original "<staged>"
Preserve Orientation and ColorSpace (rotation handling and colour fidelity) even in strip mode.
Stage 3: Resize. Per file, fit within <max-side> box preserving aspect:
vipsthumbnail "<staged>" --size "<max-side>x<max-side>" --output "<resized>.png[Q=100]"
Use lossless intermediate to avoid double-compression. Skip if the source's longest side is already ≤ max-side.
Stage 4: Encode. For each survivor, produce up to three outputs:
avifenc -q <avif-q> -s 6 "<resized>.png" "<out>/avif/<basename>.avif"cwebp -q <webp-q> "<resized>.png" -o "<out>/webp/<basename>.webp"--no-jpeg-fallback): cjpeg-mozjpeg -quality <jpeg-q> -progressive -optimize (or stock cjpeg if mozjpeg missing) → <out>/jpg/<basename>.jpgRun encodes in parallel — they're independent.
Stage 5: Optimise (final squeeze).
jpegoptim --strip-all --all-progressive in-place on web/jpg/.--no-jpeg-fallback): oxipng -o 4 --strip safe.Cleanup: delete <staged> intermediates. Write a manifest at <output>/manifest.json mapping <original-path> → {avif, webp, jpg} plus per-file size deltas.
<output-dir>: avif/, webp/, jpg/.manifest.json with the mapping and size table.<orig> → AVIF <X>%, WebP <Y>%, JPEG <Z>%.blog profile. gallery and archival-web raise quality for slower-but-better output.convert-to-webp (single-format), convert-to-avif (single-format), optimize-png, optimize-jpeg. This orchestrator composes them; the user is welcome to use the components directly when they want finer control.