Skip to content

brew services performs an automatic update of JSON api data when it might not be necessary #21201

@alastair

Description

@alastair

brew doctor output

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Some installed formulae are deprecated or disabled.
You should find replacements for the following formulae:
  node@18
  node@20

but if I uninstall old node just for testing purposes: 

$ brew doctor
Your system is ready to brew.

Verification

  • I ran brew update twice and am still able to reproduce my issue.
  • My "brew doctor output" above says Your system is ready to brew or a definitely unrelated Tier message.
  • This issue's title and/or description do not reference a single formula e.g. brew install wget. If they do, open an issue at https://github.com/Homebrew/homebrew-core/issues/new/choose instead.

brew config output

HOMEBREW_VERSION: 5.0.5
ORIGIN: https://github.com/Homebrew/brew
HEAD: 70badad488056fb48cf687aa777f2880aac58fe9
Last commit: 2 days ago
Branch: stable
Core tap JSON: 09 Dec 10:56 UTC
Core cask tap JSON: 09 Dec 10:56 UTC
HOMEBREW_PREFIX: /opt/homebrew
HOMEBREW_CASK_OPTS: []
HOMEBREW_DOWNLOAD_CONCURRENCY: 28
HOMEBREW_FORBID_PACKAGES_FROM_PATHS: set
HOMEBREW_MAKE_JOBS: 14
Homebrew Ruby: 3.4.7 => /opt/homebrew/Library/Homebrew/vendor/portable-ruby/3.4.7/bin/ruby
CPU: 14-core 64-bit arm_brava
Clang: 17.0.0 build 1700
Git: 2.52.0 => /opt/homebrew/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 15.7-arm64
CLT: 26.0.0.0.1.1757719676
Xcode: 26.1.1
Metal Toolchain: N/A
Rosetta 2: false


I don't see any specific other HOMEBREW_* config items in my .bashrc or .profile. I have no ~/.homebrew/ directory. The only HOMEBREW environment variables I have set are

$ env | grep HOMEBREW
HOMEBREW_PREFIX=/opt/homebrew
HOMEBREW_CELLAR=/opt/homebrew/Cellar
HOMEBREW_REPOSITORY=/opt/homebrew

What were you trying to do (and why)?

I use brew services to periodically start and stop services as required depending on what project I'm working on. I normally use this for posgres and redis.

What happened (include all command output)?

When I run a brew services command, I sometimes (but not always) get output of homebrew refreshing some internal data:

$ brew services start postgresql@17
✔︎ JSON API formula_tap_migrations.jws.json         [Downloaded    2.1KB/  2.1KB]
✔︎ JSON API cask_tap_migrations.jws.json            [Downloaded    2.4KB/  2.4KB]
✔︎ JSON API cask.jws.json                           [Downloaded   15.1MB/ 15.1MB]
✔︎ JSON API formula.jws.json                        [Downloaded   31.7MB/ 31.7MB]
==> Successfully started `postgresql@17` (label: homebrew.mxcl.postgresql@17)

This doesn't always happen, so it's clear that this is some sort of periodic refresh of the homebrew internal database. I'm not sure how frequently it does this. If I immediately afterwards run another brew services command, I don't get any output. This only started happening after I upgraded to homebrew 5.

What did you expect to happen?

To me it seems a bit odd that brew services performs this automatic update. If this sub-command is only used for modifying launchctl configuration for already installed software, I'd expect that it doesn't need to do any refresh of the internal database.
Performing the refresh during a brew install or brew upgrade seems fine, and I'm not suggesting this behaviour is changed.
It's not clear to me if this update can be changed to run only in specific subcommands, or for simplicity it's checked every time brew is run.

I don't recall seeing any "updating..." message when using brew services on homebrew 4.

Looking at the environment settings (https://docs.brew.sh/Manpage#environment) I wonder if this is

HOMEBREW_AUTO_UPDATE_SECS
Run brew update once every $HOMEBREW_AUTO_UPDATE_SECS seconds before some commands, e.g. brew install, brew upgrade or brew tap. Alternatively, disable auto-update entirely with $HOMEBREW_NO_AUTO_UPDATE.
Default: 86400 (24 hours), 3600 (1 hour) if a developer command has been run

the "24 hours" default kind of vibes with the frequency with which I see it happen.

What confuses me is that I don't recall making any configuration changes to explicitly use the new API, I understand from the release notes at https://brew.sh/2025/11/12/homebrew-5.0.0/ that this is opt-in at the moment via HOMEBREW_USE_INTERNAL_API and will be enabled at some later time. It's not clear to me if these output messages are in fact from homebrew downloading from the internal API or are from some unrelated code

Step-by-step reproduction instructions (by running brew commands)

brew install postgresql@17
# wait some amount of time (not sure how long? maybe HOMEBREW_AUTO_UPDATE_SECS?)
brew services start postgresql@17

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions