Skip to content

feat: Archify 1.5 - #17

Merged
Oct4Pie merged 8 commits into
mainfrom
release/1.5.0
Oct 9, 2026
Merged

Oct4Pie merged 8 commits into
mainfrom
release/1.5.0

Conversation

@Oct4Pie

@Oct4Pie Oct4Pie commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Archify 1.5 is a security and reliability release. The privileged helper changed the most. It used to accept general file operations on any path. Now it can do only two things: optimize an app in /Applications, or remove a language folder inside one. Every request needs administrator approval, and the helper checks it again before each change. Only Archify signed by the same team can connect: on macOS 13+ this is enforced with a code-signing requirement on the XPC connection, and on macOS 12 the helper checks the caller's audit token. Paths are resolved without following symbolic links, a removal never crosses into another volume, and the helper exits when it is idle. It prepares changes in a folder only root can modify, reads app files through descriptors that never follow links, and opens only regular files, so another program cannot redirect or stall what it does. On macOS 13+ it is installed with SMAppService, and a 1.4 helper is replaced automatically with no restart or logout.

Optimization is now transactional. Archify prepares the new binaries outside the app, swaps them in atomically, checks the whole app's signature, and rolls back if anything fails. Files that an app's signature seals are left alone, so optimized apps stay signed and notarized. Thinned binaries are stored with macOS transparent compression, and sizes are reported as space on disk. Before changing an app, Archify detects whether it is open. Long operations can be paused, resumed or canceled. Optimize App never overwrites an existing app: it copies into a private folder and moves the copy into place only if nothing appeared there meanwhile, and it refuses destinations that other users can change.

Full Disk Access is no longer required at launch. Archify asks for it only when macOS actually blocks a change to a protected app, and links straight to the setting. This fixes the repeated prompts in #15. The interface has been redesigned, including the Languages screen. Architecture detection is more accurate (#12). On macOS 13+ the helper appears under Archify's name in Login Items (#13). Updates now come through Sparkle with a signed feed (#14), so 1.4 users need to install 1.5 by hand once.

The Python CLI got the same transactional thinning and compression. It refuses to run as root, which it never needs, and checks its output folder before writing anything. The bundled LDID source is removed; LDID signing now uses an ldid the user installs, for example with Homebrew. CI runs the Swift and Python tests on Apple Silicon and Intel, plus Xcode Analyze. The README and CHANGELOG now describe 1.5.

Closes #12, closes #13, closes #14, closes #15.

Oct4Pie and others added 8 commits October 8, 2026 01:44
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Thinning wrote plain binaries, so apps that macOS stores compressed could
take more disk space after optimizing than before. Thinned binaries are now
written with macOS transparent compression (LZFSE) and verified to read back
unchanged; the app and CLI report sizes and savings as space on disk.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The helper now stages thinned binaries in a root-only directory instead of
beside the app in /Applications, where any administrator's processes could
rename the staging folder and redirect root writes. The staging directory
and every directory above it must be changeable only by root, including
through ACLs, and the app must really live at the path that was checked.

Binaries are read through descriptors opened without following links, and
lipo runs on a private clone, so swapping a folder inside an app can no
longer make the helper read, or copy ownership from, a file outside it.
Language removal verifies each opened folder is the one it examined.

Compression skips files with other hard links or an existing resource fork
and never replaces attributes it did not create. The command-line tool
records each backup before installing a replacement, so a failed install
and restore keeps the original. CI actions are pinned to commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e helper

Copies are made in a private folder inside a destination that no other
user can change, and moved into place with an exclusive rename, so a
destination that appears mid-copy is never merged into or deleted.
Replace trashes the old copy only through that checked folder.

The helper and the Mach-O reader open files without blocking and accept
only regular files. A language folder that is only partly removed is
reported as such. The command-line tool refuses to run as root, checks
its output folder before writing anything, and never writes its log
through a link. Release scripts no longer use fixed paths in /tmp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Oct4Pie
Oct4Pie merged commit 7f3ba77 into main Oct 9, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant