New request
#500: feat(performance): virtual scroll for session list and message list
We'll provision a sandbox, run an agent against the issue, and open a draft PR. You can pull the branch and iterate from there.
Issue
enhancementuxperformance
Summary
Users with large session histories or very long conversations experience slow rendering and DOM bloat. Both the session sidebar and the message list currently render all items into the DOM at once.
Proposed behaviour
Implement virtual (windowed) scrolling so only the items near the current scroll position are in the DOM:
- Session sidebar — ~20 visible items plus a small buffer
- Message list — messages near the current scroll position
Implementation notes
- Use
IntersectionObserverfor a lightweight no-library approach: replace off-screen items with placeholder divs of the same height - No bundler or external dependency needed — keeps the project's no-build-step constraint
- Session list is simpler (roughly fixed height per item); message list is harder (variable-height markdown)
- Suggested order: session list first, message list as a follow-on
Tracked in ROADMAP.md as "Virtual scroll for large lists (deferred)".
Assessmentadvisory
feature●● medium90% confidence
Self-contained frontend performance optimization touching list rendering components with IntersectionObserver but no backend API changes.
Likely files
- static/js/sidebar/session_list.js
- static/js/chat/message_list.js
- static/js/utils/virtual_scroll.js
- static/css/layout.css
- tests/smoke/test_virtual_scroll.py
Create the request