Releases: jeso87/ShrinkerPro
Release list
Shrinker Pro 1.5.0
Shrinker Pro is now translated into 36 languages, and Settings is two tabs
instead of one column taller than a laptop screen.
Download
ShrinkerPro-1.5.0.dmg — 3.7 MB. Open it and drag Shrinker Pro to Applications.
Signed with a Developer ID and notarized by Apple, with the ticket stapled to
the DMG, so it opens by double-clicking: no right-click-Open, no Gatekeeper
warning, no network round trip on first launch.
Requires macOS 14 Sonoma or later, on an Apple Silicon Mac. Every Mach-O
in the bundle is arm64 — not "supports Apple Silicon", only Apple Silicon —
so it will not run on an Intel Mac at all.
Or from Homebrew:
brew install jeso87/tap/shrinker # the headless `shrinker` command
Existing installs are offered this automatically; nothing to do.
In 36 languages
Arabic, Catalan, Chinese (Simplified, Traditional and Hong Kong), Croatian,
Czech, Danish, Dutch, Finnish, French, German, Greek, Hebrew, Hungarian,
Icelandic, Italian, Japanese, Korean, Norwegian (Bokmål and Nynorsk), Persian,
Polish, Portuguese (Brazil and Portugal), Romanian, Russian, Slovak, Slovenian,
Spanish, Swedish, Thai, Turkish, Ukrainian and Vietnamese.
There is nothing to choose — the app follows the language macOS is set to. The
set matches the 36 the updater itself ships in, so the app and its update
dialog can never be in different languages, and the update notes are
translated too.
Where macOS already has a word for something, the app uses that word rather
than a fresh translation of it: Reveal in Finder, Keep Both,
Replace and the rest were each read out of the system's own shipping
resources. Plural forms and typography were measured per language rather than
assumed — Arabic reaches five plural categories for whole numbers, Polish and
Russian never reach other at all, and Czech, Slovak, Polish and Russian take
a non-breaking space after one-letter prepositions where Croatian, Slovenian
and Ukrainian do not.
Arabic, Hebrew and Persian lay the whole window out right to left.
These are machine translations made against those platform sources, not
native-speaker work. They have not been reviewed by a speaker of every
language. Corrections are very welcome and are a one-file change —
translations/<lang>.json in this repo, one per language.
The headless shrinker command stays in English on purpose: its output is
something scripts read, and a message that changes wording with the Mac's
region is a message no script can match on.
Settings is two tabs
It was over a thousand points tall and had to scroll, which put the Metadata
and General sections below the bottom edge of a laptop screen. It is now
Output and Conversion, each short enough to need no scrolling at all,
and the window sizes itself to whichever tab is showing — and to the language
it is in, stacking a row whose label and options no longer fit side by side
rather than cutting the text off.
Fixed
The crop fields hold five digits. They had always been documented as holding
five and never did: anything from 12345 up was silently truncated to an
ellipsis while you typed it. Four digits fit, so 1920 and 3840 never
showed it.
The other files here
| File | What it is |
|---|---|
ShrinkerPro-1.5.0.dmg |
The app. This is the one you want |
ShrinkerPro.dmg |
The same bytes under a stable name, for the README's download button |
shrinker-1.5.0-arm64.zip |
The headless shrinker command on its own, for scripts and CI |
ShrinkerPro-1.5.0-thirdparty-sources.zip |
Corresponding source for the bundled GPL components — see below |
Licensing
Shrinker Pro's own code is MIT. The app also bundles gifsicle (GPL-2.0) and
pngquant with libimagequant (GPL-3.0-or-later) as executables, plus
BSD/libpng components. ShrinkerPro-1.5.0-thirdparty-sources.zip is the
corresponding source for those, published alongside the binaries because the
GPL requires it — not as a courtesy. Full details in
THIRD-PARTY-LICENSES.md.
Checksums
7caa35e65267a680cc136225bf07a2fca39d748eab78b5c46964c950f1859c3c ShrinkerPro-1.5.0.dmg
df95b3dde59ee08f94f76263947ab0ef4645bada1b7e6f6d410007408a45fe9d shrinker-1.5.0-arm64.zip
19e3a3a25b039452ea0271c5ecf35911ac964239cb7173d9a38e0e33693858f6 ShrinkerPro-1.5.0-thirdparty-sources.zip
Full changelog: CHANGELOG.md · v1.4.0…v1.5.0
Shrinker Pro 1.4.0
- Fixed settings window size for smaller screens
- Added cropping options
Shrinker Pro 1.3.1
- Settings logic Fix
- Fixed Auto Update checker
Shrinker Pro 1.3.0
1.3.0 — 2026-09-16
Added
Max size. Give Shrinker Pro a number and nothing comes out bigger than it
on its longest side: a landscape image is scaled by its width, a portrait one
by its height, always keeping the aspect ratio. Anything already inside the cap
is left at the size it arrived — the number is a ceiling, not a target, and
nothing is ever scaled up.
Every still image is resized by the same resampler, whichever encoder finishes
the file, so a PNG and a WebP capped at the same number match. GIF is the one
exception, and it is resized by gifsicle precisely so an animation stays an
animation. SVG is unaffected: it is vector, so it has no pixel size to cap.
A resized file is written even if it comes out larger — the same exemption
converting already had. You asked for those dimensions.
--max-size for the command line.
shrinker --max-size 2000 ./camera-roll
Changed
The window footer is now a session settings bar. One line states what will
happen to the next files you drop — WebP · High · Max 2000px — and Adjust
opens Convert all to, Quality and Max size in place. Done, Escape, or a click
anywhere above closes it again; nothing is discarded by closing, because every
control applies the moment you use it. A dot marks any setting that differs
from your defaults, and Reset puts all three back.
The three controls in a row needed about 620pt of window. A summary fits any
width, and it says something the row never did: these settings are the
session's, not the app's.
Quality set in the window no longer changes your saved default. It applies
to that session and is gone at the next launch, which is now true of everything
in the bar — the defaults each session starts from still live in Settings, and
that is where to change them for good. If you never open the panel, nothing
about your quality changes.
1.2.1 — 2026-09-14
Added
Shrinker Pro now asks before replacing a file. Drop something whose result
would land on a file that already exists and you are asked before any work
starts, with the choice to skip those files, keep both, or replace. Files in
the same drop that collide with nothing still get shrunk.
Two questions rather than one, asked separately and answered separately,
because the stakes differ. Your own originals are asked about first —
overwriting one cannot be undone — then anything already sitting at the
destination: a copy from an earlier run, or something unrelated that happens
to share the name. Shrinker Pro cannot tell which from where it stands, so it
asks rather than assuming. Skipping declines only the files in that one
answer; the rest of the drop still runs.
You can turn it off in Settings, under Output, which restores exactly what
1.2.0 did.
--if-exists for the command line. The same three choices, plus a fourth
that has no sheet equivalent, as a flag:
shrinker --if-exists skip ./screenshots
shrinker --if-exists keep-both photo.jpg
shrinker --if-exists fail ./build-assets
It defaults to replace, which is what every earlier version did, so no
existing script changes behaviour. --json output gains a status field —
shrunk, declined or skipped — so a caller can tell a file that was
skipped from one that had nothing worth saving.
Changed
Settings is easier to read. The panel is now five labelled sections —
Output, Conversion, Quality, Metadata, General — where two of them previously
had no heading at all. Where files go and whether originals are kept are
radio choices that each state their own consequence, instead of a checkbox
whose off-state you had to work out.
Fixed
The "your originals will be overwritten" warning told the truth only some
of the time. It appeared whenever the .min suffix was off, including when
a subfolder or a chosen save folder meant nothing was actually being
overwritten. It now appears only when originals are genuinely at risk.
Shrinker Pro 1.2.0
Released 2026-09-13. Build 5. macOS 14+, Apple Silicon only.
The quality release, and the first one with a command line.
New install line
brew install jeso87/tap/shrinker
First release distributed through Homebrew as well as the DMG.
What shipped
Quality
Settings offers Super Low, Low, Standard, High for the lossy encoders, and the same control sits in the window footer so it can change between one drop and the next without opening a panel.
Standard is the default and produces exactly what earlier versions did — upgrading changes nothing about your output unless you choose it to. This was verified byte-for-byte against 1.1.0 across all 12 conversion routes before shipping.
Applies to JPEG, WebP, AVIF, HEIC. PNG and GIF are deliberately excluded — pngquant's --quality is a floor with an abort (it exits non-zero and writes nothing when it can't hit the minimum), and gifsicle's --lossy inverts the axis. Wiring either would convert a preference into a failure on hard images.
The shrinker CLI
Same compression engine, no window. Built for scripts, build steps, and AI assistants that can run a command but can't drag a file onto a drop zone.
shrinker photo.jpg # .min copy beside it
shrinker --quality super-low --to webp ./shots # a whole folder
shrinker --json --quality 85 diagram.jpg # one JSON line per fileTwo differences from the app worth remembering:
- It never reads saved preferences, so nothing converts unless
--toasks — except HEIC, which has no "keep" option anywhere and always becomes JPEG. --qualitytakes a plain number as well as a level name, for hitting a size target the four named stops don't reach.
Window footer
"Convert all to" moved from above the results list to a bar pinned along the bottom, now a dropdown, with Quality beside it. History scrolls above them. On a narrow window they stack rather than crowd.
"Off" became "App default" — says what actually happens (stored per-format rules apply) rather than only what doesn't.
Fixed: compressing a file can no longer make it bigger
Re-encoding an already-compressed image can produce a larger file, and the app used to write that result and report it as a saving. Now a same-format result larger than its source is discarded, original untouched, reported as 0%.
Was already happening: re-optimising a WebP produced a file ~36 bytes larger every time. Format conversion is deliberately exempt — a photo converted to lossless PNG is expected to grow, and that's what was asked for.
Shrinker Pro 1.1.0
Photos keep their rotation, metadata is now yours to control, and there's a
one-off "convert everything to X" in the main window.
Fixed
Photos no longer come out rotated the wrong way. EXIF orientation is now
applied to the image itself rather than passed along as a tag, so a portrait
iPhone photo stays upright in Preview, Finder and browsers alike, whatever
format it is converted to.
This affected HEIC → JPEG — the default rule, so it hit iPhone photos dropped
on the app with no settings changed — along with every AVIF target, every WebP
output, and HEIC/AVIF re-encodes. JPEG → JPEG was never affected, which is why
only some images were coming back wrong.
Added
Metadata control. Settings now offers three choices: keep all metadata,
keep copyright and credit only, or keep none. The default is all, so nothing
you currently get is lost on upgrade.
"Copyright and credit only" is the one to reach for before posting a photo
publicly — it keeps the fields that say who made the image and drops GPS
coordinates, capture time and camera details.
Rotation is not covered by any of the three. It is always applied to the image,
whichever option you choose.
Convert all to. A bar above the results list overrides every per-format
conversion rule at once — JPEG, WebP, AVIF or PNG — for as long as the app is
open. It leaves your stored settings untouched and is gone the next time you
launch. It lives in the window rather than in Settings so it is visible the
whole time it is on.
PNG is available here and nowhere else. It is lossless, so photographs
converted to it usually get larger; the app says so when you pick it.
SVG and GIF ignore the override, exactly as they ignore the stored rules.
Changed
"Add .min suffix to shrunken files" is now "Keep original files." Same
setting, same behaviour, same default — the old label described the filename
rather than what turning it off costs you, which is your originals. Your
existing preference carries over untouched.
Shrinker Pro 1.0.2
Shrinker Pro 1.0.1
Publish 1.0.0: install links, stable download asset, update feed Adds an Install section to the README and teaches release.sh to emit a second, byte-identical copy of the DMG named ShrinkerPro.dmg. The two names serve consumers with opposite requirements. GitHub's permanent download URL is .../releases/latest/download/<exact asset name>, so a download button that survives every release needs a filename with no version in it. Sparkle needs the reverse: generate_appcast derives the enclosure URL from the versioned filename, and each release's asset has to stay distinct. Uploading both costs 2.5MB and lets each have what it needs. The copy is made after stapling and its ticket re-validated, because a copy taken beforehand would look identical while needing a network round trip on first launch — and would fail to open offline. appcast.xml carries the 1.0.0 entry, signed with the release EdDSA key. Publishing it is still a manual push; release.sh prints the steps. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UViFBUxU17vNiGaZY7p2so
Shrinker Pro 1.0.0
Shrinker Pro — native Apple Silicon image compressor A ground-up rewrite of Image Shrinker (Stefan Schulz-Lauterbach, CC0-1.0) as a native SwiftUI app for Apple Silicon. Upstream shipped its compressors as x64-only binaries, so on Apple Silicon they ran only under Rosetta 2 — and Apple ended Intel support with macOS 26. Every executable here is arm64, statically linked, and verified by a release gate that blocks notarization if anything else appears in the bundle. Compresses PNG, JPEG, GIF and SVG in place, and converts between PNG, JPEG, HEIC, WebP and AVIF with per-format rules. SVG and GIF are never converted: SVG is vector, and GIF is usually animated. mozjpeg, pngquant, gifsicle and cwebp are built from source as static arm64 binaries and bundled; AVIF and HEIC encode through ImageIO; SVG runs svgo inside JavaScriptCore with no binary at all. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>