Commit graph

598 commits

Author SHA1 Message Date
COGnITO (mode: carbon)
cf284b1700
feat(nix): NixOS integration — ALSA_PLUGIN_DIR, nixosModule, home-manager module (#1025)
- Set ALSA_PLUGIN_DIR to PipeWire's alsa-lib path in package wrapper
  (NixOS store paths aren't in ALSA's default plugin search)
- Add nixosModules.default: udev rule for /dev/uinput, systemPackages
- Add homeManagerModules.default: systemd user service for autostart

Co-authored-by: zitongcharliedeng <zitongcharliedeng@users.noreply.github.com>
2026-03-16 20:47:32 +08:00
CJ Pais
cafc2b7208
experimental: pick between cpu/gpu acceleration + enable directml on windows (#1058)
* first pass at gpu acceleration

* unload the model when changing

* mock accelerator

* translations and build fix

* format

* clean up helptext

* type cleanup

* format

* lint
2026-03-16 20:41:30 +08:00
Ivan Zhuravlev
f8bbcd791c
Migrate to transcribe-rs-0.3.1 and add Canary support (#1023)
* refactor: migrate transcribe-rs from v0.2.8 to v0.3.0

Breaking API migration:
- engines::* → onnx::* module paths, whisper_cpp::* for Whisper
- TranscriptionEngine trait → SpeechModel trait
- Two-step new()+load_model() → one-step Model::load()
- transcribe_samples(Vec<f32>) → transcribe(&[f32])
- Explicit unload_model() → RAII drop
- Canary engine now from transcribe-rs instead of local crate

Removes canary-engine local crate dependency.
Uses path dependency to local transcribe-rs clone (temporary).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: upgrade transcribe-rs to v0.3.1, add Canary models

Update transcribe-rs dependency from v0.2.8 to v0.3.1 with
restructured features (whisper + onnx). Add Canary 180M Flash
(4 languages, 146MB) and Canary 1B v2 (25 EU languages, 692MB)
with translation support. Add i18n translations for all 17 locales.

Languages verified against HuggingFace model cards:
- Canary 180M Flash: en, de, es, fr
- Canary 1B v2: bg, hr, cs, da, nl, en, et, fi, fr, de, el, hu,
  it, lv, lt, mt, pl, pt, ro, sk, sl, es, sv, ru, uk

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* make sure when changing models the language changes with it

* format

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-16 16:31:44 +08:00
CJ Pais
f45ad97e51
ensure samples don't get dropped (#1043)
* ensure samples don't get dropped

* format
2026-03-16 08:47:00 +08:00
CJ Pais
184bdf4586
Update README.md 2026-03-15 23:12:14 +08:00
Fero
a6e8fc8651
fix: keep Windows microphone guidance Windows-only (#1032)
* fix windows-only mic permission guidance

* don't hardcode error strings in rust

* format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-15 22:44:48 +08:00
Tom Plant
2a528d8d10
Add Windows installation with winget to README (#1046)
https://github.com/microsoft/winget-pkgs/pull/336309#issuecomment-4054883712
2026-03-15 15:29:21 +08:00
CJ Pais
b833a21f04 update handy keys 2026-03-14 18:54:10 +08:00
Scott Humphries
e3a040cd97
Remove step prop from VolumeSlider component (#944)
Removed the `step` prop from VolumeSlider to use the generic Slider component's default `0.01` step size.
2026-03-14 14:28:29 +08:00
CJ Pais
cbdb4983cd
upgrade to handy-keys 0.2.3 (#1039) 2026-03-14 12:39:15 +08:00
CJ Pais
30a940629a
be able to change models from the tray (#1002)
* be able to change models from the tray

* persist at the right times

* fixes

* fix tests
2026-03-14 12:19:06 +08:00
CJ Pais
79f28f515c remove usage of dangerouslySetInnerHTML 2026-03-14 11:52:40 +08:00
CJ Pais
46fd170d69
attempt to clean up warnings on build (#1037)
* attempt to clean up warnings on build

* format

* fix linux warning
2026-03-14 11:42:42 +08:00
Javier Campanini
85a8ed77b5
feat: pass custom words as Whisper initial_prompt instead of post-correction (#1035)
Whisper supports an `initial_prompt` parameter that biases the model's
vocabulary during transcription. For Whisper models, we now join the
user's custom words list into a comma-separated string and pass it as
the initial_prompt. This guides the model to prefer those spellings
during decoding rather than relying solely on fuzzy post-correction.

For non-Whisper engines (Parakeet, Moonshine, SenseVoice, GigaAM),
the existing apply_custom_words post-correction continues to apply
since those engines don't support prompt-based vocabulary biasing.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 09:37:46 +08:00
CJ Pais
6ad588cba0 bindings from macos 2026-03-14 09:07:28 +08:00
Fero
dfd445d422
Add Windows microphone permission onboarding (#991) 2026-03-13 22:06:46 +08:00
CJ Pais
3795bc2417
unwind instead of crash (#1030) 2026-03-13 21:04:50 +08:00
CJ Pais
a58216e076
default to handy keys on windowss (#1029) 2026-03-13 20:37:09 +08:00
Evgeny Khudoba
7056edce28
fix(nix): replace manual hash management with bun2nix (#1021)
* fix(nix): replace manual hash management with bun2nix

Eliminate the recurring problem of Nix build hashes breaking whenever
bun dependencies change or the bun version in nixpkgs updates.

Changes:
- Add bun2nix flake input (pinned to v2.0.1) for per-package fetchurl
  expressions from bun.lock, replacing the single FOD hash approach
- Use allowBuiltinFetchGit for cargo git dependencies, removing manual
  outputHashes that required updates on every git dep change
- Add scripts/check-nix-deps.ts (cross-platform, runs via bun) that
  auto-regenerates .nix/bun.nix when bun.lock changes, triggered by
  the postinstall hook in package.json
- Update CI workflow to verify bun.nix is in sync and evaluate flake
- Remove scripts/update-nix-hashes.sh (no longer needed)

* style: format check-nix-deps.ts with prettier

* ci(nix): make nix-check job a required check

* fix(nix): address review feedback

- Fix bun2nix input pinning: use path syntax (github:owner/repo/tag)
  instead of ?tag= query parameter so flake.lock records the ref
  and `nix flake update` respects the pin
- Make check-nix-deps.ts exit with 0 on bun2nix failure so that
  `bun install` is not blocked for non-Nix developers (CI validates
  bun.nix independently)
- Fix stale reference to check-nix-deps.sh in flake.nix comment

* ci(nix): add full nix build step to CI workflow

Add `nix build .#handy -L --show-trace` after flake evaluation to
catch runtime build errors (broken dependencies, sandbox issues,
compilation failures) that flake eval alone cannot detect.

* fix(nix): update bun2nix pin from 2.0.1 to 2.0.8

bun2nix 2.0.1 has a bug in cache-entry-creator that causes
"ln: failed to create symbolic link '/p': Permission denied"
during the build. Version 2.0.8 fixes this.
2026-03-13 18:45:46 +08:00
Avish Jha
01b8b05bdc
docs: add note in readme about homebrew install (#1011)
* docs: add note about brew install not being directly maintained by devs

Added note about Homebrew cask maintenance and updated installation steps.

* fix

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-12 20:33:01 +08:00
Evgeny Khudoba
5dbe99bf00
fix(nix): Fixed nix hash for dependencies, added CI job and script for updating dependencies versions (#948) 2026-03-12 18:39:39 +08:00
Jon Deibel
aebd432390
fix: overlay not showing on non-primary monitors (#969) 2026-03-12 06:51:42 +08:00
CJ Pais
82297fa146
Add model loading failure notifications with i18n support (#997)
* fix: show toast notification when model fails to load with ORT error

The model loading failure (e.g. ORT error) was only shown as a small
red dot with truncated text in the footer. Now it also triggers a
toast notification, matching how recording errors are already handled.

https://claude.ai/code/session_015VfQgoDkUDV6wk63RHrwEs

* fix: add missing i18n keys for model load error toast to all locales

https://claude.ai/code/session_015VfQgoDkUDV6wk63RHrwEs

* fix: simplify model load error toast and add proper translations

Remove the unnecessary modelLoadFailed passthrough key that just
forwarded a variable. Use the error string directly with a translated
fallback. Add proper translations for all 16 locales.

https://claude.ai/code/session_015VfQgoDkUDV6wk63RHrwEs

* fix: translate recordingFailed string in all locales

This was previously left untranslated (English) in all non-English
locale files.

https://claude.ai/code/session_015VfQgoDkUDV6wk63RHrwEs

* cleanup

* format

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-11 14:43:16 +08:00
Arshit Vaghasiya
d6ed1f9bbc
ui: improve scrollbar UI with custom colors and rounded thumb (#983)
* ui: improve scrollbar UI with custom colors and rounded thumb

* ui: increase scrollbar thickness for better visibility

* ui: refine scrollbar styling from primary pink to text/15 color and add custom buttons for scrollbar

* tweaks

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-11 14:38:37 +08:00
Alexander Yastrebov
22d2e96942
Improve Russian translation (#996) 2026-03-11 09:11:59 +08:00
CJ Pais
426031a8d7 Release v0.7.10 2026-03-10 13:17:20 +08:00
Fero
785c3317e4
Handle microphone init failure without aborting (#945)
* Handle microphone start failures without aborting

Return recorder init errors instead of panicking/aborting in the worker thread and reset UI state when recording start fails.

Refs #436

* prop errors to ui

* format

* Add missing recording error translation keys

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-10 13:07:21 +08:00
Dariel Dato-on
fc05e4aee9
fix: simplify Bun setup for Windows ARM64 (#965)
oven-sh/setup-bun@v2 (v2.1.1+) now automatically falls back ARM64 to
x64 with AVX2 disabled on Windows, making the manual baseline download
workaround unnecessary.

Ref: https://github.com/oven-sh/setup-bun/pull/131
Ref: https://github.com/oven-sh/setup-bun/issues/130

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 21:44:19 +08:00
CJ Pais
f221f834c3 Merge branch 'main' of github.com:cjpais/Handy 2026-03-06 20:59:31 +08:00
CJ Pais
e354c0afc8 update dialog package.json 2026-03-06 20:59:14 +08:00
CJ Pais
615b3c93bb
feat: language-aware filler word removal (#971)
* Remove filler words that conflict with European languages

Removed three filler words from the transcription filter that are actual
words in European languages:

- 'um' - Portuguese/Spanish indefinite article meaning 'a/an' (masculine)
  Example: Portuguese 'Isto é um teste' (This is a test)
  Removing this was breaking Portuguese transcriptions

- 'ha' - Spanish/Italian/Norwegian/Swedish auxiliary verb meaning 'has/have'
  Example: Spanish 'Él ha comido' (He has eaten)
  This is a very common verb form in Romance and Scandinavian languages

- 'eh' - Italian interjection and Canadian English discourse marker
  While less critical, this can appear in legitimate Italian speech

The remaining filler words are primarily English
vocalized hesitations that don't conflict with common words in other
European languages.

Updated tests to use 'uhm' instead of 'um' where needed.

Fixes #941

* customize list

---------

Co-authored-by: Alexander Yastrebov <yastrebov.alex@gmail.com>
2026-03-06 20:24:29 +08:00
Giovanni Donisi
f8c74e9449
Fix Italian translation (#973) 2026-03-06 20:10:41 +08:00
Shehab Tarek
10beb60d63
feat: add portable mode to NSIS installer (#807)
* ci: add temporary test workflow for portable ZIP validation

* ci: fix mock setup in test workflow

* ci: remove temporary test workflow

* feat: add portable mode option to NSIS installer

Custom NSIS template based on tauri-v2.9.1 upstream with 6 targeted
modifications for portable mode support:

- New PortableMode variable and /PORTABLE CLI flag for silent installs
- Install type selection page with Normal/Portable radio buttons
- Conditional default directory (Desktop for portable, LocalAppData for normal)
- Skip registry writes, file associations, deep links, and uninstaller for portable
- Skip Start Menu and desktop shortcuts for portable installs
- Create portable marker file and Data/ directory on portable install

The existing portable.rs runtime detection is unchanged — it looks for the
same marker file this installer creates.

Usage:
  GUI: select "Portable Installation" on the install type page
  Silent: Handy_setup.exe /S /PORTABLE /D=C:\path\to\Handy

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: implement true portable mode via source code path override

Detect a `portable` marker file next to the executable at startup.
When present, redirect all data paths (settings, models, recordings,
database, logs) to a local `Data/` directory instead of %APPDATA%.

This approach works because it intercepts path resolution at the Rust
level, bypassing Tauri/Windows Shell API limitations that made the
previous environment-variable and junction approaches unreliable.

Changes:
- Add src-tauri/src/portable.rs with OnceLock-based detection
- Replace all app.path().app_data_dir() calls with portable helper
- Configure tauri-plugin-log to use Folder target when portable
- Configure tauri-plugin-store with absolute path when portable
- Simplify build.yml portable ZIP (exe + resources + marker file)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add missing Manager trait import in portable.rs

The .path() method on AppHandle requires `tauri::Manager` in scope.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: redirect WebView2 cache to portable Data dir

Move main window creation from tauri.conf.json to setup closure so
we can set data_directory when in portable mode. This prevents
WebView2 from creating %LOCALAPPDATA%\com.pais.handy.

Also set data_directory on the recording overlay window.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: auto-detect portable mode during updates

When the Tauri updater runs the installer with /UPDATE, the install type
page is skipped and /PORTABLE is not passed. Detect the existing portable
marker file in .onInit so updates preserve portable mode automatically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: fix prettier formatting in portable.rs and lib.rs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-06 12:07:11 +08:00
albanobattistella
5ff3c896b2
Update translation.json (#961) 2026-03-05 09:49:21 +08:00
Ari
a50c59ce90
docs: add Linux install steps and AppImage troubleshooting to BUILD.md (#951)
Document the deb extraction method for installing from source on Linux,
and the AppImage build failure on rolling-release distros (Arch, CachyOS,
etc.) caused by linuxdeploy's bundled strip being too old.

Closes #946

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:14:23 +08:00
CJ Pais
a6b5c32cdb move to tauri dialog 2.6 2026-03-02 14:38:02 +07:00
CJ Pais
998449d2ad release v0.7.9 2026-03-01 22:05:33 +07:00
CJ Pais
f403cb12db update transcribe-rs 2026-03-01 22:04:47 +07:00
CJ Pais
cc05085427 Merge branch 'main' of github.com:cjpais/Handy 2026-03-01 21:53:02 +07:00
CJ Pais
eade87a178
upgrade to handy keys 0.2.2 (#926)
* Update translation.json

* upgrade handy keys
2026-03-01 21:12:13 +07:00
CJ Pais
51ef6f5755 Merge branch 'main' of github.com:cjpais/Handy 2026-03-01 20:58:27 +07:00
CJ Pais
b0aa2343d0 Update translation.json 2026-03-01 20:55:05 +07:00
pantafive
ff8612297b
feat: add GigaAM v3 for Russian speech recognition (#913)
* feat: add GigaAM v3 model for Russian speech recognition

Add GigaAM v3 e2e_ctc as a new transcription engine using
transcribe-rs 0.2.7 gigaam feature. Russian speech recognition
with punctuation, Latin characters and digit support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: cargo fmt formatting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Keep the file name of the model download the same as the file on the
blob website.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-01 20:53:48 +07:00
Brandon Chen
17d34a910f
fix: upgrade tauri-plugin-updater to v2.10.0 to fix duplicate registry entries (#873) (#876)
* fix: upgrade tauri-plugin-updater to v2.10.0 to fix duplicate registry entries (#873)

Upgrade tauri and tauri-plugin-updater to get bundle-specific target
resolution, which prevents NSIS-installed users from receiving MSI
updates via OTA and creating duplicate registry entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* move to my branch

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-01 20:41:55 +07:00
Brandon Chen
2361b8511c
fix(i18n): tray menu shows Simplified Chinese when Traditional Chinese is selected (#901)
The tray locale lookup truncated "zh-TW" to "zh", always hitting
Simplified Chinese. Now tries full locale first, then language prefix,
then English.

Follow-up fix for #796.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-01 10:39:14 +07:00
fotiecodes
86263578dc
Translated section "keyboardImplementation" translations for the languages i know and could help with (FR, PT, ES, TR) (#910) 2026-02-28 08:02:00 +08:00
CJ Pais
1d4d6820f6
[macOS] Fix tray icon disabled + start hidden causing app to become permanently invisible (#903)
* tray fix

* format

* Update lib.rs

* Update lib.rs
2026-02-27 10:55:04 +08:00
that-lucas
f1516d9228
fix: auto-refresh model list when switching post-processing providers (#854)
* fix: auto-refresh model list when switching post-processing providers

Clear cached model options and auto-fetch available models when the user
switches providers or changes the Custom provider's base URL. Prevents
stale model values from silently causing 404s at runtime.

* fix: address PR review feedback

- Fix race condition in updatePostProcessBaseUrl: persist base_url
  before clearing models so a failed write doesn't wipe the model
- Fix indentation in handleProviderSelect callback body
- Add guard before auto-fetching models: skip when provider has no
  API key or Custom has no base_url to avoid unnecessary errors

* fix: check result status before clearing models, run Prettier

- Check changePostProcessBaseUrlSetting and changePostProcessModelSetting
  result status before proceeding; bail on error to avoid partial state
- Clear cached model options only after both backend writes succeed
- Run Prettier to fix line-length violations (dependency array, destructuring)
2026-02-25 16:21:26 +08:00
CJ Pais
f705a4948d
Update README.md for improved application description
Revised description for clarity and privacy emphasis.
2026-02-24 23:31:51 +08:00
CJ Pais
52047ae06e release v0.7.8 2026-02-24 23:05:11 +08:00