Claude Code Ships Screen Reader Mode: Plain-Text TUI for VoiceOver and NVDA
Claude Code now has an opt-in screen reader mode that replaces boxes, spinners, and in-place redraws with labeled linear text that VoiceOver and NVDA read in order. Turn it on with the --ax-screen-reader flag, the CLAUDE_AX_SCREEN_READER env var, or the axScreenReader setting (v2.1.181+). Menus become numbered lists, a terminal bell signals when Claude needs you, and separate settings cover magnifiers, reduced motion, and colorblind themes.
Claude Code now ships an opt-in screen reader mode that replaces its visual terminal interface (boxes, progress animations, in-place redraws) with plain, linear, labeled text that a screen reader such as VoiceOver or NVDA reads in order. You can hold a full conversation, approve tool permissions, and review output end to end (Anthropic docs). It requires Claude Code v2.1.181 or later.
Key Takeaways
- Three ways to enable, in precedence order: the
--ax-screen-readerflag (one session), theCLAUDE_AX_SCREEN_READER=1environment variable (one shell), or"axScreenReader": truein your user settings file (every session, every terminal) (Anthropic docs). - Every transcript message starts with a searchable label such as
you:,claude:,tool:,tool error:,error:,Permission Required:, andCost:(the exit cost summary, if your account shows costs), so you can jump between sections with your terminal's scrollback search. - Menus become numbered lists. Permission prompts and other arrow-key menus read out as numbered options with an "Enter selection" prompt that names the valid range; type the number and press Enter. Escape cancels a dismissible menu, an out-of-range number gets you the range and another try, and yes/no prompts take a typed
yorn(yesandnoalso work). - The terminal bell rings when Claude finishes a reply, a permission prompt appears, or a tool running longer than 5 seconds finishes. No transcript polling needed.
- A three-second startup hold gives your screen reader time to speak the confirmation line before the first prompt renders. Any key ends it early;
CLAUDE_AX_STARTUP_QUIET_MSchanges its length,0skips it, and the cap is 10 minutes (v2.1.217+). - Typing echoes one character at a time. As you type or press Backspace at the end of the input line, Claude Code writes only the characters that change instead of rewriting the line, so your screen reader stops re-reading the whole prompt (typing v2.1.219+, deletions v2.1.222+). Word and line deletes announce the text they removed (v2.1.218+).
- Claude Code emits OSC 133 markers at turn boundaries, so jump-to-previous-prompt keys hop between turns -- but not in every terminal: macOS Terminal ignores the markers and Claude Code does not emit them in WezTerm.
- Non-screen-reader accessibility is separate and stacks with the mode:
CLAUDE_CODE_ACCESSIBILITY=1keeps the cursor trackable for magnifiers,prefersReducedMotioncuts animations, anddark-daltonized/light-daltonizedthemes handle colorblind-friendly contrast.
What Your Screen Reader Hears
In the mode, Claude Code writes flat text: no box-drawing characters, no color-only cues, no redraws of unchanged content, spinners rendered as static text, and tables read as Header: value sentences instead of a box-character grid (tables require v2.1.198+). Output accumulates in normal scrollback, so your screen reader's review commands and your terminal's search both work on the full history. Screen reader mode wins over fullscreen rendering: the tui setting has no effect while the mode is active, so you get plain scrolling text even with fullscreen turned on.
When the mode turns on, the first printed line confirms it and names the method, for example [Screen Reader Mode: on via flag], [Screen Reader Mode: on via env], or [Screen Reader Mode: on via settings] (the method-naming format requires v2.1.206+; earlier versions print [Accessible screen reader mode: on]). If Claude Code relaunches itself, say to finish installing an update, the new process inherits the mode through the environment variable, so the line reads on via env whichever method you actually used. Claude Code then holds the rest of the interface back for three seconds so your screen reader can finish speaking that line before the first prompt appears; press any key to cut the hold short, or set CLAUDE_AX_STARTUP_QUIET_MS to another number of milliseconds (default 3000, 0 to skip, capped at 600000, which is 10 minutes). That hold requires v2.1.217+.
Two refinements make the input line itself usable. The terminal cursor follows the input caret, so a read-current-line command answers "where am I" with the prompt you are editing. And as you type or press Backspace at the end of the line, Claude Code writes only the characters that change rather than rewriting the whole line, so your screen reader echoes just those characters (typing v2.1.219+, deletions v2.1.222+). Bigger deletions announce what they removed -- Ctrl+W, Option+Delete on macOS, or Ctrl+Backspace on Windows for a word; Ctrl+U or Cmd+Backspace to the start of the line; Ctrl+K to the end (v2.1.218+).
Cycling permission modes with Shift+Tab announces the mode you land on, such as [plan mode on] or [accept edits on], printed once and not repeated on later redraws (v2.1.210+). Note the boundary: that announcement only fires for Shift+Tab cycling, so entering plan mode from a command changes the mode silently.
Turning the Mode Off, and Which Setting Wins
Reverse whichever method turned the mode on: start without the flag, unset the environment variable, or set axScreenReader to false. The useful asymmetry is that CLAUDE_AX_SCREEN_READER=0 keeps the mode off even when the setting is true, so the environment variable is how you drop out of the mode for one shell on a machine configured for it -- handy on a shared machine, or when you want a visual session without editing your settings file.
One placement gotcha for remote work: if you run Claude Code over SSH, set the environment variable or the setting on the remote machine where Claude Code runs, not on the laptop you are typing into.
Jumping Between Turns, Terminal by Terminal
Claude Code emits OSC 133 shell-integration markers at turn boundaries so your terminal's jump-to-previous-prompt key moves between turns instead of making you read through the transcript. Support is uneven and worth checking before you rely on it:
| Terminal | Jump-to-prompt |
|---|---|
| iTerm2 | Cmd+Shift+Up |
| VS Code terminal | Ctrl+Up on Windows, Cmd+Up on macOS |
| Windows Terminal | No key by default; bind the scrollToMark action in its settings |
| Kitty, Ghostty | Check the terminal's own documentation for its jump-to-prompt key |
| macOS Terminal | Does not act on the markers |
| WezTerm | Claude Code does not emit markers here |
In the last two, search the scrollback for the you: label instead.
Magnifiers, Reduced Motion, and Colorblind Themes
These are separate from screen reader mode and all of them work alongside it:
- Screen magnifiers.
CLAUDE_CODE_ACCESSIBILITY=1keeps the native terminal cursor visible so a magnifier such as macOS Zoom can track it. The cursor follows keyboard focus: the input caret while you type, and the highlighted row as you move through menus and panels like/configand/pluginwith the arrow keys. Row tracking in menus and panels requires v2.1.218+. - Reduced motion. The
prefersReducedMotionsetting reduces or disables spinners, shimmer, and other animations without changing the rest of the interface. - Colorblind-friendly colors. The
themesetting selects interface colors, including thedark-daltonizedandlight-daltonizedthemes.
Why This Matters Beyond Screen Reader Users
Terminal agents have quietly been one of the least accessible corners of the AI tooling boom: TUIs repaint constantly, communicate state through color and spinners, and bury permission prompts inside redrawn boxes, all of it hostile to assistive tech. What stands out about Claude Code's answer is not just that the mode exists but that it is documented and version-gated feature by feature -- the docs name the exact release each behavior landed in, from tables at v2.1.198 to per-character deletion echo at v2.1.222, which is what makes it something a team can actually verify and support rather than a checkbox. The design brief also overlaps heavily with what scripting and logging users want (plain linear output already exists separately via claude -p non-interactive mode). If your team standardizes on an agent, "can every engineer actually operate it" now has a concrete checklist to compare against.
Known limitations worth noting, all of them stated in Anthropic's own docs (Anthropic docs):
- The mode does not auto-enable when a screen reader is running. You have to opt in.
- Permission mode changes are announced only when you cycle with
Shift+Tab. Entering plan mode from a command is silent. - Attaching to a background session with
claude attachor from agent view enters the terminal's alternate screen, which has no native scrollback. To get back out, press Left Arrow on an empty prompt, or Ctrl+Z if a dialog has focus. - Costs are announced in the exit summary, not per turn.
- The mode does not change
-pnon-interactive mode, which already writes plain text and stays the better option for scripting.
How to Use This Update
If you use VoiceOver or NVDA, add "axScreenReader": true to your user settings so every session on the machine starts in the mode, and learn the label vocabulary; searching scrollback for Permission Required: is the fastest way to find what Claude is waiting on. Update before you judge the mode -- the input-line behavior that decides whether it is pleasant or exhausting to type in landed across v2.1.217 to v2.1.222, so an older install will feel markedly worse than the current one for reasons that have nothing to do with your setup. If you use a magnifier, set CLAUDE_CODE_ACCESSIBILITY=1 instead. And if you lead a team, put the issue tracker link in front of any engineer using assistive tech; Anthropic asks for the assistive technology in the title, and the docs read like a team actively taking reports.
Sources
- Anthropic, "Use Claude Code with a screen reader" (Claude Code docs), the source for every claim on this page: https://code.claude.com/docs/en/accessibility
- Anthropic, "Fullscreen rendering" (Claude Code docs), for the
tuisetting this mode overrides: https://code.claude.com/docs/en/fullscreen
Provenance note. Every claim on this page was re-verified against the Anthropic accessibility doc
on August 8, 2026, reading the doc's machine-readable version end to end rather than a summary.
Nothing published on July 22 turned out to be wrong. The doc had, however, grown substantially
since: this revision adds the startup quiet hold and CLAUDE_AX_STARTUP_QUIET_MS, per-character
typing and deletion echo, deleted-text announcements, the Cost: transcript label, the
turn-off precedence rule, the SSH placement note, the per-terminal OSC 133 support table, menu-row
cursor tracking for magnifiers, the tui override, and the limitation that permission-mode changes
are announced only when cycled with Shift+Tab. Version requirements are quoted as the doc states
them.
Frequently Asked Questions
How do you turn on Claude Code screen reader mode?
Three ways, in precedence order: run claude --ax-screen-reader for one session, set CLAUDE_AX_SCREEN_READER=1 for a shell, or add axScreenReader: true to your user settings file for every session. Requires Claude Code v2.1.181 or later.
How do you turn off Claude Code screen reader mode?
Reverse whichever method turned it on: start without the flag, unset the environment variable, or set axScreenReader to false. Setting CLAUDE_AX_SCREEN_READER=0 keeps the mode off even when the axScreenReader setting is true, so the environment variable is the way to override a machine-wide setting for one shell.
Why does Claude Code pause after enabling screen reader mode?
By design. After printing the confirmation line, Claude Code holds the rest of the interface back for three seconds so your screen reader can finish speaking it, then renders the first prompt. Press any key to end the hold early, or set CLAUDE_AX_STARTUP_QUIET_MS to a different number of milliseconds -- 0 skips the hold, and the cap is 600000 (10 minutes). Requires v2.1.217 or later.
What does screen reader mode change?
Claude Code prints flat labeled text instead of boxes, spinners, and redraws. Messages start with labels like you:, claude:, tool:, and Permission Required:, tables read as Header: value sentences, and menus become numbered lists you answer by typing a number.
How do you know when Claude Code needs your attention?
In screen reader mode the terminal bell rings when Claude finishes a reply, when a permission prompt appears, and when a tool running longer than 5 seconds finishes. Outside the mode, set preferredNotifChannel to terminal_bell for similar alerts.
Does Claude Code support screen magnifiers and colorblind themes?
Yes, separately from screen reader mode, and all three work alongside it. Set CLAUDE_CODE_ACCESSIBILITY=1 to keep the native cursor visible for magnifiers like macOS Zoom -- it follows the input caret as you type and the highlighted row as you move through menus and panels such as /config and /plugin (row tracking needs v2.1.218 or later). Use prefersReducedMotion to reduce or disable spinners, shimmer, and other animations, and set theme to dark-daltonized or light-daltonized for colorblind-friendly colors.