macOS 14+ · Universal binary · Your files never leave the Mac

The small file jobs,
done on your Mac.

A native macOS app collecting the utilities you keep needing — unlock a PDF, get HEIC out of your camera roll, squeeze a folder of screenshots, resize a batch for the web. Drop files in, get files out. Your files are never uploaded anywhere.

Latest release · Apple silicon & Intel

Free and MIT licensed · one extra step on first launch

Toolbox
An interactive recreation of the interface — pick a tool, then press the run button to watch a batch go through.

The toolbox

Four tools today. The registry takes more.

Every tool accepts multiple files at once — drag-and-drop or a file picker — processes them in parallel, and reports a result per file. One bad file never stops the batch.

Remove PDF Password

Saves a decrypted copy of a PDF you already know the password for. Text stays selectable and searchable.

  • Batch a whole folder with one shared password
  • Writes file-unlocked.pdf beside the original
  • Decrypts with your credential — it does not crack anything

Convert Image Format

HEIC ⇄ PNG ⇄ JPEG ⇄ TIFF, plus WebP where macOS can encode it. Reads RAW too.

  • Quality slider for the lossy formats
  • Optionally strip EXIF and location data
  • Reads DNG, CR2, NEF, ARW, ORF, RAF, AVIF, GIF, BMP

Compress Images

Lossless and format-preserving, or lossy with a quality slider when you want the bytes back.

  • Never returns a file bigger than the original
  • Per-file before → after sizes in the results list
  • Keeps the correct extension either way

Resize Images

Fit inside a box, clamp the longest side, scale by percentage, or force exact pixels.

  • Longest side handles portrait and landscape in one batch
  • Won't upscale unless you ask it to
  • EXIF rotation baked in, so nothing comes out sideways

Behaviour you can rely on

Boring in all the right places.

Most of the work in a file utility is what happens on the unhappy path. These are the guarantees the app is built around.

Your files stay put

All processing happens on-device — your PDFs and photos stay on the disk they were already on. The file-processing core has no networking in it at all; the only thing that talks to the network is the update check, and it asks first.

Originals are never touched

Results are written next to the input, or into a folder you pick, with a suffix like -unlocked, -compressed, -resized.

Nothing gets overwritten

A name collision becomes photo-1.png, photo-2.png, and so on. You can run the same batch twice without losing the first result.

Compression never inflates

Re-encoding a photo can honestly produce more bytes — HEIC is roughly twice as efficient as JPEG. When that happens the original bytes are copied instead.

Rotation handled

EXIF orientation is baked into the pixels on resize, so iPhone photos come out upright instead of sideways in whatever you paste them into.

Updates verify themselves

Updates are checked against an Ed25519 key baked into the app before anything installs, so the download host doesn't have to be trusted. Publishing one needs a private key that isn't on GitHub.

4tools in the sidebar
37tests over real PDFs and images
0files uploaded, ever
2architectures in one binary

Install

Three steps, then it's a normal app.

1

Download the DMG

Grab Toolbox-<version>.dmg from the latest release.

2

Drag to Applications

Open the disk image and drop Toolbox onto the Applications shortcut inside it.

3

Open it the first time

Right-click Toolbox in Applications → OpenOpen. Once per machine.

After that it keeps itself current: on first launch it asks whether to check for updates automatically, and you can change your mind later in Settings.

Why the right-click?

This build isn't notarized by Apple, so Gatekeeper won't let a plain double-click through on first launch. Right-click → Open is the standard way to approve it, and it's only needed once — after that it opens normally.

Notarization needs a paid Apple Developer account. The scripts in the repo support it (Scripts/notarize.sh), and the app stays free either way — notarization buys Gatekeeper trust, not a licence.

One honest trade-off in that default build: Library Validation only loads libraries whose Team ID matches the executable's, and an ad-hoc signature has no Team ID — so macOS would refuse to load the bundled updater framework. Ad-hoc builds therefore turn that check off, which also lets other unsigned libraries be injected into the process. Developer ID builds keep it on, because their Team IDs match.

Signing modeCommandWhat other people see
Ad-hoc default ./Scripts/build-app.sh Works, needs right-click → Open once
Developer ID ./Scripts/build-app.sh --sign auto Fewer warnings, still not fully trusted
Notarized --sign auto then ./Scripts/notarize.sh Normal double-click, no warnings

For developers

Clone it, test it, ship your own DMG.

Requires Xcode 16 or newer. One dependency — Sparkle, for updates — which SwiftPM fetches for you; the ToolboxKit processing core has none at all.

Terminal
// clone
git clone https://github.com/lazzyms/toolbox.git
cd toolbox

// run the test suite
swift test

// → dist/Toolbox.app (universal)
./Scripts/build-app.sh --version 1.0.0

// → dist/Toolbox-1.0.0.dmg
./Scripts/make-dmg.sh --version 1.0.0

// build, sign the feed, tag, release
./Scripts/release.sh --version 1.1.0
Project layout
Sources/ToolboxKit/  processing, no UI
  PDF/               PDFUnlocker
  Images/            ImageProcessor, ResizeSpec
  Support/           BatchRunner, OutputNaming
Sources/Toolbox/    SwiftUI app
  Utility.swift      the tool registry
  Components/        DropZone, FileList, ToolScaffold
  Features/          one view per tool
  Updates/           Sparkle wiring, Settings
Resources/          Info.plist, entitlements, icon
Scripts/            build-app, make-dmg, release
docs/               this site + appcast.xml
Tests/              37 tests

Adding a utility is three edits

Sources/Toolbox/Utility.swift is the only place that knows the tool list, and BatchRunner.run already handles concurrency, progress and per-file error isolation — a new tool usually needs no threading code of its own.


  1. Put the logic in ToolboxKit as a plain file-in / file-out function, so it's unit-testable without a running app.
  2. Add a SwiftUI view in Features/, wrapped in ToolScaffold — you get drag-and-drop, batching, progress and Finder reveal for free.
  3. Append a Utility entry to Utility.all and add its id to the switch in makeView().

Questions

The fine print, up front.

Can it open a PDF I've lost the password for?

No. It decrypts using the password you supply — it doesn't crack, guess or brute-force anything. If you don't know the password, this app can't help you.

Does anything get uploaded?

Your files, never. Every PDF and image is read and written on your own disk, and the ToolboxKit code that does that work has no networking in it at all — there's no account, no telemetry and no analytics. The one thing that does reach the network is the update check below, which asks before its first request and can be switched off.

How do updates work?

Through Sparkle, against a feed hosted on this site. On first launch the app asks whether to check automatically — nothing is requested before you answer. Say yes and it checks once a day; either way Toolbox → Check for Updates… works whenever you want it, and both behaviours are togglable in Settings.

Every download is verified against an Ed25519 public key baked into the app bundle before anything is installed, and the matching private key lives only in the maintainer's Keychain — so a compromised GitHub account on its own can't push code to installed copies.

Why isn't it sandboxed?

Under App Sandbox, picking photo.heic doesn't grant permission to create photo.png beside it — which would break the default “save next to the original” workflow. It runs under the Hardened Runtime instead, which keeps the code-integrity protections without restricting where results can be written. See Resources/Toolbox.entitlements.

My compressed file came out the same size. Bug?

Probably not. Some images genuinely can't be re-encoded smaller — an already-efficient HEIC, or a photo pushed into PNG. Rather than hand you a larger file, the app copies the original bytes through and keeps the right extension.

What happens if one file in a batch is broken?

That file fails and the rest continue. The results list tells you which one it was and why, so you can retry just that file.

Which macOS versions are supported?

macOS 14 Sonoma and later, on both Apple silicon and Intel. WebP encoding is only offered when the running system can actually write it — the option hides itself rather than failing at save time.

Can I request a tool?

Open an issue on GitHub. Small, local, file-in/file-out jobs are exactly what this is for. If you'd rather build it, CONTRIBUTING.md walks through the three edits a new tool needs.

Can I fork it, rebrand it and sell it?

Yes — all of that. Toolbox is under the MIT licence, so you can use it, modify it, ship it under your own name and charge money for it, commercially or otherwise. The only condition is that you keep the copyright and licence notice somewhere in your copy. No permission needed, and nothing to pay.

Two practical notes if you do: the app ships your own build, so you'll want to point SUFeedURL and the Ed25519 key in Resources/Info.plist at your own update feed rather than this one, and Sparkle — the only dependency — is MIT licensed too, so it comes along on the same terms.

Stop hunting for a website to do it.

Keep it in the dock instead.