Smart matching and precedence
InkSpoke can choose a workspace for you on every dictation, so the right vocabulary, tone, and domain knowledge apply automatically without you touching a menu. This page explains how the automatic match is scored, and the exact order InkSpoke follows when more than one thing could decide the workspace.
The short version
Add a few tags to a workspace — usually the apps and websites you use it for — and InkSpoke does the rest. When you start dictating, it looks at the window you're focused on, finds the workspace whose tags fit best, and shows that choice on the listening overlay. If nothing matches, it falls back to a workspace you've marked as the default. You can always override the pick for a single session, or pin one workspace so it's used everywhere.
How smart window matching works
When you press your dictation hotkey, InkSpoke reads three signals about the app in front of you and scores every active workspace's tags against them:
┌──────────────────────────────────────────────────────────┐
│ Foreground app │
│ │
│ Window title → "invoice_march.xlsx — Excel" ← primary
│ App name → "Excel" ← fallback
│ Bundle id → "com.microsoft.Excel" ← strongest
│ │
└─────────────────────────────────────────────────────────┘
│ score against every active
▼ workspace's tags
┌───────────────────────┐
│ Highest score wins │
└───────────────────────┘
The scoring follows a clear ranking:
| Match on… | Tag form | Strength |
|---|---|---|
| Bundle id | bundle:<id> (e.g. bundle:com.microsoft.VSCode) | Strongest — scores highest |
| Window title | plain tag (e.g. github, jira) | Strong — beats an app-name match on a tie |
| App name | plain tag (e.g. excel, slack) | Fallback |
The window title is the primary signal because it's the most specific — it often contains the
document name, the site, or the repo you're in, not just the program. A bundle:<id> tag is the
most precise of all and always wins a tie, which makes it the reliable choice on macOS where
bundle identifiers are stable.
It tolerates near-spellings
You don't have to tag every exact variant of an app's name. Matching is forgiving in two ways:
- Small typos and near-spellings are accepted for tags of five characters or more (up to a
couple of characters of difference). A tag like
slackstill matches even if the window text is slightly off. - Trailing version digits are ignored — the tag
itermmatches a window called iTerm2.
Because the window title is the primary signal, a browser tag like github or figma will match
whenever that site's name is in the tab/window title — even though every tab runs in the same
browser. The workspace wizard can add a
website tag for you by fetching the page's title automatically.
Turning smart matching on or off
Smart matching (labeled Smart Injection in the app) is on by default. You'll find the toggle on Settings → Workspaces.
| Setting | Where | Default | What it does |
|---|---|---|---|
Smart Injection (SmartInjectionEnabled) | Settings → Workspaces | On | Turns automatic window matching on or off |
When it's off, InkSpoke won't auto-pick anything from the window — the overlay's workspace list starts at Select Workspace instead of Auto, and it uses only a pinned or default workspace (see below).
Smart matching works the same on Windows, macOS, and Linux. It relies on the platform reading the foreground window's title and app info, so the behavior is identical — only the underlying system used to read that information differs.
The precedence order
Smart matching is only one of four ways a workspace can be chosen, and they don't compete freely — InkSpoke resolves them in a strict priority order. The first one that yields an active workspace wins; if a candidate is inactive or has been deleted, InkSpoke falls through to the next.
| Priority | Source | Scope | How you set it |
|---|---|---|---|
| 1 | Pinned workspace | Sticky — used everywhere until you unpin | Star it in Settings → Workspaces (or in the wizard) |
| 2 | Overlay override | This dictation session only, not saved | Pick it from the workspace dropdown on the listening overlay |
| 3 | Smart auto-match | Per window, automatic | Nothing to do — just add tags |
| 4 | Default workspace | Fallback when nothing above applies | Kebab menu on the grid card, or the detail panel |
A useful way to read this: pinning is a deliberate "always use this," an overlay override is a one-off "use this just now," smart matching is the everyday automatic behavior, and the default is the safety net.
Pin, override, and set a default
Pin a workspace (always use this one)
Pinning forces one workspace for every dictation, ignoring the window entirely. It's ideal when you're heads-down on a single project.
- Open Settings → Workspaces.
- On the workspace card, click the star / pin control.
- The pinned workspace is shown on the page and now takes priority over smart matching.
To go back to automatic behavior, unpin it — smart matching resumes immediately.
Override for one session (just this time)
When the auto-match isn't what you want for a particular dictation, change it right on the listening overlay. This choice lasts only for the current session and is never saved.
┌────────────────────────────────────────────────┐
│ ● Listening… Alt+Space │
├────────────────────────────────────────────────┤
│ ▁▃▅▇▅▃▁▂▄▆▄▂ │
│ │
│ [ Workspace: ● Legal ▾ ] [ EN ▾ ] [ Send ]│
└────────────────────────────────────────────────┘
- Start dictation as usual so the overlay appears.
- Open the workspace picker dropdown.
- Choose a different workspace — or Auto to hand control back to smart matching.
A green indicator marks the workspace that smart matching pre-selected, so you can see at a glance what InkSpoke chose before you change it. Learn more on The listening overlay.
Set a default (the fallback)
The default workspace is used only when nothing is pinned, you didn't override, and smart matching found nothing. It's independent of smart matching — a good place to put your everyday general-purpose workspace.
- Open Settings → Workspaces.
- On the workspace card, open the kebab (⋮) menu and choose Set as default (you can also set it from the workspace's detail panel).
- That workspace now fills in whenever no higher-priority choice applies.
Power users
bundle:<id>beats everything. If a plain tag keeps matching the wrong app (common with Electron apps that share a browser-like title), add abundle:<id>tag instead — it scores highest and wins ties. On macOS, use the app's bundle identifier; on Windows and Linux, a plain app-name tag is usually enough.- Only active workspaces are considered. A deactivated workspace is skipped at every level of the precedence chain, and InkSpoke falls through to the next candidate — so deactivating is a quick way to take a workspace out of matching without deleting it.
- A hotkey for smart matching. You can assign a hotkey to toggle Smart Injection on and off. It has no default binding, so it stays unbound until you set one in your hotkey settings.
- Nothing matched? If every check comes up empty, InkSpoke dictates with your global settings only (personal context, global vocabulary, and your active models) — never a wrong workspace.
While a workspace is pinned, smart matching is effectively bypassed — the pinned workspace is used even in apps it wasn't tagged for. If auto-matching suddenly seems "stuck," check whether a workspace is pinned.
Next steps
- Create and tune a workspace — add the tags that power smart matching.
- What are workspaces? — the vocabulary, tone, and knowledge a match applies.
- The listening overlay — see and override the matched workspace per session.
- Personal context and dictionaries — the global layer used when no workspace matches.