Skip to main content

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.

Two things must be true for a command to fire
  1. Your wake word (hands-free listening) is enabled — commands ride on the same offline listener, and it's English-only.
  2. 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

  1. Open Settings → Hands-Free.
  2. Make sure the Wake Word tab shows wake word enabled (see Wake word setup). Commands can't work without it.
  3. Switch to the Voice Commands tab (marked with a PRO badge) and turn on Voice Commands.
  4. 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.

IconAction typeWhat it doesKey fields
Send KeysTypes free text where your cursor isText · Send Enter after · Secret
Key CombinationPresses a key with modifiersKey · Modifiers (Ctrl/Shift/Alt/Cmd)
Open AppLaunches an appApp
Close AppQuits an app gracefullyApp
Force Close AppForce-kills an unresponsive appApp
Bring to FrontFocuses an app's windowApp
Send to BackPushes an app's window behind othersApp
Hide AppHides an appApp
🔗Open URLOpens a URL in your default browserURL
📁Open FileOpens a file with its default handlerFile path
App actions run per-platform under the hood

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 phraseWhy
actionOpens the command window.
commandOpens Command Mode (below).
pressRuns 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.

Secrets are stored safely

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.

PlaceholderCapturesExample phraseWhat it does
{app}An app nameclose {app}Targets the app you named
{text}Free texttype {text}Send Keys types what you said
{query}A search phrasesearch {query}Substitutes the phrase
{url}A URLopen {url}Substitutes the address
{path}A file pathopen file {path}Substitutes the path
{key}A key namepress {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.

Long free text is unreliable offline

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.

ModeHow it typesBest for
Text Injection (default)Clipboard-paste / batched Unicode — fast and Unicode-safeAlmost everything; keeps accents, emoji, and non-Latin scripts
Keystroke SimulationPer-character synthetic key presses (US-QWERTY / ASCII only)Apps and games that reject synthetic Unicode input
Power users — when to switch to Keystroke Simulation

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.

SettingDefaultWhat it does
Voice Commands (VoiceCommandsEnabled)OffMaster switch; Pro-gated.
Continuous Commands (ContinuousCommandsEnabled)OnKeeps the listener armed for a follow-up.
Show continuous-command balloon (ShowContinuousCommandBalloon)OnThe listening countdown balloon.
SendKeys injection mode (CommandInjectionMode)Text InjectionHow 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.

CategoryExample commands
Terminalstart claude, run dev, git status, clear screen, hit {text}
App Controlsopen {app}, close {app}, switch to {app}
Text Autofilltype {text}, insert email, insert signature, insert password
Webopen google, open youtube, open github, open chat gpt
Editorsave file, find in file
Productivitycopy, paste, screenshot
Historyinsert last item
What's pre-installed vs. what you add

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.

Template shortcuts are macOS-flavored

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.