[BUG] Regression in Claude Desktop Code tab: chat pane no longer pins the user message corresponding to the response currently in view
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?
In a recent previous version of Claude Desktop (Code tab), the chat pane implemented a "sticky section header" pattern: the user message corresponding to the Claude response currently visible in the viewport stayed pinned at the top of the chat pane, and the pinned header updated dynamically as I scrolled between question/answer pairs.
In the current version of Claude Desktop, this behavior is gone. The chat pane scrolls as a flat list with no sticky context anchor. No setting in Settings > Claude Code, no entry in the Views menu, and none of the Verbose / Normal / Summary view modes (Ctrl+O) restore it.
NOTE: This bug is in the Claude Desktop App's Code tab (Electron UI layer), not the Claude Code CLI. I'm filing here because the Code tab is powered by Claude Code and there's no public issue tracker for the Desktop App.
What Should Happen?
The user message corresponding to the Claude response currently in view should stay pinned at the top of the chat pane, and should update dynamically as the scroll position crosses the boundary between two question/answer pairs.
This is the standard sticky-section-header pattern, analogous to iOS section headers or HTML position: sticky with multiple sticky elements in sequence: each user message acts as the section header for its corresponding Claude response, and whichever section is currently in the viewport has its header pinned at the top.
This behavior was present in a previous version of Claude Desktop and provided essential context during long agentic sessions where Claude responses span several screens of tool calls, diffs, and code blocks.
Error Messages/Logs
N/A. This is a UI behavior regression, not an error condition. No log output is produced.
Steps to Reproduce
- Open Claude Desktop and switch to the Code tab.
- Select any project folder and start a session.
- Submit at least 2-3 user prompts that produce long Claude responses, e.g.:
- Prompt A: "Walk me through the architecture of this codebase file by file."
- Prompt B: "Now refactor the main module to use dependency injection."
- Prompt C: "Write tests covering the changes from prompt B."
- Once Claude has finished responding to all three prompts, scroll up through the chat pane, crossing the visual boundaries between Claude's response to prompt C, B, and A in turn.
- Observe the top of the chat pane during the scroll.
Expected: at any scroll position, the user prompt that initiated the response currently in view is pinned at the top of the chat pane, and the pinned prompt changes (A ↔ B ↔ C) as you cross between sections.
Observed: no message is pinned. The chat scrolls as a flat list.
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
Version 1.7196.0 (2dbd78) (Claude Desktop)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
iTerm2
Additional Information
How this differs from existing sticky-related issues
This report is not a duplicate of any of the following — please read carefully before closing as duplicate:
- #36146 describes a static pinning of the FIRST user message in the VS Code extension (a bug where the wrong message stays stuck forever). This report is about a different, correctly-working behavior: the dynamically-updating section header that tracks scroll position.
- #42653 is a follow-up to #36146 asking to make the (statically) pinned initial prompt collapsible. Same static-pinning topic.
- #50366 asks to make a static "most-recent user message" sticky element clickable in the VS Code extension. Also static, not dynamic.
- #53382 is about auto-scroll-to-bottom during streaming in Claude Desktop. Unrelated scroll concern.
The behavior described here is the dynamic section-header pattern: the pinned header is whichever user message is the "section" for the currently-visible scroll position, and it changes as the user scrolls between different question/answer pairs.
Why It Matters
Long agentic sessions routinely produce responses several screens tall. Without a sticky anchor showing which user prompt the visible content is answering, navigating the transcript means repeatedly scrolling back to the top of each response to remember the original ask. The sticky section header pattern is the standard solution to this problem and was correctly implemented before. Restoring it (with the dynamic-update logic fixed per #36146) would meaningfully improve the Code tab UX for any non-trivial session.
Suggested implementation
Standard CSS position: sticky on each user message bubble, with top: 0 and the chat pane as the scrolling container. Each successive sticky element naturally replaces the previous one as it scrolls into the top of the viewport. No JavaScript required for the core behavior.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗