[BUG] Voice "hold" mode causes claude to be suspended (SIGTTIN) when terminal window loses focus

Resolved 💬 1 comment Opened May 11, 2026 by timothyspangler Closed Jun 10, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

When voice.enabled is true and voice.mode is "hold" in ~/.claude/settings.json, the claude process is suspended with zsh: suspended (tty input) claude every single time the terminal emulator window loses focus (for example, by clicking on any other application). The process appears to receive SIGTTIN, as if it were a background process attempting to read from the controlling tty.

This happens identically in both Ghostty and macOS Terminal.app, so it is not specific to a single terminal emulator. Disabling voice (/voice off, which sets voiceEnabled: false) immediately resolves the issue, and no other configuration change is required.

What Should Happen?

Claude Code should keep running normally when the terminal window loses focus. Push-to-talk voice mode should not cause the foreground process to be suspended on blur.

Error Messages/Logs

zsh: suspended (tty input)  claude

Steps to Reproduce

  1. On macOS, install Claude Code 2.1.139.
  2. Edit ~/.claude/settings.json so it includes:

``json
{
"voice": { "enabled": true, "mode": "hold" },
"voiceEnabled": true
}
``

  1. Open a fresh terminal window (Ghostty or Terminal.app) and run claude. Leave it idle at the prompt.
  2. Click on any other application window (Finder, browser, etc.) so the terminal loses focus.
  3. Switch back to the terminal. The session shows zsh: suspended (tty input) claude and the shell prompt has returned. fg resumes claude, but the cycle repeats on the next focus loss.

Toggling voice off with /voice off immediately stops the suspensions without restarting claude or the terminal.

Claude Model

Opus

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

2.1.139 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

  • Verified zsh/Ghostty/Terminal configs are not the cause: no stty tostop, no focus-event traps, no shell integration that manipulates process groups, no keyboard remappers (Karabiner, Hammerspoon, BetterTouchTool) installed or running, no tmux/screen in play.
  • The fact that SIGTTIN is delivered suggests the voice subsystem is moving claude out of the terminal's foreground process group on blur — likely as part of releasing the microphone or global key listener — and the next tty read then traps. A fix would probably be to either keep claude in the foreground process group across focus changes, or to gate the pgroup manipulation on the voice key actually being held rather than on window focus.
  • Workaround for anyone hitting this: /voice off, or remove the voice block from ~/.claude/settings.json.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗