Also correct the requirement to macOS 26: the app is built against the
macOS 26 SDK with a macOS 26 deployment target.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Minor release: live transcript preview in the recording HUD using the
on-device Apple dictation model, with Whisper still producing the final
pasted text.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
While recording, the HUD now shows a rough live transcript using macOS's
on-device dictation model (SpeechAnalyzer + DictationTranscriber), which
also supports Hungarian. It is only a preview: Whisper still produces the
pasted text.
The preview captures the microphone with its own AVAudioEngine, leaving
the AVAudioRecorder path for Whisper untouched, so a preview failure just
means no preview. Audio is buffered from the moment recording starts so
the first words aren't lost while the model spins up; dictionary terms
are passed as contextual strings and replacements are applied to the
preview text. The dictation model for the selected language is
registered/downloaded at launch and on language change, and awaited
inline if needed.
The HUD is wider and shows the last three lines of the transcript; after
recording it stays up as "Transcribing…" until the final text is pasted.
A "Live preview while recording" setting (on by default) turns it off.
No extra permission is required beyond the microphone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Patch release: quantized Whisper models (Turbo q5_0 needs ~0.7 GB RAM
instead of ~1.75 GB), a download progress window, and model warm-up at
recording start with a HUD notice when the first transcription is slow.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Quantized models: add Small q5_1, Medium q5_0, Large v3 Turbo q5_0/q8_0
and Large v3 q5_0 to the catalog. Turbo q5_0 keeps whisper-server at
~0.7 GB instead of ~1.75 GB with the same speed. Installed models show
their catalog name; the first-run wizard uses a popup instead of one
button per model.
Download feedback: a progress window with bar, size, speed, time left,
cancel and retry, followed by "loading" and "ready" steps. Progress also
shows in the menu bar icon, the status menu and the Settings button, and
the Settings model list refreshes when done. Only one download runs at a
time, an existing model is replaced only after a successful download, and
HTTP errors are reported instead of saving the error page as a model.
Model warm-up: start loading the model when recording starts instead of
after it stops. After 2+ minutes idle a tiny silent request pages the
model back in while the user talks; a dead server is restarted, and a
server that is still loading is awaited rather than loading the model a
second time via whisper-cli. If loading takes over 2.5 s the recording
HUD explains why this transcription is slower. Server start no longer
overwrites the recording/transcribing menu bar icon.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Document the warm whisper-server, live mic-level HUD, and custom
dictionary; add them to the feature list and Settings; note the
loopback-only server and the one-time model load at startup.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The new HUD label and the dictionary table labels/placeholders were in
Hungarian; the rest of the app is English. Translated: "No audio input?",
"Recording…", "Dictionary (heard → replacement):", column titles
"Heard"/"Replacement", and the field placeholders/hint.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Minor release: warm whisper-server backend (no per-dictation model
reload), live mic-level HUD with silence warning, and a custom
recognised->replacement dictionary that also biases the whisper prompt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
Patch release shipping the hardened-runtime microphone fix
(device.audio-input + allow-jit entitlements). The previously released
1.2.0 build could not access the microphone once hardened-runtime signed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bundled whisper-cli / ggml dylibs JIT-compile Metal shaders at
runtime; under the hardened runtime that needs com.apple.security.cs.allow-jit
or the process gets killed. Completes the entitlement set for the
notarized Developer ID build (alongside device.audio-input).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The v1.2.0 Developer ID re-sign enabled the hardened runtime but the
entitlements were missing com.apple.security.device.audio-input. Under
the hardened runtime tccd refuses to even prompt for the microphone and
denies kTCCServiceMicrophone outright, so the app recorded pure silence
and whisper hallucinated text on the empty audio. Adding the resource
-access entitlement restores the mic permission prompt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bundle's marketing version was stuck at 1.0.0 while the Makefile and the
shipped releases are 1.2.0. Align it so the app reports its real version.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
WhisperDictate.entitlements: non-sandboxed hardened-runtime entitlements
(app-sandbox=false; cs.disable-library-validation for the bundled whisper-cli
+ ggml/whisper dylibs). Used to deep-sign the app with the company Developer ID
identity before notarization. Also ignore the stray Contents/CodeResources
signing artifact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Document clipboard security (cleared after paste)
- Document original clipboard preservation
- Add auto-detect language mention
Co-Authored-By: Claude Opus 4.5 <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>
- Add Quick Install section for DMG download
- Add Build from Source section for developers
- Add Whisper model comparison table (tiny/base/small/medium)
- Note about Intel Mac performance
- Note about Accessibility permission after updates
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>
- Global hotkey (⌃⌥D) for voice dictation
- Local Whisper transcription (offline)
- Auto-paste to active app
- Hungarian language default
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>