* 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>
* Handle microphone start failures without aborting
Return recorder init errors instead of panicking/aborting in the worker thread and reset UI state when recording start fails.
Refs #436
* prop errors to ui
* format
* Add missing recording error translation keys
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* 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>
* 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>
* feat: add post-processing hotkey
* rewrite
* bring back toggle
* Make sure the toggle on and off propagates for the key binding.
* rename for clarity
* cleanup
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* Fix race condition when toggling transcription via SIGUSR2
The toggle state was being set to false immediately when stop was called,
but the actual transcription runs asynchronously. If another signal arrived
before transcription completed, a new recording could start while the old
transcription was still running, causing the old text to paste unexpectedly.
Now the toggle state stays true until the async transcription task completes.
* remove import
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* fix: replace async-openai library with post request to support custom providers
* move models call to llm_client too
* tweak post processing ui and add groq and cerebras
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* feat: add Apple Intelligence post-processing provider
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* feat: guide apple intelligence output
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* fix(build): add fallback stub for Apple Intelligence on older SDKs
- Checks if 'FoundationModels.framework' is present in the macOS SDK.
- If missing, compiles a stub Swift file that returns 'unavailable' errors instead of failing the build.
- Prevents build errors on older Xcode versions (or macOS versions < 26.0) where the macros are not supported.
* fix(ui): hide Apple Intelligence option when unavailable
- Checks for runtime availability of Apple Intelligence (via 'check_apple_intelligence_availability') in 'settings.rs'.
- Only adds the Apple Intelligence provider to the default settings if it is actually available on the device.
- Ensures the option does not appear in the UI for unsupported Macs (e.g., Intel or older macOS versions), even if the app was built with support enabled.
* move some files around as well as some ui text
* format
---------
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Co-authored-by: CJ Pais <cj@cjpais.com>
* feat: add conversion between Simplified and Traditional Chinese. If the selected language is Simplified or Traditional Chinese, it will convert the text to the selected variant(Simplified or Traditional) after been recognized, depends on opencc, if it is not installed, the conversion will skip.
* Adopting ferrous-opencc makes cross-platform packaging easier.
* feat: add sound duration retrieval for audio feedback
* Trim trailing silence from pop_start.wav and pop_stop.wav
* refactor: simplify sound file and base directory retrieval
* feat: only delay mute if audio feedback is enabled
* change the logic
* simplify new logic
* simplify get_sound_path and get_sound_base_dir, reorder functions
* add implicit blocking to playTestSound
* modify to my pref style
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* Fix unstable mute implementation on Windows/Linux
* add some delay before the mute so the audio feedback plays
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* Add LLM post-processing feature with settings management and UI integration
* Refactor LLM post-processing settings and prompt selection logic
* Rename CLAUDE.md to more standard AGENTS.md
* Replace Open Router with OpenAI Compatible endpoints for post-processing
* Fix post processing settings api styles
* refactor or something
* simplify
* cleanup a bit?
* remove useless code
* minor improvements
* fix laggy textarea
* Store post-processing results in db
* fix text color
* new default prompt
---------
Co-authored-by: CJ Pais <cj@cjpais.com>
* Add custom sound and control notif volume
* Modularize the picker and slider, consolidate the playback and loading
* Move custom sounds to advanced
* pairs of audio
* custom sound handling
---------
Co-authored-by: CJ Pais <cj@cjpais.com>