feat: add hold-to-talk listener and restore Handy-managed preferences

This commit is contained in:
kiri committed 2026-09-09 20:44:59 +02:00
1 parent 0992f3b863
commit e61f230978
7 files changed
+135 -47

No files matched your search

+16 -12
View File
@@ -119,15 +119,17 @@ reports are not a fresh comparison with this baseline.
## Open choices and next discussion
Dictation: plain local transcription is selected; rambling cleanup is deferred.
Handy preferences are Nix-owned in `modules/capabilities/handy.nix`: Nemotron
Streaming 3.5, automatic language detection, default microphone, Live overlay at
the bottom, Ctrl+Shift+V paste through wtype, preserved clipboard, manual submission
and no cloud processing. Other preferences use pinned app defaults. A user service
copies the baseline into Handy's writable store on each start, allowing migrations
while resetting GUI edits. Models/recordings stay outside Nix; the selected model
is already downloaded on Zenith. Other hosts still need model provisioning.
Super+Shift+D toggles; Super+Ctrl+D cancels. Super+D push-to-talk awaits the user's
decision about a keyboard listener: Niri 26.04 has no key-release bindings.
Handy preferences are application-owned again: the Nix settings generator and
startup reset are removed. The existing settings file is left untouched.
Nix installs Handy/wtype and runs Handy as a graphical-session user service.
Super+D launches a short-lived Python/evdev listener: hold to record, release D
or Super to finish. Both keys must be on the same keyboard. Niri owns the shortcut
and disables repeat; no persistent keyboard logger or exclusive input grab runs.
A udev uaccess rule grants the active local user access to keyboard event devices.
Super+Shift+D toggles; Super+Ctrl+D cancels. Both stop any active hold listener
before issuing their Handy command, preventing a later release from restarting
recording. Begin push-to-talk from idle: Handy exposes toggles, not idempotent
start/stop commands. Niri 26.04 itself has no key-release bindings.
Noctalia suppresses microphone activity popups/indicators; camera and screen-sharing
indications remain. Automatic paste and live capture need interactive checks.
@@ -139,9 +141,11 @@ and Vulkan batch mode (156 ms inference, 420 ms load). This checks model inferen
not live capture/stop/cancel. No new audio was recorded. Switching to CPU is not a
confirmed fix. After activation, retry live recording and stopping, and inspect
the service logs if it hangs.
Verification: formatting, flake evaluation, both workstation builds and whitespace
checks passed. Handy loaded the generated settings in an isolated data directory
without settings parse errors. System activation remains user-owned and pending.
Synthetic listener checks cover release during startup, repeat, modifier-first
release, device disconnect and cancellation, without live input/audio access.
System activation and an interactive hold/release trial remain user-owned.
Formatting, flake evaluation, both workstation builds, synthetic listener checks
and whitespace checking passed. No live input listener or microphone was started.
The focus is the broader environment, not further API/database polish. Candidate
areas remain places/ownership, navigation/interaction, human/agent collaboration,
+2 -2
View File
@@ -29,8 +29,8 @@ use a flake to declare its tools without Nix owning the surrounding workspace.
interaction with useful connections to the rest of the environment.
- Use Handy for local plain dictation, mainly English with occasional Dutch.
Use native Wayland automatic paste and optional live text with a streaming model.
Nix owns Handy preferences and desktop integration; the user service restores
settings on each start. Model downloads and recordings remain application data. Cleanup
Handy owns its preferences, models and recordings. Nix installs and starts it
and supplies desktop shortcuts, including a short-lived push-to-talk listener. Cleanup
through Codex, a cloud API or a local language model is deferred.
- Outlook is acceptable as an application, but its interaction and integration
do not fit as naturally. Accessible mail for tools and agents matters separately