TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Press ⌃⌘J on a Finder selection — or right-click — and get a JPEG under the size limit you pick. HEIC, PNG, JPEG and more, converted on your Mac, nothing uploaded.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Press ⌃⌘J on a Finder selection — or right-click — and get a JPEG under the size limit you pick.
Your phone shoots 8 MB photos; the form you are uploading to takes 2.
The fast way: select images anywhere in Finder and press the hot key — ⌃⌘J by default, any
combination you record in the app. They are converted where they sit, with your last settings,
without a window opening. That is the whole interaction.
The careful way: right-click → Quick Actions → Convert to JPEG → pick the limit and see
what every file will weigh before anything is written.README 전문 보기 ↗Press ⌃⌘J on a Finder selection — or right-click — and get a JPEG under the size limit you pick.
Website · Releases · Changelog
Your phone shoots 8 MB photos; the form you are uploading to takes 2.
The fast way: select images anywhere in Finder and press the hot key — ⌃⌘J by default, any combination you record in the app. They are converted where they sit, with your last settings, without a window opening. That is the whole interaction.
The careful way: right-click → Quick Actions → Convert to JPEG → pick the limit and see what every file will weigh before anything is written.
Either way it converts HEIC, JPEG, PNG and anything else macOS can read (TIFF, GIF, WebP, camera raw) to a JPEG under a size limit you pick at conversion time — and never hands you a file bigger than the one you gave it.
With Homebrew
brew install --cask mshykov/tap/image-shrink
From a release — download the DMG, drag the app to Applications, open it once. The first launch installs the Finder Quick Actions itself, switches them on and reloads Finder: nothing to enable by hand in Customize…. The app menu has Reinstall Finder Actions if they ever go missing, and Remove Finder Actions… to take them away again.
From source
./scripts/install.sh
That builds the app, removes anything an earlier install left behind, installs it into
/Applications (or ~/Applications if that is not writable), and then has the app install its
own Quick Actions — the same path a downloaded copy takes, so this tests it rather than
bypassing it. No Xcode project, no admin password.
If a menu entry still does not appear, log out and back in once — Finder caches its services list.
The first time the app writes into Downloads, Desktop or Documents, macOS asks for permission to that folder. That prompt is macOS, once per folder.
From Finder — select any number of images, right-click, and pick one of two Quick Actions:
| Quick Action | What happens |
|---|---|
| Convert to JPEG… | The window opens with the selection loaded. Pick the limit, convert. |
| Convert to JPEG Now (⌃⌘J by default) | No window at all. Converts straight away with the settings the window used last (or a preset you pin in Settings), then a sound and a notification. |
| · Email 2 MB, · Web 1 MB, · Messenger 500 KB | One action per preset, also without a window. |
The shortcut is set in the app: click the keys in the window's banner, or Settings → Finder shortcut, and press the combination you want. Esc keeps the current one, Delete removes it.
The shortcut works on a Finder selection without opening any menu, and it survives a reinstall. System Settings → Keyboard → Keyboard Shortcuts → Services shows the same entry.
By hand — open the app and drag files or a whole folder onto the window, or use Add Files. A folder is opened up for you: every image inside it, subfolders included, hidden files and package contents left alone.
From Shortcuts — the app publishes a Convert Images to JPEG action, with the images, the megabyte limit and an optional longest side as parameters. It returns the converted files, so it can feed the next step of a shortcut.
From the terminal
~/Applications/Image\ Shrink.app/Contents/MacOS/ImageShrink --cli --target-mb 2 ~/Downloads/*.heic
--help lists the options: --target-mb, --max-dim, --dest, --subfolder, --suffix,
--replace, --strip, --no-skip, --quiet.
Most conversions never need it:
Closing the window does not quit the app: it stays in the menu bar, and the Dock icon goes away until you open a window again. Settings (⌘,) has an Open at login switch.
The app reads a feed of releases and installs them in place. Every update is signed, and the app refuses any download it cannot verify against the public key built into it — so the signature is what is trusted, not the server it came from. It asks on the second launch whether to check automatically, and Check for Updates… asks on demand.
A copy installed through Homebrew updates the same way: the cask is marked auto_updates, so
brew upgrade leaves the app to it rather than the two fighting over the same bundle.
That update check is the app's only network traffic. Your images are converted entirely on your Mac, and nothing about them is sent anywhere.
Every action in the window has a menu item, which is also where its shortcut is written down:
| Convert | ⌘↩ (or ↩ when the window is focused) |
| Stop | ⌘. (or Esc) |
| Size limit | ⌘1 … ⌘5 — 500 KB, 1 MB, 2 MB, 5 MB, Custom |
| Undo last batch | ⇧⌘Z |
| Show results in Finder | ⇧⌘R |
| Clear the list | ⌘⌫ |
| Add files | ⌘O |
| Settings | ⌘, |
Tab walks the controls when macOS lets it — see below.
If Tab does not move between controls, that is a macOS setting rather than this app: System Settings → Keyboard → Keyboard navigation. With it off, macOS only lets Tab reach text fields and lists, in every app. The shortcuts above work either way.
In: HEIC/HEIF, JPEG, PNG, TIFF, GIF, WebP and camera raw — whatever ImageIO reads on this version of macOS. Out: always JPEG, in sRGB.
Two things are redrawn on the way out, both checked by the smoke test. Transparency is flattened onto white, because JPEG has no alpha channel. And a colour space that is not RGB or grayscale — a CMYK JPEG from a print workflow, say — is converted to sRGB, because a CMYK JPEG displays wrong, or is refused outright, in much of what people upload to. Grayscale stays grayscale: understood everywhere, and a third of the bytes.
| Preset | Limit | Longest side |
|---|---|---|
| 2 MB | original | |
| Web | 1 MB | 1920 px |
| Messenger | 500 KB | 1920 px |
They are in the settings popover, each has its own Finder action, and Settings (⌘,) can pin
⌃⌘J to one of them instead of "whatever the window used last". The list lives in
Sources/ImageShrink/Preset.swift — the window, the CLI (--preset, --list-presets) and
the installer all read it, so adding one there adds its Finder action on the next install.
The window is a list, and every row answers the question you actually have: what will this
file weigh? Before you convert anything each row already reads 2,5 MB → ~1,9 MB · quality 78 %, or already under the limit, and the numbers re-estimate the moment you change the
limit. While it runs each row says what it is doing ("Searching for the largest quality that
fits 2 MB — pass 3 of 6"); when it finishes the header turns green and the footer offers
Undo, which puts the new files in the Trash and brings the originals back.
| Setting | Meaning |
|---|---|
| Maximum file size | The hard ceiling. Quality is searched for the best result that fits; if even low quality overshoots, the image is scaled down until it fits. |
| Longest side | Optional resolution cap, applied before compressing. Original keeps the full resolution. |
| Save to | Same folder as the original, a Converted subfolder, or a folder you choose. |
| Move originals to Trash | Off by default. Originals go to the Trash (recoverable), never deleted outright. |
| Suffix | Left empty, every output is named after its own finished size, rounded up to 100KB / 500KB / 1MB / 2MB / 3MB / 5MB / 10MB — a 1.7 MB result becomes photo-2MB.jpg. Type something to use that instead. |
| Skip files already under the limit | A JPEG that already fits is left untouched instead of being re-encoded (re-encoding always loses quality). |
| Keep original dates | Copies created/modified timestamps, so photos keep sorting correctly. |
| Remove metadata | Drops EXIF and GPS. Orientation is always kept, otherwise the picture would display rotated. |
Settings are remembered between runs, so the window opens pre-filled with what you used last.
It will not hand you a bigger file than you gave it. HEIC stores the same photo in about half the bytes of a JPEG, so re-encoding a 1.2 MB HEIC at high quality sails under a 2 MB limit while ending up at 2 MB — bigger than the original, which is the opposite of the point. When the original already fits, the target becomes the original's own size, with a quality floor of 60 so the picture does not get wrecked chasing the last few kilobytes. A real 1.2 MB iPhone HEIC converts to a 1.2 MB JPEG at quality 61 instead of a 2 MB one at quality 84.
Files are converted in parallel, one per core.
./scripts/fetch-sparkle.sh # once: Sparkle into vendor/, pinned by version and checksum
./scripts/build.sh # build build/Image Shrink.app
./scripts/smoke-test.sh # generate test photos, convert, assert the results
./scripts/install.sh # build + install app and Quick Actions
./scripts/uninstall.sh # remove both, and the saved settings
./scripts/release.sh --publish # build, notarise, tag, publish, update the Homebrew cask
./scripts/release.sh # the same build, published by hand
./scripts/update-cask.sh # point the cask at a release published some other way
./scripts/design-probe.sh # render the window to PNGs, dark and light
The app compiles with or without Sparkle — #if canImport(Sparkle) — so a fresh checkout
builds and runs before you fetch anything; without it, Check for Updates… opens the releases
page instead of updating in place.
IMAGESHRINK_ARCHS="arm64 x86_64" ./scripts/build.sh produces the universal binary;
release.sh does that, notarises, staples and wraps it in a DMG — see
docs/distribution.md. The landing page is site/, published to GitHub
Pages by .github/workflows/pages.yml.
The app writes a short trail to ~/Library/Logs/ImageShrink.log — that is the first place to
look if the Quick Action seems to do nothing.
Converted files land next to the originals, keeping the original name plus the size they ended up at:
IMG_73221.jpg 2,4 MB → IMG_73221-2MB.jpg 2,0 MB
IMG_7323.jpg 2,5 MB → IMG_7323-jpg-2MB.jpg 1,7 MB
IMG_7323.HEIC 1,2 MB → IMG_7323-heic-2MB.jpg 1,2 MB
IMG_7322.HEIC 1,2 MB → IMG_7322-2MB.jpg 1,2 MB
IMG_7323.jpg and IMG_7323.HEIC share a base name, so both carry their source format —
decided from the whole batch before anything is written, so the same selection always
produces the same names. Originals are never overwritten unless you ask for it in
Move originals to Trash, which keeps the plain name instead.
Resources/Info.plist (CFBundleName, CFBundleDisplayName), in
scripts/*.sh (bundle folder and Quick Action titles) and in the window title in
AppDelegate.swift. Avoid parentheses in a Quick Action title — defaults cannot parse a
preference key containing them, which is why the instant one is “Convert to JPEG Now”.tools/make-icon.swift draws it in code; change the two gradient colours or the
glyph and rebuild. To use artwork instead, drop a .icns at
Resources/AppIcon.icns and have scripts/build.sh copy it rather than run the generator.dev.shykov.imageshrink is referenced by both Quick Actions and by the
preference keys; change it in all of them together or the menu entries stop working.Drag the app to the Trash — or, to take the Finder entries away and keep the app, use Remove Finder Actions… in its menu. From a checkout:
./scripts/uninstall.sh
It removes the app, every Quick Action this project ever installed (whatever it was called at
the time), their entries in the services preferences, and the saved settings. install.sh
runs the same cleanup first, so reinstalling never leaves stale menu items behind.
Made by UA 🇺🇦 · MIT