Voice commands (Pro)
Voice commands turn your wake word into a hands-free remote control. Instead of only starting and stopping dictation, you map a spoken phrase to a real action — type a snippet, press a shortcut, open Slack, close a window, launch a URL — and trigger it by saying the reserved word "action."
This is a Pro feature. Free and trial-expired users can open the editor and build mappings, but the commands won't actually fire until you're on a Pro or Perpetual plan.
- Your wake word (hands-free listening) is enabled — commands ride on the same offline listener, and it's English-only.
- You're on a Pro (or Perpetual) plan. If InkSpoke hears a command you've mapped while voice commands are off, it shows a balloon offering to turn them on.
How you speak a command
Every voice command follows the same shape: your wake name, the reserved word action, then the phrase you mapped.
So with the default name "annika" and a mapping for the phrase "open slack," you say:
"annika action open slack"
The word action is reserved — it's what tells InkSpoke you're about to give a command rather than start dictation. Saying it opens a short (about 5-second) window to catch the phrase. Everything is case-insensitive.
Turn voice commands on
- Open Settings → Hands-Free.
- Make sure the Wake Word tab shows wake word enabled (see Wake word setup). Commands can't work without it.
- Switch to the Voice Commands tab (marked with a PRO badge) and turn on Voice Commands.
- Click Manage Mappings to add your first command — or start from a starter template.
┌─ Hands-Free ────────────────────────────────────────────┐
│ Overview Wake Word [ Voice Commands ] PRO │
├─────────────────────────────────────────────────────────┤
│ Voice Commands [ ON ●— ] │
│ Continuous Commands [ ON ●— ] │
│ SendKeys injection mode [ Text Injection ▾ ] │
│ │
│ [ Manage Mappings ] Voice Favorites Vocabulary │
│ Words: 128 / 1000 │
│ │
│ [ Export ] [ Import ] │
└─────────────────────────────────────────────────────────┘
What a command can do — the 10 action types
Every mapping runs exactly one action. When you pick the action type in the editor, the form shows only the fields that type needs.
| Icon | Action type | What it does | Key fields |
|---|---|---|---|
| ⌨ | Send Keys | Types free text where your cursor is | Text · Send Enter after · Secret |
| ⌘ | Key Combination | Presses a key with modifiers | Key · Modifiers (Ctrl/Shift/Alt/Cmd) |
| ▶ | Open App | Launches an app | App |
| ✕ | Close App | Quits an app gracefully | App |
| ⚡ | Force Close App | Force-kills an unresponsive app | App |
| ↗ | Bring to Front | Focuses an app's window | App |
| ↙ | Send to Back | Pushes an app's window behind others | App |
| ◇ | Hide App | Hides an app | App |
| 🔗 | Open URL | Opens a URL in your default browser | URL |
| 📁 | Open File | Opens a file with its default handler | File path |
Launching, closing, focusing, and hiding apps use a native path on each OS (AppleScript on
macOS, Win32 on Windows, wmctrl/xdotool on Linux). For Key Combination, the cmd
modifier maps to the Command key on macOS and to the Windows key on Windows.
Build a mapping in the editor
Manage Mappings → Add Mapping opens the editor. A live "Say: annika action <phrase>" hint previews the exact utterance as you type.
┌─ Add Mapping ───────────────────────────────────────┐
│ Spoken phrase [ open {app} ] │
│ Say: annika action open {app} │
│ │
│ Action type [ ▶ Open App ▾ ] │
│ │
│ App ( ) Auto-detect from speech │
│ (•) Select specific app [ Pick ] │
│ ( ) Enter manually │
│ │
│ Group [ App Controls ▾ ] │
│ │
│ [ Cancel ] [ Save ] │
└─────────────────────────────────────────────────────┘
You'll set:
- Spoken phrase — what you say after action. Keep it short and distinctive; long free phrases are harder for the offline engine to catch.
- Action type — one of the ten above; the fields below adapt to it.
- App-selection mode (for app actions) — three ways to decide which app:
- Auto-detect from speech — resolve the app name you spoke against your Voice Favorites.
- Select specific app — pin one app via the app picker.
- Enter manually — type an identifier yourself.
- Group — file the mapping under a named group or leave it ungrouped.
You can also Clone an existing mapping to seed a new one, and Edit or Delete any mapping from the list.
Reserved words the editor blocks
Some phrases are off-limits because InkSpoke needs them for its own grammar. These are a hard error that stops you saving:
| Blocked phrase | Why |
|---|---|
| action | Opens the command window. |
| command | Opens Command Mode (below). |
| press | Runs the built-in key-press command (below). |
| Your finish phrase (e.g. thank you annika) | Stops and processes dictation. |
| Your cancel phrase (e.g. cancel annika) | Aborts dictation. |
Putting your wake name inside a phrase is only a soft warning — it works, but it's redundant, since you already say the name before action.
A Send Keys action can hold a secret value (say, a password snippet) instead of plain
text. Secret values are encrypted at rest, so they aren't sitting in your settings as readable
text. A secret can't be combined with the {last} token described below.
Make commands dynamic with placeholders
A spoken phrase can include a placeholder that captures part of what you said and drops it into
the action. Type { in a field and an autocomplete list of placeholders appears; a live chip
preview highlights them.
| Placeholder | Captures | Example phrase | What it does |
|---|---|---|---|
{app} | An app name | close {app} | Targets the app you named |
{text} | Free text | type {text} | Send Keys types what you said |
{query} | A search phrase | search {query} | Substitutes the phrase |
{url} | A URL | open {url} | Substitutes the address |
{path} | A file path | open file {path} | Substitutes the path |
{key} | A key name | press {key} | Substitutes the key |
InkSpoke normalizes each placeholder by type — URLs, file paths, or raw text. An unrecognized name shows a soft "Unknown parameter(s)…" warning so you can fix a typo.
The wake-word engine uses a fixed offline vocabulary, so long, unpredictable dictation —
full URLs, long search queries, arbitrary prose — often won't be caught cleanly. That's why the
shipped Web templates deliberately avoid {query} and {url}. Prefer short, predictable phrases
and lean on your custom vocabulary for
words the engine should know.
Re-inject your last dictation with {last}
In a Send Keys action, the token {last} (or {latest}) is replaced at run time with your
most recent dictated text from history and typed out character by character. It's the rescue
button for a dictation that landed in the wrong window because focus changed: just say the
command and your last words are re-typed where your cursor is now.
- It always uses the Unicode-safe typing path and bypasses the clipboard, regardless of your injection-mode setting.
- If your history is empty, the command is skipped with a "No previous text to insert" status.
- The seeded "insert last item" template is exactly this, ready to use.
The built-in "press" command
You don't need a mapping to press keys. Say the reserved word press after action and name the keys:
- "annika action press enter"
- "annika action press control s"
- "annika action press a b tab" (a sequence)
A balloon confirms the press. Because press is reserved, no mapping of yours can start with it.
The "command" trigger (Command Mode)
Saying "annika command" opens the Command Mode overlay hands-free — the same thing the Command Mode hotkey does. Select some text first, say the trigger, then speak your instruction ("make this formal," "translate to Spanish").
How typed text is delivered
The SendKeys injection mode picker on the Voice Commands tab controls how Send Keys text reaches the target app. It doesn't affect app or key-combo actions.
| Mode | How it types | Best for |
|---|---|---|
| Text Injection (default) | Clipboard-paste / batched Unicode — fast and Unicode-safe | Almost everything; keeps accents, emoji, and non-Latin scripts |
| Keystroke Simulation | Per-character synthetic key presses (US-QWERTY / ASCII only) | Apps and games that reject synthetic Unicode input |
Some games and locked-down apps ignore pasted or batched Unicode input and only accept "real" key presses. Switch to Keystroke Simulation for those. The trade-off: it's ASCII-only, so typographic punctuation (smart quotes, em dashes, ellipses) is folded down to plain ASCII, and truly non-ASCII characters can't be sent this way. Leave the default Text Injection on everywhere else.
Chain commands without repeating the wake name
With Continuous Commands on (the default), the listener stays armed for a short follow-up window after each command or dictation finishes. You can fire the next command — or your quick-confirm phrase — without saying the wake name again.
Each success re-arms the window; it ends when you say your cancel phrase, when it times out, or when you click the countdown balloon. A small countdown balloon shows the app is still listening — you can hide it with the "…balloon" toggle. The window length reuses your Quick Confirm window setting.
| Setting | Default | What it does |
|---|---|---|
Voice Commands (VoiceCommandsEnabled) | Off | Master switch; Pro-gated. |
Continuous Commands (ContinuousCommandsEnabled) | On | Keeps the listener armed for a follow-up. |
Show continuous-command balloon (ShowContinuousCommandBalloon) | On | The listening countdown balloon. |
SendKeys injection mode (CommandInjectionMode) | Text Injection | How Send Keys text is delivered. |
Organize with groups
As your command set grows, tidy it up. In Manage Mappings you can create named groups, rename them inline, reorder them, enable or disable a whole group at once, or leave mappings Ungrouped. Deleting a group moves its mappings back to Ungrouped rather than losing them.
Start from a template
You don't have to author phrases and actions from scratch. Manage Mappings → Browse Templates opens a searchable catalog of ready-made commands grouped by category. Add one directly, or Edit before adding to open the normal form pre-filled.
| Category | Example commands |
|---|---|
| Terminal | start claude, run dev, git status, clear screen, hit {text} |
| App Controls | open {app}, close {app}, switch to {app} |
| Text Autofill | type {text}, insert email, insert signature, insert password |
| Web | open google, open youtube, open github, open chat gpt |
| Editor | save file, find in file |
| Productivity | copy, paste, screenshot |
| History | insert last item |
Only "insert last item" (the {last} re-inject command) is auto-seeded on first launch —
everything else you add yourself from the catalog. "insert password" is a Pro-only secret
template. If you delete a seeded command, InkSpoke won't silently resurrect it.
The templates' key combos are written for macOS (⌘S to save, ⌘F to find, ⌘H to hide, and so on).
On Windows and Linux the cmd modifier maps to the Command/Windows key — check that each shortcut
does what you expect in your app, and edit the mapping if not.
Back up and share with bundles
The Export and Import buttons at the bottom of the Voice Commands tab move your whole
voice-command setup — groups, mappings, app favorites, and custom vocabulary — as a single
JSON file (default name inkspoke-commands-YYYY-MM-DD.json).
- Export is available to everyone — a handy backup before you experiment.
- Import is Pro-gated. It opens a preview where you pick which categories to bring in, then applies them, skipping anything that would conflict with what you already have.
Next steps
- Wake word setup — the offline listener every voice command depends on, plus finish/cancel/quick-confirm phrases.
- Favorites & vocabulary — teach the
engine your app names and jargon so
{app}and custom phrases resolve reliably. - Command Mode — transform selected text by voice, triggerable with "<wake> command."
- General & hotkeys — where keyboard shortcuts (including the Command Mode hotkey) live.