Commit graph

667 commits

Author SHA1 Message Date
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
CJ Pais
4e4bc613ed please add logs when submitting bugs 2026-02-24 17:58:23 +08:00
CJ Pais
a83228030f Add BoltAI as a sponsor! 2026-02-24 16:02:46 +08:00
CJ Pais
551ad6c414 Add BoltAI as a sponsor! 2026-02-24 15:35:46 +08:00
CJ Pais
0c8358899f
use blocking for handy keys (#881) 2026-02-23 11:18:47 +08:00
CJ Pais
a5c3f88ace
Update PR template with feature freeze notice
Added a warning about feature freeze and prioritization of bug fixes.
2026-02-20 23:42:48 +08:00
CJ Pais
74951cfca4 release v0.7.7 2026-02-20 13:25:25 +08:00
CJ Pais
4fcc974ab7 Merge branch 'main' of github.com:cjpais/Handy 2026-02-20 13:25:04 +08:00
CJ Pais
f367353752
fix handy-keys not firing when in the ui (#856) 2026-02-20 13:24:47 +08:00
CJ Pais
3e140e53b2 upgrade handy-keys 2026-02-20 13:18:51 +08:00
Phuoc Thinh Vu
15fbc47f5a
fix(nix): update bunDeps outputHash (#853) 2026-02-19 04:03:44 -08:00
CJ Pais
e624a45264 toast if exists 2026-02-19 17:26:14 +08:00
CJ Pais
2cf5effef3 add translations + fix bindings 2026-02-19 17:09:22 +08:00
Pierre Carru
b90077b228
Add "external script" paste method (#638)
* feat(linux): add "external script" paste method

* feat(i18n): external script translation for fr, de, it
2026-02-19 17:07:16 +08:00
Mathieu Dupuis
f8ee7fce7c
feat: add z.ai post-process provider (#849)
Co-authored-by: Mathieu Dupuis <mathieu.dupuis@moov.ai>
2026-02-19 16:54:36 +08:00
CJ Pais
3c0fb95185
drain audio (#838) 2026-02-19 10:32:30 +08:00
MaximilianGaedig
cbc80802cb
fix: update nix hash for dependencies (#842) 2026-02-17 22:13:10 +08:00
CJ Pais
58b95c5c95 release v0.7.6 2026-02-17 13:02:48 +08:00
Anatoliy Guskov
133c50c6d4
feat: add CLI parameters for linux (#792)
* feat: add CLI parameters for Linux (--start-hidden, --no-tray, --toggle-transcription, --debug)

Add command-line interface using clap for better Linux desktop integration:
- --start-hidden: launch without showing the main window
- --no-tray: launch without system tray icon (closing window quits app)
- --toggle-transcription: toggle recording on/off on a running instance
  via tauri_plugin_single_instance
- --debug: enable debug mode with Trace-level logging (runtime-only)

Extract toggle_transcription() from signal_handle.rs into a reusable
function shared between SIGUSR2 handler and CLI single-instance callback.

Update CLAUDE.md and README.md with CLI documentation including setup
instructions for GNOME, KDE Plasma, Sway/i3, and Hyprland.

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

* add cancel and post processs

* cleanup

* format

* docs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-17 12:48:43 +08:00
Chirag Agggarwal
0cb8ab2162
feat: implement structured outputs for post-processing providers (#706)
* feat: implement structured outputs for Cerebras, OpenRouter, OpenAI, and Apple Intelligence

- Add structured output support with JSON schema in llm_client.rs
- Update actions.rs to use system prompt + user content approach
- Remove legacy ${output} variable substitution for supported providers
- Update Apple Intelligence Swift code to accept system prompts
- All providers now use consistent structured output format
- Remove duplicate check_apple_intelligence_availability function

* wip changes

* fix(structured-outputs): address PR #706 review comments

- Add settings migration to sync supports_structured_output field for existing providers
- Fix fallback behavior: structured output failures now fall through to legacy mode
- Clone api_key to prevent ownership issues in fallback path
- Clean up build_system_prompt(): remove  placeholder entirely
  (instead of replacing with 'the user's message' which reads awkwardly)
- Add warn import from log crate

* refactor(structured-outputs): apply best practice improvements

- Optimize settings migration: use single match instead of double iteration
- Add TRANSCRIPTION_FIELD constant to replace magic strings
- Keep Apple Intelligence behavior unchanged (no API fallback for privacy)

Addresses code review feedback on PR #706:
1. More efficient provider lookup in ensure_post_process_defaults()
2. Eliminates hardcoded 'transcription' string in JSON parsing
3. Maintains privacy-first approach for Apple Intelligence

* fix groq output

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-17 12:14:00 +08:00
CJ Pais
83e6f5c492
support moonshine v2 (#837)
* support moonshine v2

* format

* add translations for models
2026-02-17 11:44:10 +08:00
Ari
203ba1dbc2
feat(linux): add SIGUSR1 signal for transcribe_with_post_process (#759)
* feat(linux): add SIGUSR1 signal for transcribe_with_post_process

Register SIGUSR1 alongside SIGUSR2 in the signal handler so Linux
users can trigger transcription with post-processing via system
signals (e.g. `pkill -SIGUSR1 -x handy`). This mirrors the existing
SIGUSR2 toggle pattern and maps to the `transcribe_with_post_process`
action already present in ACTION_MAP.

Closes #758

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

* readme

* format

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-16 22:41:33 +08:00
johnpyp
7fdde63460
fix: transcription lock-up race condition & add small debounce (#824)
* fix: add TranscriptionState to prevent race conditions & add debounce

* refactor(transcription): replace state machine with actor coordinator

* some cleanup

* format

* minor cleanup

* format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-16 22:18:50 +08:00
CJ Pais
dc2077431a add back lang 2026-02-16 21:14:42 +08:00
CJ Pais
e2a8008274 push lock 2026-02-16 17:26:58 +08:00
Sami Ansari
3b88717091
fix(nix): address PR #778 review comments (#800)
- Replace patchShebangs with targeted substituteInPlace for tsc/vite
  shebangs, pointing them to bun instead of node
- Use `bun run build` instead of `${pkgs.bun}/bin/bun run build`
  since bun is already in nativeBuildInputs
- Remove nodejs from nativeBuildInputs (no longer needed)
- Add comment explaining why doCheck is disabled
2026-02-13 08:41:25 +08:00
Brandon Chen
cc477a310a
feat(i18n): add Traditional Chinese (zh-TW) locale (#796)
* feat(i18n): add Traditional Chinese (zh-TW) locale

* style(i18n): clarify zh as Simplified Chinese and format languages.ts

* tweak

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-12 18:19:28 +08:00
Phuoc Thinh Vu
336ccffcc7
fix(nix): fix ALSA mismatch, add GStreamer plugins, and repair UI environment (#787)
- Update `flake.lock` to synchronize `alsa-lib` and `glibc` versions, resolving a runtime `dlopen` crash when loading the PipeWire plugin.
  - Add `gstreamer`, `gst-plugins-base`, `good`, `bad`, and `ugly` to both `buildInputs` (package) and `devShell` to support WebKitGTK audio/video playback (resolving missing `appsink`/`autoaudiosink`).
  - Set `GST_PLUGIN_SYSTEM_PATH_1_0` in both environments so GStreamer can locate the plugins at runtime.
  - Manually set `XDG_DATA_DIRS` in `devShell` to include `gsettings-desktop-schemas` and `gtk3` schemas, fixing UI scaling, theming, and missing asset issues during development.

Co-authored-by: Thinh Vu <phuocthinhvu@gmail.com>
2026-02-11 21:34:03 +08:00
CJ Pais
43bc2373ef
Revert "feat: add portable ZIP archives for Windows releases (#753)" (#788)
This reverts commit 6f3fd9babc.
2026-02-11 21:13:32 +08:00
CJ Pais
36c29b6628 release v0.7.5 2026-02-11 20:29:33 +08:00
suuuehgi
eafc74a91e
fix: Apply DMABUF workaround on all Linux systems (#789)
The previous implementation only applied the workaround on X11 sessions,
leaving Wayland users affected by WebkitGTK DMABUF crashes. This affects
various GPU configurations (at least Intel and NVIDIA) on both X11 and Wayland.

This change applies the workaround unconditionally on Linux, ensuring
the app doesn't crash on affected systems while having minimal performance
impact.

Related: https://github.com/tauri-apps/tauri/issues/9394

Co-authored-by: suuuehgi <>
2026-02-11 20:24:30 +08:00
CJ Pais
7db91f5f92
try minimal fix (#781) 2026-02-11 19:52:42 +08:00