Chore/readme ship update 2026 03 04#5
Closed
celstnblacc wants to merge 32 commits intoMelvynx:mainfrom
Closed
Conversation
* chore(security): patch Rust advisories and add project pre-commit hook * docs: add quality/security workflow and test filename hardening * docs: fix sequential README security command flow --------- Co-authored-by: newblacc <refactor code>
Co-authored-by: newblacc <refactor code>
Co-authored-by: newblacc <refactor code>
* fix: improve Claude auto-submit reliability and refresh app icons * build: add app:create script for generating macOS .app bundle * chore: refresh app icon set and update app bundle build script * fix: add AppleScript paste path and skip self-focus on macOS Use AppleScript System Events for Cmd+V paste on macOS instead of Enigo/CGEvents, which is more reliable for Electron apps (Claude Desktop, VS Code, Slack). Also skip saving/restoring frontmost app when Parler itself is in the foreground to avoid self-activation loops. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…#5) * fix: improve Claude auto-submit reliability and refresh app icons * build: add app:create script for generating macOS .app bundle * chore: refresh app icon set and update app bundle build script * fix: add AppleScript paste path and skip self-focus on macOS Use AppleScript System Events for Cmd+V paste on macOS instead of Enigo/CGEvents, which is more reliable for Electron apps (Claude Desktop, VS Code, Slack). Also skip saving/restoring frontmost app when Parler itself is in the foreground to avoid self-activation loops. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: rename Parler to Phraser with comprehensive tests and review fixes Rebrand the app from Parler to Phraser across all configs, source, i18n (17 locales), docs, CI workflows, and React components. Legacy bundle IDs kept for backward-compatible upgrades. Add 141 Rust tests (unit + integration) and 7 Playwright e2e tests covering branding consistency, audio processing, VAD state machine, settings serde, LLM client headers, and CLI parsing. Apply code review fixes: - Remove dead height prop from PhraserTextLogo - Replace Handy branding in llm_client HTTP headers with Phraser - Remove commented-out timing code in resampler - Use CARGO_MANIFEST_DIR for absolute paths in integration tests - Remove duplicated config/i18n checks from Playwright (kept in Rust) - Tighten Playwright error filter to match specific Tauri patterns - Fix no-op overlay_position test to assert serialization - Extract FRAME_SAMPLES_16K_30MS constant in resampler tests - Remove tautological tray version label tests - Auto-format all Rust code via cargo fmt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: apply second code review fixes across tests and source - Extract shared isTauriRuntimeError() in Playwright to unify error filters - Consolidate repeated tauri.conf.json reads with OnceLock in branding tests - Add .expect() messages to bare .unwrap() calls in integration tests - Add log file name branding test for lib.rs - Remove stale upstream compatibility comment in llm_client.rs - Remove fragile ACTION_MAP.len() assertion - Remove redundant cli_ prefix from cli.rs test names - Make French i18n test fail-fast on missing file Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: apply third code review fixes - Replace stale "Handy" references with "Phraser" in CLAUDE.md - Add error context to bare .unwrap() in i18n translation test loop - Remove git-archaeology inline comments in actions.rs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: apply fourth code review fixes - Rename misleading test get_language_code_empty_returns_en to _returns_empty - Add .clamp(-1.0, 1.0) to WAV save to prevent i16 overflow on out-of-range samples - Consolidate Cargo.toml reads with OnceLock in branding tests Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: move inline styles to Tailwind in PhraserTextLogo Replace fontWeight and letterSpacing inline styles with Tailwind font-normal and tracking-[2px] classes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: eliminate trailing space in PhraserTextLogo className Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: improve Claude auto-submit reliability and refresh app icons * build: add app:create script for generating macOS .app bundle * chore: refresh app icon set and update app bundle build script * fix: add AppleScript paste path and skip self-focus on macOS Use AppleScript System Events for Cmd+V paste on macOS instead of Enigo/CGEvents, which is more reliable for Electron apps (Claude Desktop, VS Code, Slack). Also skip saving/restoring frontmost app when Parler itself is in the foreground to avoid self-activation loops. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: rename Parler to Phraser with comprehensive tests and review fixes Rebrand the app from Parler to Phraser across all configs, source, i18n (17 locales), docs, CI workflows, and React components. Legacy bundle IDs kept for backward-compatible upgrades. Add 141 Rust tests (unit + integration) and 7 Playwright e2e tests covering branding consistency, audio processing, VAD state machine, settings serde, LLM client headers, and CLI parsing. Apply code review fixes: - Remove dead height prop from PhraserTextLogo - Replace Handy branding in llm_client HTTP headers with Phraser - Remove commented-out timing code in resampler - Use CARGO_MANIFEST_DIR for absolute paths in integration tests - Remove duplicated config/i18n checks from Playwright (kept in Rust) - Tighten Playwright error filter to match specific Tauri patterns - Fix no-op overlay_position test to assert serialization - Extract FRAME_SAMPLES_16K_30MS constant in resampler tests - Remove tautological tray version label tests - Auto-format all Rust code via cargo fmt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: apply second code review fixes across tests and source - Extract shared isTauriRuntimeError() in Playwright to unify error filters - Consolidate repeated tauri.conf.json reads with OnceLock in branding tests - Add .expect() messages to bare .unwrap() calls in integration tests - Add log file name branding test for lib.rs - Remove stale upstream compatibility comment in llm_client.rs - Remove fragile ACTION_MAP.len() assertion - Remove redundant cli_ prefix from cli.rs test names - Make French i18n test fail-fast on missing file Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: apply third code review fixes - Replace stale "Handy" references with "Phraser" in CLAUDE.md - Add error context to bare .unwrap() in i18n translation test loop - Remove git-archaeology inline comments in actions.rs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: apply fourth code review fixes - Rename misleading test get_language_code_empty_returns_en to _returns_empty - Add .clamp(-1.0, 1.0) to WAV save to prevent i16 overflow on out-of-range samples - Consolidate Cargo.toml reads with OnceLock in branding tests Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: move inline styles to Tailwind in PhraserTextLogo Replace fontWeight and letterSpacing inline styles with Tailwind font-normal and tracking-[2px] classes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: eliminate trailing space in PhraserTextLogo className Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…nt improvements - Extract call_apple_intelligence(), build_processed_text(), spawn_save_transcription(), paste_transcription_on_main_thread(), and restore_model_if_switched() into focused helpers - Fix clipboard always restoring on both success and error paths (do_paste_via_clipboard / do_paste_via_applescript pattern) - Add send_chat_completion_with_system() for explicit intent at call sites - Consolidate is_tool_available() for Linux CLI tool checks - Move fetch_gemini_models() before tests, add timeout and proper headers - Add LANG_SIMPLIFIED_CHINESE / LANG_TRADITIONAL_CHINESE constants to settings - Handle poisoned mutex in ActiveActionState gracefully - Remove unused audioDevices/outputDevices fields from settingsStore, extract audioDeviceStore - Add quickstart and voice terminal stack docs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…odesign failure when sign-binaries=false
…de quality (#7) * refactor: decouple postProcessStore from settingsStore and improve code quality - Extract postProcessStore for model option caching; settingsStore no longer imports it — cross-store coordination moves to the useSettings hook - Add audioFeedbackEnabled derived value to useSettings return type - Restore BACKEND_DEFAULT_DEVICE_NAME constant in audioDeviceStore - Add PROVIDER_ID_* constants in settings.rs as single source of truth for provider routing across llm_client, actions, and transcription - Extract persist_settings and load_settings_from_store helpers in settings.rs to remove ~40 lines of duplicated logic - Change persist_settings failure from warn! to error! (derived Serialize cannot fail; failure is a programming bug) - Fix get_stored_binding to return Option instead of panicking on missing key - Fix dotool stdin: replace \n and \r in text before writing to line-oriented protocol; remove shell injection via sh -c (use stdin pipe directly) - Cache tool availability checks with OnceLock in clipboard.rs - Rename st/et timing vars to start_time/elapsed in transcription.rs - Use let _ = spawn(...) instead of drop(spawn(...)) for idiomatic discard - Remove duplicate and vacuous tests; fix misleading test name - Rename merge_bindings param to fill_missing_bindings for clarity Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: suppress dead_code warnings for provider ID constants and fix cfg-gated import - Gate OnceLock import behind #[cfg(target_os = "linux")] to match its usage - Move PROVIDER_ID_OPENAI import to test module in llm_client.rs (only used in tests) - Add #[allow(dead_code)] to PROVIDER_ID_* constants not yet referenced outside tests; they are the intended single source of truth for future use Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: silence dead_code lint on PROVIDER_ID_OPENAI constant Test-only usage in llm_client.rs does not satisfy the dead_code lint on the definition site in settings.rs; add #[allow(dead_code)] to match the other currently-unreferenced PROVIDER_ID_* constants. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add vitest unit tests for audioDeviceStore and postProcessStore Sets up vitest + happy-dom as the unit test framework (distinct from Playwright e2e). Adds 10 tests covering sentinel prepend/dedup logic in audioDeviceStore and the fetchModels/clearModelOptions/setModelOptions contract in postProcessStore — including error paths that must not cache. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve TS type errors introduced by vitest setup and model_unload_timeout - NonNullable cast on model_unload_timeout in settingsStore to match the pattern used for log_level (fixes TS2345) - Add vitest/globals to tsconfig types so vi/describe/it/expect are recognized by tsc in src/test/setup.ts (fixes TS2304) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add component tests and extend Playwright e2e coverage - ToggleSwitch.test.tsx: 8 tests for the core toggle UI primitive (checked state, onChange, disabled, isUpdating) - AudioFeedback.test.tsx: 6 tests for the setting toggle component, mocking useSettings to verify hook integration - MicrophoneSelector.test.tsx: 5 tests for device dropdown — device list rendering, loading placeholder, updateSetting/resetSetting callbacks - Extend setup.ts with @testing-library/jest-dom matchers and a global react-i18next mock (t returns key, stable across copy changes) - Playwright: add CSS/JS asset load checks and i18n lang attribute test (total e2e coverage: 10 tests) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add full component test coverage for all settings UI 167 tests across 17 files covering every user-facing settings path: Infrastructure: - src/test/mockSettings.ts: shared makeSettings() factory for all tests - src/test/setup.ts: add initReactI18next, i18n.changeLanguage mock, and sonner/plugin-os/bindings global stubs New test files: - ui/__tests__/Button, Input, Slider, Dropdown (23 tests) - __tests__/Sidebar (5 tests — section visibility, active state) - settings/__tests__/ToggleSettings (55 tests via factory — 11 toggles × 5) - settings/__tests__/DropdownSettings (18 tests — 6 dropdown components) - settings/__tests__/SliderSettings (8 tests — VolumeSlider, PasteDelay, Threshold) - settings/__tests__/CustomWords (10 tests — add, remove, duplicate, Enter key) - settings/__tests__/ShortcutInput (3 tests — tauri vs handy_keys routing) - settings/__tests__/AboutSettings (7 tests — version fetch, donate button) - settings/__tests__/HistorySettings (9 tests — loading/empty/entry states) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…event notarization when sign-binaries=false
…literal union type
…PasteMethod values
… test coverage (#8) * refactor: decouple postProcessStore from settingsStore and improve code quality - Extract postProcessStore for model option caching; settingsStore no longer imports it — cross-store coordination moves to the useSettings hook - Add audioFeedbackEnabled derived value to useSettings return type - Restore BACKEND_DEFAULT_DEVICE_NAME constant in audioDeviceStore - Add PROVIDER_ID_* constants in settings.rs as single source of truth for provider routing across llm_client, actions, and transcription - Extract persist_settings and load_settings_from_store helpers in settings.rs to remove ~40 lines of duplicated logic - Change persist_settings failure from warn! to error! (derived Serialize cannot fail; failure is a programming bug) - Fix get_stored_binding to return Option instead of panicking on missing key - Fix dotool stdin: replace \n and \r in text before writing to line-oriented protocol; remove shell injection via sh -c (use stdin pipe directly) - Cache tool availability checks with OnceLock in clipboard.rs - Rename st/et timing vars to start_time/elapsed in transcription.rs - Use let _ = spawn(...) instead of drop(spawn(...)) for idiomatic discard - Remove duplicate and vacuous tests; fix misleading test name - Rename merge_bindings param to fill_missing_bindings for clarity Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: suppress dead_code warnings for provider ID constants and fix cfg-gated import - Gate OnceLock import behind #[cfg(target_os = "linux")] to match its usage - Move PROVIDER_ID_OPENAI import to test module in llm_client.rs (only used in tests) - Add #[allow(dead_code)] to PROVIDER_ID_* constants not yet referenced outside tests; they are the intended single source of truth for future use Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: silence dead_code lint on PROVIDER_ID_OPENAI constant Test-only usage in llm_client.rs does not satisfy the dead_code lint on the definition site in settings.rs; add #[allow(dead_code)] to match the other currently-unreferenced PROVIDER_ID_* constants. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add vitest unit tests for audioDeviceStore and postProcessStore Sets up vitest + happy-dom as the unit test framework (distinct from Playwright e2e). Adds 10 tests covering sentinel prepend/dedup logic in audioDeviceStore and the fetchModels/clearModelOptions/setModelOptions contract in postProcessStore — including error paths that must not cache. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve TS type errors introduced by vitest setup and model_unload_timeout - NonNullable cast on model_unload_timeout in settingsStore to match the pattern used for log_level (fixes TS2345) - Add vitest/globals to tsconfig types so vi/describe/it/expect are recognized by tsc in src/test/setup.ts (fixes TS2304) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add component tests and extend Playwright e2e coverage - ToggleSwitch.test.tsx: 8 tests for the core toggle UI primitive (checked state, onChange, disabled, isUpdating) - AudioFeedback.test.tsx: 6 tests for the setting toggle component, mocking useSettings to verify hook integration - MicrophoneSelector.test.tsx: 5 tests for device dropdown — device list rendering, loading placeholder, updateSetting/resetSetting callbacks - Extend setup.ts with @testing-library/jest-dom matchers and a global react-i18next mock (t returns key, stable across copy changes) - Playwright: add CSS/JS asset load checks and i18n lang attribute test (total e2e coverage: 10 tests) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: add full component test coverage for all settings UI 167 tests across 17 files covering every user-facing settings path: Infrastructure: - src/test/mockSettings.ts: shared makeSettings() factory for all tests - src/test/setup.ts: add initReactI18next, i18n.changeLanguage mock, and sonner/plugin-os/bindings global stubs New test files: - ui/__tests__/Button, Input, Slider, Dropdown (23 tests) - __tests__/Sidebar (5 tests — section visibility, active state) - settings/__tests__/ToggleSettings (55 tests via factory — 11 toggles × 5) - settings/__tests__/DropdownSettings (18 tests — 6 dropdown components) - settings/__tests__/SliderSettings (8 tests — VolumeSlider, PasteDelay, Threshold) - settings/__tests__/CustomWords (10 tests — add, remove, duplicate, Enter key) - settings/__tests__/ShortcutInput (3 tests — tauri vs handy_keys routing) - settings/__tests__/AboutSettings (7 tests — version fetch, donate button) - settings/__tests__/HistorySettings (9 tests — loading/empty/entry states) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: exclude test files from production tsc compilation Test files were included in the default tsconfig include path, causing tsc to fail during `tauri build`. Adding an explicit exclude prevents test-only types (vitest globals, any-casts) from breaking the build. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: make Ctrl+N a standalone one-key shortcut to start recording with action N pre-selected Action shortcuts (Ctrl+1…9) are now always-on globals registered at startup instead of dynamically registered/unregistered during recording. Pressing Ctrl+N while idle starts recording with action N pre-selected; pressing it again stops recording and applies the action. This eliminates the previous two-step flow that required first starting recording and then pressing Ctrl+N mid-recording. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: pressing Ctrl+N again now stops recording and triggers transcription Previously Ctrl+N while recording only changed the selected action. Now it always delegates to start_with_action which stops recording when already in recording state, completing the one-key start/stop flow. Also adds PostProcessingSettings tests with DEFAULT_ACTIONS fixture. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add Ollama provider with editable server URL and no API key required Adds Ollama as a dedicated post-process provider (default: http://localhost:11434/v1) with allow_base_url_edit=true and requires_api_key=false. Adds a requires_api_key field to PostProcessProvider so providers like Ollama hide the API key input. Shows a Server URL field in the Processing Models form for providers with allow_base_url_edit=true. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…pdates (#9) * chore(security): patch Rust advisories and add project pre-commit hook * docs: add quality/security workflow and test filename hardening * docs: fix sequential README security command flow * docs: update custom additions with recent security and quality work --------- Co-authored-by: newblacc <refactor code> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…e conflict - README.md: take main's fork attribution (Parler intermediary correctly cited) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Before Submitting This PR
Please confirm you have done the following:
If this is a feature or change that was previously closed/rejected:
Human Written Description
Related Issues/Discussions
Fixes #
Discussion:
Community Feedback
Testing
Screenshots/Videos (if applicable)
AI Assistance
If AI was used: