How injection picks a strategy
When transcription completes, Voxstr identifies the focused app by its bundle ID and routes the text through one of three injectors:
- AXValue (read-splice-write): the most reliable method. Voxstr reads the focused text field's current value via the macOS Accessibility API, splices the new text in at the caret, and writes the result back. No clipboard pollution, no synthetic key events.
- Pasteboard + Cmd+V: Voxstr writes the text to the clipboard and synthesizes a Cmd+V keystroke. Used for apps that don't expose editable text via Accessibility (terminals, Electron apps, web inputs).
- Clipboard fallback: when the chosen injector fails, Voxstr copies the text to the clipboard and posts a notification. You paste manually.
The full mapping lives in AppClassifier in the macOS app source. The matrix below mirrors that file as of the latest doc update; if you spot a mismatch, the source is canonical.
The compatibility matrix
| App | Bundle ID | Method |
|---|---|---|
| Native Cocoa (Notes, Pages, TextEdit, Mail compose) | default | AXValue (read-splice-write) |
| iTerm2 | com.googlecode.iterm2 |
Pasteboard + Cmd+V |
| Obsidian | md.obsidian |
Pasteboard + Cmd+V |
| Chrome | com.google.Chrome |
Pasteboard + Cmd+V |
| Claude desktop | com.anthropic.claudefordesktop |
Pasteboard + Cmd+V (newlines as Shift+Return) |
| Electron chat apps | com.electron.* |
Pasteboard + Cmd+V (newlines as Shift+Return) |
| Fallback (when other methods fail) | any | Copy to clipboard + notification |
Per-app notes and gotchas
iTerm2
Pasteboard + Cmd+V. The one thing that breaks injection here is iTerm2's Secure Keyboard Entry setting. When it's on, no app (including Voxstr) can synthesize keystrokes into the terminal, and the Cmd+V chord silently does nothing.
To disable: in iTerm2's menu bar, open iTerm2 › Secure Keyboard Entry and uncheck it. The setting is per-session for the menu and global if you also clear it under Preferences. If you need secure entry for a sensitive shell, toggle it back on and use the clipboard fallback for that session.
Obsidian
Smooth, no known issues. Works in the editor, search bars, command palette inputs, and tag fields.
Chrome (and Chromium browsers)
Pasteboard + Cmd+V works inside text inputs, textareas, and contenteditable regions (Google Docs, Notion-in-Chrome, etc.). Note that pasting into a styled contenteditable can inherit the page's text formatting (font, size, color) — if you need plain text, paste with Cmd+Shift+V manually after Voxstr injects, or strip formatting in the destination editor.
Claude desktop and Anthropic apps
Treated like an Electron chat app. Multi-line dictations are injected with newlines as Shift+Return instead of Return, so a newline doesn't accidentally submit the message. See newlines in chat apps below — this is the single most important behavior to be aware of in chat clients.
Electron chat apps (Slack, Discord, others)
Apps detected via the com.electron.* bundle prefix get the same Shift+Return treatment as Claude desktop. If you have a chat app that submits on a single Return and breaks your dictation flow, check whether it's Electron-based — if it is, Voxstr should already be handling newlines correctly. If not, it falls into the unlisted apps category.
VS Code, Cursor
Both are Electron-based and follow the Pasteboard + Cmd+V path. The VS Code editor's autocomplete popup will sometimes intercept the paste; if a single dictation gets split across the popup and the buffer, dismiss the popup with Escape before pressing the hotkey.
Notion (desktop or web)
Desktop Notion is Electron — Pasteboard + Cmd+V. Web Notion goes through Chrome — same path. In both cases, large dictations may take a beat to render in the page's contenteditable; this is Notion's own debounce, not a Voxstr issue.
Slack
Electron, so it's covered by the com.electron.* rule. Newlines route as Shift+Return, which matches Slack's "Shift+Return inserts newline, Return sends" convention. Dictating multi-paragraph messages then editing in place works exactly as you'd expect.
Native Cocoa apps
The default tier. Apple's first-party apps (Notes, Pages, TextEdit, Mail compose, Reminders, etc.) and most well-behaved third-party native apps expose their text fields via the Accessibility API, so AXValue read-splice-write works without any clipboard side effects. This is the tier where Voxstr is least disruptive — your clipboard contents are preserved.
Fallback (clipboard + notification)
When neither AXValue nor Pasteboard+Cmd+V can be confirmed to land in the focused app, Voxstr copies the transcribed text to the clipboard and posts a notification banner. You paste manually. This path is rare in modern apps but can fire for apps with custom rendering surfaces (some games, drawing apps with their own text engines) or terminals running with secure input enabled.
Newlines in chat apps (Shift+Return)
This deserves its own section because it's the single most user-visible quirk of injection.
In most chat clients (Claude desktop, Slack, Discord, Electron-based clients), Return sends the message and Shift+Return inserts a literal newline. If Voxstr injected a multi-line dictation as raw \n characters routed through the keystroke injector, every newline would submit the message — and you'd end up with five short messages instead of one long one.
Voxstr handles this by tagging "submit-on-Return" apps in AppClassifier.needsShiftReturnForNewline. When such an app is the injection target and the keystroke path is used, \n and \r in the text are sent as Return with the Shift modifier. The result: a literal newline in the chat composer, and your message stays intact until you press Return yourself.
What if my app isn't listed?
Voxstr falls through the strategy in order: AXValue first, Pasteboard+Cmd+V second, clipboard-fallback last. Most modern apps work via one of the first two paths without any per-app rule. The matrix exists for apps where the default heuristic picks the wrong strategy, or where a quirk (like Claude's Return-submits behavior) needs explicit handling.
Apps that genuinely don't accept any of these methods are rare. Common offenders:
- Terminals with secure-input enabled (toggle it off, see iTerm2 above)
- Apps with fully custom-drawn text surfaces (some game launchers, niche graphics tools)
- Sandboxed apps that reject Accessibility queries (very rare on macOS)
If you hit one, the clipboard fallback gets your text out and you paste manually. If a frequently-used app is misbehaving and the fallback fires every time, file an issue on GitHub with the bundle ID — that's the signal we use to add an explicit rule.
Troubleshooting
Verify Voxstr has macOS Accessibility permission. Without it, both AXValue and synthetic keystroke injection fail silently. See the permissions article for how to grant or reset the permission.
Open the target app, type a manual newline with Shift+Return, and confirm it stays as a newline rather than sending the message. If Shift+Return works for you in the app, Voxstr should be doing the same automatically. If newlines are still sending, the app's bundle ID may not match the com.electron.* pattern — file an issue with the bundle ID.
Disable Secure Keyboard Entry under iTerm2 › Secure Keyboard Entry. With it on, no synthesized key event reaches the terminal.
Voxstr targets whichever app held focus the moment you triggered the hotkey. If you used a hotkey, then clicked into a different app while the model was transcribing, the transcription lands wherever focus ended up. Speak after the target is focused, not before.
For deeper diagnostics — clipboard pollution, partial pastes, or the fallback path firing unexpectedly — see the troubleshooting guide.