[Accessibility] NVDA screen reader doesn't announce backspace/deleted characters (re-filed)

Resolved 💬 5 comments Opened Feb 14, 2026 by cmwalton Closed Mar 25, 2026

Re-filed from #13074

The original issue (#13074) was incorrectly closed by the auto-close bot despite active human comments, and is now locked. Re-filing so this accessibility issue remains trackable. See also #16497 regarding the bot behavior.

Description

When using Claude Code in Windows Terminal with the NVDA screen reader, backspace operations do not announce the character being deleted. In regular PowerShell (without Claude Code running), NVDA properly announces characters when pressing backspace.

Environment

  • Windows 11
  • Windows Terminal (latest version)
  • NVDA 2025.3.2
  • Claude Code (issue present since at least v2.0.58)
  • INK_SCREEN_READER environment variable: enabled (true)

Steps to Reproduce

  1. Open Windows Terminal with NVDA running
  2. Type a command in PowerShell (e.g., dir)—backspace announces deleted characters correctly
  3. Start Claude Code by running claude
  4. Type text in Claude Code's input (e.g., "hello world")
  5. Press backspace to delete characters
  6. Observe: NVDA does not announce the deleted characters

Expected Behavior

When pressing backspace in Claude Code, NVDA should announce the character being deleted, just as it does in regular PowerShell and other terminal applications. This is standard screen reader behavior and is essential for blind users to know what they're deleting.

Actual Behavior

NVDA remains silent when backspace is pressed in Claude Code. The character is deleted visually, but there is no auditory feedback about what was deleted.

Root Cause Analysis

Investigation (including attempting to build an NVDA add-on workaround) identified the root cause:

  1. Ink.js rendering approach—Claude Code uses Ink.js which employs ANSI escape sequences to directly manipulate cursor position and redraw the screen as a 2D canvas
  2. No discrete character events—When backspace is pressed, Ink.js doesn't send a "character deleted" event; it redraws the entire line with one less character
  3. Limited accessibility API exposure—Windows Terminal renders Ink.js output as graphics rather than exposing it through standard accessibility APIs (UIA, MSAA) that NVDA relies on
  4. Console buffer limitations—NVDA's console screen buffer reading APIs see only the final rendered state, not the incremental changes

Workarounds attempted (all failed)

  • AppModule with gesture binding—could intercept backspace but not read the character
  • Console screen buffer API—Ink.js bypasses standard console buffer
  • Review cursor reading—no accessible text to read from
  • Event monitoring—events don't fire for Ink.js updates

Required Fix

This issue requires changes within Claude Code itself to either:

  • Implement proper accessibility event generation when text is modified
  • Provide text content through Windows accessibility APIs
  • Send discrete character deletion events that screen readers can intercept
  • Use the INK_SCREEN_READER flag more effectively to generate screen-reader-friendly output

Current Workaround

The only viable workaround is manual: using NVDA review cursor commands before pressing backspace (NVDA+Numpad4 or NVDA+Shift+LeftArrow on laptop layout to read previous character). This requires the user to manually check what they're about to delete. This is not an acceptable long-term solution and significantly impacts usability for blind developers.

Impact

This significantly impairs the usability of Claude Code for blind developers who rely on auditory feedback for text editing. Without knowing what character is being deleted, users must use inefficient workarounds that disrupt their workflow and productivity.

View original on GitHub ↗

This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗