brew bundle support, brew version-install, new -full formula handling and installer updates.
Major changes and deprecations since 5.0.0:
brew bundle manages Rust Cargo packages from Brewfiles, uv tools and Flatpak remotes or apps.brew bundle fetches downloads in parallel before install, auto-taps formulae and casks from external taps, uses mas get for better fresh Apple ID handling, sets HOMEBREW_INSIDE_BUNDLE and adds --no-secrets for safer environment inspection.brew version-install creates, extracts and installs older formula versions in one step.Homebrew.pkg installer URL and uses Portable Ruby 4.0.1 with Ruby 4.0.ffmpeg-full, imagemagick-full, automatic linking for versioned or -full keg-only formulae when the unversioned sibling is absent and stricter rejection of dependencies on *-full formulae.Formula#needs and needs :openmp, option :cxx11 and option :universal and other APIs scheduled for the normal release-cycle removals.Upcoming changes:
glibc 2.39 and libstdc++ 6.0.33.master to main migration introduced in 4.6.0; some repositories stop updating master in 5.1.0 and the remaining compatibility branches are scheduled for removal in 5.2.0 in favour of main.Homebrew’s other changes since 5.0.0 worth highlighting are the following:
brew services supports nice priorities for services.brew services sets ThrottleInterval for LaunchAgents and LaunchDaemons on macOS.brew sh --ruby opens a shell with Homebrew’s bundled Ruby and Bundler preconfigured.brew shellenv uses simpler shell detection and is easier to override when auto-detection is wrong.brew lgtm is recommended in the PR template before submitting changes and brew lgtm --online covers checks that need network access.brew --taps prints Homebrew’s taps directory.brew source jumps straight to a formula’s source repository.brew tap-info exits with a failure status for unknown taps, which makes scripting more reliable.brew edit auto-taps Homebrew/core or Homebrew/cask when API-known formulae or casks are edited on tapless installs.brew config on macOS reports the detected Metal toolchain version.brew info marks installed and uninstalled formulae or casks more clearly.brew search labels deprecated and disabled formulae and casks directly in search results.brew outdated respects HOMEBREW_UPGRADE_GREEDY_CASKS.brew doctor warns early when Linux glibc is older than the upcoming CI baseline.brew uninstall refuses to uninstall casks that other installed casks depend on and keeps going when one requested formula or cask fails.brew upgrade and brew reinstall keep working through individual name-resolution failures instead of stopping early.CLAUDE.md guide alongside AGENTS.md.cache-homebrew-prefix for prefix caching in CI..setup-ruby for Ruby setup through Homebrew in CI.WSL_DISTRO_NAME, which keeps CLI tools launched from WSL behaving correctly.homebrew- prefix.livecheck blocks.x86_64 when Homebrew requires it.HOMEBREW_CURLRC paths through brew update.linuxbrew repository, removes the remaining automatic migration logic for old linuxbrew-core formulae and removes more obsolete linuxbrew-core migration entries.HOMEBREW_ARTIFACT_DOMAIN mirrors and uses the correct mirror links when building brew mirror URLs../bin/brew so local checks match CI more closely.appcast uninstall or upgrade again and filters broken Caskroom metadata out of installed-cask listings.brew doctor uses clearer wording about when to report issues from Tier 2 configurations.:cobra format and a built-in :typer format.revision and compatibility_version changes more strictly, which helps catch ABI mistakes earlier.std_npm_args disables package scripts by default, reducing exposure to malicious npm install hooks.HOMEBREW_DOCKER_REGISTRY_BASIC_AUTH_TOKEN=none.Finally:
Homebrew thanks all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>Major changes and deprecations since 4.6.0:
HOMEBREW_DOWNLOAD_CONCURRENCY=auto is set by default.
This enables parallel downloads by default for all users.
It can be disabled by setting HOMEBREW_DOWNLOAD_CONCURRENCY=1.
Concurrent downloads now have progress reporting.
We expect there may be a long-tail of issues, please report them!HOMEBREW_USE_INTERNAL_API allows opt-in to the new, smaller internal Homebrew JSON API.
This will become the default behaviour in a later version of Homebrew.
Please consider opting-in now and reporting any issues you encounter.--no-quarantine and --quarantine flags have been deprecated as Homebrew does not wish to easily provide circumvention to macOS security features.Other changes since 4.6.0 I’d like to highlight are the following:
brew bundle supports installing go packages in Brewfile.
brew bundle --no-go and HOMEBREW_BUNDLE_DUMP_NO_GO will opt-out of this behaviour.brew bundle defaults the global Brewfile location to the user configuration directory.brew bump-*-pr will automatically tap core taps if needed.brew doctor skips the disclaimer when --quiet is passed.brew doctor warns on a pkg-config macOS SDK version mismatch.brew mcp-server provides more development commands.brew search --alpine searches Alpine Linux packages.brew services supports keep_alive systemctl services with Restart=on-failure.brew info --sizes shows the sizes of each formula and cask.brew audit will do online checks for Codeberg repositories.brew lgtm runs multiple style checks in one command.brew release now runs the release workflow and uploads artifacts. This means Homebrew/brew now uses immutable releases.brew style --changed checks style on all changed files in a repository or tap.Homebrew/homebrew-test-bot,
Homebrew/homebrew-portable-ruby
and Homebrew/command-not-found
were imported into Homebrew/brew. This means
all Homebrew external commands have now been moved into primary repositories (Homebrew/brew, Homebrew/homebrew-core or Homebrew/homebrew-cask)./usr/local prefix replacement is more selective to increase the number of relocatable bottles.launchctl service removal sudo failures are non-fatal.CGO_ENABLED is enabled by default on ARM64 Linux.pkgconf will be reinstalled automatically on a macOS version mismatch.rubydoc.brew.sh has been redirected to docs.brew.sh/rubydoc.head Git URLs always require a branch name.HOMEBREW_FORBIDDEN_CASK_ARTIFACTS allows selectively blocking cask install methods.HOMEBREW_DEVELOPER is required when installing formulae from paths.compatibility_version DSL will help us reduce the number of upgrades needed in future.no_linkage DSL will help stricter linkage detection and avoid issues.libstdc++ (instead of gcc) is used for automatically determining if a brewed gcc dependency is needed.clang over gcc on macOS.-O2 with gcc.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>HOMEBREW_DOWNLOAD_CONCURRENCY, preliminary macOS 26 (Tahoe) support and a built-in brew mcp-server.
Major changes and deprecations since 4.5.0:
HOMEBREW_DOWNLOAD_CONCURRENCY is a new environment variable that allows opt-in to Homebrew’s new download concurrency support.
We recommend using HOMEBREW_DOWNLOAD_CONCURRENCY=auto as a starting point.
This will become the default behaviour in a later version of Homebrew (with an opt-out).brew mcp-server is an MCP server for Homebrew and is available in Homebrew by default.Other changes since 4.5.0 I’d like to highlight are the following:
main as their default branch..pkg and official/shell installers will now add Homebrew to the default PATH if possible.HOMEBREW_FORBID_CASKS is a new environment variable that forbids all casks.HOMEBREW_VERIFY_ATTESTATIONS must be explicitly set again, even for HOMEBREW_DEVELOPERs.brew no longer copies across zeroed environment-variable values.brew resets the sudo timestamp later so it’s not done by e.g. brew --prefix or brew shellenv but remains done by e.g. brew install.brew --debug output is a bit quieter by default.brew bundle no longer uses the brew tap --force-auto-update option as it was removed.brew bundle better handles cask renames for brew bundle and brew bundle dump.brew bundle refers to “formulae” rather than “brews” for consistency with other parts of Homebrew.brew bundle add will create a Brewfile if it doesn’t exist.brew cleanup doesn’t warn when loading a renamed cask.brew install outputs a better error message when there are tap conflicts.brew install --ask will also prompt before installing casks.brew uninstall won’t suggest deleting configuration files that belong to other formulae.brew update displays descriptions for new formulae and casks.brew update will migrate taps from master to main when necessary.brew pin returns a non-zero exit code if pinning formulae that are not installed.brew sh and brew bundle sh use more of the user’s configuration but provide a custom prompt.brew audit ensures that official formula and cask names don’t conflict.brew deps outputs a warning when runtime dependencies are not used (so results may be inconsistent or confusing).env_script_all_files in formulae won’t overwrite existing files.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>brew bundle/services, preliminary Linux support for casks, official Support Tiers, Tier 2 ARM64 Linux support, Ruby 3.4 and several deprecations.
Major changes and deprecations since 4.4.0:
brew bundle and brew servicesbrew bundle and Brewfile
has been hugely improved.
It also documents the many new brew bundle features and changes in this release.brew bundle
and
brew services
are built-in commands instead of being provided by an external tap.brew bundle (exec|env|sh) no longer filter the user’s environment (like other brew commands do)brew services supports passing multiple formulaeBrewfiles have a version_file: DSL that allows brew bundle to write to e.g. a .ruby-version file based on the installed versionbrew bundle no longer includes ${HOMEBREW_PREFIX}/bin in the $PATH by default.
You can do this in your Brewfile with ENV["PATH"] = "#{HOMEBREW_PREFIX}/bin:#{ENV["PATH"]}".brew bump-cask-pr allows bumping multi-platform casks on Linuxbrew doctor links to Support Tiersbrew doctor checks for OpenCore Legacy Patcherbrew much faster.Other changes since 4.4.0 I’d like to highlight are the following:
brew install --ask and HOMEBREW_ASK allow viewing the packages, dependencies and sizes in a prompt before installationbrew install --skip-link allows installation without running brew linkbrew update-if-needed provides a much faster possible replacement for brew update that does nothing if no auto-update is requiredbrew install --as-dependency allows installation of formulae as dependencies rather than “on request”brew allows being run by root in podman containersHOMEBREW_TEMP defaults to /var/tmp on Linux, assuming it exists, is readable and is writablebrew install --cask produces fewer GitHub Actions warningsbrew pyenv-sync creates major version symlinks to fix pyenv support.pkg installer will upgrade existing installationsHOMEBREW_UPGRADE_GREEDY_CASKS allows specifying a list of casks that should always be upgraded with --greedypwsh)
or
clap
completions.@@HOMEBREW_PREFIX@@ can be replaced with the value of HOMEBREW_PREFIX in external patchesbrew alias and brew unalias commands are part of Homebrew/brew rather than an external tapbrew edit and brew bundle edit look for VSCode variants, e.g. Cursorbrew bump* can bump synced formulae togetherbrew *env-sync has a HOMEBREW_ENV_SYNC_STRICT mode for stricter version handlingdeprecate!/disable! support specifying replacement software
and
can specify replacement typebrew bump-* only warns, rather than errors, on duplicate PRs for non-official tapsbrew verify allows verifying package attributionsbrew audit flags pkg-config dependencies in core tap.
We have fully moved to using pkgconf in Homebrew/homebrew-core instead.jq instead of Homebrew’sbrew config prints the current Homebrew/brew branchINSTALL_RECEIPT.json include the bottle_rebuild in runtime_dependencieslockf where availablebrew tests on macOS 13.
It was too slow and we’re dropping macOS 13 support later this year.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>As part of this change, we will be rotating our @BrewTestBot’s key.
This rotation should not affect most users, but you may notice
it if you currently manually verify git commits from
Homebrew/brew, Homebrew/homebrew-core, or similar.
Once all repositories have been transitioned, we will revoke the old PGP key to prevent unintended future use:
3C76C3F1E573FA9E82D7D104050B0F0FThe new SSH signing key has the following public half:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0QzQJ6gl6Yxru0QrSaDRNatiHajcKxDu9lxQrFl8Nw
Users can also discover this signing key programmatically through GitHub’s REST API:
$ gh api /users/BrewTestBot/ssh_signing_keys
[
{
"id": 475371,
"key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0QzQJ6gl6Yxru0QrSaDRNatiHajcKxDu9lxQrFl8Nw",
"title": "BREWTESTBOT_SSH_SIGNING_KEY",
"created_at": "2025-02-03T17:50:27.377+01:00"
}
]
We understand that the community will, rightly, have questions. You’ll find some answers below. This relationship is mutually beneficial: Workbrew employees work on Homebrew during working hours, and Workbrew sponsors Homebrew on GitHub Sponsors. Workbrew’s founders care deeply about the success and independence of Homebrew.
Homebrew itself is and will always remain open source and free (as in speech and beer 🍺).
Homebrew is an open source project and part of the non-profit Open Source Collective run by unpaid volunteers (bar a small $300/month stipend for opted-in active maintainers).
Workbrew is a product (with paid tiers) and company run by founders and employees.
At the time of writing, some of Homebrew and Workbrew’s leadership overlap (@MikeMcQuaid, @mozzadrella) and Workbrew employs some Homebrew maintainers (@Bo98, @carlocab).
No. Homebrew has an independent governance structure that can only be changed through a supermajority of votes cast. Homebrew’s Project Leadership Committee (PLC) restricts any employer (including Workbrew) from holding more than 2 seats on the PLC.
Additionally, on the code side, Homebrew is BSD-2 licensed with no CLA and >10,000 contributors.
In practice, this means that neither Homebrew or Workbrew could relicense Homebrew without >10,000 people agreeing to it (or their code being rewritten) which is essentially impossible.
No. Only Homebrew could decide to do this and we have no plans to do so. Workbrew includes Homebrew and charges money for certain Workbrew plans - as permitted by Homebrew’s license - but cannot ever make Homebrew not open source.
Yes. Workbrew kept Homebrew’s leadership, maintainers and membership in the loop from early in the company’s conception. We’re very grateful for this transparency.
]]>INSTALL_RECEIPT.json files for casks, macOS Monterey (12) deprecation and various other deprecations.
Major changes and deprecations since 4.3.0:
INSTALL_RECEIPT.json files).url do blocks are deprecated for casks.brew tab is a new command for editing tab information.Other changes since 4.3.0 I’d like to highlight are the following:
brew upgrade --cask --quiet is quieter.brew outdated assumes the --greedy flag was passed when HOMEBREW_UPGRADE_GREEDY is set.brew install --cask --adopt only cares if the cask doesn’t auto-update.brew search --desc and brew desc --search use the JSON API’s data for description searches.brew autoremove does not remove formulae that were built from source.node shebangs on installation (mirroring python and perl).brew install will prioritise homebrew-cask casks over non-Homebrew organisation formulae.brew info will show size information for bottles.brew list has new --poured-from-bottle and --built-from-source flags.brew shellenv will set XDG_DATA_DIRS on Linux.brew typecheck supports using Sorbet for typechecking in taps.HOMEBREW_NO_BUILD_ERROR_ISSUES is a new environment variable that prevents Homebrew from searching for relevant GitHub issues on a build error.brew search allows searching with @ and + characters.homebrew/brew:master Docker image was added.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>You can read Trail of Bits’ blog post on the audit here and find the full public report here.
Homebrew’s maintainers and Project Leadership Commitee would like to thank Open Technology Fund and Trail of Bits for sponsoring and running this engagement. Our partnership directly improves the security of Homebrew and open source software in general.
Scope: Homebrew/brew, Homebrew/actions, Homebrew/formulae.brew.sh, Homebrew/homebrew-test-bot.
Findings by severity:
Mitigation & acknowledgement:
Since 2019, Homebrew’s maintainers meet annually for the “Annual General Meeting” in Brussels, Belgium. At AGM’s inception, Brussels was deemed a convenient location for the predominantly European team to coincide with the free FOSDEM conference. Since then, the global distribution of the core team has expanded.
At the same time, maintenance issues related to performance (the not-so-glamorous tasks of running a mature project that the whole world relies upon) and the remaining pieces of the Trail of Bits Security Audit needed to be completed.
The Project Leadership Team decided to undertake an experiment: our first North American in-person event, thematically focused and with an application process.

Of the 16 applications, 12 participants were accepted.
On the first day of the three-day event, Project Leader Mike McQuaid gave a presentation about how to triage and measure the highest-impact performance-related issues:

From there, participants tackled high-priority issues, raising pull requests in the dedicated Slack channel to ensure speedy reviews.
Participants worked synchronously and co-located over three days, with standup around 9:30am and departing at 5:00pm. Dinners were optional but provided opportunities for additional discussion:

Participants made significant progress in the following areas:
In addition to the direct impact participants had by shipping code, there’s some evidence that this in-person gathering may have increased the capacity of maintainers in areas of security and performance, which will ultimately benefit the project in the future:
1 = least likely, 5 = most likely


While the event seemed successful to us as organizers, we also wanted to hear from the participants themselves as part of our evaluation.
Overall, the hackathon received positive feedback:
Participants themselves assessed the event as successful:
1 = least successful, 5 = most successful

One of the unexpected effects of the rapid progress was a flurry of notifications for the maintainers who were not attending the event:

Apologies, Eric.
In their own words, participants identified key benefits:
What in particular made the Hackathon successful or not successful?
As an experiment, we were keen to hear how we might improve the structure to be more effective. Attendees had feedback in the following areas:
Overall, the event not only addressed critical technical challenges but also strengthened the bonds within the Homebrew community, setting a positive precedent for future collaborative efforts.
]]>Major changes and deprecations since 4.2.0:
brew bottle will include a basic SPDX file inside the bottle
and a more comprehensive one after installation.
This is to provide support for the widely used SBOM format from Homebrew.
If HOMEBREW_VERIFY_ATTESTATIONS is set, brew install will verify the bottle artifact’s attestation when pouring bottles using GitHub’s gh CLI.
This functionality is still in beta. We expect to remove the need for the gh tool and improve performance before we make this the default behaviour.
This behaviour demonstrates Homebrew’s ongoing commitment to improving our security posture.
Read more in the tracking issue or in the GitHub artifact attestation announcement
HOMEBREW_AUTOREMOVE is the default behaviour meaning that brew cleanup and brew uninstall automatically run brew autoremove.
Disable this by setting HOMEBREW_NO_AUTOREMOVE.
This is to improve the default behaviour of brew uninstall given brew autoremove is sufficiently reliable.
Homebrew has two new types of analytics: “Brew Command Run” events and brew test-bot analytics.
The latter are not working or published yet but will be soon.
These are to help us improve the documentation and prioritisation of issues in Homebrew.
Homebrew/homebrew-cask requires code signing of all casks. Expect removal of casks that are not code signed from Homebrew/homebrew-cask in future. This is because code signing is required on Apple Silicon which is used by a growing majority of all Homebrew users.
Homebrew/homebrew-cask-versions migrated to Homebrew/homebrew-cask and is archived, following Homebrew/homebrew-cask-drivers. Migration for Homebrew/homebrew-cask-fonts will happen soon. This will make it easier to have a more consistent installation, discovery and maintenance experience for all official casks.
As-of Homebrew 4.3.1: Homebrew now provides Portable Ruby 3.3.1 and requires Ruby >=3.3.0.
Other changes since 4.2.0 I’d like to highlight are the following:
HOMEBREW_FORBIDDEN_CASKS, HOMEBREW_FORBIDDEN_FORMULAE and HOMEBREW_FORBIDDEN_TAPS are added to extend the functionality beyond the existing HOMEBREW_FORBIDDEN_LICENSES to prevent formulae/cask/tap installation.
Relatedly, HOMEBREW_ALLOWED_TAPS was added to restrict installation of and from specific taps.
GitHub Actions will display native warnings/error notices for deprecations/disables and warnings/errors.
There are now several more reasons why casks are deprecated or disabled.
Homebrew’s code documentation on rubydoc.brew.sh previously did not do a good job of differentiating public/private/internal (i.e. only public for Homebrew’s use) APIs. We explicitly mark non-private APIs, non-public APIs, warn about undocumented non-private APIs and APIs are private by default.
Homebrew’s code documentation on rubydoc.brew.sh
includes Sorbet data from .rbi files to provide more types.
brew command,
brew shellenv and brew setup-ruby are significantly faster.
brew upgrade --overwrite is a new flag similar to brew install --overwrite and brew link --overwrite to delete files that already exist in the prefix while linking.brew install --display-times also works with casks.HOMEBREW_GITHUB_API_TOKEN supports more types of GitHub tokens.brew desc --eval-all warning only applies to brew desc --search.brew tap no longer shows untapped taps with API support.brew upgrade no longer truncates some version numbers.HOMEBREW_TEMP is used more consistently for temporary filesbrew update outputs a message whenever it is autoupdating to make clear what is causing the delay. Also, brew update will attempt to update all taps, not just those on GitHub.brew install/upgrade/outdated will more intelligently auto-update when specifying formulae/casks from third-party taps.brew bump-formula and brew bump-cask-pr refuse to bump packages that Homebrew’s automation already handles.brew install --adopt is more permissive and quicker if the bundle versions match.brew uninstall and brew reinstall will skip cask quit/signal directives.brew info --json=v2 returns a Cask’s bundle versions in bundle_version and bundle_short_version keys.brew info and brew tap-info provide more consistent output indicating if a package or tap is installed.brew *-sync commands avoid overwriting existing user installations.brew *-sync commands will use their respective: *ENV_ROOT variables.brew config provides information about Homebrew/homebrew-core and Homebrew/homebrew-cask taps and JSON API files.brew list provides --installed-on-request and --installed-as-dependency to list formulae installed on request or as dependencies respectively.brew update-reset will reset to the stable tag when appropriate.brew bump* commands no longer allow forcing multiple PRs.brew bump* commands limit the number of open PRs to 15.brew bump will indicate if formulae should sync with others.brew audit will reject Internet Archive Wayback Machine URLs as these formulae are no longer active.brew audit will check the license(s) of the specific release rather than the default branch.brew update will attempt to parse a GitHub API token from repository URL to better handle private repositories.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>.env file configuration and macOS Sonoma support.
Major changes and deprecations since 4.1.0:
/usr/bin/ruby on macOS 🍻.brew upgrade foo upgraded everything on my system” problems.git and GitHub performance..env files.OS::Mac and MacOS usage in formulae on Linux is deprecated.
Please guard all uses in formulae with if OS.mac? or if OS.linux? as appropriate.brew audit --new-formula and --new-cask options are deprecated.
Please use brew audit --new instead.brew postgresql-upgrade-database is deprecated.
It is not longer needed now that we use versioned postgresql formulae.
Please use pg_upgrade directly instead.discontinued? in casks is deprecated.Other changes since 4.1.0 I’d like to highlight are the following:
.pkg installer is signed (by me!).brew list --full-names properly output Homebrew organisation names for casks.rc shell.curl or system certificates are too old.brew deps no longer passes options to formulae.brew desc has improved handling of--eval-all with formulae.brew install will upgrade already installed casks (to be consistent with formulae.)brew pin‘d formulae don’t cause as many warnings or errors.brew setup-ruby is a new command to just install Homebrew’s Ruby, if needed.brew edit will suggest tapping core repositories if untapped..pkg installer is a documented installation method.ENV.O3 again to allow passing -O3 compiler optimisations.brew install sets PIP_CACHE_DIR to cache more Python files when building bottles or from source.brew audit checks all relicensed HashiCorp formulae.sshpass has (finally?) been removed from the new formula deny list.service blocks now support multiple sockets.bootsnap is used more often, speeding up repeated brew invocations.XDG_CACHE_HOME is used correctly again for logs and Homebrew’s cache on Linux.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>Major changes and deprecations since 4.0.0:
brew downloads of formula/cask APIs use a signed API endpoint with client signature verification.HOMEBREW_NO_AUTO_UPDATE, HOMEBREW_NO_INSTALL_FROM_API or HOMEBREW_AUTO_UPDATE_SECS to work around bugs or annoyances: please consider unsetting these and tweaking the values based on the new behaviour. Under some circumstances, you may see a one-time message nudging you do to this.brew doctor warns if Homebrew/homebrew-core or Homebrew/homebrew-cask seem to be tapped unnecessarily so you can brew untap them to save time and disk space.HOMEBREW_NO_ANALYTICS because you didn’t like Google Analytics and/or data being sent to the US: please consider unsetting this allowing analytics data to be sent to our new InfluxDB host. Again, under some circumstances, you may see a one-time message nudging you do to this.HOMEBREW_NO_ENV_FILTERING no longer fails but is silently a no-op.brew rbenv-sync, brew nodenv-sync and brew pyenv-sync commands will automatically sync Homebrew-installed Ruby, NodeJS and Python versions with rbenv, nodenv and pyenv respectively to avoid needing to build these from source.brew command performance.brew fetching bottles is significantly faster.brew install with no post_install is significantly faster.Other changes since 4.0.0 I’d like to highlight are the following:
brew commands will only auto-update from the API for commands that auto-updated from Git pre-4.0.0.brew update reports new/deleted formulae/casks when installing from the API.brew update will automatically update Homebrew/homebrew-core and Homebrew/homebrew-cask local taps for users who have run developer commands.brew install build failures only recommend open issues rather than pull requests.brew install will use cached bottles if the request to check if bottles are up-to-date fails.brew install sets OPENSSL_NO_VENDOR to use Homebrew’s relevant openssl* formula rather than the vendored OpenSSL from the openssl crate.brew install --skip-post-install will skip post-installation steps when installing a formula.brew search no longer searches remotely instead using Homebrew’s new JSON API.brew cleanup --quiet omits outputting some warnings.brew deps --missing provides the inverse output to brew deps --installedbrew fetch, brew --cache, brew audit and brew readall has --os and --arch flags to simulate different operating systems and CPU architectures.brew shellenv accepts a shell name parameter for when auto-detection is unreliable.brew commands auto-update less frequently for users who have run Homebrew developer commands.brew audit verifies the correct signing of .pkg installers.brew bump and brew bump-formula-pr will update a local Homebrew/homebrew-core tap (if present) and brew bump and brew bump-cask-pr will do the same for Homebrew/homebrew-cask.HOMEBREW_NO_INSTALL_FROM_API is set automatically for commands that need it.cask_renames.json file in taps allows casks to be renamed./home/linuxbrew/.linuxbrew) works as expected on Fedora Silverblue and other configurations where /home is symlinked elsewhere.gh CLI (when available).texinfoRUSTFLAGS to the appropriate target CPU on installation.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>Major changes and deprecations since 3.6.0:
HOMEBREW_NO_AUTO_UPDATE, HOMEBREW_NO_INSTALL_FROM_API or HOMEBREW_AUTO_UPDATE_SECS to work around bugs or annoyances: please consider unsetting these and tweaking the values based on the new behaviour.brew untap homebrew/core and brew untap homebrew/cask to save some space.brew update will now be run automatically less often (every 24 hours rather than every 5 minutes) and these auto-updates will be much faster as they no longer need to perform the slow git fetch of the huge homebrew/core and homebrew/cask taps’ Git repositories.HOMEBREW_INSTALL_FROM_API variable has been removed and is a no-op.export HOMEBREW_NO_INSTALL_FROM_API=1. Please investigate HOMEBREW_API_AUTO_UPDATE_SECS first.HOMEBREW_API_DOMAIN can be set to use mirrors for formulae.brew.sh.HOMEBREW_NO_ANALYTICS because you didn’t like Google Analytics and/or data being sent to the USA: please consider unsetting this and setting HOMEBREW_NO_GOOGLE_ANALYTICS instead, allowing analytics data to be sent to our new InfluxDB host..pkg files are generated for each Homebrew release. You can help us test this beta feature by downloading the generated package artifact from the relevant GitHub Actions release events.homebrew/ubuntu16.04:master image has been deprecated.Other changes since 3.6.0 I’d like to highlight are the following:
brew test sets PYTHONDONTWRITEBYTECODE to improve performance.brew install --adopt allows taking ownership of existing installed cask artifacts.brew install --dry-run allows viewing what brew install will do before it is run.brew docs opens docs.brew.sh.--cask is never required on Linux.service do blocks allow defining a run command per platform.brew install uses the local cache while installing dependencies from pip.brew doctor no longer complains about BitDefender.brew install will also suggest casks rather than just formulae when it fails to find the requested package.brew readall simulates all architecture and OS configurations for better reliability.git partial clones with sparse checkouts are supported when downloading using git.brew doctor --quiet prints no output on success.brew gist-logs better detects missing permissions.brew update uses the GitHub API token if available to avoid hitting rate limits.brew fetch and brew install can automatically determine mirrors for glibc-bootstrap and PyPI resources.Finally:

Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>Since version 3.6.0 of Homebrew, we are now choosing to advertise the HOMEBREW_INSTALL_FROM_API environment variable to the general public. A lot of work was done by @Rylan12 to make the experience more stable and the API install method is bound to bring a big performance improvement to those who are willing to give it a try.
The goal of the HOMEBREW_INSTALL_FROM_API environment variable is to allow Homebrew users to install formulae and casks without needing to have Homebrew/homebrew-core and/or Homebrew/homebrew-cask tapped. This is intended to make brew update much faster and required less often and also to save space on the user’s machine.
Now that the variable is public, we’re going into a period of bug hunting. When its users stop finding problems and edge-cases for the API to handle, we will be making this the default for all users so everyone can enjoy a fast Homebrew experience.
Since July 18th the Intel-based CI runners are now ephemeral and the foundation has been laid for applying the same features to Apple Silicon based runners. While Homebrew users might not notice more than sleeping a little easier thanks to bottling runs being more reliable, I can tell you that the maintainers are very happy with this improvement and the accompanying dashboard.
Currently our runners persist indefinitely, which has some distinct downsides:
The goal was to replace all our persistent runners with ephemeral variants, starting with the Apple Silicon runners. Unfortunately we ran into some bugs in the Orka platform which MacStadium provides for us, so that initial goal had to be shifted to Intel runners first.
Work is ongoing to enable the Apple Silicon based runners as ephemeral runners to close this project from the macOS side. Once that is done the stretch goal for this project is to make our self-hosted Linux runners ephemeral too. Most of our Linux CI already uses ephemeral GitHub-hosted runners.
Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>--eval-all/HOMEBREW_EVAL_ALL and a migration to Ubuntu 22.04 as our CI platform.
Major changes and deprecations since 3.5.0:
--eval-all to be passed or HOMEBREW_EVAL_ALL to be set to improve security in cases where it may evaluate formulae or casks that have not been installed, may not be trusted and will execute arbitrary Ruby code.brew no longer respects HOMEBREW_NO_ENV_FILTERING. Environment variables needed in formulae or casks need to have a HOMEBREW_ prefix to be passed through and then reassigned e.g. ENV["FOO"] = ENV["HOMEBREW_FOO"].brew linkage detects deprecated linkage to libnsl.so.1. and disabled linkage to libcrypt.so.1..Other changes since 3.5.0 I’d like to highlight are the following:
HOMEBREW_INSTALL_FROM_API is an opt-in flag added in 3.3.0 to install formulae and casks in homebrew/core and homebrew/cask taps using Homebrew’s API instead of needing the (large, slow) local checkouts of these repositories. HOMEBREW_INSTALL_FROM_API has had many improvements since 3.5.0. We encourage you to try setting it and reporting any issues you experience.postgresql formula was renamed to postgresql@14 to avoid repeated breakage on major/minor version upgrades.HOMEBREW_CURL_PATH and HOMEBREW_GIT_PATH are documented and supported for setting the location of curl or git on Linux. On macOS, the system versions will still always be used instead.HOMEBREW_ARTIFACT_DOMAIN only takes effect on bottles and not e.g. casks.brew cleanup is run after installing all packages rather than after the first package is installed.brew install --debug-symbols is available to build and retain debug symbols on macOS. This does not yet work on Linux but we’ll review a pull request to add it.brew install automatically installs glibc or gcc if they are too old.brew cleanup and brew uninstall automatically run brew autoremove if HOMEBREW_AUTOREMOVE is set.brew fetch --retry uses an exponential backoff.brew deps returns failing exit code when circular dependencies are detected.brew info --json includes a variations key. This provides information about how a formula or cask varies on OSs and CPU architectures other than the one it is being run on. Various additional DSLs e.g. on_system and arch have been added to formulae or casks to facilitate this.Formula DSL is available to more easily generate completions.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>brew update behaviour and Homebrew (on macOS) requiring at least OS X El Capitan (10.11).
Major changes and deprecations since 3.4.0:
brew update now defaults to HOMEBREW_UPDATE_REPORT_ONLY_INSTALLED behaviour, showing only information on installed formulae, so HOMEBREW_UPDATE_REPORT_ALL_FORMULAE was added instead. This improves performance and usability of brew update.brew update lists “Outdated” rather than “Updated” formulae by default. It was already calculating which formulae were outdated and this information is more useful than showing which formulae were changed and is significantly faster than doing version comparisons.Other changes since 3.4.0 I’d like to highlight are the following:
brew tests --changed runs tests only on files that have been changed from master (including test files).brew tap --no-force-auto-update removes the --force-auto-update flag for taps.brew no longer filters the TERMINFO_DIRS environment variable.brew update --quiet makes brew update produce less output.brew uninstall, brew reinstall, etc. are no longer blocked by unreadable casks.brew upgrade only upgrades version :latest casks when --greedy or --greedy-latest are passed and the cask has been updated.brew cleanup shows the total disk space freed.HOMEBREW_DOCKER_REGISTRY_TOKEN and HOMEBREW_DOCKER_REGISTRY_BASIC_AUTH_TOKEN can be used for GitHub Packages authentication without HOMEBREW_ARTIFACT_DOMAIN.HOMEBREW_ARTIFACT_DOMAIN’s description in man brew has been clarified.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>Here’s an overview of the timescale:
HOMEBREW_NO_ENV_HINTS to hide configuration suggestions, brew services supported on systemd on Linux, brew install --overwrite and Homebrew beginning the process to leave the SFC.
Major changes and deprecations since 3.3.0:
brew will hint at configuration variables to tweak behaviour unless HOMEBREW_NO_ENV_HINTS is set.brew services is supported and recommended on Linux when using systemd.brew install --overwrite ensures the brew link after brew install is always run with --overwrite.Formula.each, Cask::Cask.each and other uses of Enumerable methods are deprecated because reading all formulae/casks on the system unnecessarily runs untrusted code.Other changes since 3.3.0 I’d like to highlight are the following:
HOMEBREW_DOCKER_REGISTRY_TOKEN_BASIC allows authenticating with a Docker register proxying GitHub Packages using a basic authentication token.brew cask produces a more helpful error message pointing to brew --cask.HOMEBREW_DOCKER_REGISTRY_TOKEN is used when installing Homebrew’s Portable Ruby.brew deps --graph and --dot output dependencies as a directed graph in text or DOT formats.brew bump --open-pr opens a pull request for a new version if there is none already open. This is used by Homebrew’s automation to automatically “bump” some outdated formulae.brew extract automatically removes bottle blocks.brew style --fix automatically fixes shellcheck failures.brew upgrade skips upgrading unbottled dependents of upgraded formulae.brew upgrade skips checking dependents of homebrew-core versioned formulae.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>HOMEBREW_INSTALL_FROM_API flag to avoid needing to have Homebrew/homebrew-core or Homebrew/homebrew-cask repositories tapped/cloned locally.
Major changes and deprecations since 3.2.0:
brew update will migrate all Linux users from linuxbrew-core to homebrew-core. This will also trigger the upgrade of some formulae installed from linuxbrew-core due to revision differences.HOMEBREW_INSTALL_FROM_API is a new opt-in flag to install formulae and casks in homebrew/core and homebrew/cask taps using Homebrew’s API instead of needing the (large, slow) local checkouts of these repositories.brew bump-formula-pr --write has been deprecated in favour of brew bump-formula-pr --write-only.Other changes since 3.2.0 I’d like to highlight are the following:
HOMEBREW_SSH_CONFIG_PATH sets the path a configuration file for using Git over SSH inside Homebrew.brew edit --print-path outputs the filename to be edited without opening an editor.brew developer makes it easier to enable/disable the Homebrew developer release channel.brew search does approximate matching of formula names.ca-certificates will be installed when necessary on macOS <= 10.15.5 to allow connecting to various HTTPS sites.brew bump --start-with retrieves a subset of results.brew search can search Arch Linux and Repology.HOMEBREW_ADDITIONAL_GOOGLE_ANALYTICS_ID can be used to report to an additional Google Analytics tracking ID.brew fetch --bottle-tag allows fetching a bottle for any specified tag (e.g. OS/architecture/macOS version).brew install and brew upgrade will fetch all formulae before attempting installation.brew install outputs all cask installations at the end (like formulae).brew will start the sandbox in a pseudoterminal (to avoid potential formula access to the parent terminal).brew style will check and fix more shell script style.brew tap --custom-remote allows changing the remote for an installed tap.brew typecheck can be run on Apple Silicon.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>brew install now upgrades outdated formulae by default and basic macOS 12 (Monterey) support.
Major changes and deprecations since 3.1.0:
brew install now upgrades outdated formulae by default (for idempotency). This can be disabled by setting HOMEBREW_NO_INSTALL_UPGRADE.brew has basic macOS 12 (Monterey) support.brew leaves has --installed-on-request and --installed-as-dependency flags to only list formula installed manually or as dependencies.Other changes since 3.1.0 I’d like to highlight are the following:
brew link --HEAD links the HEAD version of a formula.brew alias, brew autoupdate and brew command-not-found are official external command taps.brew tap will never create shallow clones (as shallow clones are not performant when repeatedly fetching as Homebrew does).brew fetch will no longer use shallow clones.brew install also outputs cask caveats as part of the final summary.brew has GCC 11 support.brew bottle will generate all: bottles which are used on all platforms.. A lot of work has gone into improving reproducible builds to make these possible. brew bottle on your local machine for an all: bottle should generate an identical checksum.brew doctor hides some warnings on Apple Silicon with Intel and ARM installations.brew bottle --bottle-arch allow bottles with custom architectures.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far.
]]>review-cask-pr GitHub Action used on the homebrew-cask and all homebrew-cask-* taps (non-default repositories) in the Homebrew organization and reported it on our HackerOne.
Whenever an affected cask tap received a pull request to change only the version of a cask, the review-cask-pr GitHub Action would automatically review and approve the pull request. The approval would then trigger the automerge GitHub Action which would merge the approved pull request. A proof-of-concept (PoC) pull request demonstrating the vulnerability was submitted with our permission. We subsequently reverted the PoC pull request, disabled and removed the automerge GitHub Action and disabled and removed the review-cask-pr GitHub Action from all vulnerable repositories.
The discovered vulnerability would allow an attacker to inject arbitrary code into a cask and have it be merged automatically. This is due to a flaw in the git_diff dependency of the review-cask-pr GitHub Action, which is used to parse a pull request’s diff for inspection. Due to this flaw, the parser can be spoofed into completely ignoring the offending lines, resulting in successfully approving a malicious pull request.
A single cask was compromised with a harmless change for the duration of the demonstration pull request until its reversal. No action is required by users due to this incident.
review-cask-pr GitHub Action has been disabled and removed from all repositories.automerge GitHub Action has been disabled and removed from all repositories (in favour of the GitHub built-in functionality that did not exist when this action was created).homebrew/cask* repositories.homebrew/cask* pull requests will require a manual review and approval by a maintainer.homebrew/cask maintainers and training
existing homebrew/core maintainers to help with homebrew/cask.We did, do and will continue to take the security of the project and our users very seriously. We try our best to behave as a for-profit company would do in terms of timely response to security issues.
In order to ensure and improve Homebrew’s security, please consider contributing your code and code reviews to our GitHub projects.
Thanks for using Homebrew!
]]>Major changes and deprecations since 3.0.0:
The undocumented HOMEBREW_NO_ENV_FILTERING flag is deprecated and will be removed.
HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK is removed (as its behaviour is now the default).brew bottle --only-json-tab has been added to allow future GitHub Packages bottles to store their tab outside the bottle to allow reproducible builds. This is why downloads from GitHub Packages also include a small manifest JSON download. This also allows future creation of all: SHA256 bottles for bottles shared across all platforms.Other changes since 3.0.0 I’d like to highlight are the following:
sed superenv shim is removed.brew update --quiet is a bit quieter.brew update outputs to stderr when not outputting to a TTY to ease stdout usage.brew update reports outdated formulae and suggests brew upgrade.installed_on_request is correctly set in the tab for dependencies again. This will improve usage of brew bundle dump after reinstalling packages.ruby warning level is now -W1 (to avoid hiding legitimate warnings.)brew cask pkg uninstallation is faster.brew --prefix <formula> is faster.brew --version is faster.brew list also uses ls for casks output (to be consistent with formulae).brew list visually separates formulae and casks.brew bump supports casks.service do is a new formula DSL to allow plists to be easily generated.codesign is needed when pouring bottles).codesign fails more error output is now printed.gem, rake and ruby superenv shims are provided to work around broken macOS rubys.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Particular thanks on Homebrew 3.1.0 go to GitHub for providing GitHub Packages and helping in our migration. Enjoy using Homebrew!
]]>Major changes and deprecations since 2.7.0:
/opt/homebrew. formulae.brew.sh formula pages indicate for which platforms bottles (binary packages) are provided and therefore whether they are supported by Homebrew. Homebrew doesn’t (yet) provide bottles for all packages on Apple Silicon that we do on Intel x86_64 but we welcome your help in doing so. Rosetta 2 on Apple Silicon still provides support for Intel x86_64 in /usr/local.brew bottle and bottle do blocks use a new syntax format (one :cellar per platform). brew style --fix will autocorrect formulae to this new format. This will allow more bottles to be relocatable.HOMEBREW_BOOTSNAP environment variable allows the use of the Bootsnap gem to speed up repeated brew calls. This does not work (yet) on Apple Silicon or using Homebrew’s portable Ruby.CLI::Parser DSL. This will ensure they are kept up-to-date.brew update better handles upstream branch renames (e.g. from master to main)brew completions is a new command to opt-in to completions provided by third-party tapsOther changes since 2.7.0 I’d like to highlight are the following:
brew audit reads more formula data from tapsbrew untap of an official tap you don’t use (e.g. Homebrew/homebrew-cask) will ensure it’s no longer automatically retappedbrew casks is a new command implemented in Bash to speedily output all casks available to install (like brew formulae)brew info --cask --json=v2 includes whether a cask is outdated and the currently installed versionsbrew update could be run every timebrew --prefix --installed is a new flag to brew --prefix that will fail if the requested formula is not installedFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Particular thanks on Homebrew 3.0.0 go to MacStadium and Apple for providing us with a lot of Apple Silicon hardware and Cassidy from Apple for helping us in many ways with this migration. Enjoy using Homebrew!
]]>Changes and deprecations since 2.6.0:
prefix DSL for bottles is deprecated. It was not actually used by the code.deprecate! and disable! in formulae with missing or non-ISO 8601 dates is deprecated.depends_on :java, :x11, :osxfuse, :tuntap are all deprecated in formulae and casks.brew update refuses to update shallow homebrew-core/cask clones (on request from GitHub).HOMEBREW_CLEANUP_PERIODIC_FULL_DAYS environment variable allows customisation of how often a full brew cleanup is run.--build-from-source.brew livecheck now supports casks.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew commands replacing all brew cask commands, the beginnings of macOS M1/Apple Silicon/ARM support and API deprecations.
Major changes and deprecations since 2.5.0:
depends_on :java, brew switch, brew diy and various other APIs have been deprecatedbrew cask commands have been deprecated in favour of brew commands (with --cask) when necessaryHomebrew.args is deprecatedRequirements are deprecated in Homebrew/core/opt/homebrew and forbid installing into /usr/local (to avoid clashing with the macOS Intel install and allow their usage side-by-side). We currently recommend running Homebrew using Intel emulation with Rosetta 2.brew tap-new will set up GitHub Actions workflows to upload to GitHub Releases. Read the blog post for more documentation.Other changes since 2.5.0 I’d like to highlight are the following:
brew doctor checks the active branch for all taps, not just Homebrew/homebrew-corebrew unbottled is a new developer command to identify formulae that haven’t had binary packages built yetbrew install ./ is now recommended for installing local file formulaebrew formulae commandbrew install --force-bottle refuses to ever build from sourcebrew install or brew link of a versioned keg-only formula will automatically unlink conflicted version formulaebrew shellenv is significantly fasterbrew linkage and commands using the linkage cache have significantly better performancebrew bump-cask-pr is a new developer command to create Homebrew/homebrew-cask pull requestsFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Homebrew/brew in this PR on 2020-09-15, and a companion PR to Homebrew/homebrew-test-bot added support for setting the base download URL of bottles to point to a specific release on GitHub.
First, go to GitHub and create an empty repository named with the homebrew- prefix, for example: USER/homebrew-tap.

Then locally run:
brew tap-new USER/REPOSITORY
changing USER/REPOSITORY to the full name of the repository that you just created on GitHub. You can omit the homebrew- prefix and specify the --branch flag if your default branch should be named differently than main.

Navigate to the newly created tap on disk by executing:
cd $(brew --repository USER/REPOSITORY)

Now you can list all files in this tap to see what is created by default.
Add the repository that you created on GitHub as the origin remote and push newly created files:
git remote add origin https://github.com/USER/REPOSITORY
git push --set-upstream origin main

I won’t go into too many details on how the workflows look, as they are subject to change at any time. For now, there are 2 workflow files created by default.
pull_request event, so every push to a PR’s branch triggers the workflow, which tests changes made to formulae, builds bottles for those formulae and uploads them to GitHub Actions as artifacts.It’s time we add a new formula to our tap; shall we?
All formulae should go in the Formula directory. Let’s suppose we want to create a formula for this little Go program named gothanks. Run locally:
brew create --tap=USER/REPOSITORY --go https://github.com/psampaz/gothanks/archive/v0.3.0.tar.gz


This command will create a new standard formula for Go projects in your tap and open the file in your editor of choice. After you close the editor, you can still edit the formula with:
brew edit USER/REPOSITORY/FORMULA
Our gothanks formula, after some editing could look like this:
class Gothanks < Formula
desc "Automatically star your go.mod Github dependencies"
homepage "https://github.com/psampaz/gothanks"
url "https://github.com/psampaz/gothanks/archive/v0.3.0.tar.gz"
sha256 "ce5440334b3eac2e058724faa4c6e4478ca1d81ea087e55ccca33f1996752aad"
license "MIT"
depends_on "go" => :build
def install
system "go", "build", *std_go_args
end
test do
ENV.delete "GITHUB_TOKEN"
assert_match "no Github token found", shell_output(bin/"gothanks", 255)
end
end
Now we can create a new branch, add the formula, commit it and push:
git checkout -b gothanks
git add Formula/gothanks.rb
git commit --message "gothanks 0.3.0 (new formula)"
git push --set-upstream origin gothanks

But to trigger the workflows, we need to create a pull request from our recently-pushed branch. I’m using the hub utility for this operation, but you can use the newer GitHub CLI tool gh or just click your way through in GitHub’s UI.

Wait until the pull request’s checks become green. Then label your pull request with the pr-pull label (this is the default label that will trigger the uploading workflow; you can easily change this in workflow file). A new brew pr-pull workflow will be fired up and after a couple of minutes you should observe the PR closed, bottles uploaded and commits pushed to the main branch of your repository.

With current tooling it’s now easier than ever to create your own Homebrew tap with bottles. Gone are the days when you had to create a Bintray account and fiddle around with custom CI configs. Now you can run a bunch of commands and get a tap up and running in minutes, with only a GitHub account!
]]>brew cask integration, license support and API deprecations.
Major changes and deprecations since 2.4.0:
brew cask commands have been replaced with brew commands and are deprecated. This continues our goal of better integration between brew and brew cask commands.brew typecheck provides the beginnings of Homebrew’s use of Sorbet for type-checking.brew livecheck has moved from its own tap to a Homebrew command and part of Homebrew/homebrew-core formulae.brew bump is a new command using brew livecheck and Repology to output outdated formulae in Homebrew/homebrew-core.Other changes since 2.4.0 I’d like to highlight are the following:
brew sh has a non-interactive mode.brew bump-revision accepts multiple formulae.brew cask --help output is supported for all brew cask commands.brew audit now has a --tap argument.brew tap-new makes use of Homebrew’s custom GitHub Actions (which are also used by Homebrew CI).brew audit is passing and mandatory for all changes on Homebrew/homebrew-core.brew update-python-resources is a new command that can be used to upgrade dependencies in Python formulae.brew tests retries failed tests by default.brew bundle runs brew update before if needed.brew audit checks were migrated to RuboCop checks for better performance and editor integration.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>devel versions and brew audit speedups.
Major changes and deprecations since 2.3.0:
devel versions in formulae have been deprecated.brew pull has been deprecated in favour of hub checkout.Other changes since 2.3.0 I’d like to highlight are the following:
brew audit is significantly faster.brew irb correctly uses TERMINFO to improve keyboard handling.man brew lists the full help for all official external commands (which now includes brew test-bot).Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew install from URLs.
Major changes and deprecations since 2.2.0:
brew tap-pin and brew tap-unpin have been removed along with the deprecation of some Homebrew and Formula methods.brew install from a URL has been deprecated to improve the security of brew install.brew install, brew upgrade and brew reinstall now fetch all resources before beginning installation or locking dependencies.latest for the latest stable release and master for the master branch.Other changes since 2.2.0 I’d like to highlight are the following:
brew style and brew readall are run on macOS and Linux for Homebrew/brew and Homebrew/homebrew-core to make retaining Linux compatibility easier and ease the eventual merging of homebrew-core and linuxbrew-core taps.ruby.brew cask info shows cask analytics data.brew doctor shows deleted formulae.brew uninstall notes all etc files will stay around.brew test runs pkill without exceptions to avoid manual cleanup in test do blocks.pkg-config correctly sets the SDKROOT to find more macOS-provided software.pkgetc method to install into etc/#{formula_name}.free_port test helper.curl requests retry 2 times by default.patch blocks can change directories to apply their patch.brew tap defaults to full clones. The existing shallow clone default would cause slower git fetches over time.HOMEBREW_BREW_GIT_REMOTE and HOMEBREW_CORE_GIT_REMOTE environment variables allow you to use custom Git mirrors to speed up brew update and brew tap.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Major changes and deprecations since 2.1.0:
brew upgrade no longer has an unsuccessful error code if the formula is up-to-date.brew upgrade’s post-install dependent checking is dramatically faster and more reliable.brew info outputs Linux analytics data.brew tap-pin is disabled. It was buggy and unused by Homebrew maintainers. Directly reference formulae (e.g. brew install user/tap/formula) or rename formulae in taps to avoid shadowing Homebrew/homebrew-core formulae instead.Other changes since 2.1.0 I’d like to highlight are the following:
brew bundle outputs Brewfile.lock.json files for debugging non-reproducibility.brew bundle allows skipping installations by setting environment variables.sudo brew services takes root ownership of files when running as root.--verbose command output no longer outputs (extremely) long $LOAD_PATH and Ruby paths.brew cat sets bat as pager if HOMEBREW_BAT is setbrew create has --rust and --python options.brew audit checks bitbucket.com and gitlab.com repositories for notability.uses_from_macos is a new formula DSL that allows formulae to declare that they use a dependency from the macOS system (rather than from Homebrew). This is useful for additional metadata and automatically installing that dependency on Linux.HOMEBREW_CURL_RETRIES retries curl downloads that fail.brew bump-revision increases the revision of formulae.brew are faster.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Maintainers arrived on Friday and met informally to socialise and get to know each other. On Saturday we released Homebrew 2.0.0 and on Saturday and Sunday attended the various talks at the conference (including a Homebrew 2.0.0 talk).
After getting to know each other better over the weekend we met in a hotel meeting room on Monday for the main purpose of the maintainer meeting: discussion of the future direction of the Homebrew project. 14 Homebrew maintainers were present in the meeting room and 3 others called in remotely.

Perhaps due to Mike McQuaid arranging to resign as Lead Maintainer on the same day the majority of the discussion was about Homebrew’s project governance. We agreed on having an elected Project Leader position, Project Leadership Committee and Technical Steering Committee. Representatives were elected to each of these positions.

If you’re interested in more details on our agreed governance structures you can read Governance documents (https://docs.brew.sh/Homebrew-Governance) and read the representatives for all positions in the Homebrew README’s “Who We Are” section.

Homebrew spent $11,965.85 in total on this meeting on the 14 individuals who attended. Included in this are some group meals, meeting room hire, travel (i.e. flights or trains) and hotel rooms in line with the Software Freedom Conservancy Travel and Reimbursable Expense Policy.
We felt this was a disproportionally valuable use of project funds. Most of us met each other for the first time, had some difficult conversations in-person and built bonds that make us all more committed to the project.
Thanks so much to everyone who has ever donated to Homebrew for enabling this meeting. If you would like to support similar events in future and can afford it, please donate through Patreon. If you’d rather not use Patreon (our preferred donation method), check out the other ways to donate in our README.
]]>Major changes and deprecations since 2.0.0:
brew tap-pin is deprecated. It was buggy and unused by Homebrew maintainers. Directly reference formulae (e.g. brew install user/tap/formula) or rename formulae in taps to avoid shadowing Homebrew/homebrew-core formulae instead.brew install --ignore-dependencies is documented as an unsupported, developer flag. If you’re trying to avoid a command being installed instead consider adjusting your PATH so your preferred version precedes it.Other changes since 2.0.0 I’d like to highlight are the following:
brew doctor reports unreadable, installed formulae.brew commands avoid auto-updating if no parameters are passedbrew extract works for all tapsbrew update and brew doctor warn on deleted taps.rootbrew cleanup --prune-prefix option does what brew prune used toFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew cleanup running automatically, no more options in Homebrew/homebrew-core, and removal of support for OS X Mountain Lion (10.8) and older.
Major changes and deprecations since 1.9.0:
sudo, and use it to install software that your host distribution’s package manager does not provide. Homebrew on Linux uses its own repository for formulae: Homebrew/linuxbrew-core.brew cleanup is run periodically (every 30 days) and triggers for individual formula cleanup on reinstall, install or upgrade. You can opt-out of this behaviour by setting the HOMEBREW_NO_INSTALL_CLEANUP variable. This addresses a long-standing complaint where users were surprised by how much disk space Homebrew used if they did not run brew cleanup.Other changes since 1.9.0 I’d like to highlight are the following:
man brew and --help. Also, Homebrew no longer silently ignores invalid options to formulae or commands.. This change will provide better feedback to users and allow making our argument handling more simple and robust.brew install does not try to link formulae that already have a cask with the same name installed. This change avoids link errors in these cases.Also, if you’ve not tuned in since 1.0.0, here are the major changes since then:
brew audit information when editing formulae in taps. This improves the contribution experience.brew tap-new command is available for creating a new tap with a README and preconfigured Azure Pipelines configuration (which seems to provide the most reliable and performant macOS CI for OSS at the time of writing). This eases the creation of taps (third-party repositories).brew update-reset resets all repositories and taps to their upstream versions. This is useful when debugging git issues.brew link state is preserved after brew install and brew upgrade (including for keg-only formulae) but unfortunately not the brew unlink state due to a lack of state. This should allow many keg-only formulae to be used as if they are normal formulae.brew postgresql-upgrade-database upgrades PostgreSQL database data between major versions. This simplifies upgrades between PostgreSQL versions which previously required a semi-manual process and old version of PostgreSQL to be kept around.python formula was upgraded to Python 3.x and python@2 formula was added for installing Python 2.7. We initially did not comply with PEP 394 and this was a mistake. We made brew install python and brew install python@2 PEP 394 compliant and will not change this again until PEP 394 has changed. This allows us to migrate more of our ecosystem to Python 3.brew upgrade automatically reinstalls or upgrades formulae with broken linkage. This avoids broken formulae when building from source or using optional behaviour after upgrades.brew info displays analytics data. This is the way that Homebrew maintainers query analytics data so we are using the same data as the community.. This will hopefully ease concerns about our collection of analytics data.brew install (although not brew cask install) from Homebrew/homebrew-core is open source software.brew link --force will not link software already provided by macOS but instead output the instructions on how to do so. This avoids strange compilation errors and encourages users to use the system mechanisms for adjusting their PATH.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew cleanup and providing bottles (binary packages) to more Homebrew users.
Major changes and deprecations since 1.8.0:
brew cleanup is run periodically if the HOMEBREW_INSTALL_CLEANUP environment variable is set. The HOMEBREW_INSTALL_CLEANUP environment variable will also trigger individual formula cleanup on reinstall, install or upgrade. brew upgrade --cleanup and HOMEBREW_UPGRADE_CLEANUP have been replaced with the HOMEBREW_INSTALL_CLEANUP variable. These will become default behaviours in 2.0.0.brew update no longer migrates legacy keg symlinks, tap names, repository locations, cache locations or cache entries.brew prune has been replaced by and is now run as part of brew cleanup.brew cask --version has been replaced with brew --version and brew cask search with brew search --cask.HOMEBREW_BUILD_FROM_SOURCE environment variable has been deprecated in favour of passing --build-from-source to individual formulae installs.brew install on macOS uses the same CFLAGS for bottles and building from source.brew link --force will not link software already provided by macOS.Future major changes and deprecations coming in 2.0.0:
brew cleanup will be run periodically and for trigger individual formula cleanup on reinstall, install or upgrade. You can enable this behaviour now on 1.9.0 by setting the HOMEBREW_INSTALL_CLEANUP variable.Other changes since 1.8.0 I’d like to highlight are the following:
brew info --json defaults to the latest JSON version and no longer requires a version argument.TERMINFO environment variable is passed through to Homebrew to enable support for some terminal emulators.brew’s ZSH completion performs more caching.brew bottle now allows relocation of more bottles by ignoring source code and skipping matches to build dependencies.brew doctor now outputs the non-default Xcode prefix to ease debugging when Homebrew is using one in a strange location.brew upgrade will not upgrade formulae installed from one tap to formulae installed in another.Homebrew/brew contains a Dockerfile for building Linuxbrew. This is built automatically on Homebrew’s Docker Hub page.Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew upgrade, brew info displaying analytics data and quarantining Cask’s downloads.
Major changes and deprecations since 1.7.0:
devel specs in Homebrew/homebrew-core (due to CI overhead)brew upgrade automatically reinstalls or upgrades formulae with broken linkagebrew shellenv outputs configuration variables for Homebrew (and was reimplemented in Bash for speed)brew info displays analytics data. This is the way that Homebrew maintainers query analytics data so we are using the same data as the community.brew extract is a new command to extract old versions of formulae from Git historybrew cask search and brew cask cleanup are deprecated in favour of brew search and brew cleanupOther changes since 1.7.0 I’d like to highlight are the following:
brew gist-logs --private creates private gistsHOMEBREW_FORCE_HOMEBREW_ON_LINUX disables using Linuxbrew settings when using Homebrew on Linuxbrew style checks Bash style with shellcheck and uses RuboCop RSpec by defaultbrew cleanup removes old or unnecessary portable Rubies and linkage cachesbrew linkage uses a JSON cache to increase reliabilitybrew update-reset accepts a repository argumentbundle install --standalone is used to handle vendored gems. This is used to use ActiveSupport File.atomic_write, ActiveSupport Hash#deep_merge, String#delete_prefix backport and ActiveSupport Object#blank? and #present? rather than maintaining our own poor imitations.brew update follows GitHub API redirectsbrew linkage data is used to check for multiple simultaneous versioned formulae linkage. This is more permissive than the previous recursive dependency check.brew bundle check --verbose displays what software is missing and causing a brew bundle check to failbrew update prints a one-time donation requestFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>git push on Homebrew/brew and Homebrew/homebrew-core. They reported this to our Hacker One. Within a few hours the credentials had been revoked, replaced and sanitised within Jenkins so they would not be revealed in future. Homebrew/brew and Homebrew/homebrew-core were updated so non-administrators on those repositories cannot push directly to master. Most repositories in the Homebrew organisation (notably not Homebrew/homebrew-core due to their current workflow and maintainer requests) were also updated to require CI checks from a pull request to pass before changes can be pushed to master.
GitHub Support was contacted and they verified the relevant token had not been used to perform any pushes to Homebrew/brew or Homebrew/homebrew-core during the period of elevated scopes. To be explicit: no packages were compromised and no action is required by users due to this incident.
We did, do and will continue to take the security of the project and our users very seriously. We try our best to behave as a for-profit company would do in terms of timely response to security issues but this is heavily limited by our lack of resources. For example, in this the Homebrew maintainer who resolved the above issues was on paternity leave from work and the primary carer for their child and had to reach a quick resolution while their child had a nap.
We need more help to improve Homebrew’s security. Please consider contributing your code and code reviews to our GitHub projects, get in touch to volunteer to be on-call for security and/or system administration emergencies or donate through Patreon.
Thanks for using Homebrew!
]]>Major changes and deprecations since 1.6.0:
HOMEBREW_FORCE_BREWED_GIT makes Homebrew use a Homebrew-installed rather than system Gitbrew install and upgrade display all caveats at the end of installing multiple formulaebrew link does not permit force-linking system dependencies on macOS 10.14 Mojave/CLT 10 and instead outputs the correct compiler flags to useHOMEBREW_PREFIX can no longer be in Homebrew’s temporary directorybrew ls no longer accepts all ls argumentsOther changes since 1.6.0 I’d like to highlight are the following:
brew install, upgrade and reinstall now have a --display-times option to print the install time for each formulabrew linkage now uses a cache to dramatically speed up the commandHOMEBREW_BOTTLE_DOMAIN variableFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew install python installing Python 3, the deprecation of Homebrew/homebrew-php and various formula API deprecations.
Major changes and deprecations since 1.5.0:
python formula was upgraded to Python 3.x and python@2 formula was added for installing Python 2.7. We initially did not comply with PEP 394 and this was a mistake; sorry for the pain. We heard your feedback on Python 3 and made brew install python and brew install python@2 PEP 394 compliant. We will not change this again until PEP 394 has changed.php and versioned php@* formulae in Homebrew/core. This completes the deprecation and archival of the last non-Homebrew/core tap for end-users. We encourage more niche formulae and options to be supported in taps outside the Homebrew organisation.curl invocations now only read curlrc if HOMEBREW_CURLRC is setbrew audit --strict now checks for depends_on ... build.with? dependencies (because they don’t and cannot work as expected)brew audit now flags the use of :run dependencies as they were a no-opbrew tap refuses to tap deprecated tapsOther changes since 1.5.0 I’d like to highlight are the following:
curl needs --insecure on OS X 10.7 and belowbrew unlink no longer incorrectly removes versioned aliasesbrew linkage now outputs broken dependencies and missing librariesbrew bump-formula-pr uses the GitHub API directly rather than hubscp:// in formula URLsbrew uninstall and brew missing will now have consistent outputbrew install will now also search casks if the formulae was not foundroot_urls can now use any download strategybrew install --only-dependencies will install any missing dependencies even if the formula is already installedbrew upgrade now has a HOMEBREW_UPGRADE_CLEANUP environment variable to request automatic removal of old versions of a formula on upgrade:test to indicate they are only used by the test do blockbrew irb --pry uses pry instead of irbbrew prof and brew ruby commands have been added for Homebrew developersbrew update now handles a too old system Git (by installing Homebrew’s git) to access GitHub on OS X 10.8 and belowNO_COLOR environment variable is set, Homebrew disables all coloured outputbrew pin is no longer automatically undone by brew uninstall or brew upgradeALL_PROXY variable to curlFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Future dates for your calendar:
python formula will be upgraded to Python 3.x and a python@2 formula will be added for installing Python 2.7 (although this will be keg-only so neither python nor python2 will be added to the PATH by default without a manual brew link --force). We will maintain python2, python3 and python@3 aliases. Any formulae that use depends_on "python" outside Homebrew/core will need to be updated at this point if they wish to keep using Python 2. Note: macOS has provided Python 2.7 since OS X Lion (10.7) so you can update formulae that need Python 2 today by removing depends_on "python" so they use the system python instead.Major changes and deprecations since 1.4.0:
brew postgresql-upgrade-database is a new command to simplify upgrading PostgreSQL databases between major versions.default_formula are no longer supported for Requirements. This was originally added to ease our bottle/binary package building when Homebrew was primarily a build-from-source package manager. Now that Homebrew is primarily a binary package manager, default_formula was no longer useful and was the source of many complex dependency resolution bugs.Requirements that allowed you to use depends_on for software outside of Homebrew that was also provided by Homebrew have been deprecated. Instead formulae that wish to support e.g. a non-Homebrew Python should use env :std and use the first instance of the software in the PATH (found with which)brew reinstall and brew upgrade no longer keep manually brew unlinked kegs as unlinked on reinstall or upgrade. Without this change there was no way of differentiating manually unlinked and failed-to-link kegs so a single keg link failure would stop any future version trying to link (leading to the software unexpectedly being missing from the user’s PATH).Other changes since 1.4.0 I’d like to highlight are the following:
brew audit allows the use of env :std in non-Homebrew organisation tapsHOMEBREW_DEVELOPERs are encouraged to submit pull requests for deprecationsbrew install a formula that doesn’t exist will only check if the formula was deleted in the last month (rather than ever) to improve performance.brew info now shows --devel and --HEAD options for optionless formulaebrew upgrade skips the formula rather than exiting if an upgrade fails due to an unsatisfied Requirementno_proxy variable is passed through to the Homebrew fetch/install process (e.g. for curl)Finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Major changes and deprecations since 1.3.0:
Other changes since 1.3.0 I’d like to highlight are the following:
HOMEBREW_FORCE_BREWED_CURL variable you can force Homebrew to use its own curl for all downloads. This may be useful combined with the proxychains-ng formula in bypassing any grating, ceramic firewalls.brew config outputs most HOMEBREW_* variablesbrew readall and brew update-reset are documented commands in man brewbrew linkage will list possible unnecessary dependenciescurl that consistently supports HTTPSbrew audit checks have been ported to RuboCop so are available in your text editorbrew installing local bottles no longer requires a sha256 in the formulabrew search explains what it’s searching for at each stagebrew pin documentation explains when and why pinned formulae may be upgradedbrew audit will only check for non-libraries in lib for new formulaeFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>brew install python no longer installs a python binary without manual PATH additions and instead installs a python2 binary. This avoids overriding the system python binary by default when installing Python as a dependency. It also paves the way to eventually have python be Python 3.x.
Major changes and deprecations since 1.2.0:
brew install (and upgrade/reinstall) use the macOS sandbox for all builds by defaultrevision is deprecated in favour of rebuild in bottle do blocksfails_with :llvm is deprecated as it’s always a no-opopt links for taps are created based on their name and not in subdirectoriesbrew link and brew unlink state is preserved after brew install and brew upgrade (including for keg-only formulae)brew test requires non-keg-only formulae to be linkedBuildErrors reported to analytics now include the requested formula installation optionsWhile all the functionality for these deprecations will be supported for the foreseeable future in Homebrew/brew for 3rd-party usage, Homebrew/homebrew-core has removed the use of these APIs from formulae to improve the user experience.
Other changes since 1.2.0 I’d like to highlight are the following:
default_formula are always used when pouring bottles againbrew --prefix is fasterwith_env can be used to simplify temporarily setting environment variableshomebrew npm-noob is a new tool to ease creating formulae from npm packagesbrew update arguments tell you more explicitly which brew upgrade command to runbrew bump-formula-pr now works with a shallow Git clone of a tapbrew install formulae whose dependency trees require more than one version of the same :build-time dependency:build-time requirements are no longer fatal when installing from bottlesbrew edit will use atom if availablebrew search includes Homebrew Cask results even when it is tappedbrew style and brew audit run rubocop in parallel for performancebrew info displays formula conflict reasonsbrew install --interactive can access $HOME to provide a better shell experiencebrew install can install bottles from a URLbrew postinstall allows reinstalling etc and varbrew audit checks have been ported to rubocop providing in-editor feedback on Homebrew styleFinally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>Additionally, as Homebrew/homebrew-versions has been moved into Homebrew/homebrew-core Homebrew provides better, official support for different versions. You can read more about this in the dedicated versions document. Please note our goal isn’t to support all versions of all software but to provide some versions and tooling such that you can easily maintain more in your own tap (package repository).
Since 1.1.0 the following deprecations have been made:
env :std and env :userpaths in formulaeOS.mac? and OS.linux? in formulaefails_with :llvm in formulae32-bit options in formulaego get usage in formulaedepends_on "pygments.rb" => :ruby)brew tap of deprecated, official tapsbrew cask update commandbrew linkapps and brew unlinkapps commandsENV. and elsewhereWhile all the functionality for these deprecations will be supported for the foreseeable future in Homebrew/brew for 3rd-party usage, Homebrew/homebrew-core will be removing the use of these APIs from formulae to improve the user experience.
Since 1.1.0 some new commands are available:
brew cask outdated shows outdated Casksbrew formula outputs the location of a formulabrew update-reset simplifies cleaning up broken repositoriesSome of the other changes since 1.1.0 I’d like to highlight are the following:
brew create uses GitHub metadata to populate fields when creating from a GitHub archivebrew audit provides --only and --except flags to allow selectively running brew audit methodsbrew search uses a single GitHub API call for searching all Homebrew and Caskroom tapsbrew install creates symlinks in opt for formulae aliases (such as versioned aliases)brew update will symlink shell completions provided by tapsbrew tests runs all cask tests (replacing brew cask-tests) and all tests use RSpec rather than MiniTestbrew info --json=v1. This is useful in differentiating between top installed packages based on user demand vs. based on large numbers of dependents. This is also used by brew bundle dump and brew bundle cleanup to handle dependencies more sensibly.brew reinstall, upgrade and install always output used optionsbrew tap-new uses our latest Travis CI recommended configuration providing zero-configuration CI for all formulae tapsbrew uninstall now refuses to uninstall a package if other packages that depend on it are still installeddesc audits and checking the order of methods in formulae rather than requiring brew audit be run. This also allows these checks to be run automatically in any editor with RuboCop integration.HOMEBREW_ENV_FILTERING will filter all custom user environment variables from brew. Eventually we hope to enable this by default.brew install and brew testbrew services provides better error reporting using new macOS APIsAnd finally:
Thanks to all our hard-working maintainers, contributors, sponsors and supporters for getting us this far. Enjoy using Homebrew!
]]>1.1.0 contains some breaking changes:
root user (e.g. sudo brew)_or_later tags no longer use _or_later in their filenames so the existing bottle can be reusedSome of the changes since 1.0.0 I’d like to highlight are the following:
stable (rather than master) is used for following Homebrew/brew tagsbrew test-bot has moved to its own tapbrew info now also lists Requirements (e.g. depends_on :foo) as well as dependenciesLibrary/Tapsbrew commands can now use #: comments to automatically have rich --help outputbrew.1 manpage points to official external commands (brew bundle, brew cask, brew services)xzbrew tap-new command is available for creating a new tap with a README and preconfigured Travis CI file (.travis.yml)brew output has been improved when git is not installedbrew cask reinstall command was addedbrew info now lists required option builds in dependencies outputEnjoy using Homebrew!
]]>We’ve been working hard over the last year to make some major changes to Homebrew that we’ve been wanting for a long time. There have been some hiccups along the way but we now have a more stable base for using and developing Homebrew in the future.
These include:
/usr/local/Homebrew to keep your /usr/local cleanerbrew bump-formula-pr command to create new formula version pull requestsbrew --help to brew subcommandsbrew update sped up by only running git fetch if necessarybrew bundle (for Brewfiles and import/export) and brew services (for background services management).brew update workflow automaticallycurl for all HTTP access for consistent proxy supportHEAD package installations have versions and can be upgradedAnd finally:
Thanks to all our users, contributors and maintainers past and present for getting us to this milestone. Enjoy using Homebrew!
]]>