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.