Hold a key and say what to do. Offline voice commands for GNOME. Hold the shortcut (Super+C by default), speak, release: "open Firefox", "volume 50", "dark mode", "next workspace", "lock the screen", "screenshot", "Wi-Fi off"… run at once. Anything else ("clone the repo owner slash name", "update the system", "what is using my memory") becomes a shell command that you see and confirm before it runs in a visible terminal; the pill then reports done or failed. Everything runs on your computer: speech recognition by the Voice Hold engine (French, English and 23 other languages), GNOME actions by rules, open requests by a small local LLM through Ollama (optional). No account, no cloud. Requires the separate command-hold-engine helper (Python, GPL, one command to install) and the Voice Hold engine; nothing works without them. The settings page shows the install commands, with a button that copies them to the clipboard, and the engine status. Wayland only.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
| Version | Status |
|---|---|
| 0.2 (1) | Unreviewed |
Author note (first submission). Command Hold is the third of the "Hold" family (Accent Hold #10265, Voice Hold #11610): hold Super+C, say what to do, release. Architecture, for the reviewer: - Speech recognition comes from the Voice Hold engine over the session bus (org.griffit.VoiceHold); command interpretation from a second helper, command-hold-engine (Python, GPL-2.0-or-later, same repository), over org.griffit.CommandHold (D-Bus activation). The extension never spawns a process: no Gio.Subprocess / GLib.spawn anywhere in the extension zip (grep-able). Shell commands are run by the helper in a visible terminal, and only after the user confirmed them in a ModalDialog (confirmDialog.js: Enter runs, Escape cancels; the exact command is shown). - GNOME actions are done in-process with public APIs: Gio.DesktopAppInfo (launch apps), Gvc.MixerControl (volume), org.gnome.SettingsDaemon.Power brightness, org.gnome.desktop.interface color-scheme and notifications show-banners via Gio.Settings, NM and GnomeBluetooth, workspace manager, Shell.Screenshot, Main.screenShield.lock and SystemActions. Nothing is written outside GSettings. - Preferences: an "Installation" page (setup.js / setupPage.js) downloads the two helpers, the speech models and optionally an Ollama bundle with libsoup 3, verifies each file against a SHA-256 published in a manifest (https://github.com/d101c/hold-setup/blob/master/manifest.json), extracts with libgnome-autoar into ~/.local/share/hold, and writes the user D-Bus service files. This runs in the prefs (GTK) process only. The Copy buttons write install commands to the clipboard, as declared in the description. - Same keyHook.js / hud.js as Voice Hold: IBus.InputContext.prototype.process_key_event_async is wrapped only while a hands-free session runs and restored only if the wrapper is still its own; hud.js reads Main.inputMethod._cursorRect with a pointer fallback. Tests: gjs cases for dispatch/holdMachine/keyHook, 150 pytest cases for the engine. I used AI assistance to write and review this code and can explain every line.