TUI redraws force scroll-to-bottom, ignoring terminal scroll-to-bottom=no-output setting

Resolved 💬 4 comments Opened Mar 22, 2026 by asgeirtj Closed Mar 25, 2026

Description

Claude Code's TUI output forces the terminal viewport to scroll to the bottom during long conversations, overriding the terminal's scroll-to-bottom = no-output configuration. This makes it impossible to review earlier output while Claude is actively streaming or redrawing.

Behavior

  • Works correctly at the start of a conversation
  • After the conversation reaches a certain length, the viewport is forced to the bottom on every TUI redraw (status line animation, streaming text)
  • The terminal's scroll-to-bottom setting is completely bypassed
  • Survives terminal restart — tied to conversation length, not session state

Reproduction

  1. Configure terminal with scroll-to-bottom = no-output, no-keystroke (tested in Ghostty, but also confirmed in iTerm2 and Terminal.app)
  2. Start a Claude Code session
  3. Have a conversation long enough (several back-and-forth exchanges)
  4. Scroll up to review earlier output
  5. Observe: viewport is yanked back to the bottom on every Claude Code redraw

Root Cause

Claude Code's TUI appears to use terminal escape sequences (cursor repositioning / screen redraws) that force scroll-to-bottom regardless of terminal configuration. This is not regular PTY output — it bypasses the terminal's no-output scroll behavior.

Expected Behavior

When the user has scrolled up to review previous output, Claude Code should not force the viewport back to the bottom. The terminal's scroll-to-bottom configuration should be respected.

Related

  • ghostty-org/ghostty#10456 — Ghostty discussion confirming this is a Claude Code issue, not terminal-side
  • #35208 — Related scroll-to-bottom issue on edit acceptance

Environment

  • Claude Code CLI (latest)
  • macOS (Darwin 25.3.0, Apple M4 Pro)
  • Tested in: Ghostty (tip channel), iTerm2, Terminal.app

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗