Skip to main content

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.

Research preview

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 modeFullscreen mode
Output streams and pushes the input box upInput box pinned to the bottom of the screen
Flicker on re-renderNo flicker
Long conversation = growing memoryRenders only visible messages โ†’ constant memory
Terminal handles the mouseClaude 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.

What "fullscreen" means

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.

ActionResult
Click the prompt inputPosition the cursor
Click a collapsed tool resultExpand/collapse (click again to toggle). Only clickable on messages that have something to expand
Click a URLOpen in the browser (a normal single click)
Click a file pathOpen in the default application
Click and dragSelect text (anywhere in the conversation)
Double-clickSelect a word (same word boundaries as iTerm2 โ€” a file path is selected as one)
Triple-clickSelect a line
Mouse wheelScroll
VS Code integrated terminal and other xterm.js-based terminals

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:

ShortcutCondition
Ctrl+Shift+CDefault
Cmd+Ckitty, 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:

ShortcutAction
Shift+โ†‘Extend selection upward (scrolls the viewport at the top)
Shift+โ†“Extend selection downward
Shift+โ† / Shift+โ†’Extend one column at a time
Shift+HomeExtend to the start of the line
Shift+EndExtend to the end of the line

Scrolling and navigationโ€‹

In fullscreen mode, scrolling is also handled inside Claude Code.

Default shortcutsโ€‹

ShortcutAction
PgUp / PgDnHalf-screen scroll
Ctrl+HomeJump to the start of the conversation
Ctrl+EndJump to the latest message + resume auto-follow
Mouse wheelA few lines at a time

MacBook keyboard mappingโ€‹

On a MacBook without dedicated PgUp, PgDn, Home, and End keys, combine with Fn:

MacBookMaps 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+End key
  • 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.

KeyAction
/Search mode (Enter to confirm, Esc to cancel)
n / NNext/previous match (works even after the search bar is closed)
j / k or โ†‘ / โ†“Scroll one line
g / G or Home / EndJump to top/bottom
Ctrl+u / Ctrl+dHalf-page scroll
Ctrl+b / Ctrl+f or Space / bFull-page scroll
Ctrl+O, Esc, qExit and return to the prompt

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:

KeyAction
[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)
vSave 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 /focus again 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.

Relationship to fullscreen

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.

ScopeMethod
This session onlyclaude --ax-screen-reader
Sessions started from this shellexport 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.

Version

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: value sentences 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 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 prefersReducedMotion setting โ€” reduces or disables just the animations (spinners, shimmers, and so on)
  • The theme setting โ€” includes color-vision-corrected themes dark-daltonized and light-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+Tab cycle aren't announced (cycle announcements are v2.1.210 or later)
  • Cost is read only in the summary at exit, not per turn
  • The -p non-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):

ActionDefault keyDescription
scroll:lineUp(unbound)Up one line. The mouse wheel triggers this action
scroll:lineDown(unbound)Down one line
scroll:pageUpPageUpUp half a screen
scroll:pageDownPageDownDown half a screen
scroll:topCtrl+HomeStart of the conversation
scroll:bottomCtrl+EndLatest + resume auto-follow
scroll:halfPageUp / halfPageDown(unbound)For vi-style binding
scroll:fullPageUp / fullPageDown(unbound)Full-screen scroll
selection:copyCtrl+Shift+C / Cmd+CCopy the selection
selection:extendLeft/Right/Up/DownShift+โ†/โ†’/โ†‘/โ†“Extend the selection
selection:extendLineStart/EndShift+Home/EndExtend 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
Research preview status

Rendering issues are possible in uncommon terminals or unusual setups. If you find a problem:

Revertingโ€‹

/tui default

If you enabled it via environment variables, remove CLAUDE_CODE_NO_FLICKER and CLAUDE_CODE_DISABLE_MOUSE.


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.