Skip to content

Releases: jeso87/ShrinkerPro

Shrinker Pro 1.5.0

Choose a tag to compare

@jeso87 jeso87 released this 29 Sep 13:23

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

Choose a tag to compare

@jeso87 jeso87 released this 18 Sep 02:54
  • Fixed settings window size for smaller screens
  • Added cropping options

Shrinker Pro 1.3.1

Choose a tag to compare

@jeso87 jeso87 released this 17 Sep 09:27
  • Settings logic Fix
  • Fixed Auto Update checker

Shrinker Pro 1.3.0

Choose a tag to compare

@jeso87 jeso87 released this 17 Sep 05:55

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

Choose a tag to compare

@jeso87 jeso87 released this 14 Sep 02:25

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 file

Two differences from the app worth remembering:

  • It never reads saved preferences, so nothing converts unless --to asks — except HEIC, which has no "keep" option anywhere and always becomes JPEG.
  • --quality takes 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

Choose a tag to compare

@jeso87 jeso87 released this 11 Sep 04:38

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

Choose a tag to compare

@jeso87 jeso87 released this 11 Sep 01:25

Fixed App Notifications

Shrinker Pro 1.0.1

Choose a tag to compare

@jeso87 jeso87 released this 11 Sep 00:12
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

Choose a tag to compare

@jeso87 jeso87 released this 10 Sep 22:45
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>