[iPad/iOS Safari] Scroll position jumps far up when scrolling up slightly in chat history, requires long scroll back down to return to current conversation
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?
Environment
| Item | Value |
|------|-------|
| Platform | iPad (iPadOS) |
| Browser | Safari |
| iPadOS version | iPadOS 18.6
| iPad model | iPad Air 5
| Claude Code version | Web / claude.ai/code |
| Date observed | 2026-06-15 (consistently reproducible) |
| Conversation length | Long (~100+ messages) |
Summary
When scrolling upward by a small amount in a long chat history on iPad Safari, the scroll position jumps far up (to messages from many turns / hours ago) instead of moving smoothly. To return to the current bottom of the conversation, the user must perform a long downward scroll, which is highly disruptive during active sessions.
Steps to reproduce
- Open
claude.ai/code(or Claude Code web) on an iPad with Safari - Have a long-running conversation (50+ exchanges)
- While near the bottom of the conversation, perform a small upward swipe (e.g., to re-read the previous message you just received)
- Observe scroll position jumping far upward to old messages
- Scroll down repeatedly to return to current position
Expected behavior
- Small upward scroll should move the viewport by approximately the same distance as the gesture
- Scroll position should be preserved smoothly without sudden jumps
- Returning to "now" should be near-instantaneous (e.g., a single tap on a "scroll to bottom" affordance, or a momentum-based return)
Actual behavior
- Small upward scroll triggers a large jump to messages from much earlier in the conversation (possibly the top of a virtualized chunk being re-rendered)
- No visual indicator that this jump occurred
- Returning requires manual, lengthy downward scrolling
- This makes it nearly impossible to reference a message I just saw — by the time I scroll back down, the new assistant reply may have already arrived
Impact
- High disruption during active conversations on iPad
- Particularly problematic when:
- Reviewing the assistant's previous answer to compose a follow-up
- Copying code/text from a recent message
- Using Claude Code as a mobile/away-from-desk tool
- Forces user to switch to a desktop browser for any non-trivial conversation, defeating the value of iPad as a portable client
Suspected cause
Looks like virtualized scrolling (e.g., react-window / react-virtualized) interacting badly with iOS WebKit's momentum scrolling, causing scroll offset to be lost or jumped to the top of a recycled chunk during re-layout. May be related to:
- Scroll anchoring not being properly maintained on iOS Safari
overflow-anchorCSS not behaving as expected- IntersectionObserver thresholds triggering bulk position recalculations
Workaround currently used
- Switching to desktop browser (defeats the purpose of iPad use)
- Avoiding upward scroll entirely (constrains conversation review)
Suggested fix direction
- Preserve scroll position via
scroll: anchoror explicitscrollTopsnapshotting before list re-renders - Add a floating "Jump to latest" button that appears whenever the user scrolls more than X px above the bottom
- On iOS Safari, consider falling back to non-virtualized rendering for conversations under N messages, since the cost of virtualization is outweighed by the UX cost
Additional context
- Issue is reliably reproducible every session on iPad
- Does not occur on macOS Safari or Chrome (desktop)
- Have not tested on iPhone Safari (smaller viewport may mask or change behavior)
---
Thanks for the work on Claude Code — this is the single biggest UX papercut for iPad usage, and addressing it would significantly improve the mobile experience.
What Should Happen?
A small upward scroll should move the viewport by approximately the same distance as the gesture — not jump to ancient history.
Specifically:
- Scroll position should be preserved during list re-renders / virtualization recycling (e.g., via
overflow-anchor, explicitscrollTopsnapshotting, or scroll anchoring API). - Add a floating "Jump to latest" button that appears whenever the user has scrolled more than N px above the bottom — this is standard in Slack/Discord/Telegram and would mitigate the issue even if root cause is hard to fix.
- Consider non-virtualized rendering for conversations under a certain message count on mobile Safari — virtualization cost may exceed UX benefit on smaller devices.
<!-- Failed to upload "ScreenRecording_06-17-2026 11-14-42_1.mp4" -->
Error Messages/Logs
Steps to Reproduce
Steps to Reproduce
- On an iPad, open Safari and navigate to
claude.ai/code - Sign in and either start a new conversation or open one that already has 50+ messages
- Continue the conversation until the viewport is automatically scrolled to the bottom (latest assistant reply visible)
- With one finger, swipe upward by a small distance (e.g., 1–2 cm) — just enough to re-read the previous message you sent or received
- Observe that the viewport jumps abruptly to messages far earlier in the conversation (often several screens up, sometimes to the very top)
- To return to the latest message, manually swipe downward repeatedly — this can take 10+ seconds in a long session, and there is no "jump to latest" affordance
Frequency: Reproduces on every single attempt in a long conversation. Not intermittent.
Notes:
- Does not reproduce on macOS Safari, Chrome (desktop), or Firefox (desktop)
- Have not tested on iPhone Safari
- Reproduces regardless of whether assistant is still streaming a response or has finished
- Reproduces both immediately after sending a message and after idle pause
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
1.260611.1
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_