The cell-based table couldn't be edited reliably (no click-to-edit, no
Tab between columns). Rewritten as a view-based NSTableView where each
cell is an editable NSTextField committed via controlTextDidEndEditing
(Enter/Tab/focus-loss). Tab now moves from "Felismert" to "Helyette".
Rows where both columns are blank are pruned on add and on window close,
so empty rows are never persisted.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A single editable table in Settings ("Felismert" -> "Helyette"). Two
effects from one list:
- the replacement pairs are applied to every transcript (fix names/jargon,
and "\n" expands to a real newline for spoken line-break commands);
- the "to" terms are fed to whisper as the initial --prompt to bias
recognition toward the user's vocabulary.
Stored in UserDefaults; wired through both the warm server and the CLI
fallback. Settings window grown to fit the table + add/remove buttons.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Shows a small floating, non-interactive panel while recording with a
segmented VU meter driven by AVAudioRecorder metering (averagePower).
If the input peak stays at silence for >1.2s it turns red and shows
"Nincs hangbemenet?" — surfacing the dead-mic case that previously
produced empty recordings and whisper hallucinations with no feedback.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Each dictation previously spawned whisper-cli with -m, reloading the full
1.5-1.6GB model (+ ~10s Metal init) every single time. This adds a
WhisperServer manager that keeps a whisper-server child process alive with
the model preloaded, so each utterance is a fast local HTTP POST to
/inference (~0.5s) instead of a multi-second cold start.
- Bundles whisper-server alongside whisper-cli (bundle-whisper.sh).
- Server (re)starts on launch and on model change; stops on terminate;
picks a free loopback port; -nt (plain text) + -sns (fewer hallucinations).
- transcribe() prefers the warm server and falls back to a per-call
whisper-cli spawn if the server is unavailable.
- Warm-up now starts BEFORE the blocking accessibility prompt so the model
load overlaps with the user granting permissions.
- Info.plist: NSAllowsLocalNetworking for the loopback HTTP call.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- If clipboard was empty, clear it after paste (don't leave transcript)
- If clipboard had content, restore original content
- Prevents sensitive dictated text from remaining on clipboard
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add "Auto-detect" option at top of language dropdown
- When selected, whisper-cli detects language automatically
- Useful for multilingual users or unknown language content
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ggml-large-v3-turbo.bin to model list
- Mark as recommended: fast like Medium, accurate like Large
- Update README with new model comparison
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Save clipboard before pasting transcript (text, images, any content)
- Restore original clipboard contents after paste completes
- User's copied content is no longer lost after dictation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- whisper-cli and dependencies bundled in app (no brew required for users)
- Built-in model downloader with 5 model options (Tiny to Large)
- Download progress indicator (e.g., "45% Downloading Small")
- Model selection dropdown in Settings
- First-run wizard for initial model download
Security fixes:
- Input validation for language and model path
- Private temp directory for audio files
- Auto-cleanup of audio files after transcription
- Auto-detect whisper-cli path (ARM/Intel)
Bug fixes:
- Fixed Settings window crash (NSWindowController)
- Fixed model selection with tag-based indexing
Build:
- bundle-whisper.sh script for packaging whisper-cli
- Updated Makefile with Frameworks bundling
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Check multiple paths: /opt/homebrew/bin (ARM), /usr/local/bin (Intel),
/opt/local/bin (MacPorts), ~/bin (user local)
- Show error status if whisper-cli not found
- Use isExecutableFile to verify binary exists and is executable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security improvements:
- Audio file now stored in user's private NSTemporaryDirectory
- Filename includes process ID to avoid conflicts
- Audio file deleted after transcription (success or failure)
- Audio file deleted when app terminates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security improvements:
- Language selection now uses dropdown with 31 supported languages
- Model path validated: must be .bin file, no path traversal
- Validation runs before transcription execution
- Invalid inputs show error status instead of executing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add checkAccessibilityPermission() with AXIsProcessTrusted check
- Permission alerts now have "Open Settings" button
- Button opens directly to the relevant Privacy settings pane
- Import ApplicationServices for accessibility API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move macOS code to macos/ directory for platform separation
- Add Settings window with configurable language, model path, and sound toggle
- Add launch at login support using SMAppService
- Add proper .app bundle structure with Info.plist
- Add Makefile for build, install, run, and dmg targets
- Store preferences in UserDefaults for persistence
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>