Summary
Add visual markers to the TUI scrollbar at each message boundary so users can navigate long conversations quickly without scrolling through entire message bodies.
Problem
When conversations exceed ~50 messages, navigating back to a specific user input becomes painful:
- Scrolling with
PageUp/PageDown shows the message body but you have to read each one to find what you want.
- No overview — the scrollbar is a single position indicator; it doesn't communicate how many turns exist or where they break.
- Existing keybinds help (
messages_next/messages_previous/messages_last_user in tui.json) but require the user to know the keybinds exist and press them repeatedly.
This is a common UX pattern in:
- Code editors (minimap markers for search results, breakpoints, git diffs)
- Chat apps (Slack, Discord: small avatars/dots on the scrollbar)
- IDEs (IntelliJ: navigation bar showing file structure)
Proposed Behavior
Render a small visual marker on the scrollbar at each message boundary:
| Marker style |
Meaning |
| Larger notch |
User input |
| Smaller notch |
Assistant message |
| Distinct color |
Tool call / error message |
Visually something like:
│ │
│ █ │ <- message #1 (user)
│ █ │ <- message #2 (assistant)
│ █ │ <- message #3 (user)
│ █ │ <- message #4 (assistant, has tool call)
│ █ │ <- message #5 (user)
│ │
│ █ ← you are here │
Why a Plugin Can't Solve This
I tried. Built conversation-nav (https://gist...) that tracks user inputs to a JSON file and exposes /inputs + /jump N commands. This works as a workaround but:
- The TUI renderer is not exposed via the plugin API (
PluginInput has client, project, directory, $ — no tui/scrollbar/viewport).
- Themes can change colors but the scrollbar widget itself is hardcoded in the TUI binary.
- The JSON workaround requires reading a file + remembering keybinds + manual
Ctrl+Up presses — still friction.
The feature needs to live in the TUI layer.
Acceptance Criteria
Alternatives Considered
- Plugin-based workaround (what I built) — works but doesn't solve the visual problem.
- Theme-only — can't distinguish messages by role in current theme schema.
- External sidebar — splits attention, breaks the single-pane UX.
Related
messages_next/messages_previous/messages_last_user keybinds in tui.json (already exist, currently bound to none)
scrollbar_toggle keybind (already exists, currently bound to none)
cc @anomalyco
Posted from opencode CLI via gh issue create.
Summary
Add visual markers to the TUI scrollbar at each message boundary so users can navigate long conversations quickly without scrolling through entire message bodies.
Problem
When conversations exceed ~50 messages, navigating back to a specific user input becomes painful:
PageUp/PageDownshows the message body but you have to read each one to find what you want.messages_next/messages_previous/messages_last_userintui.json) but require the user to know the keybinds exist and press them repeatedly.This is a common UX pattern in:
Proposed Behavior
Render a small visual marker on the scrollbar at each message boundary:
Visually something like:
Why a Plugin Can't Solve This
I tried. Built
conversation-nav(https://gist...) that tracks user inputs to a JSON file and exposes/inputs+/jump Ncommands. This works as a workaround but:PluginInputhasclient,project,directory,$— notui/scrollbar/viewport).Ctrl+Uppresses — still friction.The feature needs to live in the TUI layer.
Acceptance Criteria
messages_next/messages_previouskeybindstui.json(enable/disable, colors)Alternatives Considered
Related
messages_next/messages_previous/messages_last_userkeybinds intui.json(already exist, currently bound tonone)scrollbar_togglekeybind (already exists, currently bound tonone)cc @anomalyco
Posted from opencode CLI via
gh issue create.