[BUG]TUI banner duplication stacking repeatedly on macOS Terminal.app (v2.1.104) — blocking daily work
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?
On macOS Terminal.app with Claude Code CLI v2.1.104, the entire TUI (Claude Code logo, version header, working directory, input box,
and bottom status bar) stacks multiple times vertically in the same terminal window after launching claude and sending a single
message like "hello". The banners pile on top of each other, each one progressively narrower, as if SIGWINCH is being fired
repeatedly on startup.
Environment
- Claude Code version: 2.1.104
- OS: macOS (Darwin 25.2.0, Apple Silicon M1, 8GB RAM)
- Terminal: Apple Terminal.app, version 466
- Shell: zsh
- TERM: xterm-256color
- No tmux / screen
- Window was NOT resized manually
Steps to Reproduce
- Open a fresh Terminal.app window
- Run claude
- Type hello and press Enter
- Observe: the full TUI banner (logo + version + cwd + prompt + status bar) renders multiple times stacked vertically in the same
window
What I've Already Tried
- Cleared all SessionStart hooks — issue persists
- Set CLAUDE_CODE_NO_FLICKER=1 — issue persists (please confirm if this flag still exists in v2.1.104)
- Verified no hook writes to stdout during startup
- Confirmed TERM is correct
- Did not resize the window
Impact
This is severely blocking my daily work. I have lost multiple days of development time because of this rendering bug. The terminal
becomes unusable within seconds of starting a session, and I have already submitted official support requests several days ago with
no response. This is a long-standing TUI issue on macOS Terminal.app that has been acknowledged by the community but not fully
resolved.
Expected Behavior
The TUI should render once and redraw in place using the alternate screen buffer — not stack repeated copies of the banner in the
scrollback.
Request
Please prioritize a fix for Apple Terminal.app users, or at minimum provide a --plain / --no-tui / --legacy fallback mode so we can
keep working while the TUI bug is being investigated.
Screenshots attached.
<img width="962" height="1088" alt="Image" src="https://github.com/user-attachments/assets/dbe60a1a-37a9-40b1-bec2-7d4d7c48d053" />
What Should Happen?
<img width="962" height="1088" alt="Image" src="https://github.com/user-attachments/assets/742ebd75-8d8a-47e7-a5d2-d5350d22aa0f" />
<img width="920" height="1081" alt="Image" src="https://github.com/user-attachments/assets/92e3ba7a-c932-4a9f-adc3-65ea306ea399" />
<img width="962" height="1088" alt="Image" src="https://github.com/user-attachments/assets/dcf05051-9832-48be-b6d8-47643823f54b" />
<img width="950" height="1086" alt="Image" src="https://github.com/user-attachments/assets/db036eaf-7194-473d-8b64-d42382c9e785" />
<img width="950" height="1086" alt="Image" src="https://github.com/user-attachments/assets/41c4c5a4-2c38-479a-9c86-3a88342f4579" />
Error Messages/Logs
Steps to Reproduce
- Open a fresh macOS Terminal.app window (no tmux, no screen)
- Run
claude - Wait for the TUI to render (banner + prompt + status bar)
- Type any message, e.g.
hello, and press Enter - Observe: the full TUI (logo + version header + working directory + input box + bottom status bar) stacks multiple times
vertically in the same window, each copy progressively narrower — as if SIGWINCH is being fired repeatedly on startup.
Environment:
- Claude Code 2.1.104
- macOS (Darwin 25.2.0, Apple M1, 8GB RAM)
- Terminal.app version 466
- zsh, TERM=xterm-256color
- No tmux/screen, window was NOT resized
Already tried:
- Cleared all SessionStart hooks — still happens
- Set CLAUDE_CODE_NO_FLICKER=1 — still happens
- Confirmed no hook writes to stdout during startup
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.104
Platform
Other
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_
Showing cached comments. Read the full discussion on GitHub ↗
11 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Update: Switching to iTerm2 did NOT fix the issue.
I followed community suggestions and installed iTerm2 (3.6.9, official build from Homebrew), but the TUI banner duplication is still happening — the
entire Claude Code interface (logo, version, working directory, input box, status bar) continues to stack repeatedly in the same window after any
interaction, with each copy rendered at a different width.
Additional workarounds I've tried (all failed):
This is not a terminal-emulator issue — it reproduces across both Terminal.app and iTerm2, which strongly suggests the root cause is in Claude Code's TUI
rendering layer (likely ink/React not using the alternate screen buffer, or repeated SIGWINCH-driven full redraws without clearing the previous frame).
<img width="962" height="1088" alt="Image" src="https://github.com/user-attachments/assets/79d84301-7337-4310-87b3-5b11bb79ac54" />
Hitting this on macOS Terminal.app, Claude Code 2.1.104, Darwin 25.4.0, zsh. Custom
▎ statusLine configured in ~/.claude/settings.json (single-line output with ANSI colors
▎ and multibyte ·/⚡ characters). Scrollback accumulates duplicate copies of the
▎ statusline + model banner throughout a session — after ~1hr of use, scrolling up shows
▎ the CID line repeated dozens of times interleaved with actual output. Screenshots
▎ attached.
<img width="676" height="512" alt="Image" src="https://github.com/user-attachments/assets/654e2f84-c944-4222-a927-51060a1db05e" />
Undergoing the same issue. I think it arrived with 2.1.68 or something around the time of the 1M context, at the time if i remember i had it isolated to only iterm2 and even with zellij adn messing with the settings, i had problems with using Better Snap Tool and windows resizing. Suddenlty it is now occurring in terminal as of the most recent update
▗ ▗ ▖ ▖ Claude Code v2.1.104
Opus 4.6 (1M context) · Claude Max
▘▘ ▝▝ ~/CCP/P05-Testing-Ground-02-28-26
❯ having terrible probelms with bettersnap tool and using the commands in bettersnap tool to rezie terminal windows right now, move
terminal windows, resize the terminal windows, moving terminal windows with my better snap tool commands. this hasn't happened for a
long tiem. it occurred at one point around a change to like claude code 2.1.68 or something and we resolved it but it ruined
iterm2. so far i've stayed in terminal .. it was working fine earlier but suddenly now there seems to be whenever i open betternsap
tool and try to resize claude code in terminal it elongates / repeats certaion responses and adds so many additional lines.
✢ Gesticulating… (11s · thinking)
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0─────────25────────50────────75──87───100 [0/1,000,000|0%] P05-Testing-
┃──────────│─────────│─────────│───│─────┃ In:0|Out:0|Total:0 Ground-02-28-26 0 tokens
▗ ▗ ▖ ▖ Claude Code v2.1.104
Opus 4.6 (1M context) · Claude Max
▘▘ ▝▝ ~/CCP/P05-Testing-Ground-02-28-26
❯ having terrible probelms with bettersnap tool and using the commands in bettersnap tool to rezie terminal windows right now, move terminal
windows, resize the terminal windows, moving terminal windows with my better snap tool commands. this hasn't happened for a long tiem. it
occurred at one point around a change to like claude code 2.1.68 or something and we resolved it but it ruined iterm2. so far i've stayed in
terminal .. it was working fine earlier but suddenly now there seems to be whenever i open betternsap tool and try to resize claude code in
terminal it elongates / repeats certaion responses and adds so many additional lines.
✢ Gesticulating… (11s · thinking)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0─────────25────────50────────75──87───100 [0/1,000,000|0%] P05-Testing-
┃──────────│─────────│─────────│───│─────┃ In:0|Out:0|Total:0 Ground-02-28-26 0 tokens
▗ ▗ ▖ ▖ Claude Code v2.1.104
Opus 4.6 (1M context) · Claude Max
▘▘ ▝▝ ~/CCP/P05-Testing-Ground-02-28-26
❯ having terrible probelms with bettersnap tool and using the commands in bettersnap tool to rezie terminal windows right now, move terminal windows,
resize the terminal windows, moving terminal windows with my better snap tool commands. this hasn't happened for a long tiem. it occurred at one
point around a change to like claude code 2.1.68 or something and we resolved it but it ruined iterm2. so far i've stayed in terminal .. it was
working fine earlier but suddenly now there seems to be whenever i open betternsap tool and try to resize claude code in terminal it elongates /
repeats certaion responses and adds so many additional lines.
✢ Gesticulating… (11s · thinking)
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0─────────25────────50────────75──87───100 [0/1,000,000|0%] P05-Testing-
┃──────────│─────────│─────────│───│─────┃ In:0|Out:0|Total:0 Ground-02-28-26 0 tokens
▗ ▗ ▖ ▖ Claude Code v2.1.104
Opus 4.6 (1M context) · Claude Max
▘▘ ▝▝ ~/CCP/P05-Testing-Ground-02-28-26
❯ having terrible probelms with bettersnap tool and using the commands in bettersnap tool to rezie terminal windows right now, move terminal windows,
resize the terminal windows, moving terminal windows with my better snap tool commands. this hasn't happened for a long tiem. it occurred at one point
around a change to like claude code 2.1.68 or something and we resolved it but it ruined iterm2. so far i've stayed in terminal .. it was working fine
earlier but suddenly now there seems to be whenever i open betternsap tool and try to resize claude code in terminal it elongates / repeats certaion
responses and adds so many additional lines.
✳ Gesticulating… (11s · thinking)
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0─────────25────────50────────75──87───100 [0/1,000,000|0%] P05-Testing-
┃──────────│─────────│─────────│───│─────┃ In:0|Out:0|Total:0 Ground-02-28-26 0 tokens
Seeing the same issue for a few days now.
Confirming this reproduces on Windows 11 / Git Bash (MSYS2) — not just macOS Terminal.app. The symptom is slightly different but the signature matches: SIGWINCH/redraw-triggered scrollback duplication.
Environment:
Symptom on Windows:
Instead of only the startup banner stacking, the last full assistant message gets re-emitted 2–6× into scrollback during long-running tool calls (4 parallel sub-agents, ~7.5 min total). Each copy is intact — not progressively narrower like the macOS report. Banner (\
▐▛███▜▌ Claude Code v2.1.114\) also re-prints between duplicates, and the most recent user prompt appears to echo again.Trigger pattern:
Task\/\Agent\tool calls with background sub-agentsWorkarounds tried:
CLAUDE_CODE_NO_FLICKER=1\just set, will report back after a few daysRelated: Closed issue #21039 (\"Multiple startup banner renders on Windows — Ink initializes 3 times\") looks like the same root cause regressing. Worth reopening or linking.
Still reproducing on v2.1.116 on macOS Terminal.app — despite the sibling issue #47235 being marked as "fixed as of version 2.1.116". Posting an updated repro + bisection here because the trigger appears to be subtly different from pure SIGWINCH.
Environment
TERM=xterm-256color,COLORTERM=truecolor,TERM_PROGRAM=Apple_TerminalSymptom
On fresh launch of
claude --dangerously-skip-permissionsin a default-sized Terminal.app window, the welcome banner + border + status line is rendered 6–10 times in succession, each frame with a progressively wider horizontal separator:Growth stops once the frame width reaches the actual terminal width. The live alt-screen pane (prompt area) works correctly afterwards, but scrollback is flooded with stacked welcome frames.
Abbreviated paste:
Bisection
| Condition | Cascade? |
|---|---|
|
claude --dangerously-skip-permissionsin 80-col window | Yes || Plain
claude(no flag) in 80-col window | No ||
claude --dangerously-skip-permissionsin window pre-sized to ≥155 cols | No |The only user-visible difference between the flagged and unflagged code paths is the extra footer line
⏵⏵ bypass permissions on (shift+tab to cycle), which is rendered only when--dangerously-skip-permissionsis active.Hypothesis
The footer contains
⏵(U+23F5, BLACK MEDIUM RIGHT-POINTING TRIANGLE), which has ambiguous East Asian Width. macOS Terminal falls back to Apple Color Emoji and renders it as a 2-column emoji glyph, while string-width / wcwidth-style measurement in the TUI (no VS16 U+FE0F present) counts it as 1 column. Two such glyphs (⏵⏵) plus a space = a 4-column rendering miscounted as 2 columns.A similar ambiguity exists for
⏱(U+23F1) in the statusline when a user has a custom statusline script containing it. In the flagged code path the miscount is on a line rendered by CC itself, not by user config — so any user running--dangerously-skip-permissionsin a narrow window will hit it, not just those with custom statuslines.The growth pattern is consistent with: content overflows the TUI's assumed width → layout engine retries with a larger width → overflows again (because the underlying measurement is still wrong) → retries wider → eventually catches up to the terminal's actual width, at which point the mismatch becomes moot.
The fact that pre-sizing the window to ≥155 cols eliminates the cascade supports this: when actual width already exceeds the overflow point from the first render, the retry loop never fires.
Related: this is the same general Unicode-width-miscalc family as #30471 ("TUI misalignment caused by string-width miscalculating emoji character width on macOS 12") and #46909 ("Permission mode icon U+23FA ⏺ renders as two garbled boxes"). The U+23Fx block (media control symbols) is particularly affected — these are ambiguous-width glyphs that terminals render via emoji fallback but string-width tables often classify as 1-col.
Regression window
Started appearing for me ~2 days prior to 2026-04-21. Earlier versions on the same hardware / same Terminal.app / same settings did not cascade.
Workarounds
--dangerously-skip-permissions(removes the triggering⏵⏵footer line)Neither is a fix — the bug is in CC's width measurement / overflow-retry behavior.
Suggested fixes
⏵(U+23F5) with a width-stable glyph in the bypass indicator — e.g. plain>>(two ASCII chars) or include U+FE0F (VS16) after each⏵to force emoji presentation and align the width assumption across terminal and TUI.⏱U+23F1, record⏺U+23FA, etc.) and normalize via VS16 or ASCII substitution.Happy to provide additional logs or a terminal recording (asciinema) if useful.
Same here
Not a duplicate. Distinct trigger, signature, and root cause from #46462 / #46834 / #46499 / #47235.
| | #47235 (closed, "fixed in 2.1.116") | #46983 (this) |
|---|---|---|
| Trigger | Terminal resize | Fresh launch of
claude --dangerously-skip-permissionsin <155-col window. No resize, no prompt, no permission toggle. || Growth | Geometric (1→2→4→8) | Arithmetic (+6–9 cols per frame) until real terminal width is reached |
| Status on v2.1.116 | Closed as fixed | Still reproduces. Confirmed by @konepone, @limikelove200-lgtm, @ventilla, @charlie-elisity, @shinobu1729. |
#46834 re-emits the entire transcript on relayout — here only the welcome banner stacks, before any transcript exists. #46499 requires a prompt — here the cascade fires before any input. #46462 is closed and was about resize-driven enlargement.
Clean bisection (single variable):
claude --dangerously-skip-permissionsin 80-col → cascadeclaude(no flag) in 80-col → no cascadeclaude --dangerously-skip-permissionsin ≥155-col → no cascadeThe only delta between the flagged and unflagged paths is the footer
⏵⏵ bypass permissions on (shift+tab to cycle). U+23F5 hasEast_Asian_Width=A(ambiguous) andEmoji_Presentation=No— measured as 1 cell by string-width / Ink, rendered as 2 cells by macOS Terminal's emoji fallback. The 2-cell undercount overflows, the startup layout retries wider, still wrong, retries wider — the observed arithmetic growth.Same class as #30471 and #46909. Whatever #47235 patched lives in the SIGWINCH handler; this bug is in the first-paint pass, upstream of it.
Please remove the duplicate label. One-line fix: replace
⏵⏵with>>, or append\uFE0Fafter each⏵.+1 — observing a partial-fix variant of this on 2.1.119 / macOS Terminal.app (Darwin 24.6.0, Apple Silicon).
The full TUI no longer stacks (logo+header+cwd+status seem to redraw correctly in v2.1.119), but a single ghost input box
echoing the previous prompt is still rendered below the splash/version footer and persists across turns. Looks like the same
SIGWINCH/redraw root cause described here, just a milder leftover after whatever changed between 2.1.104 and 2.1.119.
Symptoms on 2.1.119:
/clear, Ctrl+L, or window resize — reappears on next turnFiled as #54050 — closing as duplicate of this since the root cause looks shared. Tracking under this issue going forward.
Subscription: Claude Max. Will try
CLAUDE_CODE_NO_FLICKER=1workaround mentioned in OP.Closing for now — inactive for too long. Please open a new issue if this is still relevant.