On a Tuesday morning, coffee in hand at my iMac, I tried to answer a simple question: which release channel is my Claude Code actually following, and how far behind is it? The update notices kept appearing, yet I could not say how many versions I was missing.
The official setup page describes stable as typically about one week old, skipping releases with major regressions, while latest is the default and picks up new versions right away. "About a week" is easy to understand. It does not tell you how many versions that is on your own machine.
So I pulled the numbers from the registry today.
Today's registry values
Querying the dist-tags on npm, today (November 10, 2026) returned this:
| Tag | Version |
|---|---|
| stable | 2.1.311 |
| latest | 2.1.322 |
Looking only at the last number, 322 minus 311 suggests 11 versions apart. That is how I read it at first.
But when I counted the versions that were actually published after stable, there were 9, not 11. Version numbers have gaps, so subtraction overcounts.
These values move from day to day, so please read them as a record of today only.
The counting script
This Python script fetches the published versions, then counts the ones newer than stable and up to latest. It uses only the standard library.
#!/usr/bin/env python3
"""Count how many versions sit between npm's stable and latest."""
import json, urllib.request
URL = "https://registry.npmjs.org/@anthropic-ai/claude-code"
req = urllib.request.Request(URL, headers={"Accept": "application/vnd.npm.install-v1+json"})
with urllib.request.urlopen(req, timeout=20) as r:
meta = json.load(r)
def key(v):
# Compare plain versions such as 2.1.319 (skip -beta and the like)
core = v.split("-")[0]
return tuple(int(x) for x in core.split("."))
plain = sorted((v for v in meta["versions"] if "-" not in v), key=key)
tags = meta["dist-tags"]
stable, latest = tags["stable"], tags["latest"]
gap = [v for v in plain if key(stable) < key(v) <= key(latest)]
print(f"stable={stable} latest={latest}")
print(f"versions published after stable: {len(gap)}")
print("first and last:", gap[:1], gap[-1:])Today it printed:
stable=2.1.311 latest=2.1.322
versions published after stable: 9
first and last: ['2.1.312'] ['2.1.322']Two reasons for the shape of the code:
- Tuples, not strings. Compared as strings, "2.1.99" would sort after "2.1.322".
- Hyphenated versions are excluded. Mixing in pre-releases blurs what "ahead of stable" means.
Checking against your own version
The registry gap matters less than your installed version. Two commands answer that:
claude --version
npm view @anthropic-ai/claude-code dist-tags --jsonIf your version matches the stable tag, you are following the channel as intended. If it is older, updates may have stalled. The setup page says claude doctor shows the result of the most recent update attempt.
Switching channels
The channel is set by autoUpdatesChannel in settings.json. The default is "latest"; "stable" moves you to the version that is typically about a week old.
{
"autoUpdatesChannel": "stable",
"minimumVersion": "2.1.100"
}If you are already on a build newer than stable when you switch, your version could go down. According to the docs, switching through /config asks whether to stay on the current version or allow the downgrade; choosing to stay sets minimumVersion to that version, and switching back to latest clears it.
With Homebrew, the cask name decides the channel instead: claude-code tracks stable and claude-code@latest tracks latest. I now check the cask name first.
How I read the number
Here is how I treat the count. It is a rule of thumb for an indie setup, not a right answer.
| Count | My reading |
|---|---|
| 0–3 | Nearly caught up. I do nothing. |
| 4–10 | Today's range. I update when my current task is done. |
| 11 or more | I suspect stalled updates and check claude doctor first. |
Whether the count grew since last month's check matters more than the count itself.
My rule
As an indie developer, I swing between days when I want the newest feature and days when I want nothing to break. I used to change channels by mood.
What I noticed this time is that I had been afraid of a gap whose size I did not know. Once the number was 9, I could calmly decide whether it was a day to wait or a day to catch up.
Count the gap once a month, then decide—don't fear it by feel. I added that as one line to my monthly notes.
What to do next
Save the script and write down today's output in one line. Once the numbers pile up, you will see how far behind stable runs in your own setup, from records instead of impressions.