Use this when users report:
- "recording does not start"
- "right-button gesture does not switch workspace"
- "rear button enter does not work"
- or "everything broke at once"
If service is active but all button-triggered behaviors fail together, suspect:
- Side-button raw event code mismatch (
BTN_SIDE/BTN_EXTRAvsBTN_BACK/BTN_FORWARD), or - Runtime env mapping not loaded into the service process.
Do not assume service crash first.
Current Linux+Hyprland production chain is intentionally narrowed to:
main.py->load_config()->VoiceMouseApp.run()mouse_listener.py(evdevprimary,pynputfallback)audio.py(record start/stop + sample-rate fallback)transcriber.py(funasr_onnxruntime only)output.py(enter / typed / clipboard / OpenClaw route)system_integration.py(HyprlandSystemIntegrationorNoopSystemIntegration)
Simplified/removed paths:
- Windows/macOS integration branches are removed from runtime factory.
funasrandautobackend execution paths are removed; values are compatibility-mapped to ONNX.
Kept intentionally:
pynputfallback in listener (evdev failure resilience)doctoranddeployoperational checks
systemctl --user is-active vibemouse.service
systemctl --user status vibemouse.service --no-pagerRead effective runtime env from service process:
pid=$(systemctl --user show vibemouse.service --property=MainPID --value)
python3 - <<'PY'
import subprocess
pid=subprocess.check_output(['systemctl','--user','show','vibemouse.service','--property=MainPID','--value'],text=True).strip()
env=open(f'/proc/{pid}/environ','rb').read().split(b'\0')
keys=[
b'VIBEMOUSE_FRONT_BUTTON', b'VIBEMOUSE_REAR_BUTTON',
b'VIBEMOUSE_GESTURES_ENABLED', b'VIBEMOUSE_GESTURE_TRIGGER_BUTTON',
b'VIBEMOUSE_GESTURE_LEFT_ACTION', b'VIBEMOUSE_GESTURE_RIGHT_ACTION',
b'VIBEMOUSE_ENTER_MODE', b'WAYLAND_DISPLAY', b'HYPRLAND_INSTANCE_SIGNATURE'
]
for k in keys:
v=next((x.split(b'=',1)[1] for x in env if x.startswith(k+b'=')),None)
print((k+b'='+(v if v else b'<unset>')).decode('utf-8','ignore'))
PYExpected for right-button workspace gestures:
VIBEMOUSE_GESTURES_ENABLED=trueVIBEMOUSE_GESTURE_TRIGGER_BUTTON=rightVIBEMOUSE_GESTURE_LEFT_ACTION=workspace_leftVIBEMOUSE_GESTURE_RIGHT_ACTION=workspace_right
hyprctl dispatch workspace e-1
hyprctl dispatch workspace e+1If both return ok, workspace switching path is healthy; issue is likely listener/input side.
hyprctl bindsAlso inspect config files for side-button hard binds that steal events:
grep -R --line-number -E 'mouse:275|mouse:276|mouse:277|mouse:278|sendshortcut|Return' ~/.config/hyprIf conflicting side-button binds exist, disable them and reload:
hyprctl reload config-onlyvibemouse doctorIf sample-rate errors appear (paInvalidSampleRate), set a stable rate in deploy env, e.g.:
VIBEMOUSE_SAMPLE_RATE=48000Then restart service.
Some mice emit aliases:
x1may beBTN_SIDEorBTN_BACKx2may beBTN_EXTRAorBTN_FORWARD
Listener must support both sets in evdev path.
Current expected behavior in code:
x1 -> {BTN_SIDE, BTN_BACK}x2 -> {BTN_EXTRA, BTN_FORWARD}
If missing, patch vibemouse/mouse_listener.py accordingly and add tests.
systemctl --user daemon-reload
systemctl --user restart vibemouse.service
systemctl --user is-active vibemouse.service
vibemouse doctorFunctional smoke expectations:
- front button toggles recording
- rear button sends Enter (idle) / stops recording (recording)
- hold right button + swipe left/right switches workspace
If still flaky, add temporary runtime logs in listener dispatch path:
- received event code
- resolved button label
- classified gesture direction
- resolved action