The 1,000 line terminal scrollback limit in VS Code, Cursor, and Windsurf
VS Code, Cursor, and Windsurf all cap integrated terminal scrollback around 1,000 lines. A real Claude Code session blows past that in ten minutes. Here is what actually breaks and how to work around it.
If you run Claude Code inside the integrated terminal of VS Code, Cursor, or Windsurf, the top of your conversation has almost certainly already rolled off the buffer. The default scrollback is 1000 lines. A normal Claude session with a handful of tool calls and a modest plan emits that in about ten minutes. By the time you want to go look at what Claude decided an hour ago, it is gone.
This post nails down the exact defaults, the settings that raise them, the failure modes you still hit after raising them, and what to do instead.
The exact defaults
All three editors inherit from VS Code's terminal implementation. The setting you want is terminal.integrated.scrollback. The default is 1000.
// settings.json
{
"terminal.integrated.scrollback": 10000
}- VS Code: default 1000.
- Cursor: inherits 1000.
- Windsurf: inherits 1000.
You can verify in any of them by opening Settings and searching for "terminal scrollback". The slider goes up to 1,000,000, but practically nobody sets it there because of memory pressure in long-running windows.
What breaks at 1000
A few concrete scenarios where the limit bites:
- Claude lists the steps of a plan, then executes them over 40 minutes. You want to go back and read the plan. The plan scrolled off.
- You pasted a long stack trace. Claude's root-cause explanation referenced line numbers from the trace. Both are gone.
- You need to reconstruct what tool Claude used to make a change that is now wrong. The
tool_useoutput is gone. - You opened a second terminal tab for a quick
git status, then closed it. Everything the agent printed in that tab is permanently gone, scrollback or no scrollback. The buffer is per-terminal, not per-session.
Raising the limit to 10,000 or 100,000 helps with cases 1 through 3. It does not help with case 4 at all. Closing the pane still drops the buffer. A crash of the editor drops every buffer in the window. Restarting the host drops all of them.
The workarounds that half work
Raise scrollback
Useful, do it anyway:
{
"terminal.integrated.scrollback": 100000,
"terminal.integrated.persistentSessionScrollback": 100
}The second key controls how much scrollback is persisted across editor restarts for reconnected sessions. The default is 100 lines. Raise it if you want any chance of surviving a window reload.
Pipe to tee
claude 2>&1 | tee -a ~/logs/claude-$(date +%Y%m%d-%H%M%S).logThis gives you a durable copy, but you lose the interactive TUI. Not a real fix for an agent workflow.
script the session
script -q ~/logs/claude-session.typescriptCaptures everything including ANSI, which makes the file a pain to grep later.
All three of these treat the symptom (scrollback too short) rather than the underlying problem: the conversation state is a first-class thing, and the terminal buffer is the wrong place for it.
What actually solves it
Claude Code already writes every conversation to a durable JSONL on disk at ~/.claude/projects/<encoded-cwd>/<uuid>.jsonl. The terminal buffer is just a rendering of that file. When the buffer rolls over, the truth is still there. You just need an index.
That is what Claude Recall does. It tails the JSONLs, parses them, stores the results in a local SQLite, and exposes them through a CLI and a web UI. Scrollback becomes irrelevant:
recall list --since 1h # what did I work on in the last hour
recall search "race condition" # full-text across every session, ever
recall show <uuid> --full # the entire conversation, rendered cleanly
recall context <uuid> | claude # hand a past session back to a new ClaudeThe web UI gives you the same data with keyboard shortcuts, per-session markdown rendering, and tag filtering. If you live in VS Code, the extension adds a sidebar that automatically aliases the session running in the current terminal tab.
Why the terminal buffer is the wrong place
Step back for a second. The reason scrollback hurts is not that 1000 is a small number. The reason is that the terminal buffer is the wrong data structure for conversational state. It is a ring of characters optimized for rendering, not for search, not for structure, not for durability. You cannot filter it by project. You cannot tag parts of it. You cannot sort it by date range across sessions. You cannot share a slice of it cleanly with a teammate. A ring of characters is a fine thing for reading ls output. It is not a fine thing for multi-hour agent conversations that you care about a month later.
Once you accept that, the size of the ring stops being the interesting number. The interesting question is "where does the durable copy live". The answer is ~/.claude/projects/<encoded-cwd>/<uuid>.jsonl, and the answer has been the answer all along. The terminal was just rendering it.
The recommendation
Raise terminal.integrated.scrollback to 100000. Then stop relying on it. Install recall, let it index the JSONLs you already have, and treat the terminal buffer as ephemeral output for the last few minutes of work. The durable history belongs somewhere that survives a pane close.
Full setup in the quickstart, and the tips doc has a section on the exact editor settings to change.