[BUG] Claude TUI says update available via brew. Brew update shows already up to date.

Resolved 💬 68 comments Opened Nov 11, 2025 by shubham-arora-clear Closed Apr 8, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

<img width="1920" height="192" alt="Image" src="https://github.com/user-attachments/assets/2bf90415-ef06-4d5a-bba7-99fab8bcb41c" />

<img width="1920" height="70" alt="Image" src="https://github.com/user-attachments/assets/8c705017-4f6a-4fb7-b83d-34e8ccccca57" />

What Should Happen?

The update status should be in sync with brew cask

Error Messages/Logs

Steps to Reproduce

  1. Start a new claude code session
  2. Message appears about Update Available
  3. Run the brew upgrade command

Claude Model

None

Is this a regression?

I don't know

Last Working Version

_No response_

Claude Code Version

2.0.36

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

iTerm2

Additional Information

_No response_

View original on GitHub ↗

68 Comments

AhmedOsama · 8 months ago

Same issue here only difference is that I am running claude code on WSL2

rjcorwin · 8 months ago

same :)

elindiotaino · 8 months ago

Additional Platform Confirmation - Ubuntu Linux/Linuxbrew

I can confirm this bug also affects Linuxbrew on Ubuntu 24.04.3 LTS.

Environment:

  • Platform: Ubuntu 24.04.3 LTS (Noble Numbat)
  • Kernel: Linux 6.14.0-35-generic
  • Claude Code version: 2.0.37
  • Installation: Linuxbrew (/home/linuxbrew/.linuxbrew/Caskroom/claude-code/2.0.37)
  • Installed: 2025-11-07 at 19:06:53

Diagnostic Output:
\\\`bash
$ claude --version
2.0.37 (Claude Code)

$ brew info claude-code
==> claude-code: 2.0.37
https://www.anthropic.com/claude-code
Installed
/home/linuxbrew/.linuxbrew/Caskroom/claude-code/2.0.37 (203.8MB)
Installed using the formulae.brew.sh API on 2025-11-07 at 19:06:53
From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/claude-code.rb
\\\`

Behavior:
Despite both commands showing version \2.0.37\ is installed, Claude Code still displays at startup:
\\\
Update available! Run: brew upgrade claude-code
\
\\

Running \brew upgrade claude-code\ confirms:
\\\
Warning: Not upgrading claude-code, the latest version is already installed
\
\\

Attempted Workarounds:

  • \brew cleanup claude-code\ - No effect
  • \brew update\ - No effect
  • Verified versions match exactly (both show 2.0.37), but notification persists on every startup

Analysis:
This suggests the update check mechanism may be comparing against a stale cache or incorrect source, independent of the actual Homebrew formula version. The issue affects multiple platforms (macOS, WSL2, and now Ubuntu Linux), indicating it's likely a cross-platform bug in Claude Code's update detection logic rather than a platform-specific Homebrew issue.

pattiereaves · 8 months ago

I have the same issue.

robpatton4 · 8 months ago

I have the same issue on MacOS with homebrew. I did not have this issue after I upgraded claude code to 2.0.37, I have been running it frequently since that upgrade and this behavior started later. So in my case it does not appear to be tied to the upgrade itself.

vkarampinis · 8 months ago

same here

dipendra-sharma · 7 months ago

Same on 2.0.45

<img width="1704" height="366" alt="Image" src="https://github.com/user-attachments/assets/8b4faeb0-adf9-4003-af4b-a7a698f1aa23" />

rijieli · 7 months ago

Same here. This notification is really annoying.

KianYari · 7 months ago

same here with version 2.0.45 on macos with homebrew

DrinkingJuice · 7 months ago

same here with version v2.0.52 on macos with homebrew

DrinkingJuice · 7 months ago

<img width="2768" height="962" alt="Image" src="https://github.com/user-attachments/assets/3dbdc940-f542-4985-8008-a165d2c68d9e" />

brennonj · 7 months ago

Same issue here. MacOS

claude --version 
  ⎿  2.0.53 
aejfager · 7 months ago

Getting it too on claude 2.0.53

noebrito · 7 months ago

Same issue here.

Aleksandar-Borisov · 7 months ago

I think it's related to the fact that the Homebrew version is actually outdated comparing to the official one. Same issue is happening for all Claude products, including the macOS desktop app. The app shows that there is an update and it indeed upgrades by itself to the latest version, while the Homebrew version is not the latest and greatest. I use Homebrew to simplify my workflow and have the latest and greatest versions faster, this however defies the purpose by doing the opposite.

dpark2025 · 7 months ago

Same message as well on cc.

Sonyque · 7 months ago

+1 with homebrew instalation

brennonj · 7 months ago
I think it's related to the fact that the Homebrew version is actually outdated comparing to the official one. Same issue is happening for all Claude products, including the macOS desktop app. The app shows that there is an update and it indeed upgrades by itself to the latest version, while the Homebrew version is not the latest and greatest. I use Homebrew to simplify my workflow and have the latest and greatest versions faster, this however defies the purpose by doing the opposite.

This is the answer. Removed the brew install and did direct curl which solved my problem.

angristan · 7 months ago

Yeah this is a bit annoying, when installed through homebrew, claude code should check against the latest available version from homebrew _specifically_

jdrill-rewst · 7 months ago

Confirmed on v2.0.62 (Latest Version)

Can confirm this issue still persists on Claude Code v2.0.62 (the latest version as of 2025-12-09).

Environment:

  • Platform: macOS (Darwin 25.1.0)
  • Claude Code version: 2.0.62
  • Installation: Homebrew
  • Installed: 2025-11-19 at 07:54:33

Behavior:
Claude Code displays at startup:

Update available! Run: brew upgrade claude-code

However, running the suggested commands confirms already on latest:

$ brew upgrade claude-code
Warning: Not upgrading claude-code, the latest version is already installed

$ brew info claude-code
==> claude-code: 2.0.62
...
Installed
/opt/homebrew/Caskroom/claude-code/2.0.62 (169.6MB)

This confirms the bug persists even in the most recent release, suggesting the update check mechanism needs attention.

Aleksandar-Borisov · 7 months ago

This wasn’t fixed for a long time, and then I read on Reddit that the official version through Anthropic had more features. So I went straight to the source. It’s updating correctly now, and the desktop app has a more robust update mechanism as well. I guess not everything will go through Homebrew for me.

Jarvvski · 7 months ago

@jdrill-rewst @Aleksandar-Borisov

claude-code via homebrew works fine for me:

➜ brew info claude-code
==> claude-code: 2.0.65

Did you do a brew update first?

➜ brew info claude-code
==> claude-code: 2.0.65
https://www.anthropic.com/claude-code
Installed
/opt/homebrew/Caskroom/claude-code/2.0.65 (163.4MB)
  Installed using the formulae.brew.sh API on 2025-07-30 at 16:16:35
From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/claude-code.rb
==> Name
Claude Code
==> Description
Terminal-based AI coding assistant
==> Artifacts
claude (Binary)
==> Downloading https://formulae.brew.sh/api/cask/claude-code.json
==> Analytics
install: 80,781 (30 days), 143,333 (90 days), 163,882 (365 days)
topout · 7 months ago

Below is what my diagnostics show. I continue to have this "Update available! Run: brew upgrade claude-code" showing even when I run the upgrade.

Diagnostics
└ Currently running: package-manager (2.0.65)
└ Package manager: homebrew
└ Path: /opt/homebrew/bin/claude
└ Invoked: /opt/homebrew/Caskroom/claude-code/2.0.65/claude
└ Config install method: unknown
└ Auto-updates: Managed by package manager
└ Search: OK (bundled)

Jarvvski · 7 months ago
Below is what my diagnostics show. I continue to have this "Update available! Run: brew upgrade claude-code" showing even when I run the upgrade. Diagnostics └ Currently running: package-manager (2.0.65) └ Package manager: homebrew └ Path: /opt/homebrew/bin/claude └ Invoked: /opt/homebrew/Caskroom/claude-code/2.0.65/claude └ Config install method: unknown └ Auto-updates: Managed by package manager └ Search: OK (bundled)

It's already on 2.0.67, so you get the alert because you're out of date

They are pushing updates multiple times, and quite frequently. I've asked in a different issue if they could change the alert to use the minor version instead of the patch. But it doesn't look like anthropic are following semver for this anyway

topout · 7 months ago
It's already on 2.0.67, so you get the alert because you're out of date They are pushing updates multiple times, and quite frequently. I've asked in a different issue if they could change the alert to use the minor version instead of the patch. But it doesn't look like anthropic are following semver for this anyway

Thanks. Noted. I was getting that message telling me to update even though I ran brew upgrade claude-code multiple times already. Each time I run brew upgrade, brew tells me ithas the latest version.

The issue only happens for a period of time. I just ran brew upgrade again and now that Update available message is gone.

What I noticed is later, I'll run into the same issue where I'm told to update by claude, I upgrade with brew, brew tells me I have the latest version. claude tells me I need to update.

zienag · 7 months ago

I'm getting this issue on 2.0.71

 Diagnostics
 └ Currently running: package-manager (2.0.71)
 └ Package manager: homebrew
 └ Path: /opt/homebrew/bin/claude
 └ Invoked: /opt/homebrew/Caskroom/claude-code/2.0.71/claude
 └ Config install method: global
 └ Auto-updates: Managed by package manager
 └ Search: OK (bundled)
Santiago0412 · 6 months ago

use this instead of home-brew

curl -fsSL https://claude.ai/install.sh | bash
hash -r
AbdelrahmanHafez · 6 months ago

More information in https://github.com/Homebrew/homebrew-cask/pull/243791, Brew team have an automation that submit PRs to update their casks every 3 hours, Claude should poll brew every ~10 minutes or so when an NPM version is available to check if the NPM version is now on brew.

dziin · 5 months ago

Because of frequent updates and slow download speeds, I disabled Homebrew's auto-update by setting HOMEBREW_NO_AUTO_UPDATE=1, and now the following commands work fine for me:

brew update
brew upgrade claude-code

!Image

Konadu-Akwasi-Akuoko · 5 months ago

Now this is biting me in the a**, I am stuck on v2.1.27 with the CPU loop thing, so I can't work. A fix is out like 30 mins ago, I want to upgrade, and continue working, but they tell me there is no update via homebrew. I remember Anthropic advocating for us to use the Homebrew version, but now we are getting slower updates compared to the npm version, so why did you guys let us switch? Fix this ASAP

<img width="1524" height="526" alt="Image" src="https://github.com/user-attachments/assets/926adf09-19bc-4bfd-a30d-5c8eec42e328" />

baekenough · 5 months ago

Same issue here.
$ brew upgrade claude-code
Warning: Not upgrading claude-code, the latest version is already installed
Still seeing the "Update available" banner when starting a new session.

Platform: darwin(macOS Tahoe 26.2)
Terminal: Zed (built-in terminal), iTerm2
Version: 2.1.30
Homebrew: 5.0.13

<img width="1365" height="419" alt="Image" src="https://github.com/user-attachments/assets/710f8a91-917d-472f-ad9d-db54f018854c" />

AbdelrahmanHafez · 5 months ago

For anyone still having an issue with this, until Anthropic fixes it, I created a script in my ~/bin dir
That builds a local cask and updates from it, shouldn't have to wait until Brew create a PR and make it public. Just run update-claude-code in your terminal and it should update using a local verison.

Note: tested only on mac, might need to slightly modify it to work with other operating systems, give it to Claude Code and it'll do it for you.
Here, no need to wait for a couple of hours to test Opus 4.6 :)

~/bin/update-claude-code.sh

#!/usr/bin/env bash
# vi: ft=bash
#
# Updates claude-code to the latest npm version, bypassing brew's cask update lag.
# Self-contained: creates a local brew tap on first run, idempotent on subsequent runs.

set -euo pipefail

BASE_URL="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases"
TAP_DIR="$(brew --repository)/Library/Taps/local/homebrew-cask"
CASK_FILE="$TAP_DIR/Casks/claude-code.rb"

ARCH=$(uname -m)
if [[ "$ARCH" == "arm64" ]]; then
    PLATFORM="darwin-arm64"
else
    PLATFORM="darwin-x64"
fi

LATEST=$(npm view @anthropic-ai/claude-code version --safe-chain-skip-minimum-package-age 2>/dev/null)
CURRENT=$(claude --version 2>/dev/null | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+' || echo "not installed")

echo "Current: $CURRENT"
echo "Latest:  $LATEST"

if [[ "$CURRENT" == "$LATEST" ]]; then
    echo "Already up to date."
    exit 0
fi

echo ""
echo "Updating claude-code $CURRENT -> $LATEST..."

# Ensure local tap exists (idempotent)
if [[ ! -d "$TAP_DIR" ]]; then
    echo "Creating local brew tap..."
    brew tap-new local/cask
fi
mkdir -p "$TAP_DIR/Casks"

WORK_DIR=$(mktemp -d)
trap 'rm -rf "$WORK_DIR"' EXIT

DOWNLOAD_URL="$BASE_URL/$LATEST/$PLATFORM/claude"
echo "Downloading $DOWNLOAD_URL..."
curl -fSL --progress-bar "$DOWNLOAD_URL" -o "$WORK_DIR/claude"

SHA256=$(shasum -a 256 "$WORK_DIR/claude" | cut -d' ' -f1)

cat > "$CASK_FILE" <<RUBY
cask "claude-code" do
  version "$LATEST"
  sha256 "$SHA256"

  url "$BASE_URL/#{version}/$PLATFORM/claude",
      verified: "storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/"

  name "Claude Code"
  desc "Terminal-based AI coding assistant"
  homepage "https://www.anthropic.com/claude-code"

  depends_on macos: ">= :catalina"

  binary "claude"

  zap trash: [
    "~/.cache/claude",
    "~/.claude",
    "~/.claude.json*",
    "~/.config/claude",
    "~/.local/bin/claude",
    "~/.local/share/claude",
    "~/.local/state/claude",
    "~/Library/Caches/claude-cli-nodejs",
  ]
end
RUBY

cd "$TAP_DIR" && git add -A && git commit -m "claude-code $LATEST" --allow-empty -q 2>/dev/null || true

brew reinstall --cask local/cask/claude-code

echo ""
echo "Updated to $(claude --version 2>/dev/null)"
ctsstc · 5 months ago

Seems that the release exists on github, but hasn't hit the brew ecosystem yet. It drives me nuts. By the time the update hits the brew ecosystem there's already another update out that's not in brew yet 😆

mcmillion · 5 months ago

Yeah it would be far less annoying if it wasn't the brightest colored thing in the entire UI.

javabrett · 5 months ago

This will occur whenever:

  1. There's a newer version available on Homebrew, and you need to run brew update and brew upgrade claude-code, OR
  2. You have the newest Homebrew version installed, but that version currently/momentarily lags the latest version number published by Anthropic. Due to high update cadence of this cask, this is happening pretty regularly - almost every day for most of us.

2 should occur precisely when:

This:

curl https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/latest
2.1.37

... returns a newer version than this:

curl -s https://formulae.brew.sh/api/cask/claude-code.json | jq -r '.version'
2.1.37

Next time these differ I might post the output.

So it would seem that the solution might be:

When Claude Code CLI knows that it is package-managed by homebrew (it does - claude doctor outputs Package manager: homebrew), it does one of:

  • suppresses all UI messages about newer versions available
  • checks homebrew version metadata to make sure it (also?) has a newer version available, before reporting it.

WDYT?

javabrett · 5 months ago

This happens right now for me, so per above, logging the outputs from the commands run at the same time:

curl https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/latest
2.1.39
curl -s https://formulae.brew.sh/api/cask/claude-code.json | jq -r '.version'
2.1.38
zerclanzhang · 5 months ago
For anyone still having an issue with this, until Anthropic fixes it, I created a script in my ~/bin dir That builds a local cask and updates from it, shouldn't have to wait until Brew create a PR and make it public. Just run update-claude-code in your terminal and it should update using a local verison. Note: tested only on mac, might need to slightly modify it to work with other operating systems, give it to Claude Code and it'll do it for you. Here, no need to wait for a couple of hours to test Opus 4.6 :) ### ~/bin/update-claude-code.sh #!/usr/bin/env bash # vi: ft=bash # # Updates claude-code to the latest npm version, bypassing brew's cask update lag. # Self-contained: creates a local brew tap on first run, idempotent on subsequent runs. set -euo pipefail BASE_URL="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases" TAP_DIR="$(brew --repository)/Library/Taps/local/homebrew-cask" CASK_FILE="$TAP_DIR/Casks/claude-code.rb" ARCH=$(uname -m) if [[ "$ARCH" == "arm64" ]]; then PLATFORM="darwin-arm64" else PLATFORM="darwin-x64" fi LATEST=$(npm view @anthropic-ai/claude-code version --safe-chain-skip-minimum-package-age 2>/dev/null) CURRENT=$(claude --version 2>/dev/null | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+' || echo "not installed") echo "Current: $CURRENT" echo "Latest: $LATEST" if [[ "$CURRENT" == "$LATEST" ]]; then echo "Already up to date." exit 0 fi echo "" echo "Updating claude-code $CURRENT -> $LATEST..." # Ensure local tap exists (idempotent) if [[ ! -d "$TAP_DIR" ]]; then echo "Creating local brew tap..." brew tap-new local/cask fi mkdir -p "$TAP_DIR/Casks" WORK_DIR=$(mktemp -d) trap 'rm -rf "$WORK_DIR"' EXIT DOWNLOAD_URL="$BASE_URL/$LATEST/$PLATFORM/claude" echo "Downloading $DOWNLOAD_URL..." curl -fSL --progress-bar "$DOWNLOAD_URL" -o "$WORK_DIR/claude" SHA256=$(shasum -a 256 "$WORK_DIR/claude" | cut -d' ' -f1) cat > "$CASK_FILE" <<RUBY cask "claude-code" do version "$LATEST" sha256 "$SHA256" url "$BASE_URL/#{version}/$PLATFORM/claude", verified: "storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/" name "Claude Code" desc "Terminal-based AI coding assistant" homepage "https://www.anthropic.com/claude-code" depends_on macos: ">= :catalina" binary "claude" zap trash: [ "~/.cache/claude", "~/.claude", "~/.claude.json*", "~/.config/claude", "~/.local/bin/claude", "~/.local/share/claude", "~/.local/state/claude", "~/Library/Caches/claude-cli-nodejs", ] end RUBY cd "$TAP_DIR" && git add -A && git commit -m "claude-code $LATEST" --allow-empty -q 2>/dev/null || true brew reinstall --cask local/cask/claude-code echo "" echo "Updated to $(claude --version 2>/dev/null)"

e

For anyone still having an issue with this, until Anthropic fixes it, I created a script in my ~/bin dir That builds a local cask and updates from it, shouldn't have to wait until Brew create a PR and make it public. Just run update-claude-code in your terminal and it should update using a local verison. Note: tested only on mac, might need to slightly modify it to work with other operating systems, give it to Claude Code and it'll do it for you. Here, no need to wait for a couple of hours to test Opus 4.6 :) ### ~/bin/update-claude-code.sh #!/usr/bin/env bash # vi: ft=bash # # Updates claude-code to the latest npm version, bypassing brew's cask update lag. # Self-contained: creates a local brew tap on first run, idempotent on subsequent runs. set -euo pipefail BASE_URL="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases" TAP_DIR="$(brew --repository)/Library/Taps/local/homebrew-cask" CASK_FILE="$TAP_DIR/Casks/claude-code.rb" ARCH=$(uname -m) if [[ "$ARCH" == "arm64" ]]; then PLATFORM="darwin-arm64" else PLATFORM="darwin-x64" fi LATEST=$(npm view @anthropic-ai/claude-code version --safe-chain-skip-minimum-package-age 2>/dev/null) CURRENT=$(claude --version 2>/dev/null | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+' || echo "not installed") echo "Current: $CURRENT" echo "Latest: $LATEST" if [[ "$CURRENT" == "$LATEST" ]]; then echo "Already up to date." exit 0 fi echo "" echo "Updating claude-code $CURRENT -> $LATEST..." # Ensure local tap exists (idempotent) if [[ ! -d "$TAP_DIR" ]]; then echo "Creating local brew tap..." brew tap-new local/cask fi mkdir -p "$TAP_DIR/Casks" WORK_DIR=$(mktemp -d) trap 'rm -rf "$WORK_DIR"' EXIT DOWNLOAD_URL="$BASE_URL/$LATEST/$PLATFORM/claude" echo "Downloading $DOWNLOAD_URL..." curl -fSL --progress-bar "$DOWNLOAD_URL" -o "$WORK_DIR/claude" SHA256=$(shasum -a 256 "$WORK_DIR/claude" | cut -d' ' -f1) cat > "$CASK_FILE" <<RUBY cask "claude-code" do version "$LATEST" sha256 "$SHA256" url "$BASE_URL/#{version}/$PLATFORM/claude", verified: "storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/" name "Claude Code" desc "Terminal-based AI coding assistant" homepage "https://www.anthropic.com/claude-code" depends_on macos: ">= :catalina" binary "claude" zap trash: [ "~/.cache/claude", "~/.claude", "~/.claude.json*", "~/.config/claude", "~/.local/bin/claude", "~/.local/share/claude", "~/.local/state/claude", "~/Library/Caches/claude-cli-nodejs", ] end RUBY cd "$TAP_DIR" && git add -A && git commit -m "claude-code $LATEST" --allow-empty -q 2>/dev/null || true brew reinstall --cask local/cask/claude-code echo "" echo "Updated to $(claude --version 2>/dev/null)"

Great! It Works! Thanks Dude!

javabrett · 5 months ago

An effective workaround is to, when installed with Homebrew, disable the auto-updater entirely (it's not active anyway) which will also disable the update check and notification, including this early/spurious case where the latest version isn't in Homebrew yet.

You can do that by adding this to your ~/.claude/settings.json:

...
  "env": {
    "DISABLE_AUTOUPDATER": "1"
  },
...
EZWrighter · 4 months ago

+1 — Still happening on 2.1.44 (Linux/brew). npm shows 2.1.45 but brew hasn't published it yet, so the update nag fires with no way to resolve it. Thanks to the team for tracking this\!

0xMH · 4 months ago

I created https://github.com/0xMH/homebrew-claude-latest which works like a charm natively with Homebrew a until they fix the issue.

EZWrighter · 4 months ago
An effective workaround is to, when installed with Homebrew, disable the auto-updater entirely (it's not active anyway) which will also disable the update check and notification, including this early/spurious case where the latest version isn't in Homebrew yet. You can do that by adding this to your ~/.claude/settings.json: `` ... "env": { "DISABLE_AUTOUPDATER": "1" }, ... ``

That is a nice temporary workaround, but with how often Claude-Code updates, it would be great to get the notification of these updates, or even better....let Claude just update itself continuously and auto-resume.

0xMH · 4 months ago
> An effective workaround is to, when installed with Homebrew, disable the auto-updater entirely (it's not active anyway) which will also disable the update check and notification, including this early/spurious case where the latest version isn't in Homebrew yet. > You can do that by adding this to your ~/.claude/settings.json: > `` > ... > "env": { > "DISABLE_AUTOUPDATER": "1" > }, > ... > `` That is a nice temporary workaround, but with how often Claude-Code updates, it would be great to get the notification of these updates, or even better....let Claude just update itself continuously and auto-resume.

That's exactly what my tap does. Instead of disabling the nag entirely, it makes brew upgrade actually work the moment Anthropic publishes a release. The cask resolves the version dynamically by hitting Anthropic's own CDN at install time, so there's no delay waiting for someone to update the official homebrew-cask formula.

So this should fix the issue for now:

brew uninstall --cask claude-code
brew tap 0xMH/claude-latest
brew install 0xMH/claude-latest/claude-code
AbdelrahmanHafez · 4 months ago

@0xMH I'm curious, how do you keep it up-to-date? How differently do you handle new versions over Brew's approach?

0xMH · 4 months ago
@0xMH I'm curious, how do you keep it up-to-date? How differently do you handle new versions over Brew's approach?

I wrote about how it works here: homebrew-claude-latest

javabrett · 4 months ago
I wrote about how it works here: homebrew-claude-latest

Very nice indeed.

The Trade-Off You probably noticed sha256 :no_check in the formula. sha256 :no_check

Once current latest is resolved to version, we can fetch manifest.json for that release, extract the checksum and then use that to verify the binary downloaded from GCS. I expect that the checksum in the manifest is about as authoritative/safe source-of-truth as it gets, and is possibly where the current cask PR authors should be getting the checksums from anyway.

The cost of this is a HTTP GET to GCS whenever the cask is mentioned or checked, which seems reasonable as well as fast.

I have this working, raised PR https://github.com/0xMH/homebrew-claude-latest/pull/1 .

dlgochan · 4 months ago

If you're here because Homebrew doesn't auto-update claude-code — I built a tool for this:

brew tap dlgochan/tap
brew install claude-autoupdate
claude-autoupdate enable

Sets up a macOS LaunchAgent that runs brew upgrade --cask claude-code every 24h (configurable from 1h to 7d). Zero dependencies.

https://github.com/dlgochan/claude-code-autoupdate

EZWrighter · 4 months ago

Why do people keep posting random repositories here? This is just a basic
claude-code feature that should work...without needing to risk installation
of 3rd party tools that could contain malware or any other malicious script
they wish. Sorry, random internet installs shouldn't be a thing, even if
open source. Take your time to submit a patch!

On Wed, Feb 18, 2026 at 12:18 AM Haechan Lee @.***>
wrote:

dlgochan left a comment (anthropics/claude-code#11405) <https://github.com/anthropics/claude-code/issues/11405#issuecomment-3919353372> If you're here because Homebrew doesn't auto-update claude-code — I built a tool for this: brew tap dlgochan/tap brew install claude-autoupdate claude-autoupdate enable Sets up a macOS LaunchAgent that runs brew upgrade --cask claude-code every 24h (configurable from 1h to 7d). Zero dependencies. https://github.com/dlgochan/claude-code-autoupdate — Reply to this email directly, view it on GitHub <https://github.com/anthropics/claude-code/issues/11405#issuecomment-3919353372>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AADR7Q5J3JL2T6GOINK4DQL4MQN6PAVCNFSM6AAAAACLX5XWS2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTSMJZGM2TGMZXGI> . You are receiving this because you commented.Message ID: @.***>
AbdelrahmanHafez · 4 months ago
Take your time to submit a patch!
  1. Claude Code isn't open source.
  2. If it were, a patch is useless when Anthropic is ignoring issues for months.

People are trying to help here. If you, rightfully, don't trust their code, find one of the many solutions posted here, fork it, and use your fork until Anthropic fixes it.

Your problem is with Anthropic, not with the people trying to help. :)

javabrett · 4 months ago

@0xMH thanks for the fix at https://github.com/0xMH/homebrew-claude-latest/commit/852c592a65ec7123b42f340f48d2bf02bb7a3d46 for upgrade issues ... I hit the same issue.

Two questions though:

  • Now that version is :latest, I expect that a simple brew upgrade isn't going to pick-up new claude-code versions any more, and that an extra switch will be required e.g. brew upgrade --greedy-latest. Do you find the same?
  • The fix also backed-out my resolved sha256 change, reverting to sha256 :no_check. I'm wondering whether that's because you found this didn't work with the change, or because brew audit complains:
brew audit --cask javabrett/claude-latest/claude-code
audit for claude-code: failed
 - you should use sha256 :no_check when version is :latest
 - Casks with a `livecheck` should not use `version :latest`.
javabrett/claude-latest/claude-code
  * you should use sha256 :no_check when version is :latest
  * Casks with a `livecheck` should not use `version :latest`.
Error: 2 problems in 1 cask detected.

I think those ^^ can be safely ignored for this kind of private tap and workaround WDYT?

I've restored that change and will run with it for some weeks to see if it's OK - seems OK with last upgrade to 2.1.49. LMK if you want another PR.

yurukusa · 3 months ago

This happens because Claude Code checks for updates independently of your package manager. When installed via Homebrew, the TUI's "update available" banner checks Anthropic's version endpoint, while brew upgrade checks the Homebrew formula — and they can be out of sync.
Workaround 1 — Use the native installer instead of Homebrew:

brew uninstall --cask claude
curl -fsSL https://claude.ai/install.sh | sh

The native installer uses claude --update which checks the same source as the TUI banner, so they stay in sync.
Workaround 2 — Dismiss and ignore the banner:
If you prefer to stay on Homebrew, the update banner is cosmetic — it doesn't affect functionality. The version you have via Homebrew may lag behind the native installer by a few hours/days until the Homebrew formula is updated.
Workaround 3 — Force brew to pull the latest:

brew update && brew upgrade --cask claude --greedy

The --greedy flag forces Homebrew to re-check even if it thinks you're up to date. This can help when the cask has been updated but brew's cache hasn't caught up.

brandonaaskov · 3 months ago

@yurukusa that's not even the right package with homebrew, it's claude-code and the greedy flag is not going to make it update if the formula hasn't been updated. Besides, that's treating a symptom, not the problem.

The issue is that it's looking at the wrong package manager for the version: simple as that. If a user installed with "Package Manager A" it shouldn't be showing details from "Package Manager B". And requiring the native installer over a supported package manager is not a solution either.

brandonaaskov · 3 months ago

The PackageManagerAutoUpdater component compares the installed version against the latest release channel by default, but the Homebrew cask tracks the stable channel. When latest is ahead of stable, every Homebrew user sees a phantom "Update available! Run: brew upgrade claude-code" notification that brew upgrade can never satisfy.

How it works (from binary analysis of my current version, v2.1.81)

The update check flow in PackageManagerAutoUpdater:

  1. Reads the configured channel: settings?.autoUpdatesChannel ?? "latest"defaults to "latest"
  2. Fetches the latest version for that channel (queries the release manifest)
  3. Detects the package manager via detectPackageManager() — correctly returns "homebrew"
  4. Compares installed version vs. the fetched version
  5. If the fetched version is newer → displays: Update available! Run: brew upgrade claude-code

The Homebrew cask's livecheck points at the stable channel:

livecheck do
  url "https://storage.googleapis.com/claude-code-dist-.../claude-code-releases/stable"
end

So when latest > stable, the notification fires but brew upgrade reports "already up to date" because Homebrew correctly has the latest stable version.

Why this matters

  • This issue has been open since November 2025 with dozens of confirmations across macOS, WSL2, and Linux
  • The current "fix" (documented in the Homebrew cask caveats) requires every user to manually edit ~/.claude/settings.json — nobody reads cask caveats
  • The detection infrastructure is already in place; only the default channel logic needs to change
ahammel · 3 months ago

Confirming this on 2.1.81 (latest as of 2026-03-31). claude --version and brew info claude-code both report 2.1.81, but the update banner appears on every startup.

$ claude --version
2.1.81 (Claude Code)

$ brew info claude-code
==> claude-code: 2.1.81
https://www.anthropic.com/claude-code
Installed
/opt/homebrew/Caskroom/claude-code/2.1.81 (193.3MB)
  Installed using the formulae.brew.sh API on 2026-03-28 at 14:03:51

$ brew upgrade claude-code
Warning: Not upgrading claude-code, the latest version is already installed

Appears the internal version check queries the npm registry rather than the installed binary version, causing a false positive for Homebrew cask installs.

Note: Claude Code itself (claude-sonnet-4-6) noticed this issue, suggested filing a bug report, and submitted this comment.

urda · 3 months ago

For my homebrew setting "autoUpdatesChannel": "stable", in my settings.json appears to have resolved it.

oojacoboo · 3 months ago

Is this broken again? I thought it was resolved with the "autoUpdatesChannel": "stable" setting. But today, I'm getting the notice and brew upgrade claude-code insists I have the latest version. I've also ensured that I've updated homebrew's casks.

% brew upgrade --cask claude-code
Warning: Not upgrading claude-code, the latest version is already installed

% brew upgrade claude-code
Warning: Not upgrading claude-code, the latest version is already installed

I think there is a delay between the time they push a release and the homebrew repository is updated? Either way, this notice is annoying. They should just disable the damn thing.

brandonaaskov · 3 months ago

@OctavianGuzu since you're the only one making commits in recent history, can you take a look at this?

brandonaaskov · 3 months ago

I wish people would stop posting "don't install via brew" because that is _not_ a solution to the core problem, that's only a solution to the symptom.

tobiasrein · 3 months ago
darthShadow · 3 months ago

I believe this was fixed in the latest release 2.1.92:

Fixed Homebrew install update prompts to use the cask's release channel (claude-code → stable, claude-code@latest → latest)
oojacoboo · 3 months ago

Which isn't yet on the brew channel b/c it uses stable.

brandonaaskov · 3 months ago

Like @oojacoboo said, it's still 2.1.89 on homebrew. So we still have no idea if this is actually fixed or not. @cirospaciari - this issue should not be closed until it's confirmed fixed, which it isn't right now.

Hypn0sis · 3 months ago

Still present.

deepakmahakale · 3 months ago

As of 13th April 2026, this is still happening.

claude says

Update available! Run: brew upgrade claude-code

while upgrading:

$ brew upgrade claude-code Warning: Not upgrading claude-code, the latest version is already installed
AbdelrahmanHafez · 3 months ago

It's okay everyone, Mythos decided it's solved.

Hypn0sis · 3 months ago

:)

Il giorno lun 13 apr 2026 alle ore 08:51 Hafez @.***>
ha scritto:

AbdelrahmanHafez left a comment (anthropics/claude-code#11405) <https://github.com/anthropics/claude-code/issues/11405#issuecomment-4234393803> It's okay everyone, Mythos decided it's solved. — Reply to this email directly, view it on GitHub <https://github.com/anthropics/claude-code/issues/11405#issuecomment-4234393803>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AS6IHC4LLR6S3T5L63BXODL4VSE7XAVCNFSM6AAAAACLX5XWS2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DEMZUGM4TGOBQGM> . You are receiving this because you commented.Message ID: @.***>
darthShadow · 3 months ago

You do realize you can upgrade to the latest channel on homebrew too right?

Use claude-code@latest for the latest & claude-code for the stable. Spamming this thread won't really help in any way because it's already resolved in the latest version.

oojacoboo · 3 months ago

Welp, on 2.1.92 now and it's STILL an issue. So, I'm STILL wasting time on this BS.

brew uninstall claude-code
brew install claude-code@latest

Then use brew upgrade claude-code@latest to upgrade, instead.

github-actions[bot] · 2 months ago

This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.