Fullscreen Rendering โ a Flicker-Free Terminal UI
/tui fullscreen switches how Claude Code renders. It's a different UI path from the default mode, offering no flicker, constant memory in long conversations, and mouse support.
Fullscreen rendering is an opt-in research preview feature and works in Claude Code v2.1.89 or later. Its behavior may change based on feedback.
What changesโ
By default, Claude Code stacks the conversation into the terminal's scrollback buffer. Fullscreen mode instead draws into the alt-screen buffer (the same approach vim and htop use).
| Default mode | Fullscreen mode |
|---|---|
| Output streams and pushes the input box up | Input box pinned to the bottom of the screen |
| Flicker on re-render | No flicker |
| Long conversation = growing memory | Renders only visible messages โ constant memory |
| Terminal handles the mouse | Claude Code captures mouse events |
The benefit is largest where rendering throughput is the bottleneck โ especially the VS Code integrated terminal, tmux, and iTerm2. If your scroll position suddenly jumps to the top mid-task, or the screen flickers while tool output streams, this mode fixes it.
Here, "fullscreen" means Claude Code takes over the terminal's entire drawing surface (just like vim). It has nothing to do with maximizing the terminal window. It works at any size.
How to switchโ
Switch mid-conversationโ
/tui fullscreen
The tui setting is saved and the CLI relaunches while keeping your conversation. Switching mid-session doesn't lose context.
Check the current renderer:
/tui
Revert:
/tui default
The environment variable approach (before v2.1.110)โ
CLAUDE_CODE_NO_FLICKER=1 claude
The tui setting and the environment variable are equivalent. When you run the /tui command, the relaunch removes CLAUDE_CODE_NO_FLICKER and the tui setting takes precedence.
Using the mouseโ
Fullscreen mode handles mouse events inside Claude Code.
| Action | Result |
|---|---|
| Click the prompt input | Position the cursor |
| Click a collapsed tool result | Expand/collapse (click again to toggle). Only clickable on messages that have something to expand |
| Click a URL | Open in the browser (a normal single click) |
| Click a file path | Open in the default application |
| Click and drag | Select text (anywhere in the conversation) |
| Double-click | Select a word (same word boundaries as iTerm2 โ a file path is selected as one) |
| Triple-click | Select a line |
| Mouse wheel | Scroll |
In these terminals, Cmd-click is preserved. Claude Code delegates to the terminal's link handler to avoid opening links twice.
Automatic clipboard copyโ
When you make a selection with the mouse, it's automatically copied to the clipboard when you release the selection. Turning off Copy on select in /config switches this to manual.
Manual copy shortcuts:
| Shortcut | Condition |
|---|---|
Ctrl+Shift+C | Default |
Cmd+C | kitty, WezTerm, Ghostty, iTerm2 (terminals supporting the kitty keyboard protocol) |
While a selection is active, Ctrl+C acts as copy, not cancel.
Extend the selection with the keyboardโ
While a selection is active:
| Shortcut | Action |
|---|---|
Shift+โ | Extend selection upward (scrolls the viewport at the top) |
Shift+โ | Extend selection downward |
Shift+โ / Shift+โ | Extend one column at a time |
Shift+Home | Extend to the start of the line |
Shift+End | Extend to the end of the line |
Scrolling and navigationโ
In fullscreen mode, scrolling is also handled inside Claude Code.
Default shortcutsโ
| Shortcut | Action |
|---|---|
PgUp / PgDn | Half-screen scroll |
Ctrl+Home | Jump to the start of the conversation |
Ctrl+End | Jump to the latest message + resume auto-follow |
| Mouse wheel | A few lines at a time |
MacBook keyboard mappingโ
On a MacBook without dedicated PgUp, PgDn, Home, and End keys, combine with Fn:
| MacBook | Maps to |
|---|---|
Fn+โ | PgUp |
Fn+โ | PgDn |
Fn+โ | Home |
Fn+โ | End |
Ctrl+Fn+โ | Jump to the very bottom |
If that feels awkward, scrolling all the way down with the mouse wheel also resumes auto-follow, and you can rebind the scroll:bottom action to another key (see Customizing keybindings).
Auto-followโ
Scrolling up pauses auto-follow โ new output won't yank your view to the bottom. To resume:
- The
Ctrl+Endkey - Scroll to the bottom with the mouse wheel
To turn it off entirely, set /config โ Auto-scroll to off. Permission prompts and dialogs that require a response appear in view regardless of this setting.
Mouse wheel setupโ
Mouse wheel scrolling works only if the terminal forwards mouse events to Claude Code. iTerm2 makes this a profile setting, so if the wheel only does PgUp/PgDn:
Check Settings โ Profiles โ Terminal โ Enable mouse reporting.
Click-to-expand and text selection need the same setting.
Adjusting wheel speedโ
Some terminals lack a wheel-event multiplier and feel slow (the VS Code integrated terminal, for example).
export CLAUDE_CODE_SCROLL_SPEED=3
- Value 1 (default) to 20
- 3 = the vim default
Transcript mode โ Ctrl+Oโ
Ctrl+O toggles between the normal prompt and transcript mode. Transcript mode supports less-style navigation and search.
| Key | Action |
|---|---|
/ | Search mode (Enter to confirm, Esc to cancel) |
n / N | Next/previous match (works even after the search bar is closed) |
j / k or โ / โ | Scroll one line |
g / G or Home / End | Jump to top/bottom |
Ctrl+u / Ctrl+d | Half-page scroll |
Ctrl+b / Ctrl+f or Space / b | Full-page scroll |
Ctrl+O, Esc, q | Exit and return to the prompt |
Bridging to the terminal's native searchโ
The terminal's Cmd+f or tmux search can't see the conversation because it lives in the alt-screen buffer. To hand it off to native tools, enter transcript mode and then:
| Key | Action |
|---|---|
[ | Writes the entire conversation to the terminal's native scrollback (with all tool output expanded). After that, Cmd+f, tmux copy mode, and other native tools can search and select it. Stays until you exit transcript mode (Esc / q) |
v | Save to a temporary file and open it in $VISUAL or $EDITOR |
Pressing Ctrl+O again resets and starts fresh.
Focus view โ /focusโ
/focus
Switches to a quiet view โ showing only the last prompt, a one-line tool-call summary (with diffstats), and the final response. Everything else is hidden.
- The setting persists across sessions
- Run
/focusagain to turn it off - Fullscreen rendering only (does nothing in default mode)
Useful when reviewing, or when you only want a summary of a complex session.
tmux compatibilityโ
Fullscreen rendering works inside tmux (with just two caveats).
1. tmux mouse mode is requiredโ
For wheel scroll to reach Claude Code, tmux mouse mode has to be on. In ~/.tmux.conf:
set -g mouse on
Then reload the config. Without it, the wheel goes to tmux and Claude Code never receives it (keyboard PgUp/PgDn works on both). When Claude Code detects tmux, it prints a one-time hint at startup.
2. iTerm2 tmux integration mode is incompatibleโ
tmux -CC # โ Fullscreen not supported
In this mode, iTerm2 renders each tmux window as a native split, so the alt-screen buffer and mouse tracking don't work correctly. The wheel may not scroll, and double-clicking can corrupt the terminal state.
Plain tmux (just tmux, without -CC) works fine inside iTerm2.
Keeping native text selectionโ
For SSH and tmux users, mouse capture is the biggest friction point. When Claude Code captures mouse events, the terminal's native copy-on-select stops. A drag selection lives only inside Claude Code, so native tools like tmux copy mode and Kitty hints can't see it.
Claude Code tries to write to the clipboard:
- Inside tmux: writes to the tmux paste buffer
- Over SSH: an OSC 52 escape sequence (blocked by some terminals)
After each copy, it shows a toast telling you which path it used.
How to disable only the mouseโ
CLAUDE_CODE_NO_FLICKER=1 CLAUDE_CODE_DISABLE_MOUSE=1 claude
Keeps flicker-free rendering and constant memory while turning off only mouse capture. The terminal handles selection natively.
What you lose: click-to-position cursor, click-to-expand tools, URL clicks, wheel scroll. Keyboard scrolling (PgUp, PgDn, Ctrl+Home, Ctrl+End) stays.
Screen reader modeโ
If you use a screen reader like VoiceOver or NVDA, there's a separate screen reader mode. It's the opposite direction from fullscreen โ it replaces the terminal UI with flat, linear text.
When screen reader mode is on, the tui setting is ignored and everything renders as ordinary scrolling text. In other words, even with /tui fullscreen enabled, screen reader mode takes precedence. (Attaching to a background session is an exception โ that renders to the alt-screen.)
How to turn it onโ
There are three ways, and the one higher up wins.
| Scope | Method |
|---|---|
| This session only | claude --ax-screen-reader |
| Sessions started from this shell | export CLAUDE_AX_SCREEN_READER=1 (in PowerShell, $env:CLAUDE_AX_SCREEN_READER = "1") |
| Every session on this machine | "axScreenReader": true in your user settings file |
When it's on, a confirmation line at startup tells you how it was enabled โ [Screen Reader Mode: on via flag] / on via env / on via settings. To turn it off, undo the method you used to turn it on; CLAUDE_AX_SCREEN_READER=0 keeps it off even when the setting is true. If you use SSH, set it on the remote machine where Claude Code actually runs.
Screen reader mode requires v2.1.181 or later โ earlier versions don't recognize the --ax-screen-reader flag. The confirmation-line format that names how it was enabled arrived in v2.1.206; before that it reads [Accessible screen reader mode: on]. It's formally announced in the changelog as a v2.1.208 entry.
What changesโ
- No box-drawing characters in the interface chrome, and no indicators that rely on color alone
- Unchanged content isn't redrawn โ even the spinner becomes static text
- Tables in responses read as
Header: valuesentences instead of a grid (v2.1.198 or later) - Output stacks straight into the terminal scrollback, so you can revisit it with screen reader review commands and terminal search
Each message starts with a label the screen reader reads โ you: (your message), claude: (the response), tool: (tool activity), tool error:, error:, Permission Required: (a pending permission prompt), Cost: (the cost summary at exit). The labels are searchable too, so you can use them to jump between sections in the scrollback.
At turn boundaries it emits an OSC 133 shell integration marker, so the terminal's jump-to-previous-prompt feature works (iTerm2 Cmd+Shift+Up, VS Code terminal Ctrl+Up, or Cmd+Up on macOS). Windows Terminal has no default key, so you have to bind the scrollToMark action yourself; macOS Terminal and WezTerm don't support this path, so use a you: label search instead.
Menus and prompt responsesโ
Menus you'd normally navigate with arrow keys (including permission prompts) become numbered lists. Each option reads as a numbered line, followed by an Enter selection prompt that tells you the valid range. Type the number you want and press Enter. Cancelable menus take Escape; yes/no takes y/n (or yes/no).
A terminal bell also rings when something needs your attention โ a completed response, a permission prompt appearing, or a tool that ran for more than 5 seconds finishing. You silence the bell in your terminal's settings.
If you're not using a screen readerโ
CLAUDE_CODE_ACCESSIBILITY=1โ for screen magnifiers. Keeps the native terminal cursor visible so magnifiers like macOS Zoom can track it- The
prefersReducedMotionsetting โ reduces or disables just the animations (spinners, shimmers, and so on) - The
themesetting โ includes color-vision-corrected themesdark-daltonizedandlight-daltonized
Known limitationsโ
- It doesn't turn on automatically even when a screen reader is running (manual opt-in)
- Permission mode changes made by a means other than the
Shift+Tabcycle aren't announced (cycle announcements are v2.1.210 or later) - Cost is read only in the summary at exit, not per turn
- The
-pnon-interactive mode is plain text to begin with, so this mode has no effect on it
Customizing keybindingsโ
Every action in the Scroll context can be rebound. Edit ~/.claude/keybindings.json.
Key Scroll actions (official reference):
| Action | Default key | Description |
|---|---|---|
scroll:lineUp | (unbound) | Up one line. The mouse wheel triggers this action |
scroll:lineDown | (unbound) | Down one line |
scroll:pageUp | PageUp | Up half a screen |
scroll:pageDown | PageDown | Down half a screen |
scroll:top | Ctrl+Home | Start of the conversation |
scroll:bottom | Ctrl+End | Latest + resume auto-follow |
scroll:halfPageUp / halfPageDown | (unbound) | For vi-style binding |
scroll:fullPageUp / fullPageDown | (unbound) | Full-screen scroll |
selection:copy | Ctrl+Shift+C / Cmd+C | Copy the selection |
selection:extendLeft/Right/Up/Down | Shift+โ/โ/โ/โ | Extend the selection |
selection:extendLineStart/End | Shift+Home/End | Extend to the line boundary |
Example โ a vim user binding G to jump to the very bottom:
{
"bindings": [
{
"context": "Scroll",
"bindings": {
"shift+g": "scroll:bottom"
}
}
]
}
When it's worth usingโ
- You experience flicker in the VS Code integrated terminal, tmux, or iTerm2
- Very long conversation sessions (memory issues)
- Frequent mouse-based copy work
- You want a clean view with
/focus
Rendering issues are possible in uncommon terminals or unusual setups. If you find a problem:
- Report it inside
/feedback - Open a claude-code GitHub issue
- Include your terminal name and version
Revertingโ
/tui default
If you enabled it via environment variables, remove CLAUDE_CODE_NO_FLICKER and CLAUDE_CODE_DISABLE_MOUSE.
Related docsโ
- Slash commands โ the
/tuiand/focuscommands - Official fullscreen docs โ latest, in English
- Official keybindings reference โ the full list of actions
/configsettings โ Auto-scroll and Copy on select toggles
Fullscreen rendering is a paradigm-shift option for Claude Code's terminal UX. If the default mode feels familiar, keep it; if you need to deal with flicker, long conversations, or heavy mouse use, switch over. You can type /tui fullscreen once and come back with /tui default, so it's easy to try without commitment.