I love long conversations with AI. Big ideas don’t fit into three bubbles; they meander, double back, and grow over hours. And then, somewhere around message 120, everything turns to sludge. The cursor lags. The page stutters. Sometimes the tab just taps out. I end up copying the last few lines into a fresh chat like I’m rebooting a modem in 2003.
This isn’t mysterious. Most chat UIs keep the entire conversation mounted in the page all the time. Every old message—images, markdown, buttons, tooltips, code blocks—keeps living rent-free in the browser. Add a few hundred of those and the DOM becomes a brick. Your laptop fan writes its will. Your train of thought derails.
There’s a very normal, very boring fix that would make this go away: show only what I can see.
That’s it. Keep the on-screen messages in the DOM (with a small buffer above and below), and let older ones nap offstage until I scroll to them. When I do scroll up, quietly pop them back in and turn their little features back on—copy buttons, embeds, diagrams—only while they’re visible. When I scroll past, power them down again. The conversation stays whole; the page stays light. It’s the same trick that fast news feeds and file explorers have used for years. In tech terms, it’s “virtualization” with “lazy hydration,” but you don’t need the jargon to feel the difference. Typing becomes instant. Scrolling smooths out. The browser stops sweating.
“Do we lose anything?” No. History doesn’t disappear; it’s just rendered on demand. Search still works—you just give me an in-app search that scans the full message list and jumps to the result, mounting it when I land. Deep links still work—open #message-123
, calculate where that lives, and focus it without yanking the viewport. Printing and exporting? Give me a “Save full conversation” button that bypasses the fancy stuff and dumps everything to HTML, PDF, or Markdown. Accessibility stays intact if you keep semantic roles and sensible focus order when things mount and unmount. New replies shouldn’t shove me around either: if I’m at the bottom, auto-scroll; if I’m reading higher up, leave me there and show a gentle “New messages” badge.
Rolling this out isn’t scary. Turn it on first for very long threads and power users, measure the things people actually feel—input latency, scroll FPS, memory usage, reloads—then expand. Start with plain text and images. Phase in heavier widgets once the core is steady. Keep a “Show everything” switch for edge cases and call it a day.
Why push for this? Because long conversations are the point. We’re planning, debugging, writing, researching. Cutting a dialogue into five separate chats just to dodge a freeze kills context and momentum. A small, thoughtful change in the UI would save thousands of tiny frustrations a day and make the product feel… respectful of how people actually use it.
So here’s the ask, plain and human: please stop making my browser carry an entire novel when I’m reading one page. Let the rest wait in the wings. Keep the chat fast, the thoughts flowing, and the reload key lonely.