Homebrew compares installed formulae and casks with the versions available in its current package metadata. Checking the outdated list before running upgrades shows which command-line tools or apps need attention without changing installed versions.
The default report covers packages that Homebrew would normally consider for an upgrade. --verbose keeps installed and available versions visible, while --formula and --cask separate command-line formulae from app-style casks.
Casks can need a second pass because some declare version :latest or update themselves outside Homebrew. Pinned packages also deserve a separate check before upgrade planning because Homebrew skips pinned items during normal upgrades.
Related: How to upgrade Homebrew packages
Steps to check for outdated Homebrew packages:
- Refresh Homebrew metadata when the available-version list may be stale.
$ brew update Already up-to-date.
brew update fetches Homebrew and tap metadata. It does not upgrade installed formulae or casks by itself.
- List outdated packages with version details.
$ brew outdated --verbose
No output means Homebrew did not find outdated packages in the default formula and cask set.
- Check only formulae when the upgrade plan should exclude casks.
$ brew outdated --formula --verbose
No output means the installed formulae are current according to the available metadata.
- Check casks that are skipped by the default outdated report.
$ brew outdated --cask --greedy --verbose iterm2 (3.4.16) != 3.6.11 vlc (3.0.17.3) != 3.0.23 zoom (5.14.6.17822) != 7.1.0.83064
--greedy includes casks with version :latest and auto_updates true metadata that Homebrew normally leaves out of the default cask check.
- Print the cask report as JSON when another tool will read the result.
$ brew outdated --cask --greedy --json=v2 { "formulae": [], "casks": [ { "name": "iterm2", "installed_versions": [ "3.4.16" ], "current_version": "3.6.11", "pinned": false, "pinned_version": null } ] }Use --json=v2 so the output keeps separate formulae and casks arrays.
- List pinned packages before treating outdated items as upgradeable.
$ brew list --pinned
No output means no Homebrew packages are currently pinned. Pinned packages are intentionally skipped by normal upgrades.
Related: How to pin a Homebrew package
Mohd Shakir Zakaria is a cloud architect with deep roots in software development and open-source advocacy. Certified in AWS, Red Hat, VMware, ITIL, and Linux, he specializes in designing and managing robust cloud and on-premises infrastructures.