Skip to content

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:

ScopeHow
One sessionclaude --ax-screen-reader
Every session from this shellexport 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: value sentences 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:

LabelWhat 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) or Ctrl+Backspace (Windows) for words
  • Ctrl+U or Cmd+Backspace to the start of the line
  • Ctrl+K to 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:

TerminalKey
iTerm2Cmd+Shift+Up
VS Code terminalCmd+Up (macOS), Ctrl+Up (Windows)
Windows TerminalUnbound by default; bind the scrollToMark action
Kitty, GhosttySee 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.

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 /effort slider 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.

OptionKindEffect
--ax-screen-readerCLI flagScreen reader mode for this session
CLAUDE_AX_SCREEN_READEREnv varScreen reader mode for this shell
axScreenReaderSettingScreen reader mode everywhere when true
CLAUDE_AX_STARTUP_QUIET_MSEnv varPause in milliseconds between the confirmation line and the first prompt (v2.1.217+)
CLAUDE_AX_PREPARK_MSEnv varWhen 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_ACCESSIBILITYEnv varSet 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
prefersReducedMotionSettingtrue reduces or removes spinners, shimmer and other animation
themeSettingInterface colours; dark-daltonized and light-daltonized are tuned for colour vision deficiency. Also available via /theme
preferredNotifChannelSetting"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 /plan is not announced (only Shift+Tab is).
  • Attaching to a background session from agent view or claude attach uses 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 -p mode 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.