--chrome / /chrome always shows Status: Disabled on Microsoft Edge — extension prioritizes Desktop app's native host over CLI's, and CLI host doesn't complete handshake even when it wins
Environment:
- Claude Code:
2.1.216(native install, darwin-arm64) - OS: macOS 26.5.1 (Build 25F80), Apple Silicon
- Browser: Microsoft Edge, "Claude in Chrome" extension v1.0.81 (
fcoeoabgfenejglbffodgkkbkcdhcgfn) - Claude desktop app also installed
Symptom:claude --chrome / running /chrome in a session always reports:
Status: Disabled
Extension: Installed
regardless of "Reconnect extension", restarting the browser, or restarting the CLI session with --chrome explicitly passed.
What I found while debugging:
- Stale native-host wrapper (points to a real gap in the update process):
~/.claude/chrome/chrome-native-hostis a generated shell script hardcoded to an absolute version path, e.g.:
``sh`
exec "/Users/<user>/.local/share/claude/versions/2.1.90" --chrome-native-host
--chrome
Auto-update prunes old version directories over time, so after several updates this script pointed at a binary that no longer existed on disk. Nothing regenerates or revalidates this script on update — it appears to only be written once at initial setup. Suggest either pointing it at the stable ~/.local/bin/claude` symlink, or regenerating it on every update.
- Extension prioritizes the Desktop app's native host over the CLI's, unconditionally: Decompiling the extension's
service-worker.ts-*.js, it races two native hosts in a fixed list order:
``js`
const t=[{name:"com.anthropic.claude_browser_extension",label:"Desktop"},
{name:"com.anthropic.claude_code_browser_extension",label:"Claude Code"}];
for(const a of t) // ping/pong handshake, 10s timeout per entry, first success wins
com.anthropic.claude_browser_extension
→ /Applications/Claude.app/Contents/Helpers/chrome-native-host`. This helper answers the ping successfully even when the Claude desktop app itself is not running — so as long as the desktop app is installed, the extension never even attempts the CLI's host. There's no way in the extension's own settings UI to prefer the CLI over the Desktop app.
- Even when Desktop is forced out of the race, the CLI's host still doesn't report Enabled: Renaming Desktop's native-messaging manifest (Edge-scoped only) so it can't be found forces the extension to fall through to
com.anthropic.claude_code_browser_extension. When this happens,/Users/<user>/.local/bin/claude --chrome-native-hostdoes spawn and holds a Unix socket open well past the extension's 10-second ping timeout — but/chromestill reportsStatus: Disabled, with no error surfaced anywhere. This suggests the CLI-side handshake (the "pong" reply, or whatever signals success back to the interactive session) isn't completing correctly, or the interactive session polling for status isn't picking up a successful connection.
Expected: /chrome should either connect successfully, or surface a specific error (extension not found / handshake failed / desktop app is taking priority) instead of silently showing Disabled forever.
Repro:
- Have both the Claude desktop app and Claude Code CLI installed, with the "Claude in Chrome" extension installed in Microsoft Edge and signed in.
- Run
claude --chrome, then/chrome. - Observe
Status: Disabledregardless of "Reconnect extension", browser restarts, or fresh CLI sessions.