Terminal title rewritten every 960ms (activity glyph is part of the title payload), restarting terminal status animations
Environment
- Claude Code 2.1.231 (native install)
- macOS 26 (Darwin 25.5.0), Apple Silicon
- iTerm2 3.7b, attached via
tmux -CC(control mode); tmux 3.7b;TERM=tmux-256color
Behavior
While a turn is in flight, Claude Code rewrites the terminal title roughly every 960 ms.
The OSC 0 payload is <glyph> <title>, where the glyph alternates ◐ / ◑ while busy (✳ when idle). The title text is stable across those writes — only the glyph changes. Because the composed string differs each frame, every frame produces a real title write.
Impact
Under tmux -CC, each write updates pane_title; tmux pushes that to the control-mode client, and iTerm2 restarts its tab status/progress animation. The result is an indicator that re-animates once per second for the entire turn — visually a gradient that never finishes sliding.
Nothing in the chain deduplicates: Claude Code doesn't compare against the last title it emitted, and tmux's title handling stores and notifies unconditionally.
Why there is no workaround
CLAUDE_CODE_DISABLE_TERMINAL_TITLEremoves the title entirely. That defeats the purpose — I rely on the generated session topic to tell apart many tabs started in the same directory.- A code path that omits the glyph appears to exist, but is reachable only behind an internal feature gate (
tengu_terminal_sidebar) combined with theshowStatusInTerminalTabconfig, so it can't be enabled locally. - tmux can strip the glyph in format strings (
automatic-rename-format,status-right,pane-border-format), but it cannot rewritepane_titleitself: there is nopane-title-changedhook, andallow-set-title offis again all-or-nothing. iTerm2 in control mode readspane_titledirectly, so format-level rewriting doesn't reach it.
Net effect: there is currently no configuration that keeps the title and stops the per-second churn.
Requests
Any one of these would resolve it:
- A setting to omit the activity glyph from the terminal title (i.e. make the existing no-prefix path reachable).
- Skip the OSC write when the composed title is unchanged from the last one emitted.
- Make the glyph animation opt-in, or slow it substantially.
Option 2 seems strictly good regardless — it removes redundant terminal writes for every user, not just multiplexer setups.
Note
I have not verified whether the OSC 9;4 progress reporting (terminalProgressBarEnabled) also re-emits per frame; if it does, it would be a second source of the same restart behavior.
Workaround for anyone hitting this
The session topic is persisted to the transcript as {"type":"custom-title","customTitle":"…"}, so it's possible to keep CLAUDE_CODE_DISABLE_TERMINAL_TITLE=1 and set the tab title from a Stop hook instead — once per turn rather than once per second.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗