Problem
When the global hotkey fails to initialize on Linux (e.g., missing evdev permissions), the app silently falls back to toggle mode by setting push_to_talk = false (src/app/mod.rs:216).
Toggle mode is broken — handle_toggle() transitions the state enum (Idle → Recording → Transcribing) but never creates a CpalRecorder and never runs the transcription pipeline. This causes the app to get stuck on "Transcribing..." indefinitely.
Reproduce
- Run on Linux without root/in
input group (global hotkey fails to init)
- Press space to start recording → shows "● REC 0.0s"
- Press space to stop → stuck on "Transcribing..."
Root Cause
src/app/mod.rs:212-218 — when GlobalHotkey::new() fails:
Err(e) => {
eprintln!("[voice] Warning: Could not set up global hotkey: {}", e);
if self.config.push_to_talk {
eprintln!("[voice] Falling back to toggle mode (press space to start/stop recording).");
self.config.push_to_talk = false; // <-- broken fallback
}
}
Fix
Keep push_to_talk = true when the hotkey fails. The terminal keyboard (space) already works through the PTT path. Just warn the user the global hotkey is unavailable.
Problem
When the global hotkey fails to initialize on Linux (e.g., missing evdev permissions), the app silently falls back to toggle mode by setting
push_to_talk = false(src/app/mod.rs:216).Toggle mode is broken —
handle_toggle()transitions the state enum (Idle → Recording → Transcribing) but never creates aCpalRecorderand never runs the transcription pipeline. This causes the app to get stuck on "Transcribing..." indefinitely.Reproduce
inputgroup (global hotkey fails to init)Root Cause
src/app/mod.rs:212-218— whenGlobalHotkey::new()fails:Fix
Keep
push_to_talk = truewhen the hotkey fails. The terminal keyboard (space) already works through the PTT path. Just warn the user the global hotkey is unavailable.