Where settings live
VoiceFlow settings are stored in a plain-text TOML config file in your Windows app-data folder. Open it by right-clicking the tray icon and selecting Settings, or navigate manually to:
%APPDATA%\VoiceFlow\config.toml
Two ways to configure:
- Settings dialog (recommended). Right-click the VoiceFlow tray icon → Settings. Most common settings have a UI. Changes apply immediately to the next capture.
- Direct config file edit. Open
%APPDATA%\VoiceFlow\config.tomlin a text editor. Restart VoiceFlow for changes to take effect. Use this for advanced configuration (like personal dictionary or LLM endpoints).
Hotkeys & Trigger
These settings control how you start, stop, and manage recordings.
Recording hotkey
Config: hotkey.record | Default: Ctrl+Space
What it does: The key combination you hold (or tap, if toggle mode) to trigger recording.
Why change it: Your preferred hotkey conflicts with another app, or you want a combo that's easier to reach.
How to use: Open Settings, go to Hotkeys, click in the Record field, and
press the keys you want (single key or combination). Try Alt+R, Ctrl+`
(backtick, good for programmers), or CapsLock if you remap it.
Examples:
Ctrl+Space: default, works in most appsAlt+V: mnemonic for "voice"Ctrl+Shift+D: "dictate", easy to remember
Trigger style
Config: trigger.style | Default: hold
What it does: How you activate recording: hold the key down while speaking, or tap once to start and tap again to stop.
Options:
hold: record while key is pressed, stop on release. Instant feedback on when recording ends.toggle: tap once to start, tap again to stop. Hands-free, good for longer dictations.
When to use:
- Hold: quick bursts to Claude Code, chat messages, PR descriptions. You know exactly when recording stops.
- Toggle: hands-free note-taking while reading docs, long rambling thoughts, or meetings. No need to hold a key.
Why you'd switch: Your use case changed (now doing more hands-free work), or you want to reduce finger strain on long sessions.
Paste-again hotkey
Config: hotkey.paste_again | Default: Ctrl+Shift+V
What it does: Re-paste the last transcription at your cursor, without re-recording.
Why use it: You dictated something, pasted it, then clicked elsewhere. Now you want to paste the same text somewhere else without re-speaking.
Example: You dictate an error message to Claude Code, it gets pasted in the chat. Then you realize you also need it in a GitHub issue. Hit paste-again and it appears in the issue without re-recording.
Cancel hotkey
Config: hotkey.cancel | Default: Esc
What it does: Stop recording and discard the current capture (don't paste anything).
When you'd use it: You started recording, realized you want to rephrase, and want to bail without pasting. In hold mode, just release; in toggle mode, hit Esc to cancel before you tap to stop.
Output & Cleanup
These settings control what VoiceFlow does with the raw transcript before pasting it.
Default output mode
Config: output.mode | Default: clean
What it does: The cleanup mode that runs on every capture (unless you override it from the tray menu per-capture).
Options:
raw: verbatim transcript, lightly punctuated. Nothing removed or reworded.clean: removes filler ("um", "uh", repeats), fixes capitalization, and improves punctuation. Works offline, instant.code: like clean, but also trims politeness and fixes programming terms ("dunder init" →__init__). Perfect for AI coding assistants.summary: condenses rambling speech into a tight, one-line brief. Needs an LLM.prompt: reformats your spoken words into a structured LLM prompt (Role, Task, Constraints, Context). Needs an LLM.systems: rewrites speech into formal Systems Engineering terminology per INCOSE/ISO 15288 (e.g. "make sure it works" → "verify compliance with the requirement"). Needs an LLM.
Which to pick:
- Writing most of the time? Use
clean(default, works everywhere, instant). - Dictating to Claude Code or Cursor? Use
code(programming terms fixed, politeness trimmed). - Taking rough notes you'll clean up later? Use
raw. - Want AI to condense your thoughts? Use
summaryorprompt(after configuring an LLM).
clean,
right-click the tray icon before dictating and pick a different mode just for that capture. Useful
when you switch tasks mid-day.LLM provider
Config: llm.provider | Default: none
What it does: Points VoiceFlow at an AI model to power the summary and
prompt modes. Completely optional.
Options:
none: no LLM.summaryandpromptfall back to a rule-based cleaner (offline, instant, lower quality).openai_compatible: any OpenAI-compatible endpoint. Examples: Ollama, LM Studio, Azure OpenAI, or even your own local server.anthropic: Claude API (requires API key; your text is sent to Anthropic).openai: OpenAI API (requires API key; your text is sent to OpenAI).
When to configure:
- You want better summaries: rambling spoken thoughts condensed into tight, readable text. Great for capturing half-formed ideas.
- You dictate prompts to AI: spoken instructions reformatted into structured role/task prompts, saving you keypresses.
- You want true local-only processing: use Ollama or LM Studio with a local model
(careful: some model names ending in
:cloudroute through a remote server).
Setup example (Ollama):
Config (config.toml): [llm] provider = "openai_compatible" base_url = "http://localhost:11434/v1" model = "mistral"
Then fire up Ollama, run ollama serve, and your summaries will use the Mistral
model running on your machine.
Personal dictionary
Config: [dictionary] section in config.toml
What it does: A list of spoken phrases and what they should become in your output. Merges on top of the built-in programming dictionary (your entries win if there's a conflict).
Why use it: VoiceFlow keeps mishearing a term, or you want to add jargon specific to your domain, company, or stack.
How to add terms: Edit config.toml directly. Find or create the
[dictionary] section and add pairs:
[dictionary] "dunder main" = "__main__" "postgres" = "PostgreSQL" "my company name" = "MyCompanyName" "async await" = "async/await"
Tips for good dictionary terms:
- Exact matches only. The term must match exactly as spoken (case-insensitive). "postgres" matches but "postgre" won't.
- Multi-word phrases work. You can map "machine learning model" → "ML model".
- Symbols are safe. Use any symbols you need: "double quote" →
"works fine. - Order doesn't matter. Longer phrases are processed first, so specific terms take precedence.
Real examples from v1:
- "dunder init" →
__init__ - "fast api" →
FastAPI - "dot py file" →
.py file - "postgres connection" →
PostgreSQL connection
When to add a term: After you notice VoiceFlow mishearing the same word three times. Add it to the dictionary and it's fixed from then on, in every mode.
Speech Recognition
These settings control the on-device speech engine and language behavior.
Language
Config: speech.language | Default: auto-detect based on Windows locale
What it does: The language the speech engine listens for. Auto-detection is the default but slower and less accurate than explicitly setting a language.
Why change it: You work in a specific language and want faster, more accurate transcription.
Examples: en (English), fr (French), de (German),
ja (Japanese). See Whisper's supported languages for the full list.
Performance: Setting a language is ~10-20% faster than auto-detect, with better accuracy for that language.
Speech engine
Config: speech.engine | Default: auto-configured on first run
What it does: The underlying transcription model and provider. VoiceFlow auto-configures on first run based on your hardware.
Options (v0.3.0):
parakeet: NVIDIA's lightweight model. Faster, lower accuracy than Whisper. Bundled in the installer. Recommended for most users.whisper_tiny,whisper_base,whisper_small: OpenAI Whisper models, in order of speed vs. accuracy trade-off. Tiny is fast but less accurate; small is slower but more accurate. All bundled in the installer.
When to switch:
- Parakeet is mishearing you. Try
whisper_basefor better accuracy (trades speed). - Transcription is too slow. Try
parakeetorwhisper_tinyfor speed (trades accuracy). - You need a specific language. Some models perform better in certain languages. Test both and see.
Behavior
These settings control app-level behavior and persistence.
Start on login
Config: app.start_on_login | Default: false
What it does: Whether VoiceFlow launches automatically when you log into Windows.
Why enable it: You use VoiceFlow every day and want it running without remembering to start it. It sits quietly in the tray, takes no resources until you dictate.
How to set it: Right-click the tray icon → Settings → check Start on login. That's it; next restart, it'll launch automatically.
Tray icon click behavior
Config: app.tray_click | Default: menu
What it does: What happens when you left-click the VoiceFlow tray icon.
Options:
menu: opens the context menu (mode switcher, Settings, Help).paste_again: re-pastes the last transcription (convenience shortcut).toggle_mode: cycles through modes without opening a menu.
Choose based on workflow:
- Default (menu): most flexible, covers everything in one click.
- paste_again: if you frequently re-paste the last dictation without changing it.
- toggle_mode: if you switch modes often and want a one-click cycle.
Capture history retention
Config: app.history_days | Default: 30
What it does: How many days of capture history VoiceFlow keeps (transcripts, timestamps, modes used). Older entries are automatically deleted.
Why care: History takes disk space (minimal) and can be a privacy concern if your machine is ever accessed by someone else.
Options:
0: no history, every capture is forgotten immediately.7: keep a week of history.30: default, keep a month.-1: keep forever.
Why you'd change it: Privacy-sensitive work (medical, legal transcripts) → set to 0. Research or reference work where you want to look back → set to -1.
Recipes & Workflows
Common scenarios and how to configure VoiceFlow for each.
Scenario A: I dictate to Claude Code all day
Setup:
- Default mode:
code - Hotkey:
Ctrl+Space(default is fine) - Trigger:
hold(default) - Personal dictionary: add your stack's terms (e.g., "dunder init" →
__init__, "your framework" → "YourFramework")
Why: Code mode strips politeness and fixes terms. You hold the key, speak an instruction, release, and it pastes clean and ready to send. Your custom terms get fixed every time.
Pro tip: set paste-again hotkey to something one-handed so you can re-paste a prompt into multiple places without re-speaking.
Scenario B: I take notes while reading docs (hands-free)
Setup:
- Default mode:
clean - Trigger:
toggle - Hotkey: something easy to tap (e.g.,
Alt+V)
Why: Toggle mode means you tap once to start, tap again to stop. No key-holding. Clean mode removes filler but keeps structure, great for documentation notes. You can ramble and pause without stopping the recording.
Workflow: Tap Alt+V once, read and talk, tap Alt+V again. Text
lands in your editor, cleaned up and ready.
Scenario C: I want AI-powered summaries of rambling thoughts
Setup:
- Default mode:
clean(orsummaryif you want summaries most of the time) - LLM provider: configure Ollama or your cloud provider of choice (OpenAI, Anthropic)
- Trigger:
toggle(hands-free for longer thoughts)
Why: LLM modes condense rambling speech into tight, one-line notes. Useful for capturing half-formed ideas and turning them into actionable items. You talk for 30 seconds, it becomes a one-line note ready to paste into your issue tracker.
Setup (Ollama example): Install Ollama, run ollama pull mistral, start the
server, then point VoiceFlow at http://localhost:11434/v1 with model mistral.
Scenario D: Privacy-first, zero history
Setup:
- Default mode:
cleanorraw - LLM provider:
none - Hotkey: leave default or set to something you control
- Capture history:
0(forget every capture immediately)
Why: Sensitive work (medical, legal, financial transcripts) needs zero persistence and zero cloud egress. This config ensures everything stays on-device and nothing is logged.
Verify: See privacy for how to confirm zero network usage with a firewall rule.
Scenario E: My hotkey conflicts with another app
Problem: You use Ctrl+Space to invoke an IDE feature or autohotkey script, and VoiceFlow grabs it first.
Solution: Rebind VoiceFlow's hotkey.
- Right-click tray icon → Settings → Hotkeys → click the Record field
- Press the new keys you want (try
Alt+Shift+V,Ctrl+`backtick, orCapsLockif you remap it) - Test in the apps where you use VoiceFlow most
Pro tip: If a key combo still doesn't work, check the other app's settings, since it might be blocking the hotkey at a system level.
Quick reference table
| Setting | Config key | Default | Type | When to change |
|---|---|---|---|---|
| Recording hotkey | hotkey.record |
Ctrl+Space |
Hotkey | Conflicts with another app |
| Trigger style | trigger.style |
hold |
hold / toggle | Want hands-free, or quick bursts |
| Paste-again hotkey | hotkey.paste_again |
Ctrl+Shift+V |
Hotkey | Want easier access to re-paste |
| Cancel hotkey | hotkey.cancel |
Esc |
Hotkey | Rarely needed; conflicts if common in your app |
| Default output mode | output.mode |
clean |
raw / clean / code / summary / prompt / systems | Dictating to AI, or want LLM cleanup |
| LLM provider | llm.provider |
none |
none / openai_compatible / anthropic / openai | Want better summaries or prompts |
| Personal dictionary | [dictionary] |
(empty) | Key-value pairs | App mishears a term, or add domain jargon |
| Language | speech.language |
auto-detect | en, fr, de, etc. | Want faster, more accurate transcription |
| Speech engine | speech.engine |
auto-configured | parakeet / whisper_* | Accuracy or speed needs change |
| Start on login | app.start_on_login |
false |
true / false | Use VoiceFlow every day |
| Tray click behavior | app.tray_click |
menu |
menu / paste_again / toggle_mode | Different workflow preferences |
| History retention | app.history_days |
30 |
0 to -1 (0 = none, -1 = forever) | Privacy concerns, or need long-term record |
More questions? See the FAQ, check troubleshooting, or read the full guide. For bugs or feature requests, visit the GitHub issues page.