Skip to content

About

Fast batch JPEG converter and photo resizer for macOS: resize thousands of photos by the long side, set JPEG quality, convert in parallel, keep folder structure and metadata. x86-64 assembly (AVX2) engine, 2.6x faster than sips. Free, native Swift.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

GOBL(in) Convert: batch JPEG converter and photo resizer for macOS

GOBL(in) Convert — fast batch JPEG converter and photo resizer for macOS

macOS 10.15+ Swift native engine x86--64 AVX2 asm license MIT GitHub stars

Resize and recompress thousands of photos in minutes. Pick a folder, set the long side and the JPEG quality, press a button — every subfolder is processed, several files at a time, the folder tree is mirrored and the originals are never touched. The fast engine is hand-written x86-64 assembly with AVX2, about 2.6× faster than sips.

Batch photo resizing in parallel on macOS

Batch JPEG converter for macOS with a hand-written x86-64 assembly engine. Pick a folder, set the long-side size and JPEG quality, press a button, and thousands of photos are resized and recompressed, several at a time, with the folder structure kept intact. One of the extra apps of GOBL(in).

Two modes

Mode How it works When to use
Regular macOS sips, one file after another maximum compatibility; optional file renaming
Fast conversion the jpeg-convert engine: ImageIO decoding, scaling in x86-64 assembly with AVX2, up to four files in parallel big folders, when speed matters

On a test of eight ~4.3 MB JPEGs the fast engine took about 0.73 s instead of 1.94 s, roughly 2.6× faster. A repeat run with unchanged settings skips finished files and takes milliseconds.

Features

  • Recursive: every subfolder, .jpg and .jpeg in any letter case.
  • Resizes by the long side and never upscales small images.
  • Mirrors the source folder tree in the result.
  • Never touches the originals. If no destination is chosen, results go to convert_<source name> next to the source.
  • Name clashes get _1, _2… suffixes.
  • Regular mode keeps metadata and orientation and can make names web-friendly: Cyrillic to Latin, spaces replaced.
  • Repeat runs with the same settings process only new or changed photos.
  • Drag and drop folders onto the window, a colour-coded log, total time at the end, dark interface.

Requirements

  • macOS 10.15 or newer, Xcode Command Line Tools (xcode-select --install)
  • The app is a universal binary: it runs natively on both Apple Silicon and Intel Macs.
  • The fast engine is an x86-64 binary with AVX2: it runs natively on Intel Macs with AVX2 and through Rosetta on Apple Silicon (tested on macOS 26).

Install

Paste this into Terminal:

curl -fsSL https://raw.githubusercontent.com/goblin-red/Photo-Convert/main/install.sh | bash

The script downloads the ready-made build from Releases, puts it into /Applications/GOBL(in) Convert and opens it. The build is universal: it runs on Apple Silicon and on Intel Macs, and no Xcode tools are needed. Your config.txt is kept between updates. To update, run the same command again.

Downloaded the zip by hand? The app is not notarized by Apple, so macOS blocks a downloaded copy. Unblock it once:

xattr -dr com.apple.quarantine "/path/to/GOBL(in) Convert"

Keep the app, the utilite folder and config.txt together in one folder: the app looks for them next to itself.

Build from source

git clone https://github.com/goblin-red/Photo-Convert.git
cd Photo-Convert

./build_app.sh            # builds "build/GOBL(in) Convert.app" and the engine in build/utilite
open "build/GOBL(in) Convert.app"

Defaults (2000 px, 85%, folders, renaming options) are read from build/config.txt, which is created from config.example.txt on the first build. The app only reads this file and doesn't overwrite it.

The engine on its own

cd jpeg-convert
make jpeg-convert
cp conf.example.txt conf.txt     # set input, output, max_size, quality
./start.command                  # or: ./jpeg-convert INPUT OUTPUT MAX_SIZE QUALITY WORKERS SKIP_EXISTING

How it works:

  1. nftw walks the source tree and mirrors subfolders in the output, without following symlinks.
  2. ImageIO decodes a JPEG, CoreGraphics draws it into an RGBA buffer in memory.
  3. Assembly code computes the size and a fixed-point coordinate table and scales the image; AVX2 vpgatherdd moves eight RGBA pixels at a time.
  4. ImageIO encodes the result as JPEG with the chosen quality.
  5. Independent files are processed in parallel with fork: one process per physical core, up to four.

Scaling uses nearest-neighbour sampling. More in jpeg-convert/docs: troubleshooting and ABI notes, optimization ideas, and plans for PNG, HEIC, TIFF, WebP and other formats.

Project

Path Purpose
Sources/main.swift the app (AppKit)
build_app.sh builds the app (arm64 + x86_64) and the engine
install.sh installs the ready-made build from Releases
package.sh packs the build for Releases: build/goblin-convert-macos.zip
logo.svg, AppIcon.icns the Goblin logo for the window and the app icon
config.example.txt default settings for the app
jpeg-convert/jpeg_convert.s the assembly engine
jpeg-convert/run_jpeg_converter.command, start.command engine launcher: reads conf.txt, picks the number of workers
CHANGELOG.md, jpeg-convert/CHANGELOG.md change history

FAQ

How do I batch resize photos on a Mac? Drop a folder onto GOBL(in) Convert, choose the long-side size and quality and press Convert. Subfolders are included, small images are never upscaled, and repeat runs only process new or changed photos.

Does it keep EXIF metadata and orientation? The regular mode (macOS sips) keeps metadata and orientation and can make file names web-friendly.

Does it run on Apple Silicon? Yes. The app is universal; the fast assembly engine runs natively on Intel Macs with AVX2 and through Rosetta on Apple Silicon.

More GOBL(in) apps

Free and open source, from the makers of GOBL(in):

App What it does
GOBL(in) Remote self-hosted remote desktop for macOS in any browser, over cheap PHP hosting
GOBL(in) Voice voice control and dictation for Claude Code, Codex and Orca on macOS
GOBL(in) Session Viewer every Claude Code, Codex, Grok and OpenCode session in one window
GOBL(in) Drag & Taskbar move windows with trackpad gestures, a real taskbar and Alt-Tab for macOS
GOBL(in) Workflow visual flowchart workflows run by AI coding agents

If this project is useful to you, please ⭐ star it — it helps other people find it.

License

MIT

About

Fast batch JPEG converter and photo resizer for macOS: resize thousands of photos by the long side, set JPEG quality, convert in parallel, keep folder structure and metadata. x86-64 assembly (AVX2) engine, 2.6x faster than sips. Free, native Swift.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages