Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
cdf5028
Refactor Sidebar settings structure (#1720)
MikaKrul Jul 21, 2026
b462aa3
feat: windows single left click on tray icon opens handy window (#369)
olejsc Jul 21, 2026
f4e3587
Add Danish translations (#1747)
jacksondk Jul 21, 2026
3ed2b21
fix: restore clipboard images after paste (#1231)
egsok Jul 21, 2026
e8c73ba
update catalog
cjpais Jul 21, 2026
e1152d8
fix: place Windows overlay on secondary monitors (#1733)
Curious-Ray Jul 22, 2026
8a362e9
fix mute bug (#1760)
cjpais Jul 22, 2026
390729a
bump handy keys 0.3.2
cjpais Jul 23, 2026
6cad594
maximize-window: enable maximize and snap support (#1778)
Cxkies Jul 25, 2026
09a6a71
fix(i18n): complete zh-TW translations for newer UI strings (#1795)
fredchu Jul 27, 2026
292db64
Harden Hugging Face downloads and use mirror fallback (#1773)
cjpais Jul 28, 2026
ea3c20a
fix(i18n): resolve zh-Hant-* system locales to Traditional Chinese (z…
fredchu Jul 28, 2026
d001fcd
secure input warning and fallback (#1785)
cjpais Jul 30, 2026
16e5d48
dont fire bindings when recording (#1811)
cjpais Jul 30, 2026
9aae694
update translations
cjpais Jul 30, 2026
cf49ab3
run overlay on main thread (#1810)
cjpais Jul 31, 2026
148e549
retry without reasoning (#1809)
cjpais Jul 31, 2026
76b44d8
fix(audio): recalibrate mic level meter so speech moves the bars (#1813)
gauravsingh06 Jul 31, 2026
2f7c2fc
Update "Manual Model Installation" documentation with Parakeet Unifie…
andreimek Jul 31, 2026
099df58
slider-reset: add reset icon following existing UI pattern (#1779)
Cxkies Jul 31, 2026
347986b
format
cjpais Jul 31, 2026
a70ac84
add more reliable paste (#1812)
cjpais Jul 31, 2026
7032758
bump handy-keys to 0.3.3
cjpais Aug 1, 2026
2266b29
remove sigusr1 on linux (#1824)
cjpais Aug 1, 2026
0902937
use SMAppService so Login Items shows Handy (#1825)
cjpais Aug 1, 2026
f602ef4
fix cargo.toml up a bit
cjpais Aug 1, 2026
05ca5f4
docs: add missing Linux build dependencies to BUILD.md (#1561)
Kaushik2003 Aug 1, 2026
76736d5
fix: link portable update dialog to the correct installer (#1750) (#1…
back1ply Aug 1, 2026
a4348be
fix: recover microphone stream after the capture worker dies (#1838)
asjad-vyro Aug 3, 2026
b1b2d9f
fix reliable paste (#1847)
cjpais Aug 3, 2026
2211da6
request stream: false, for post processing
cjpais Aug 5, 2026
96afb0c
return freed transcription buffers to the OS on Linux (#1846)
cjpais Aug 5, 2026
838f8a2
feat(nix): add Cachix binary cache to CI (#1237)
max-miller1204 Aug 5, 2026
7a5f397
pr template: dont submit more than one fix per pr
cjpais Aug 5, 2026
b4453a2
fix(audio): move blocking cpal work off the main thread + lock-free i…
xronocode Aug 5, 2026
4223e7a
fix: preserve HTTP transport error causes (#1823)
cjpais Aug 5, 2026
16caad7
fix(overlay): stop rendering animations while hidden (#1445)
koloved Aug 5, 2026
3f24f4b
fix: prioritize NonPackaged key in Windows mic permission check (#128…
ChristophNoetel Aug 5, 2026
12f02e2
fix: add input channel selection for multi-channel audio interfaces (…
phinze Aug 6, 2026
d7fc6a0
add appimage version tag to release
cjpais Aug 6, 2026
eba5d9e
fix appimage check
cjpais Aug 7, 2026
6d3239e
fix: prevent What's New from blanking settings (#1822)
cjpais Aug 7, 2026
d961593
fix: update js-yaml to address quadratic parsing (#1865)
gwendall Aug 7, 2026
0f32df7
fix(paste): release the modifier keys after pasting with wtype (#1487)
Yusyuriv Aug 7, 2026
4b3a969
feat: include streaming and translation filter buttons for easy acces…
vscg Aug 7, 2026
09aaf4d
fix moonshine streaming giving the wrong results
cjpais Aug 7, 2026
b428ae4
appimage packaging fixes (#1867)
cjpais Aug 7, 2026
3388983
release v0.9.5
cjpais Aug 7, 2026
db003f3
fix(audio): skip level meter and resampler while idle in always-on mo…
xronocode Aug 8, 2026
861b8d1
merge: sync upstream v0.9.5 (CONFLICTS: needs manual resolution)
github-actions[bot] Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ HANDY IS UNDERGOING A FEATURE FREEZE. IF YOU ARE SUBMITTING A PR WHICH IS A NEW
BUG FIXES ARE THE TOP PRIORITY. THERE ARE 60+ ISSUES TO FIX.
-->

**Please submit only one fix or feature per pull request. Pull requests containing multiple fixes or features will likely be closed.**

**Please confirm you have done the following:**

- [ ] I have searched [existing issues](https://github.com/cjpais/Handy/issues) and [pull requests](https://github.com/cjpais/Handy/pulls) (including closed ones) to ensure this isn't a duplicate
Expand Down
2 changes: 1 addition & 1 deletion .github/upstream-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v0.9.4
v0.9.5
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ blob-report/

# Nix build output
result

# Python bytecode (scripts/)
__pycache__/
2 changes: 1 addition & 1 deletion .nix/bun-lock-hash
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2b3f6a3dd6298cd35494ee52c6f5fdd40fd6391df54d48cd0063b0e154f5e1a8
a7fd0739d7f757d16b24723d230d25203292c76eafb53f3daddcf43b8ec94872
78 changes: 3 additions & 75 deletions .nix/bun.nix
Original file line number Diff line number Diff line change
Expand Up @@ -901,10 +901,6 @@
url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";
hash = "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==";
};
"escape-string-regexp@5.0.0" = fetchurl {
url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz";
hash = "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==";
};
"eslint-plugin-i18next@6.1.3" = fetchurl {
url = "https://registry.npmjs.org/eslint-plugin-i18next/-/eslint-plugin-i18next-6.1.3.tgz";
hash = "sha512-z/h4oBRd9wI1ET60HqcLSU6XPeAh/EPOrBBTyCdkWeMoYrWAaUVA+DOQkWTiNIyCltG4NTmy62SQisVXxoXurw==";
Expand Down Expand Up @@ -1121,9 +1117,9 @@
url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";
hash = "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==";
};
"js-yaml@4.1.1" = fetchurl {
url = "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz";
hash = "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==";
"js-yaml@4.3.1" = fetchurl {
url = "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz";
hash = "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==";
};
"jsesc@3.1.0" = fetchurl {
url = "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz";
Expand Down Expand Up @@ -1241,42 +1237,10 @@
url = "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz";
hash = "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==";
};
"markdown-table@3.0.4" = fetchurl {
url = "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz";
hash = "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==";
};
"mdast-util-find-and-replace@3.0.2" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz";
hash = "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==";
};
"mdast-util-from-markdown@2.0.3" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz";
hash = "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==";
};
"mdast-util-gfm-autolink-literal@2.0.1" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz";
hash = "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==";
};
"mdast-util-gfm-footnote@2.1.0" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz";
hash = "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==";
};
"mdast-util-gfm-strikethrough@2.0.0" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz";
hash = "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==";
};
"mdast-util-gfm-table@2.0.0" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz";
hash = "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==";
};
"mdast-util-gfm-task-list-item@2.0.0" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz";
hash = "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==";
};
"mdast-util-gfm@3.1.0" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz";
hash = "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==";
};
"mdast-util-mdx-expression@2.0.1" = fetchurl {
url = "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz";
hash = "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==";
Expand Down Expand Up @@ -1313,34 +1277,6 @@
url = "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz";
hash = "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==";
};
"micromark-extension-gfm-autolink-literal@2.1.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz";
hash = "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==";
};
"micromark-extension-gfm-footnote@2.1.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz";
hash = "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==";
};
"micromark-extension-gfm-strikethrough@2.1.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz";
hash = "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==";
};
"micromark-extension-gfm-table@2.1.1" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz";
hash = "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==";
};
"micromark-extension-gfm-tagfilter@2.0.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz";
hash = "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==";
};
"micromark-extension-gfm-task-list-item@2.1.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz";
hash = "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==";
};
"micromark-extension-gfm@3.0.0" = fetchurl {
url = "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz";
hash = "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==";
};
"micromark-factory-destination@2.0.1" = fetchurl {
url = "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz";
hash = "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==";
Expand Down Expand Up @@ -1561,10 +1497,6 @@
url = "https://registry.npmjs.org/react/-/react-18.3.1.tgz";
hash = "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==";
};
"remark-gfm@4.0.1" = fetchurl {
url = "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz";
hash = "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==";
};
"remark-parse@11.0.0" = fetchurl {
url = "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz";
hash = "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==";
Expand All @@ -1573,10 +1505,6 @@
url = "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz";
hash = "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==";
};
"remark-stringify@11.0.0" = fetchurl {
url = "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz";
hash = "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==";
};
"requireindex@1.1.0" = fetchurl {
url = "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz";
hash = "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==";
Expand Down
10 changes: 5 additions & 5 deletions BUILD.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,19 @@ ORT_LIB_LOCATION=$(brew --prefix onnxruntime)/lib ORT_PREFER_DYNAMIC_LINK=1 bun
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential libasound2-dev pkg-config libssl-dev libvulkan-dev vulkan-tools glslc spirv-headers glslang-tools libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libgtk-layer-shell0 libgtk-layer-shell-dev patchelf cmake
sudo apt install build-essential clang libclang-dev libevdev-dev libasound2-dev pkg-config libssl-dev libvulkan-dev vulkan-tools glslc spirv-headers glslang-tools libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev libgtk-layer-shell0 libgtk-layer-shell-dev patchelf cmake

# Fedora/RHEL
sudo dnf groupinstall "Development Tools"
sudo dnf install alsa-lib-devel pkgconf openssl-devel vulkan-devel \
spirv-headers-devel spirv-tools-devel glslang glslc \
sudo dnf install alsa-lib-devel pkgconf openssl-devel vulkan-devel glslc \
clang clang-devel libevdev-devel \
spirv-headers-devel spirv-tools-devel glslang \
gtk3-devel webkit2gtk4.1-devel libappindicator-gtk3-devel librsvg2-devel \
gtk-layer-shell gtk-layer-shell-devel \
cmake

# Arch Linux
sudo pacman -S base-devel alsa-lib pkgconf openssl vulkan-devel \
spirv-headers glslang shaderc \
sudo pacman -S base-devel clang libevdev shaderc spirv-headers glslang alsa-lib pkgconf openssl vulkan-devel \
gtk3 webkit2gtk-4.1 libappindicator-gtk3 librsvg gtk-layer-shell \
cmake
```
Expand Down
30 changes: 23 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,22 +194,24 @@ Without these tools, Handy falls back to enigo which may have limited compatibil
bind = $mainMod, O, exec, handy --toggle-transcription
```

- You can also manage global shortcuts outside of Handy via Unix signals, which lets Wayland window managers or other hotkey daemons keep ownership of keybindings:
- You can also trigger Handy externally via Unix signals or the CLI flags, which lets Wayland window managers or other hotkey daemons keep ownership of keybindings:

| Signal | Action | Example |
| --------- | ----------------------------------------- | ---------------------- |
| `SIGUSR2` | Toggle transcription | `pkill -USR2 -n handy` |
| `SIGUSR1` | Toggle transcription with post-processing | `pkill -USR1 -n handy` |
| Action | Trigger |
| ----------------------------------------- | -------------------------------------------------------- |
| Toggle transcription | `pkill -USR2 -n handy` or `handy --toggle-transcription` |
| Toggle transcription with post-processing | `handy --toggle-post-process` |

Example Sway config:

```ini
bindsym $mod+o exec pkill -USR2 -n handy
bindsym $mod+p exec pkill -USR1 -n handy
bindsym $mod+p exec handy --toggle-post-process
```

`pkill` here simply delivers the signal—it does not terminate the process.

> **Behavior change:** older releases also accepted `SIGUSR1` for toggling transcription with post-processing. WebKitGTK — the webview engine embedded in Handy on Linux — uses SIGUSR1 internally to coordinate JavaScript garbage collection, so listening for it caused phantom recordings and interrupted dictations every few minutes ([#1660](https://github.com/cjpais/Handy/issues/1660)). Handy no longer listens for SIGUSR1 on Linux; the post-processing toggle is still available via `handy --toggle-post-process`. **Remove any `pkill -USR1` bindings**: the signal is now delivered straight to WebKit's internal handler and can crash the app.

**Overlay & Pasting Issues (Linux):**

- The recording overlay window can interfere with pasting transcribed text into target applications on Linux (X11)
Expand Down Expand Up @@ -349,6 +351,10 @@ Download the models you want from below
- Turbo (1600 MB): `https://blob.handy.computer/ggml-large-v3-turbo.bin`
- Large (1100 MB): `https://blob.handy.computer/ggml-large-v3-q5_0.bin`

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

- Q8_0 (731 MB): `https://huggingface.co/handy-computer/parakeet-unified-en-0.6b-gguf/resolve/main/parakeet-unified-en-0.6b-Q8_0.gguf`

**Parakeet Models (compressed archives):**

- V2 (473 MB): `https://blob.handy.computer/parakeet-v2-int8.tar.gz`
Expand All @@ -368,6 +374,10 @@ Simply place the `.bin` file directly into the `models` directory:
└── 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.

**For Parakeet Models (.tar.gz archives):**

1. Extract the `.tar.gz` file
Expand All @@ -391,7 +401,7 @@ Final structure should look like:
**Important Notes:**

- For Parakeet models, the extracted directory name **must** match exactly as shown above
- Do not rename the `.bin` files for Whisper models—use the exact filenames from the download URLs
- Do not rename the `.bin` or `.gguf` files—use the exact filenames from the download URLs
- After placing the files, restart Handy to detect the new models

#### Step 5: Verify Installation
Expand Down Expand Up @@ -460,6 +470,12 @@ Exec=env HANDY_NO_GTK_LAYER_SHELL=1 handy

If a workaround helps you, please [open an issue](https://github.com/cjpais/Handy/issues) describing your distro, desktop environment, and session type — that information helps us narrow down the underlying bug.

### Handy Starts or Stops Recording on Its Own (Linux)

Handy 0.9.4 and earlier listened for `SIGUSR1` as a remote-control trigger. WebKitGTK — the webview engine embedded in Handy on Linux — uses that same signal internally to coordinate JavaScript garbage collection, so GC cycles were misread as hotkey presses: recordings started on their own, or real dictations were cut off mid-sentence (typically ~2 minutes in). See [#1660](https://github.com/cjpais/Handy/issues/1660).

Update to a newer release, and replace any `pkill -USR1 -n handy` keybindings with `handy --toggle-post-process`.

### How to Contribute

1. **Check existing issues** at [github.com/cjpais/Handy/issues](https://github.com/cjpais/Handy/issues)
Expand Down
Loading