Interactive input broken on Linux (regression between 2.0.77 and 2.1.6)
Resolved 💬 5 comments Opened Mar 2, 2026 by c2keesey Closed Apr 2, 2026
Description
Claude Code interactive mode drops nearly all keystrokes on Linux. The input handler appears to stop reading from stdin after initialization. Non-interactive mode (claude -p) works fine.
Environment
- OS: Ubuntu 24.04.3 LTS (Noble Numbat)
- Kernel: 6.14.0-37-generic (also reproduced on 6.17.0-14-generic)
- Architecture: x86_64
- Node.js: v24.13.0 (via nvm)
- Working version: 2.0.77
- Broken versions: 2.1.6, 2.1.5, 2.1.61, 2.1.63 (both npm and native installer)
Reproduction
- Install Claude Code >= 2.1.0 on Ubuntu 24.04 (tested via both
npm install -gand native installer viacurl -fsSL https://claude.ai/install.sh | bash) - Run
claudein interactive mode - Type any text — approximately 4 out of 5 keystrokes are dropped/ignored
Diagnostic findings
- Normal terminal input: works fine
- Node.js raw mode test (readline + setRawMode + keypress events): works fine
- Ink-style stress test (heavy ANSI rendering + raw mode input): works fine
- Claude Code interactive mode: broken — keystrokes not registered
- Claude Code non-interactive (
claude -p "hello"): works fine - strace: shows the main Claude Code process (PID reading stdin byte-by-byte during config initialization) stops reading from fd 0 entirely after startup. User keystrokes never reach the process. Zero
read(0, ...)calls corresponding to typed characters.
What was ruled out
- Not SSH-related (reproduced directly on the machine with physical access)
- Not terminal-related (reproduced across Ghostty, Terminus, and local terminal)
- Not tmux-related (reproduced with and without tmux)
- Not config-related (reproduced with empty
{}settings, disabled plugins, removed statusLine/hooks) - Not resource-related (machine has 15GB RAM, <2GB used, low CPU)
- Survives full reboot
- Survives complete reinstall (rm -rf + fresh install)
- Version 2.0.77 works perfectly on the same machine
Key evidence
The strace (strace -e read,poll -f -o trace.log claude) shows:
- During startup:
read(0, "c", 1) = 1etc. reading config JSON char by char - After startup: no further reads from fd 0 — the interactive input handler never reads user keystrokes
This suggests something changed in the stdin/input handling between 2.0.77 and 2.1.x.
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗