Accessibility
Run Claude Code with a screen reader such as VoiceOver or NVDA, and tune it for magnifiers, reduced motion and colour vision differences.
Claude Code's terminal interface is full of things that are hard to hear: box-drawing borders, animated spinners, menus you steer with arrow keys, and text that redraws in place. Screen reader mode replaces all of that with plain, linear, labelled lines that VoiceOver, NVDA or any other screen reader reads top to bottom. You can hold a whole conversation, approve tool calls and review diffs without touching the visual layout.
The mode is opt-in. If you do not use a screen reader but want help with a magnifier, motion or colour, skip to other accessibility options; those work in the normal interface.
The VS Code extension's chat panel does not need screen reader mode, which only affects the terminal UI. From v2.1.236 the extension announces conversation activity to your screen reader on its own. See VS Code.
Turning screen reader mode on
Choose the scope that suits you:
| Scope | How |
|---|---|
| One session | claude --ax-screen-reader |
| Every session from this shell | export CLAUDE_AX_SCREEN_READER=1 (Bash/Zsh) or $env:CLAUDE_AX_SCREEN_READER = "1" (PowerShell); put it in your shell profile to keep it |
| Every session on this machine | "axScreenReader": true in your user settings file |
The setting applies in any terminal, including the VS Code integrated terminal. If you use more than one, the flag beats the environment variable, which beats the setting. Working over SSH? Set the variable or setting on the remote machine, since that is where Claude Code runs.
The very first line printed confirms which source switched it on: [Screen Reader Mode: on via flag], [Screen Reader Mode: on via env] or [Screen Reader Mode: on via settings].
After that line, Claude Code waits 3 seconds before drawing the prompt so your screen reader can finish speaking. Press any key to skip the wait, or change its length with CLAUDE_AX_STARTUP_QUIET_MS (v2.1.217+).
Turning it off
Undo whatever turned it on: launch without the flag, unset the variable, or set axScreenReader to false. Setting CLAUDE_AX_SCREEN_READER=0 forces the mode off even when the setting is true, which is handy for a one-off visual session on a shared machine.
How output is spoken
In screen reader mode Claude Code prints flat text:
- No box-drawing characters around the interface.
- No information carried by colour alone.
- Nothing redrawn unless it changed; spinners become static text.
- Tables in Claude's replies become
Header: valuesentences rather than a character grid. - Diffs are read line by line with
+and-prefixes, so you can hear an edit before you approve it.
Everything stays in the terminal's scrollback, so your screen reader's review commands and the terminal's search both work. The fullscreen renderer and the tui setting are ignored in this mode.
Labels
Every transcript entry begins with a spoken label. Because they are plain text, you can also search scrollback for them to hop around:
| Label | What follows |
|---|---|
you: | Your message |
claude: | Claude's reply |
thinking: | Claude's reasoning |
tool: | Tool activity: an edit, a command and so on |
tool error: | A tool that failed |
error: | A conversation error, such as a failed API call |
warning: | A Claude Code warning, such as falling back to another model |
Permission Required: | A permission prompt awaiting your answer |
Cost: | The session cost summary on exit, if your account shows costs |
Typing and editing
The terminal cursor sits on the input caret, so "read current line" reads what you are composing. Typing or pressing Backspace at the end of the line writes only the characters that changed, so you hear only those.
Word and line deletions announce what was removed:
Ctrl+W,Alt+D,Option+Delete(macOS) orCtrl+Backspace(Windows) for wordsCtrl+UorCmd+Backspaceto the start of the lineCtrl+Kto the end of the line
Cycling permission modes with Shift+Tab announces where you land, for example [plan mode on] or [accept edits on], once only.
Reading back without being dragged to the prompt
Claude Code moves the terminal cursor back to the prompt whenever it writes something new. If your screen reader follows the cursor, it will jump you away from whatever you were reading. Stop it following: in NVDA, NVDA+6 toggles whether the review cursor tracks the terminal cursor.
Jumping between turns
Claude Code emits OSC 133 shell-integration marks at each turn boundary, so the terminal's "previous prompt" key moves a turn at a time:
| Terminal | Key |
|---|---|
| iTerm2 | Cmd+Shift+Up |
| VS Code terminal | Cmd+Up (macOS), Ctrl+Up (Windows) |
| Windows Terminal | Unbound by default; bind the scrollToMark action |
| Kitty, Ghostty | See the terminal's own docs for its jump-to-prompt key |
macOS Terminal ignores the marks and WezTerm does not receive them. In those, search scrollback for you: instead.
Menus and prompts
Arrow-key menus, including permission prompts, turn into numbered lists. Each option is read as a numbered line, followed by a Select with numbers prompt that states the valid range. Type the number and press Enter.
- If the prompt ends with
or Escape to cancel, Escape backs out. - An out-of-range number gets the range read back and another chance.
- The
/effortslider becomes a numbered list too.
Yes/no questions expect a typed y or n (or yes/no) and Enter.
Audible alerts
In screen reader mode the terminal bell rings when:
- Claude finishes a reply
- a dialog or prompt (such as a permission request) needs your answer
- a tool that ran for more than 5 seconds completes
It is your terminal's standard bell, so silence or change it in the terminal's settings. Outside screen reader mode you can get a similar alert with "preferredNotifChannel": "terminal_bell"; see terminal configuration.
Other accessibility options
These work with or without screen reader mode.
| Option | Kind | Effect |
|---|---|---|
--ax-screen-reader | CLI flag | Screen reader mode for this session |
CLAUDE_AX_SCREEN_READER | Env var | Screen reader mode for this shell |
axScreenReader | Setting | Screen reader mode everywhere when true |
CLAUDE_AX_STARTUP_QUIET_MS | Env var | Pause in milliseconds between the confirmation line and the first prompt (v2.1.217+) |
CLAUDE_AX_PREPARK_MS | Env var | When set, how long (ms) the cursor is parked at the start of the line before a new or changed line is written (v2.1.233+) |
CLAUDE_CODE_ACCESSIBILITY | Env var | Set to 1 to keep a visible terminal cursor for magnifiers such as macOS Zoom. It tracks the input caret and, from v2.1.218, the highlighted row in panels like /config and /plugin |
prefersReducedMotion | Setting | true reduces or removes spinners, shimmer and other animation |
theme | Setting | Interface colours; dark-daltonized and light-daltonized are tuned for colour vision deficiency. Also available via /theme |
preferredNotifChannel | Setting | "terminal_bell" rings the bell when Claude is waiting (outside screen reader mode) |
A setup I have used for a colleague with low vision who magnifies heavily:
{
"prefersReducedMotion": true,
"theme": "light-daltonized",
"preferredNotifChannel": "terminal_bell",
"env": {
"CLAUDE_CODE_ACCESSIBILITY": "1"
}
}
You can also build a high-contrast custom theme.
Known limitations
- The mode does not detect a running screen reader; you have to switch it on.
- Changing permission mode with a command such as
/planis not announced (onlyShift+Tabis). - Attaching to a background session from agent view or
claude attachuses the alternate screen, which has no native scrollback. To leave, press Left Arrow on an empty prompt, or Ctrl+Z if a dialog has focus. - Cost is announced only in the exit summary, not after each turn.
- Non-interactive
-pmode is unaffected. It already prints plain text and is a good fit for scripted use; see headless mode.
Reporting problems
If something does not work with your assistive technology, open an issue on the Claude Code issue tracker, naming the technology in the title. Include your OS, terminal application, and the assistive technology's name and version.