# Patchly > Patchly is a free, open-source macOS menu bar app that checks every installed application for updates across the Mac App Store, Homebrew, Sparkle feeds, and Electron manifests, shows a badge count in the menu bar, installs updates with one click after verifying them, and shows how often each app is used. macOS 26 (Tahoe), Apple Silicon only. MIT license. Website: https://pathcly.mberrishdev.me/ Source: https://github.com/mberrishdev/Patchly Author: Mikheil Berishvili (https://github.com/mberrishdev) Current version: 0.1.4 ## What it does - Scans `/Applications`, `/Applications/Utilities`, and `~/Applications` (one subfolder level deep) and reads each app's `Info.plist`. - Attributes each app to one Update Source, in this priority order: Mac App Store (has a `_MASReceipt`), Homebrew Cask (matches an installed cask), Electron (ships electron-builder's `app-update.yml`), Sparkle Feed (declares `SUFeedURL`), Custom App (a small hand-maintained registry; currently Visual Studio Code). Apps matching none are listed as "Unknown — No Source". - Checks each source: `mas outdated` for the App Store; one `brew info --cask --json=v2 --installed` call for Homebrew; the app's own appcast for Sparkle; GitHub Releases or `latest-mac[-arm64].yml` for Electron; VS Code's own update API for the custom entry. - Shows a Badge Count next to the menu bar icon: only apps in "Update Available" count. Failed or unknown checks never inflate it. - Optionally lists Homebrew formulae (CLI tools) in the same dropdown, discovered with `brew list --formula --versions`. - Search filters the list as you type. Clicking a row reveals the app in Finder. ## Usage view (new in 0.1.4) - The dropdown has two tabs, Updates and Usage. The Usage tab lists every scanned app with its Use Count (how many times it was opened), Last Used Date, and App Size (the bundle's size on disk). - Use Count and Last Used Date come from Spotlight metadata macOS already keeps (`kMDItemUseCount`, `kMDItemLastUsedDate`, the same "Last opened" date Finder shows). App Size comes from `kMDItemPhysicalSize`, or is measured from the bundle when Spotlight has none. - Patchly tracks nothing of its own, needs no Full Disk Access, and never reads other apps' data. - Sort orders: Most Used (Use Count, then most recent), Least Used (the reverse), Largest (App Size). A missing Use Count counts as zero; ties fall back to the name. - When macOS has no record, the row says "No usage recorded", never "Never opened": replacing an app's bundle (any update) clears the record. - The Usage view is read-only: it never changes update status, the badge count, or any app. Clicking a row reveals the app in Finder. Search filters it the same way as the Updates list. ## How it installs updates - Homebrew apps: runs `brew upgrade --cask `. Mac App Store apps: runs `mas upgrade `. CLI tools: `brew upgrade `. - Sparkle apps: downloads the enclosure, verifies its Ed25519 (EdDSA) signature against the `SUPublicEDKey` the installed app ships with (same scheme as Sparkle's own `SUSignatureVerifier`), quits the app, replaces the bundle, relaunches. - Electron apps: downloads the artifact from the manifest, verifies SHA-512, runs `codesign --verify --deep --strict`, checks the Team ID and bundle identifier match the installed app, then quits, replaces, relaunches. - If an app doesn't publish enough to verify (no signature, checksum, or public key), the button reads "Open to Update" and Patchly opens the app so its own updater runs. Electron and custom apps without a verifiable manifest always use this path. - If verification fails, the app is marked "Check Failed" and nothing is installed. Patchly never falls back to an unverified download. - Direct installs need macOS's App Management permission (System Settings → Privacy & Security → App Management); macOS prompts on the first attempt. - Multi-select: check several apps and click "Update Selected"; one confirmation, then updates run in parallel. ## Behavior - Cache-first: the dropdown shows the last results instantly on launch while a fresh Refresh runs in the background. - Auto-refresh every 6 hours by default (configurable: 1, 3, 6, 12, or 24 hours), and after the Mac wakes from sleep, but never more often than the configured interval. - Patchly updates itself through Sparkle, separately from the app checks. - No account, no analytics. The only network calls are the update checks themselves. Patchly never modifies another app's files except during a user-initiated Update. ## Install Homebrew: brew tap mberrishdev/patchly https://github.com/mberrishdev/Patchly brew trust --tap mberrishdev/patchly brew install --cask patchly DMG: https://github.com/mberrishdev/Patchly/releases/latest — drag to Applications. Patchly is ad-hoc signed (no Apple Developer ID yet); if macOS says it is damaged, run `xattr -cr /Applications/Patchly.app` once. The Homebrew cask does this automatically. From source: `git clone https://github.com/mberrishdev/Patchly.git`, open `Patchly.xcodeproj`, ⌘R. Swift 6, SwiftUI, single `MenuBarExtra` scene, one dependency (Sparkle, for self-update only). ## Requirements - macOS 26 (Tahoe) on Apple Silicon. No Intel build. - `mas` CLI for Mac App Store checks (Patchly offers `brew install mas` if it is missing). ## Docs - [README](https://github.com/mberrishdev/Patchly#readme): overview, install, architecture - [CONTEXT.md](https://github.com/mberrishdev/Patchly/blob/main/CONTEXT.md): the domain model — exact rules for how each Update Source is detected, checked, and installed - [Releases](https://github.com/mberrishdev/Patchly/releases): changelog and DMG downloads - [Homebrew cask](https://github.com/mberrishdev/Patchly/blob/main/Casks/patchly.rb) - [Issues](https://github.com/mberrishdev/Patchly/issues)