Summary
Add a user-configurable autoscroll mode to WebChat (Control UI) so long assistant replies don't yank the viewport down while the user is mid-read. Today the behavior is hardcoded: if the user is within ~450px of the bottom, the chat auto-scrolls on every streaming chunk; otherwise it shows a "↓ new messages" badge. There is no way to disable autoscroll always, and the 450px threshold is invisible to users.
Problem to solve
For long streaming replies (500+ words), the viewport keeps being dragged to the bottom each time a new chunk arrives. The user cannot finish reading the earlier portion without scrolling up — which then disables autoscroll temporarily, but feels reactive rather than intentional.
Concretely:
- The 450px threshold is implicit; users don't know they have to scroll up to "pause" autoscroll.
- Even if they do scroll up, attention is broken every time a long chunk arrives because the autoscroll briefly fights the user.
- There is no "I always want to read at my own pace" mode for users who prefer to pull the scroll down manually when ready.
This came up during real use: a long technical answer kept dragging the viewport mid-paragraph, making it impossible to scan back to the start of the answer.
Proposed solution
Add a chat setting (key: chatAutoScroll) with three modes:
- "always" — always pin to bottom on new chunks (legacy aggressive)
- "near-bottom" — current behavior (autoscroll only if user is within ~450px); this is the default
- "off" — never autoscroll automatically; user clicks the "↓ new messages" badge / scroll-to-bottom button when ready
Implementation appears to live in the ei(scrollHelper) function in dist/control-ui/assets/index-NYVkUQrq.js (the function that branches on chatUserNearBottom and the Xr = 450 threshold). Adding a settings.chatAutoScroll short-circuit at the top of that function would close this case with minimal surface area.
UX surface: expose the setting in the existing chat settings menu next to chatShowThinking and chatShowToolCalls. Default = "near-bottom" preserves current behavior; users who want the new behavior opt in.
Alternatives considered
- Scroll up manually to disable autoscroll for the current message — works, but breaks attention and is rediscovered each turn. Not a substitute for an explicit setting.
- Disable streaming and only render the final reply — defeats the purpose of streaming and removes the "I can see it's thinking" signal.
- Increase the 450px threshold — doesn't solve the issue for users who want "off entirely".
Impact
Affected: any WebChat user reading long replies (technical answers, code-heavy explanations, multi-section summaries).
Severity: Low-medium (cosmetic / UX friction, not data loss).
Frequency: every long reply.
Consequence: degraded reading experience, especially on smaller laptop screens where 450px is a large fraction of viewport height.
Asymmetry note: ChatGPT, Claude.ai, and most modern chat UIs all default to "near-bottom autoscroll" with a manual scroll-to-bottom button. None expose a hard off toggle — this would actually be a small UX edge over peers.
Evidence/examples
Existing related Control UI settings keys for reference (from index-NYVkUQrq.js):
- chatFocusMode
- chatShowThinking
- chatShowToolCalls
The natural place for the new key is alongside these. Persisting via the existing applySettings(...) path keeps the change minimal.
Companion: paired with the user-uploaded image persistence bug filed separately, this is part of a small "WebChat reading experience" cluster of polish work.
Additional information
Backward compatibility: default the new setting to "near-bottom" so existing users see no change. Only opt-in users get the new "off" mode (or the more aggressive "always" mode, if that's also desired).
Migration: none required; new key with sensible default.
Accessibility: respect prefers-reduced-motion. The current code already checks window.matchMedia('(prefers-reduced-motion: reduce)') for smooth vs instant — that path should be preserved.
Summary
Add a user-configurable autoscroll mode to WebChat (Control UI) so long assistant replies don't yank the viewport down while the user is mid-read. Today the behavior is hardcoded: if the user is within ~450px of the bottom, the chat auto-scrolls on every streaming chunk; otherwise it shows a "↓ new messages" badge. There is no way to disable autoscroll always, and the 450px threshold is invisible to users.
Problem to solve
For long streaming replies (500+ words), the viewport keeps being dragged to the bottom each time a new chunk arrives. The user cannot finish reading the earlier portion without scrolling up — which then disables autoscroll temporarily, but feels reactive rather than intentional.
Concretely:
This came up during real use: a long technical answer kept dragging the viewport mid-paragraph, making it impossible to scan back to the start of the answer.
Proposed solution
Add a chat setting (key: chatAutoScroll) with three modes:
Implementation appears to live in the ei(scrollHelper) function in dist/control-ui/assets/index-NYVkUQrq.js (the function that branches on chatUserNearBottom and the Xr = 450 threshold). Adding a settings.chatAutoScroll short-circuit at the top of that function would close this case with minimal surface area.
UX surface: expose the setting in the existing chat settings menu next to chatShowThinking and chatShowToolCalls. Default = "near-bottom" preserves current behavior; users who want the new behavior opt in.
Alternatives considered
Impact
Affected: any WebChat user reading long replies (technical answers, code-heavy explanations, multi-section summaries).
Severity: Low-medium (cosmetic / UX friction, not data loss).
Frequency: every long reply.
Consequence: degraded reading experience, especially on smaller laptop screens where 450px is a large fraction of viewport height.
Asymmetry note: ChatGPT, Claude.ai, and most modern chat UIs all default to "near-bottom autoscroll" with a manual scroll-to-bottom button. None expose a hard off toggle — this would actually be a small UX edge over peers.
Evidence/examples
Existing related Control UI settings keys for reference (from index-NYVkUQrq.js):
The natural place for the new key is alongside these. Persisting via the existing applySettings(...) path keeps the change minimal.
Companion: paired with the user-uploaded image persistence bug filed separately, this is part of a small "WebChat reading experience" cluster of polish work.
Additional information
Backward compatibility: default the new setting to "near-bottom" so existing users see no change. Only opt-in users get the new "off" mode (or the more aggressive "always" mode, if that's also desired).
Migration: none required; new key with sensible default.
Accessibility: respect prefers-reduced-motion. The current code already checks window.matchMedia('(prefers-reduced-motion: reduce)') for smooth vs instant — that path should be preserved.