Handy README

The project's README from github.com/cjpais/Handy. As one markdown file: README.md.

Handy

Discord

A free, open source, and extensible speech-to-text application that works completely offline.

Handy is a cross-platform desktop application that provides simple, privacy-focused speech transcription. Press a shortcut, speak, and have your words appear in any text field. This happens on your own computer without sending any information to the cloud.

Why Handy?

Handy was created to fill the gap for a truly open source, extensible speech-to-text tool. As stated on handy.computer:

How It Works

  1. Press a configurable keyboard shortcut: hold it to record and release to stop, or tap it to toggle recording on and off (Hold-only and Toggle-only modes are also available)
  2. Speak your words while the shortcut is active
  3. Release and Handy processes your speech using Whisper
  4. Get your transcribed text pasted directly into whatever app you're using

The process is entirely local:

Quick Start

Installation

  1. Download the latest release from the releases page or the website
    • macOS: Also available via Homebrew cask: brew install --cask handy
    • Windows: Also available via winget: winget install cjpais.Handy
      Note: The Homebrew cask and winget package are not maintained by the Handy developers.
    • Debian/Ubuntu: Install the downloaded .deb with APT so required dependencies are installed automatically:
      sudo apt install ./Handy_*.deb
      
      Do not use dpkg -i unless the dependencies are already installed. If you already used it, run sudo apt --fix-broken install.
  2. Install the application
  3. Launch Handy and grant necessary system permissions (microphone, accessibility)
  4. Configure your preferred keyboard shortcuts in Settings
  5. Start transcribing!

Development Setup

For detailed build instructions including platform-specific requirements, see BUILD.md.

Sponsors

We're grateful for the support of our sponsors who help make Handy possible:

Wordcab        Epicenter        Bolt AI        Canty Digital

Integrations

Install handy Raycast Extension

Control Handy from Raycast — start/stop recording, browse transcript history, manage dictionary, switch models and languages.

Source · by @mattiacolombomc

Debug Mode

Handy includes an advanced debug mode for development and troubleshooting. Access it by pressing:

CLI Parameters

Handy supports command-line flags for controlling a running instance and customizing startup behavior. These work on all platforms (macOS, Windows, Linux). Largely this is a beta feature.

Remote control flags (sent to an already-running instance via the single-instance plugin):

handy --toggle-transcription    # Toggle recording on/off
handy --toggle-post-process     # Toggle recording with post-processing on/off
handy --cancel                  # Cancel the current operation

Startup flags:

handy --start-hidden            # Start without showing the main window
handy --no-tray                 # Start without the system tray icon
handy --debug                   # Enable debug mode with verbose logging
handy --help                    # Show all available flags

Flags can be combined for autostart scenarios:

handy --start-hidden --no-tray

macOS tip: When Handy is installed as an app bundle, invoke the binary directly:

/Applications/Handy.app/Contents/MacOS/Handy --toggle-transcription

Known Issues & Current Limitations

This project is actively being developed and has some known issues. We believe in transparency about the current state:

Bluetooth Headset Microphones (macOS)

Using a Bluetooth headset microphone on macOS may temporarily reduce playback quality or volume while recording because Bluetooth switches to bidirectional audio. Keep your headphones as the output device and select your Mac's built-in or an external microphone in Handy to avoid this.

fn and Globe Key Shortcuts (macOS)

Shortcuts that include the fn (Globe) key only work on Apple keyboards — your Mac's built-in keyboard or an Apple external keyboard. They will never trigger on a third-party keyboard, even while it is connected to the same Mac.

This is a hardware limitation rather than a Handy bug. fn is not part of the standard USB HID keyboard specification: Apple reports it through a vendor-specific usage that macOS honors only from Apple devices, while third-party keyboards handle their Fn key entirely in firmware and send nothing to the computer. There is no event for Handy to listen for.

If you switch between a MacBook keyboard and an external one, pick a shortcut built from standard modifiers (ctrl, option, shift, command) or a regular key instead.

Linux Notes

Text Input Tools:

For reliable text input on Linux, install the appropriate tool for your display server:

Display Server Recommended Tool Install Command
X11 xdotool sudo apt install xdotool
Wayland wtype sudo apt install wtype
Both dotool sudo apt install dotool (requires input group)

Without these tools, Handy falls back to enigo which may have limited compatibility, especially on Wayland.

Wayland Support (Linux):

Other Notes:

Overlay & Pasting Issues (Linux):

Verify Release Signatures

Handy release artifacts are signed with Tauri's updater signature format. The public key is stored in src-tauri/tauri.conf.json under plugins.updater.pubkey.

To verify a release manually, set ARTIFACT to the filename you downloaded, save the pubkey value from src-tauri/tauri.conf.json to handy.pub.b64, then decode the public key and matching .sig file from base64 and verify the artifact with minisign:

# Replace with the file you downloaded
ARTIFACT="Handy_0.8.1_amd64.AppImage"

python3 - "$ARTIFACT" <<'PY'
import base64, pathlib, sys

artifact = sys.argv[1]

pub = pathlib.Path("handy.pub.b64").read_text().strip()
pathlib.Path("handy.pub").write_bytes(base64.b64decode(pub))

sig = pathlib.Path(f"{artifact}.sig").read_text().strip()
pathlib.Path(f"{artifact}.minisig").write_bytes(base64.b64decode(sig))
PY

minisign -Vm "$ARTIFACT" \
  -p handy.pub \
  -x "$ARTIFACT.minisig"

On success, minisign prints:

Signature and comment signature verified

Do not use gpg for these .sig files.

Troubleshooting

Previous Clipboard Content Is Pasted Instead of the Transcription

If the transcription is correct in History but Handy inserts text you copied earlier, see issue #502. With the standard clipboard paste method, Handy restores your previous clipboard after a fixed delay. Under load, the receiving application may read the clipboard only after that restoration.

  1. Open Handy's settings window and press Cmd+Shift+D (macOS) or Ctrl+Shift+D (Windows/Linux) to reveal Debug.
  2. On macOS and Windows, try Reliable Paste (Beta) in Debug with a clipboard paste method selected. It uses clipboard read notifications to delay restoration instead of relying on the standard fixed delay. Test it in the application where the problem occurs; it is still experimental.
  3. If Reliable Paste is disabled or unavailable, increase Paste Delay (After) in Debug and test again. This controls the wait before restoring your previous clipboard. Paste Delay (Before) controls the wait before sending the paste keystroke and addresses a different part of the operation. These delay settings apply to the standard paste path, not Reliable Paste.

If the problem persists, add your Handy version, operating system, receiving application, paste method, Reliable Paste setting, and before/after delays to the existing issue. Redact private dictated text before sharing logs.

Manual Model Installation (For Proxy Users or Network Restrictions)

If you're behind a proxy, firewall, or in a restricted network environment where Handy cannot download models automatically, you can manually download and install them. The URLs are publicly accessible from any browser.

Step 1: Find Your App Data Directory

  1. Open Handy settings
  2. Navigate to the About section
  3. Copy the "App Data Directory" path shown there, or use the shortcuts:
    • macOS: Cmd+Shift+D to open debug menu
    • Windows/Linux: Ctrl+Shift+D to open debug menu

The typical paths are:

Step 2: Create Models Directory

Inside your app data directory, create a models folder if it doesn't already exist:

# macOS/Linux
mkdir -p ~/Library/Application\ Support/com.pais.handy/models

# Windows (PowerShell)
New-Item -ItemType Directory -Force -Path "$env:APPDATA\com.pais.handy\models"

Step 3: Download Model Files

Download the models you want from below

Whisper Models (single .bin files):

Parakeet Unified EN 0.6B (single .gguf file, recommended):

Step 4: Install Models

For Whisper Models (.bin files):

Simply place the .bin file directly into the models directory:

{app_data_dir}/models/
├── ggml-small.bin
├── whisper-medium-q4_1.bin
├── ggml-large-v3-turbo.bin
└── ggml-large-v3-q5_0.bin

For GGUF Models (.gguf files):

Place the .gguf file directly into the models directory, exactly like the Whisper .bin files above. Handy also picks up models already present in the shared Hugging Face cache (~/.cache/huggingface/hub), so a copy downloaded by another tool works without being moved.

Important Notes:

Step 5: Verify Installation

  1. Restart Handy
  2. Open Settings → Models
  3. Your manually installed models should now appear as "Downloaded"
  4. Select the model you want to use and test transcription

Custom Whisper Models

Handy can auto-discover custom Whisper GGML models placed in the models directory. This is useful for users who want to use fine-tuned or community models not included in the default model list.

How to use:

  1. Obtain a Whisper model in GGML .bin format (e.g., from Hugging Face)
  2. Place the .bin file in your models directory (see paths above)
  3. Restart Handy to discover the new model
  4. The model will appear in the "Custom Models" section of the Models settings page

Important:

Linux Startup Crashes or Instability

If Handy fails to start reliably on Linux — for example, it crashes shortly after launch, never shows its window, or reports a Wayland protocol error — try the steps below in order.

1. Install (or reinstall) gtk-layer-shell

Handy uses gtk-layer-shell for its recording overlay and links against it at runtime. A missing or broken installation is the most common cause of startup failures and can manifest as a crash or a hang well before any window is shown. Make sure the runtime package is installed for your distro:

Distro Package to install Example command
Ubuntu/Debian libgtk-layer-shell0 sudo apt install libgtk-layer-shell0
Fedora/RHEL gtk-layer-shell sudo dnf install gtk-layer-shell
Arch Linux gtk-layer-shell sudo pacman -S gtk-layer-shell

If it is already installed and you still see startup problems, try reinstalling it (e.g. sudo pacman -S gtk-layer-shell again) in case the library files were corrupted by a partial upgrade.

2. Disable the GTK layer shell overlay (HANDY_NO_GTK_LAYER_SHELL)

If installing the library does not help, you can skip gtk-layer-shell initialization entirely as a workaround. On some compositors (notably KDE Plasma under Wayland) it has been reported to interact poorly with the recording overlay. With this variable set, the overlay falls back to a regular always-on-top window:

HANDY_NO_GTK_LAYER_SHELL=1 handy

3. Disable WebKit DMA-BUF renderer (WEBKIT_DISABLE_DMABUF_RENDERER)

On some GPU/driver combinations the WebKitGTK DMA-BUF renderer can cause the window to fail to render or to crash. Try:

WEBKIT_DISABLE_DMABUF_RENDERER=1 handy

Making a workaround permanent

Once you've found a flag that helps, export it from your shell profile (~/.bashrc, ~/.zshenv, …) or from the desktop autostart entry that launches Handy. If you launch Handy from a .desktop file, you can prefix the Exec= line, e.g.:

Exec=env HANDY_NO_GTK_LAYER_SHELL=1 handy

If a workaround helps you, please open an issue describing your distro, desktop environment, and session type — that information helps us narrow down the underlying bug.

Empty recording overlay on Hyprland / Omarchy

If the recording overlay is empty or bordered, fully quit Handy and launch a native installation with Wayland enabled:

env -u HANDY_NO_GTK_LAYER_SHELL GDK_BACKEND=wayland handy

If this works, apply GDK_BACKEND=wayland only to Handy's launcher. This workaround does not work with the 0.9.6 AppImage, which forces X11.

Vulkan Overlays and Capture Tools on Windows (HANDY_KEEP_VULKAN_IMPLICIT_LAYERS)

On Windows, Handy asks the Vulkan loader to skip implicit layers to avoid crashes caused by overlay and capture hooks (#2049). GPU acceleration remains enabled; this does not change system-wide settings.

To opt out for GPU selection or debugging tools, fully quit Handy (including the tray icon), then run both commands in the same PowerShell window:

$env:HANDY_KEEP_VULKAN_IMPLICIT_LAYERS = "1"
& "$env:ProgramFiles\Handy\handy.exe"

Adjust the executable path if needed. This override only applies to apps launched from that PowerShell session, not the Start menu. Handy also preserves any existing VK_LOADER_LAYERS_DISABLE value.

How to Contribute

  1. Check existing issues at github.com/cjpais/Handy/issues
  2. Fork the repository and create a feature branch
  3. Test thoroughly on your target platform
  4. Submit a pull request with clear description of changes
  5. Join the discussion - reach out at [email protected]

The goal is to create both a useful tool and a foundation for others to build upon—a well-patterned, simple codebase that serves the community.

License

MIT License - see LICENSE file for details.

Handy is open-source software, but the Handy name, logo, icon, and brand assets are not open-source. Unofficial forks, rewrites, and redistributions must use their own branding and must not imply endorsement or affiliation.

Acknowledgments

Handy (cjpais/Handy)

Searching Database…

34K ·GitHub
Что это такое?Handy — это бесплатное приложение с открытым исходным кодом для преобразования речи в текст: нажимаете сочетание клавиш, говорите, и расшифрованный текст вставляется в то приложение, где вы печатаете. Работает полностью офлайн, на вашем own компьютере — точнее, просто на вашем компьютере, без интернета.
То есть это программа, которую я устанавливаю на компьютер, или какой-то онлайн-сервис?Это кроссплатформенное настольное приложение для Windows, macOS и Linux, написанное на Tauri и Rust. Устанавливаете его один раз, даёте разрешения на доступ к микрофону и вспомогательным функциям — и оно работает по всей системе в любом текстовом поле.
Как мне его установить и запустить?Скачайте установщик со страницы релизов или используйте 'brew install --cask handy' (macOS) либо 'winget install cjpais.Handy' (Windows); в Debian/Ubuntu установите .deb-пакет через APT, чтобы подтянулись зависимости. Затем запустите приложение, дайте разрешения и задайте своё сочетание клавиш в настройках.
Для расшифровки нужен API-ключ, аккаунт или мощная видеокарта?Ни аккаунта, ни API-ключа — всё работает локально. Модели Whisper (Small/Medium/Turbo/Large) используют ускорение на GPU, если оно доступно, а Parakeet V3 — модель, оптимизированная под CPU, с автоматическим определением языка. Модели скачиваются автоматически, а если вы за прокси, есть способ установить их вручную.
Есть ли известные недоработки, о которых стоит знать перед установкой?Несколько: на macOS микрофоны Bluetooth-гарнитур могут ухудшать качество звука, а сочетания с клавишей fn/Globe срабатывают только на клавиатурах Apple; на Linux для ввода текста нужны xdotool (X11) или wtype/dotool (Wayland), поддержка Wayland ограничена, а оверлей записи может мешать вставке текста.
Мой голос куда-то отправляется с компьютера?Нет. Весь процесс выполняется локально: Silero, детектор голосовой активности, отфильтровывает тишину, а затем Whisper или Parakeet расшифровывает оставшийся звук прямо на вашем компьютере.
Какие модели для расшифровки речи можно выбрать?Whisper в вариантах Small, Medium, Turbo и Large с ускорением на GPU, если оно доступно, плюс Parakeet V3 — модель, оптимизированная под CPU, с отличной производительностью и автоматическим определением языка. Silero VAD обрезает тишину до начала расшифровки.
Почему автор сделал этот инструмент, а не воспользовался существующими средствами диктовки?Чтобы закрыть пробел: по-настоящему открытого и расширяемого инструмента для преобразования речи в текст не было. Заявленные принципы: бесплатно (инструменты доступности должны быть у всех, а не за платным барьером), открытый исходный код, чтобы люди могли его дорабатывать, приватность (ваш голос остаётся на вашем компьютере) и простота — один инструмент, который превращает речь в текст в любом поле ввода.
Можно ли управлять программой из других приложений или скриптов?Да. Интеграция с Raycast умеет запускать и останавливать запись, просматривать историю расшифровок, управлять словарём и переключать модели. Есть и бета-флаги командной строки на всех платформах, например 'handy --toggle-transcription' — рекомендуемый способ привязать глобальные сочетания клавиш на Wayland.
Могу ли я проверить, что скачанный релиз подлинный?Да. Файлы релизов подписаны в формате подписи обновлений Tauri, а в README описано, как проверить их с помощью minisign, используя открытый ключ из src-tauri/tauri.conf.json — используйте именно minisign, а не gpg.
Creator
cjpais
Size
16.8 MB
Stars
34K
Age
1y
Commits · 90 Days