* 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>
* Add permission step to onboarding
* translations
* minor ui
* Update AccessibilityOnboarding.tsx
* claude suggestions
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
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
* initial specta commands
* refactor to use the bindings in the ui
* merge fixes
* remove unused commands
* add clamshell to lib
* Remove Invoke from everything.
* fix settings not being loaded properly
* fix settings being overwritten due to deserialization failure + remove
provider kind
* fix model loading text bug
* feat: add more options for deleting recordings automatically and added button to open the folder that olds the recordings
- deleting automatically options: after certain time, never or preserving certain number of recordings
- new button "Open Recordings Folder" located on History page
* refactor: moved "Delete Recordings" selector to Debug settings
* refactor: simplify opening recordings folder logic by using tauri's opener plugin
* clean up ui and code a bit
---------
Co-authored-by: CJ Pais <cj@cjpais.com>