How to check for outdated Homebrew packages

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.

Steps to check for outdated Homebrew packages:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.