Commit graph

78 commits

Author SHA1 Message Date
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
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
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
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
4e4bc613ed please add logs when submitting bugs 2026-02-24 17:58:23 +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
43bc2373ef
Revert "feat: add portable ZIP archives for Windows releases (#753)" (#788)
This reverts commit 6f3fd9babc.
2026-02-11 21:13:32 +08:00
Shehab Tarek
6f3fd9babc
feat: add portable ZIP archives for Windows releases (#753)
* feat: add portable ZIP archives for Windows releases

Add portable (no-install) ZIP builds for Windows x64 and ARM64.
After the existing Tauri build step, a new step packages Handy.exe
and its resources/ directory into a zip archive that users can
extract and run directly without an installer.

The portable ZIPs are uploaded to GitHub Releases alongside the
existing NSIS/MSI installers, and included in CI artifact uploads.

Closes #153

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

* fix: use -not instead of ! for PowerShell compatibility

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 10:35:43 +08:00
Sami Ansari
c34e7d584b
fix(nix): build from source instead of wrapping AppImage (#778)
* fix(nix): build from source instead of wrapping AppImage (#701)

Replace the AppImage-based Nix package with a native from-source build
using cargo-tauri.hook + rustPlatform.buildRustPackage. This eliminates
the recurring hash mismatch failures when releases update the binary.

- Build frontend (bun) and backend (cargo tauri) from source
- Vendor JS deps as a fixed-output derivation
- Patch libappindicator-sys for Nix store path
- Patch ferrous-opencc to skip cbindgen (upstream removed in v0.3.1+)
- Wrap binary with WEBKIT_DISABLE_DMABUF_RENDERER and LD_LIBRARY_PATH
- Delete update-flake-hash.yml workflow (no longer needed)
- devShell unchanged

* add support for arm64

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-11 08:47:39 +08:00
Martin Kleine
647ccab7f8
fix(ci): install gtk-layer-shell runtime package for Ubuntu builds (#752)
* fix(ci): install gtk-layer-shell runtime package for Ubuntu builds

* docs: update runtime dependency table formatting.

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-10 09:31:18 +08:00
Viren Mohindra
ef24cfefda
feat: add models settings page with filtering and management (#478)
* feat: add models settings page with filtering and management

- add dedicated models settings page in sidebar
- reuse ModelCard component from onboarding for consistent UI
- add filter buttons for all/multi-language/translation models
- add model deletion with native confirmation dialog (tauri-plugin-dialog)
- consolidate model event listeners into useModels hook (Zustand store)
- remove duplicate event listeners from ModelSelector, LanguageSelector, TranslateToEnglish
- gate AccessibilityPermissions to macOS only
- add is_recommended field to model registry for featured models
- remove unused get_recommended_first_model command
- add translations for all 9 supported languages

* feat: add language filter to models settings page

adds a searchable language dropdown filter to the models page that lets users filter models by language support. when a non-english language is selected, models that don't support multiple languages (like parakeet) are hidden.

- add searchable language dropdown (right-aligned in filter row)
- filter models using supports_language_selection capability
- add allLanguages translation key to all 10 locales

* feat: add translation consistency checker script

- add scripts/check-translations.cjs to validate all language files
- script dynamically discovers languages from directory structure
- checks that all languages have same keys as english reference
- detects missing and extra keys in each language
- add check:translations npm script
- integrate into github actions lint workflow
- validates translations on every pull request

* fix: update imports and add missing translations after rebase

- replace useModels hook with useModelStore in components
- add permission error keys to all languages
- add model settings keys to cs and tr (new languages from main)

* fix: translate english placeholders in cs and tr locale files

* refactor: simplify model dropdown and migrate store to immer

- model dropdown now only shows downloaded models (no download/delete)
- convert store to immer with record types for immutability
- remove unused translation keys (welcome, downloadPrompt, etc.)
- add missing moonshine-base model fields
- sync translations after rebase

* fix: add download cancellation support and ui improvements

- add full download cancellation with Arc<AtomicBool> flags in rust backend
- add progress event throttling (100ms) to prevent ui freeze
- add cancel button to model card in settings page
- add model-deleted event listener to refresh dropdown after deletion
- remove pink background from recommended models in settings (keep badge only)
- add cancel/cancelDownload translation keys to all 14 languages

* fix: remove duplicate language/translate settings from general and advanced

settings are now only in ModelSettingsCard, not duplicated in their old locations

* fix: prevent model dropdown from being clipped by window edge

* add languages explicitly, clean up some ui

* fix: clear bottom progress bar when download is cancelled

The ModelSelector component maintains its own local state for download
progress. When a download was cancelled, the Rust backend would update
its state but never emitted an event to notify the frontend. This caused
the bottom progress bar to remain stuck showing "Downloading X%".

Added model-download-cancelled event emission in Rust and corresponding
listener in ModelSelector to clear progress state on cancellation.

* fix: align model card content to top to prevent floating elements

Changed ModelCard flex alignment from items-center to items-start so
the accuracy/speed bars stay at the top when the card expands (e.g.,
during download with progress bar visible).

* fix: prevent model deletion from interrupting active extractions

Added extracting_models HashSet to track models currently being
extracted. The update_download_status() function now skips cleanup
of .extracting directories for models that are actively extracting,
preventing a race condition where deleting one model would interrupt
another model's extraction process.

* refactor: migrate ModelCard buttons to Button component

Added two new Button variants for common patterns:
- primary-soft: soft/tinted primary buttons (used for download)
- danger-ghost: subtle destructive actions (used for delete/cancel)

Migrated all hardcoded buttons in ModelCard to use the shared Button
component for consistency and maintainability.

* feat: separate downloaded and available models into sections

Split the models list into "Your Models" and "Available to Download"
sections for clearer visual distinction between downloaded and
downloadable models.

Also adds missing translation keys to all locales:
- modelSelector.capabilities.singleLanguage
- modelSelector.capabilities.languageOnly
- settings.models.yourModels
- settings.models.availableModels

* fix: add missing translations after rebase onto main

add post-processing hotkey translations to all 15 locales and
backfill 29 missing keys for korean locale added in main.

* fix: add label to model delete button for clearer destructive state

* check translations as typescript

* format

* better text for dropdown

* wip ui tweaks

* rounded + ui tweaks

* fix download not 0% immediately, ui tweaks

* tweak name

* block for model downloading in onboarding

* small fixes

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-08 12:18:22 +08:00
Josh Ribakoff
9ef71046ba
chore: add Playwright E2E testing infrastructure (#673)
* feat: add Playwright testing infrastructure

- Add @playwright/test dependency
- Add playwright.config.ts with Chromium setup
- Add test scripts (test, test:ui, test:headed)
- Add hello world test to verify setup works

This is the foundation for adding comprehensive E2E tests.
Tests run against the Vite dev server on port 1420.

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

* ci: add E2E test workflow

Runs Playwright tests on pull requests using Chromium.
Uploads test artifacts on failure.

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

* fix: rename e2e to playwright, fix CI test

- Rename workflow from "E2E Tests" to "Playwright"
- Rename scripts from test:e2e to test:playwright
- Fix test to not require Tauri APIs (just check server responds)
- Run prettier

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

* fix

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-06 17:15:19 +08:00
CJ Pais
9ea1555816
cache (#724) 2026-02-06 17:13:38 +08:00
Gabe Duarte
6de8ff5b71
Fix the rust tests after gtk-layer-shell introduction (#719) 2026-02-06 07:51:22 +08:00
CJ Pais
e25c6043fb Delete feature_request.md 2026-02-05 14:26:27 +08:00
Josh Ribakoff
a033a67b13
fix: run Rust tests in CI (#671)
* fix: run Rust tests in CI

Fixes #670

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

* fix: run Rust tests in CI

Adds a separate test.yml workflow to run existing Rust unit tests.

Fixes #670

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

* refactor: use mock TranscriptionManager in CI tests

Swap to a mock adapter during CI to avoid compiling whisper/Vulkan.
The mock has the same interface but no heavy dependencies.
Existing tests don't exercise transcription code, so this is safe.

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 11:18:50 +08:00
Sami Ansari
6827fb51d4
Add Nix flake for NixOS support (#561)
* Add Nix flake for NixOS support

Provides:
- handy-appimage: AppImage-based package (default)
- devShell: Development environment for building from source

* fix(nix): address PR feedback for flake.nix

- Remove aarch64-linux from supportedSystems (ARM64 builds not produced)
- Read version dynamically from Cargo.toml instead of hardcoding
  This enables automated updates during GitHub releases

* chore(nix): add GitHub Actions workflow to auto-update AppImage hash

Adds a separate workflow triggered on release publication that:
- Fetches the released AppImage
- Computes the SRI hash using nix-prefetch-url
- Updates flake.nix with the new hash
- Commits and pushes changes directly

Includes retry logic for timing issues and defensive checks to verify
the hash was actually updated and skip commits if unchanged.

* Update flake.nix hash to resolve mismatch

Co-authored-by: pinage404 <pinage404@gmail.com>

* Update flake.nix to install dependencies automatically

Co-authored-by: pinage404 <pinage404@gmail.com>

* fix: update AppImage hash for v0.7.0

* modified description

---------

Co-authored-by: pinage404 <pinage404@gmail.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-01 10:32:49 +08:00
Pierre Carru
713d0b383e
PR template: Update link to CONTRIBUTING.md (#643) 2026-01-22 07:35:44 +08:00
CJ Pais
7e2760ea27
arm linux build? (#629)
* arm build?

* try newer vulkan

* dont think this will work but try anyway

* Update build.yml
2026-01-20 13:03:03 +08:00
Jackson
ba3f8a8a50
Prevent highlight and selection cursor hover on UI text items (#541)
* Add `select-none` and `cursor-default` to root to prevent selection and
hover on most items

* Lint

* refactor paths a bit

* format

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-01-10 11:00:01 +08:00
CJ Pais
f343bed390 PR guidelines for AI 2026-01-10 10:27:21 +08:00
CJ Pais
a0569d39f5
Update FUNDING.yml 2026-01-07 14:17:05 +08:00
CJ Pais
7a38b8024e
Update funding sources in FUNDING.yml 2026-01-07 14:07:23 +08:00
Viren Mohindra
d3a0281062
fix: prevent crash on macos 26.x beta during startup (#473)
defer apple intelligence availability check from app initialization
to when the user actually tries to use the feature. accessing
SystemLanguageModel.default during early app startup causes SIGABRT
on macOS 26.x (tahoe) beta.

- remove availability check from default_post_process_providers()
- always include apple intelligence provider on macos arm64
- add checkAppleIntelligenceAvailable command for lazy checking
- show error message if apple intelligence unavailable when selected
- clear error on any dropdown selection for better UX
2026-01-04 07:52:06 +08:00
CJ Pais
26c4f6c53f try pr test build? 2025-12-29 12:28:35 +07:00
CJ Pais
be1141cd50 description must be human written in PR 2025-12-23 09:17:02 +07:00
CJ Pais
b3dd5a8c8e add better contribution guidelines + pr template 2025-12-17 10:03:59 +07:00
CJ Pais
0477c6a888
move to macos 26 ci (#440) 2025-12-12 16:13:02 +07:00
CJ Pais
f87051f464
Add Internationalization Support (#437)
* basic i18n

* tweak

* translate app

* add linting to make sure we have translations

* run linter on pr

* format
2025-12-12 11:16:54 +07:00
CJ Pais
d52bec9d87 fix workflow? 2025-11-30 11:28:41 +07:00
CJ Pais
3d15ee13c5 add prettier format check to pr 2025-11-29 16:52:02 +07:00
Jorge
45eec57226
feat: add fallback microphone for clamshell/desktop mode (#329)
* feat: add fallback microphone for clamshell/desktop mode

* refactor: moved "Closed Laptop Microphone" setting to Debug

* cleanup

* run format

* add check back

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2025-11-17 10:38:41 +07:00
Dariel Dato-on
832eb2766c
Enable Windows ARM64 builds in CI (#340) 2025-11-15 17:02:55 +08:00
CJ Pais
70ec82285a
format everything (#323) 2025-11-10 11:39:14 +08:00
CJ Pais
11ce9a7a53
Fix Whisper Crashing on Linux + CI Fixes (#212)
* bump to latest transcribe-rs

* direct dep?

* disable avx for whisper?

* verbose?

* rust verbose?

* debug symbols

* support debug builds properly

* split release for appimage

* fix artifact name
2025-10-13 14:43:48 -07:00
CJ Pais
13d33200c5 issue template update 2025-10-13 09:57:12 -07:00
CJ Pais
d0a3ef335e fix ci? 2025-08-19 19:34:33 -07:00
CJ Pais
90395c8ba4 fix? 2025-08-19 19:29:28 -07:00
CJ Pais
425dd11b25 try draft release again? 2025-08-19 19:10:16 -07:00
CJ Pais
c8aa9e84f4 try fuse 2025-08-19 17:53:51 -07:00
CJ Pais
8b73217ff8 remove libwayland from appimage? 2025-08-19 17:37:36 -07:00
CJ Pais
dc788773cd add bug template 2025-08-19 15:39:59 -07:00
CJ Pais
ff0d5863a4 have 22.04 and 24.04 builds for now 2025-08-18 16:59:32 -07:00
CJ Pais
19aad352ad 22.04 build? 2025-08-18 16:41:42 -07:00
CJ Pais
d3429f8bb0 clean out the cache on ci for whisper 2025-08-18 16:05:32 -07:00
CJ Pais
ebb15898b3 Fix test build, potentially. 2025-08-18 15:08:04 -07:00
CJ Pais
6e6f475232 fix perms? 2025-08-18 14:26:25 -07:00
CJ Pais
93808dca97 migrate to unified ci? 2025-08-18 14:23:44 -07:00
CJ Pais
3d9ab1d8be fix vulkan? 2025-07-18 18:27:09 -07:00
CJ Pais
e45165d7b1 fix missing 24.04 2025-07-18 18:12:52 -07:00