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 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).
| 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.
- Recursive: every subfolder,
.jpgand.jpegin 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.
- 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).
Paste this into Terminal:
curl -fsSL https://raw.githubusercontent.com/goblin-red/Photo-Convert/main/install.sh | bashThe 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.
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.
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_EXISTINGHow it works:
nftwwalks the source tree and mirrors subfolders in the output, without following symlinks.- ImageIO decodes a JPEG, CoreGraphics draws it into an RGBA buffer in memory.
- Assembly code computes the size and a fixed-point coordinate table and scales the image;
AVX2
vpgatherddmoves eight RGBA pixels at a time. - ImageIO encodes the result as JPEG with the chosen quality.
- 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.
| 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 |
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.
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.

