Skip to content

[Feature]: Make native chat scrolling reader-managed #98255

Description

@christopheraaronhogg

Summary

Add reader-managed scroll behavior to the native iOS and Android chat transcripts.

Problem to solve

The native chat surfaces currently keep moving the transcript when new messages, active runs, or streaming assistant text arrive. That is useful at the live edge, but it works against users who have intentionally scrolled up to read earlier context, select text, or inspect a previous answer.

In long mobile conversations this makes the transcript feel unstable: a new assistant chunk, pending tool row, or finished reply can pull the reader away from what they were reading.

Proposed solution

Update the iOS SwiftUI chat view and Android Compose chat lists to follow only while the reader is already at the latest reply. When the reader scrolls away, new content should arrive offscreen, an unobtrusive "Jump to latest" affordance should appear, and tapping it should resume following.

The chat should also restore long sessions near the latest meaningful user turn instead of blindly forcing the absolute bottom, and a newly-sent prompt should be placed with some prior context visible so the response can stream into available space.

Alternatives considered

Keep always-following chat behavior. That is simpler, but it makes long transcripts harder to read and causes the app to move against user intent.

Add only a manual scroll-to-bottom button. That helps recovery, but without pausing follow mode when the reader scrolls away the transcript can still steal position during streaming.

Impact

Affected: iOS and Android app users reading or reviewing longer chat sessions.

Severity: Medium UX issue; not a crash, but it directly affects trust and readability in active assistant sessions.

Frequency: Common in longer chats and while assistant replies are streaming.

Consequence: Users lose their reading position and have to repeatedly scroll back to context they were inspecting.

Evidence/examples

The current iOS chat view updates scrollPosition to the bottom on send, message count changes, pending run changes, and streaming text changes. Android chat lists animate to a timeline target whenever the timeline changes. Those paths are visible in apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift and apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatScreen.kt / ChatMessageListCard.kt.

Additional information

This is a focused native-app UX contribution. It should not change gateway protocol, chat transport, or persisted message models.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low-priority cleanup, docs, polish, ergonomics, or speculative work.clawsweeper:needs-live-reproClawSweeper needs live local, crabbox, or manual validation to confirm this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:session-stateSession, memory, transcript, context, or agent state can drift or corrupt.issue-rating: 🐚 platinum hermitGood issue quality with a plausible reproduction path needing some confirmation.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions