[BUG] Accessibility: macOS Zoom caret tracking broken — terminal cursor not placed at text input position

Resolved 💬 3 comments Opened Feb 26, 2026 by csabyke Closed Mar 3, 2026

Description

macOS Accessibility Zoom with "Follow keyboard focus" (caret tracking) does not work in Claude Code. Instead of following the user's typing position, the magnified view jumps to a fixed location in the TUI — specifically near the footer/status bar text (e.g., "Bypass permissions on"), making the app unusable for visually impaired users who rely on screen magnification.

This affects all screen magnification tools that track the terminal cursor position, including:

  • macOS built-in Zoom (System Settings → Accessibility → Zoom → "Follow keyboard focus")
  • Third-party screen magnifiers (e.g., ZoomText-style tools)

Previous Issues (Closed Without Fix)

This was reported twice before, but both issues were auto-closed due to inactivity without being addressed:

  • #2237 — auto-closed after 60 days of inactivity (locked)
  • #10850 — closed as duplicate of #2237 (locked)

The bug still exists as of version 2.1.x.

Root Cause Analysis

Screen magnifiers track the real terminal cursor position (set via ANSI escape sequences like \e[row;colH / CSI cursor positioning). In a standard shell (zsh, bash), the terminal cursor sits exactly where the user types, so caret tracking works perfectly.

Claude Code is a TUI app built with Ink (React renderer for terminals). During its render cycle, the actual terminal cursor is not positioned at the text input caret. Instead, it appears to be parked near a UI element in the footer/status area. This causes screen magnifiers to follow the wrong location.

Key technical details:

  1. Claude Code uses the alternate screen buffer (\e[?1049h)
  2. The entire UI is re-rendered each frame by the Ink/React renderer
  3. The real ANSI cursor position diverges from the visual input cursor — the user sees a rendered cursor character at the input position, but the actual terminal cursor (which accessibility tools track) is elsewhere
  4. As noted by a commenter on #2237: Claude Code appears to draw its own cursor using text/ANSI escape sequences rather than using the terminal's native cursor

Expected Behavior

When typing in the Claude Code input field, the terminal cursor should be positioned at the actual text insertion point, so that:

  • macOS Zoom follows the typing position
  • Screen magnifiers center on the correct location
  • tmux copy-mode starts at the correct cursor position (related side effect noted in #2237)

Actual Behavior

  • The magnified region jumps to a fixed position (bottom-left or near footer text like "Bypass permissions on")
  • It does not follow the real typing position
  • The app is effectively unusable for users who rely on screen magnification with caret tracking

Steps to Reproduce

  1. Enable macOS Zoom: System Settings → Accessibility → Zoom → Enable "Use keyboard shortcuts to zoom" or "Use scroll gesture"
  2. Enable "Follow keyboard focus" in Zoom settings
  3. Open a terminal and zoom in
  4. Type in a normal shell prompt — observe that the magnified view follows the cursor ✅
  5. Launch claude (Claude Code CLI)
  6. Start typing in the input field — observe that the magnified view jumps to the wrong location ❌

Suggested Fix

During the Ink render cycle, after drawing the full UI frame, position the real terminal cursor at the text input caret location using a standard CSI cursor position sequence (\e[<row>;<col>H). This would make the native cursor track the input position without any visual change to the TUI, while enabling accessibility tools to correctly follow the typing location.

This is a common pattern in well-behaved TUI applications — the actual cursor is placed at the logical input position even when the rest of the UI is custom-rendered.

Environment

  • OS: macOS 15+ (also reproducible on macOS 26 Tahoe)
  • Terminal: Any (Terminal.app, iTerm2, Ghostty, etc.)
  • Claude Code: 2.1.x (latest)
  • Accessibility: macOS Zoom with "Follow keyboard focus" enabled

Impact

This is a critical accessibility barrier that prevents visually impaired developers from using Claude Code. Screen magnification is one of the most common assistive technologies, and caret tracking is essential for productive use of any text-input application.

View original on GitHub ↗

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