Repository navigation
feat: Archify 1.5 - #17
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
ldidthe 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.