Commit graph

635 commits

Author SHA1 Message Date
Guan-Rong Wu
2cb0e78bde
Change zh-Hant OpenCC conversion from S2twp to S2tw (#1171) 2026-03-28 10:50:40 +08:00
tomerar
18ce41a4ef
Add Hebrew language support (#1155) 2026-03-27 06:54:16 +08:00
CJ Pais
233db14d72 release v0.8.1 2026-03-26 09:16:55 +08:00
CJ Pais
32687d19e1
rearrange some ui (#1123)
* rearrange some ui

* full disable

* move cancel shortcut

* fix bg translation
2026-03-26 09:16:22 +08:00
CJ Pais
2b7231e6a9 Update Cargo.lock 2026-03-26 09:03:57 +08:00
CJ Pais
a6eec9e628
enumerate and list gpus in the whisper dropdown, improve auto gpu (#1142)
* enumerate and list gpus in the whisper dropdown, improve auto gpu
support

* add translations

* move to release transcribe-rs
2026-03-26 09:00:59 +08:00
Shehab Tarek
214e22dc3d
fix: require magic string in portable marker to prevent false portable mode on scoop installs (#1126)
* fix: require magic string in portable marker to prevent false portable mode

Scoop's extras bucket extracts the NSIS installer via #/dl.7z, which can
leave a stale empty portable file next to the exe. This caused
portable::init() to falsely trigger portable mode on non-portable scoop
installs, storing data in Data/ next to the exe (wiped on each update).

Changes:
- portable.rs: only enable portable mode when marker contains
  "Handy Portable Mode"; extracted is_valid_portable_marker() with tests
- installer.nsi: write magic string when creating marker file
- installer.nsi: validate magic string in update auto-detect block
- installer.nsi: allow desktop shortcut creation from finish page
  checkbox in portable mode (was silently doing nothing)
- commands/mod.rs + lib.rs: expose is_portable() as a Tauri command
- UpdateChecker.tsx: show manual-update popup for portable installs
  instead of attempting auto-install (which would download MSI)
- en/translation.json: add i18n strings for portable update popup

Fixes #1124

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

* fix: add missing translation keys to all locales and fix prettier formatting

Add portableUpdateTitle, portableUpdateMessage, portableUpdateButton to
all 17 non-English locales (English fallback text) so check:translations
passes. Also run prettier on the PR's modified files to fix format:check.

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

* fix: migrate legacy empty portable markers from v0.8.0

v0.8.0 created an empty `portable` marker file. Users who manually
update (drop new exe in place) would silently lose portable mode since
the new magic-string check rejects empty files.

Migration: if the marker exists but has invalid/empty content AND a
`Data/` directory is present, treat it as a real portable install and
rewrite the marker with the magic string. This handles the v0.8.0 →
new upgrade path without regressing the scoop false-positive fix
(scoop does not create a Data/ directory).

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 08:52:33 +08:00
CJ Pais
c6576aca44 fix paste delay not being saved 2026-03-26 08:33:58 +08:00
Ron
714ce0c270
Add Bulgarian language (#1136)
Co-authored-by: Ron <ron@xron.net>
2026-03-24 20:44:15 +08:00
CJ Pais
ad75807a69 format 2026-03-23 08:44:53 +08:00
CJ Pais
557d274db6 release v0.8.0 2026-03-23 08:43:26 +08:00
CJ Pais
2d8c94d258 Update .gitignore 2026-03-23 08:43:01 +08:00
CJ Pais
495311ca0b Update translation.json 2026-03-23 08:41:41 +08:00
Alexander Yastrebov
cca4c49455
Fix model speed/accuracy indicator alignment (#1116)
* increase indicator width to fit German translation
* use text-end for proper alignment of Arabic translation
* use ms-4 instead of ml-4 to fix score bar alignment for Arabic
* use ms-auto to fix download button alignment for Arabic

Fixes #1109
2026-03-23 08:35:39 +08:00
Marcelo Terreiro Prado
f6e71862ff
fix: show friendly error when no audio input device is available (#1115) 2026-03-23 07:53:55 +08:00
MOHAMMAD ALBARHAM
05f6bdfb50
Adding Swedish language translation (#1113) 2026-03-22 19:11:04 +08:00
Fero
17277cf6ce
Save recordings before transcription (#1024)
* save recordings before transcription

* impart cj preferences

* cleanup

* re-transcribe anything

* format

* fix tests

* format

* ui cleanup

* format

* cleanup

* bunch of fixes, mainly for vm

* put comments back

* update transcription failure text

* alert -> toast

* spawn_blocking

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-22 15:43:02 +08:00
Ivan Schneider
4a4f5ebc9a
docs: remove outdated CHANGELOG.md (#1110) 2026-03-22 08:15:47 +08:00
Viren Mohindra
58cda3f3b3
fix: sha256 verification to prevent corrupt partial download loop (#1095)
* fix: add SHA256 verification to prevent corrupt partial download loop

Fixes issue #858 — corrupt .partial files caused an infinite loop where
a failed/cancelled download would resume from EOF, pass extraction, and
loop forever with no way to recover without manual file deletion.

Three-part fix:
- Add sha2 crate and compute_sha256() helper; verify hash post-download
  before extraction/rename for all 15 built-in models. Hash mismatch
  deletes the .partial so the next attempt starts fresh.
- Delete .partial on extraction failure (independent of checksums) so
  corrupt archives can't re-enter the loop via the same path.
- Emit model-download-failed event from the command handler so all
  callers (ModelsSettings, Onboarding) get consistent error feedback
  via a central store listener rather than per-caller return-value checks.

SHA256 hashes hardcoded alongside each model's URL in ModelInfo.
Custom models (sha256: None) skip verification silently.

* chore: remove doc comment from sha256 field

Doc comments on exported specta types propagate into bindings.ts as
inline JSDoc — not useful in generated TS. Removing at the source.

* test: add SHA256 verification unit tests

Extracts inline verify logic into ModelManager::verify_sha256() and
covers all four branches:
- None expected hash → skipped (custom models)
- Matching hash → ok, file kept
- Mismatched hash → error returned, partial file deleted
- Unreadable file → error returned

Ensures corrupt partial downloads are always cleaned up so the next
attempt starts fresh.

* chore: cargo fmt

* fix: clear cancel flag on sha256 failure, spawn_blocking for hash, fallback cleanup

- remove cancel_flags entry on sha256 failure to prevent a stale flag
  from immediately cancelling the next retry attempt (HIGH)
- add fallback state cleanup in modelStore when result.status != ok,
  so spinner clears even if model-download-failed event is missed (HIGH)
- run compute_sha256 in spawn_blocking to avoid stalling the async
  executor while hashing large model files (up to 1.6 GB) (MEDIUM)

* emit some more events for the ui to pick up

* add translations + format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-21 14:19:26 +08:00
CJ Pais
e35f0a714e
improve history performance (#1107)
* paginate history

* fixes

* fix

* format

* remove unecessary key
2026-03-21 12:06:29 +08:00
Mattia Colombo
8836d45532
Update Raycast integration description (#1100)
Updated the README to include language switching in the Raycast integration description.
2026-03-19 20:53:17 +08:00
Mattia Colombo
1a95c9c471
docs: add Raycast extension to Integrations section (#1064) 2026-03-19 20:04:17 +08:00
Viren Mohindra
cd3ec3ab8d
fix(ci): use sign-binaries: true in main-build.yml (#1094)
sign-binaries: false passes empty strings for TAURI_SIGNING_PRIVATE_KEY
and APPLE_CERTIFICATE, but Tauri treats a set-but-empty env var as a
signing attempt, causing all builds to fail. Use sign-binaries: true to
match pr-test-build.yml — secrets are already configured in the repo.
2026-03-19 15:16:34 +08:00
CJ Pais
a3015026a0
whisper-rs 0.16.0 and ort.rc12 (#1041)
* test build for 0.16.0

* macos 10.15?

* format

* shorter dir for build on windows?

* Update build.yml

* move

* Update build.yml

* long path support

* clang

* try

* try

* move to ort rc12

* use ms prebuilt?

* use lower version for 1.23.1

* download my prebuilt

* Update build.yml

* Update build.yml

* fix?

* fix(nix): use dynamic linking for ort-sys 2.0.0-rc.12

ort-sys rc.12 removed pkg-config support; without ORT_PREFER_DYNAMIC_LINK
it defaults to static linking against ORT_LIB_LOCATION, which fails
because nixpkgs only provides shared libraries (.so).

* fix(nix): override onnxruntime to 1.24.2 for ort-sys rc.12 compatibility

ort 2.0.0-rc.12 enables API v24 by default, but nixpkgs only ships
onnxruntime 1.23.2 (API v23), causing a runtime panic on model load.

Use Microsoft's prebuilt binaries for onnxruntime 1.24.2 via overlay,
patched with autoPatchelfHook for NixOS compatibility.

This overlay should be removed once nixpkgs merges onnxruntime ≥ 1.24:
https://github.com/NixOS/nixpkgs/pull/499389

* updated deps for whisper

* fix(nix): sync devShell with packages for ort-sys rc.12 compatibility

- Extract shared definitions (commonNativeDeps, gstPlugins, commonEnv,
  onnxruntimeOverlay) to avoid duplication between packages and devShells
- Add onnxruntime 1.24.2 overlay to devShell (was only in packages)
- Add BINDGEN_EXTRA_CLANG_ARGS to devShell so bindgen can find stdio.h
  and generate correct vulkan bindings for whisper-rs-sys
- Add ORT_LIB_LOCATION and ORT_PREFER_DYNAMIC_LINK to devShell
- Replace libappindicator with libayatana-appindicator in devShell
- Add onnxruntime and vulkan-loader to devShell LD_LIBRARY_PATH

* fix missing lib in the handy blob dl

* scope lib verification

* dont run bun2nix on windows

---------

Co-authored-by: Evgeny <evgeny.khudoba@yandex.ru>
2026-03-19 15:00:51 +08:00
Viren Mohindra
c5ec92b310
fix(ci): grant contents: write so build.yml reusable workflow can start (#1092) 2026-03-19 14:43:38 +08:00
Viren Mohindra
e3c9f5814f
ci: run full build and quality checks on push to main (#1091)
* ci: add full build and quality checks on push to main

Adds a new main-build.yml workflow that runs the full 7-platform build
matrix on every push to main, uploading artifacts for 30 days. Also
adds push-to-main triggers to code-quality, test, and nix-check
workflows. The nix full build now always runs on main pushes (not just
when nix packaging files change), catching the expensive breakage that
currently requires manual verification before each release.

* ci: fix permissions and clarify nix full-build intent

- narrow contents: write to contents: read in main-build.yml — no
  release assets are uploaded here so write access is unnecessary
- update nix-check comment to reflect that the full build always runs
  on push to main (not just when nix files change), matching intent
2026-03-19 14:39:09 +08:00
Viren Mohindra
cb32d35b9e
feat(audio): lazy stream close for bluetooth mic latency (#747)
* feat(audio): opt-in lazy stream close for bluetooth mic latency

keep the microphone stream open for 30s after recording stops to
reduce latency on back-to-back transcriptions. gated behind an
experimental setting (off by default) since it keeps the mic actively
capturing while idle — degrading bluetooth audio quality on macOS.

adds lazy_stream_close setting, tauri command, toggle in experimental
settings section, and i18n strings.

* fix: gate lazy close on setting in cancel_recording path

cancel_recording was unconditionally calling schedule_lazy_close,
keeping the mic open for 30s even when the setting was disabled.
also bump close_generation on AlwaysOn→OnDemand switch to cancel
any stale lazy close timers.

* feat(audio): opt-in lazy stream close for bluetooth mic latency

keep the microphone stream open for 30s after recording stops to
reduce latency on back-to-back transcriptions. gated behind an
experimental setting (off by default) since it keeps the mic actively
capturing while idle — degrading bluetooth audio quality on macOS.

adds lazy_stream_close setting, tauri command, toggle in experimental
settings section, and i18n strings.

* fix: gate lazy close on setting in cancel_recording path

cancel_recording was unconditionally calling schedule_lazy_close,
keeping the mic open for 30s even when the setting was disabled.
also bump close_generation on AlwaysOn→OnDemand switch to cancel
any stale lazy close timers.

* chore: fix cargo fmt on model.rs line from main merge

* fix race

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-19 14:12:43 +08:00
Viren Mohindra
095f4ac455
fix: prevent idle watcher from unloading model during recording (#1085)
* fix: prevent idle watcher from unloading model during recording

the idle watcher treats ModelUnloadTimeout::Immediately as a 0s
timeout, causing idle_ms > 0 to always be true. this unloads the
model on the next 10s tick — even while the user is still recording.

the Immediately variant is already handled correctly by
maybe_unload_immediately() which fires after each transcription
completes. the idle watcher should skip it entirely.

fixes regression introduced in d1da935.

* fix race condition

* cleanup

* format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-19 13:45:09 +08:00
Viren Mohindra
0b3322faf3
feat(audio): use device default sample rate and always downsample (#1084)
* feat(audio): use device default sample rate and always downsample

instead of forcing the microphone to open at 16kHz (which can cause
issues with bluetooth codecs, some ALSA drivers, and other devices
that advertise 16kHz support but produce suboptimal audio), use the
device's native/default sample rate and let the existing FrameResampler
downsample to 16kHz for the whisper pipeline.

the resampling infrastructure (rubato FftFixedIn) already exists in
run_consumer() and short-circuits when in_hz == out_hz, so devices
that natively default to 16kHz are unaffected.

* fix: graceful fallback when supported_input_configs fails

some ALSA/PipeWire drivers support default_input_config but have
a broken supported_input_configs implementation. fall back to the
default config instead of propagating the error. also add a warn
log when no config matches the device's default rate.
2026-03-19 08:53:03 +08:00
CJ Pais
d33535cfd3 release v0.7.12 2026-03-19 08:33:28 +08:00
CJ Pais
2eeb21296d
upgrade path from old giga-am to new (#1088) 2026-03-18 23:20:27 +08:00
CJ Pais
5a3e6e33d1
add extra recording buffer (#1089)
* add extra recording buffer

* translations
2026-03-18 21:00:24 +08:00
CJ Pais
012e066697 better scrollbars on macos 2026-03-18 20:26:02 +08:00
Giovanni Donisi
075a588791
Update Italian translation (#1090) 2026-03-18 19:39:09 +08:00
Viren Mohindra
e1a484f70f
ci: reduce PR check time from ~30 min to ~1 min (#1073)
* ci: reduce PR check time from ~30 min to ~1 min

- merge lint + prettier into single code-quality workflow
- add concurrency groups to cancel stale runs on rapid pushes
- add path filters so irrelevant changes skip checks
- make full nix build opt-in via "nix" label (eval-only by default)
- add nix store caching via magic-nix-cache-action
- cache trusted-signing-cli binary on windows builds
- upgrade setup-bun from v1 to v2

* ci: add workflow path filters and expand nix build triggers

- add .github/workflows/** to path filters on code-quality and nix-check
  so CI runs when workflow files themselves change
- include tauri.conf.json and build.rs in nix full-build diff check since
  these can break nix sandbox builds independently of cargo builds
2026-03-18 17:25:56 +08:00
Viren Mohindra
d1da935479
fix: auto-unload model after idle timeout to reduce memory (#1051)
- Default model_unload_timeout from Never to Min5
- Fix Drop impl: use take() on watcher handle so clones from
  initiate_model_load() don't kill the watcher thread
- Reset last_activity on model load to prevent immediate unload
- Upgrade watcher logging from debug to info level
- Remove duplicate "unloaded" event (unload_model already emits it)

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-03-17 12:51:15 +08:00
CJ Pais
789a4393e8 release v0.7.11 2026-03-17 12:24:32 +08:00
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