[BUG] Korean IME: Characters completely invisible during composition in input field (macOS)

Resolved 💬 3 comments Opened Feb 3, 2026 by minislively Closed Feb 6, 2026

Environment

  • Platform: macOS Darwin 25.2.0
  • Terminal: iTerm2, VS Code integrated terminal, Terminal.app
  • Claude Code Version: Latest (installed via npm)
  • IME: macOS default Korean IME
  • Locale: ko_KR.UTF-8

Description

When typing Korean in the Claude Code input field, characters are completely invisible during IME composition. The input field appears empty while typing. Only after pressing Enter does the output show the Korean text was actually received.

This is different from the cursor positioning issues (#16322, #16372) - here the characters do not display at all during composition, not even at a wrong position.

Steps to Reproduce

  1. Open Claude Code in terminal
  2. Switch to Korean IME
  3. Type Korean characters (e.g., "안녕하세요")
  4. Observe: Input field shows nothing - completely blank
  5. Press Enter
  6. Observe: Output correctly shows "안녕하세요"

Expected Behavior

Korean characters should be visible during IME composition, showing intermediate states:

  • Type ㅎ → see ㅎ
  • Type ㅎ + ㅏ → see 하
  • Type ㅎ + ㅏ + ㄴ → see 한

Actual Behavior

  • Input field remains completely empty during entire composition
  • No characters visible at any point until Enter is pressed
  • Makes Korean input essentially "blind typing"

Impact

  • Severity: Critical for Korean users
  • Affected users: All Korean IME users on macOS
  • Workaround: Type in external editor and paste (disrupts workflow significantly)

Related Issues

  • #18291 - Jamo not displayed until syllable completion (Kitty + Gureumkim)
  • #16322 - Composing characters display at wrong position (Windows)
  • #1547 - IME input causes performance issues
  • #3045 - Investigation: Fixing IME Issues by Patching React Ink

Root Cause Analysis

Based on investigation, the root cause is React Ink's TextInput component in terminal raw mode:

  1. Terminal raw mode (setRawMode true) provides byte-level STDIN without IME composition events
  2. Ink TextInput processes keystrokes individually without understanding multi-stage character formation
  3. No composition buffer exists for tracking in-progress IME input
  4. CJK double-width characters may confuse the cursor positioning/rendering logic

Suggested Fix Direction

  1. Detect IME composition state heuristically from raw byte sequences
  2. Maintain a separate composition buffer for pre-edit text
  3. Render composition text inline with visual indicator (underline) at cursor position
  4. Handle compositionend equivalent when final character is committed

This is the most requested fix across multiple CJK-related issues and would benefit Korean, Japanese, and Chinese users.

View original on GitHub ↗

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