Configuration
Tuna keeps the configuration you may want to sync or edit in a TOML file named config.toml.
You can manage Tuna entirely through Settings, but the file is useful for keeping the same setup on
multiple Macs, putting your preferences in a dotfiles repository, or making a precise change by
hand.
If you use a coding assistant, install the Tuna agent skill to help it make configuration changes safely.
Where The File Lives
By default, Tuna uses:
~/Library/Application Support/Tuna/config.toml
Open Settings -> General -> Configuration to reveal the file, reload it, or choose a custom
folder. A custom folder is useful for iCloud Drive, Dropbox, Syncthing, or a dotfiles checkout. Tuna
always names the file config.toml inside the selected folder.
Tuna does not create the file on an untouched installation. The configuration is sparse: it only contains values that differ from Tuna’s built-in defaults, plus custom data such as hotkeys and Smart Links. Returning a setting to its default removes that override. If every override is removed, Tuna removes the empty file too.
After Tuna first saves a complete config.toml, the file is the whole configuration. Deleting a
setting or a section and reloading then returns it to Tuna’s default: a missing [aliases] section
means no aliases, a missing [hotkeys] section means no hotkeys. Until that first complete save, a
reload leaves local values in place for anything missing from the file. The first complete save
includes values that were only stored on that Mac, so nothing you had set is lost when this takes
effect.
How Saving And Reloading Work
Tuna loads config.toml at launch and writes changes made in Settings back to it automatically.
Writes are atomic and slightly delayed so a series of quick changes produces one update.
When editing the file yourself:
- Make a backup or commit your current file.
- Save your changes.
- Run Reload Tuna Settings from File from Tuna’s catalog, choose Reload from Disk in
Settings, run
tuna config reload, or opentuna://config/reload.
Tuna validates the whole file before applying it. Unknown sections, unknown fields, invalid built-in values, duplicate IDs, and malformed item or action references make the reload fail rather than silently applying a partial configuration. Tuna leaves an unreadable file untouched and shows the error in Settings -> Logs.
Older configuration may need migration before Tuna can load it. If an entry refers to something
that can no longer be restored, Tuna imports the remaining configuration and shows a Config Import
Notice in Settings. The notice stays available across restarts until you acknowledge it, and Settings -> Logs
contains the dropped-entry details.
Tuna backs up an older file before migrating it, including files marked schemaVersion = 1. If an
older file cannot be migrated at all, Tuna sets it aside as config.toml.unreadable-<date>, writes
a new config.toml from your current settings, and says so in the Config Import Notice. Copy anything you still need from the
set-aside file into the new one and choose Reload from Disk. A symlinked config.toml stays
linked. Changing to an empty custom folder does not move or import the old file; to use it there,
copy config.toml into the new folder and choose Reload from Disk.
If the file changes outside Tuna while Tuna also has unsaved changes, Tuna reports a conflict. You can reload the file to keep the external version or explicitly overwrite it with Tuna’s current state. Tuna will not silently choose one version.
Changes you make in Tuna while config.toml cannot be written, including aliases and action
defaults, are kept on your Mac and survive a restart. They reach the file with the next save once it
can be written again. If a local section is invalid, Tuna retains its last valid file version (or
omits it until repaired) while saving other sections; the Logs explain what was kept. Apart from
setting aside an older file it cannot migrate, Tuna never replaces a config.toml it cannot read.
A Small Example
You do not need to copy a complete template. Include only the values you want to override:
[settings]
screenPreference = "activeWindow"
appPresentationMode = "both"
backspaceBehavior = "deleteCharacters"
browseBackspaceBehavior = "clearSearch"
resultListNavigationBindings = "vimStyle"
typingTimeoutDuration = 1.5
The names and string values are case-sensitive.
Built-in Setting Values
All keys below live under [settings]. Booleans use true or false, strings use quotes, and
numbers do not. The default shown is what Tuna uses when the key is absent.
Window And Results
| Key | Default | Accepted values |
|---|---|---|
themeIdentifier |
Default theme | A theme’s identifier. The default theme is omitted from the file. |
resultsRevealDelay |
2.0 |
Seconds as a number. |
showResultsImmediatelyOnActivation |
false |
true, false |
mainWindowAnimationsEnabled |
true |
true, false |
screenPreference |
"mouse" |
"mouse", "primary", "activeWindow" |
appPresentationMode |
"statusBar" |
"statusBar", "dock", "both", "never" |
Built-in themes keep the input visible during their entrance motion, regardless of
mainWindowAnimationsEnabled. That setting controls the motion and dismissal animations.
Built-in theme identifiers are:
- Default:
com.brnbw.tuna.themes.default - Logic Board:
com.brnbw.tuna.themes.logicboard - Normie Bar:
com.brnbw.tuna.themes.NormieBar - Notch:
com.brnbw.tuna.themes.Notch - Nuggets:
com.brnbw.tuna.themes.nuggets
Search And Keyboard Behavior
| Key | Default | Accepted values |
|---|---|---|
launcherInputSourceIdentifier |
"" (Off) |
The identifier of an enabled macOS keyboard input source, such as "com.apple.keylayout.ABC". |
typingTimeoutDuration |
2.5 |
Seconds from 0.2 through 3.0; 3.0 means Off. Values outside this range fail reload. |
backspaceBehavior |
"clearSearch" |
"clearSearch", "deleteCharacters"; applies to global search. |
browseBackspaceBehavior |
"deleteCharacters" |
"clearSearch", "deleteCharacters"; applies inside browsed sources, including provider searches. |
spacebarBehavior |
"normal" |
"normal", "switchToTextMode", "jumpToTargetPane" |
resultListNavigationBindings |
"arrowKeysOnly" |
"arrowKeysOnly", "macOSStandard", "vimStyle" |
switchToTextModeWhenNoResults |
false |
true, false |
holdToExecuteEnabled |
false |
true, false |
pureStringRankingEnabled |
false |
true, false |
preferStringPasteboardContent |
false |
true, false |
Choose Settings → General → Keyboard → Auto-switch Input Source to select from enabled macOS keyboard layouts and input methods. Tuna switches when the launcher opens and restores the source that was active before opening when you dismiss it, execute a command that closes it, or quit. Switching between Fuzzy, Text, and Combo Mode while the launcher stays open does not switch again or replace the original source. Changes to this setting apply on the next launcher session. Settings, Shelf, and the standalone Talk Mode HUD do not auto-switch input sources.
If the configured source is unavailable on this Mac or macOS cannot select it, Tuna leaves the
current source unchanged. It never enables an input source for you. If the previous source becomes
unavailable while Tuna is open, restoration is skipped. This is separate from Combo Mode’s
comboModeKeyboardLayoutBehavior, which interprets shortcut keys without changing the macOS source.
Activation
The four trigger-type keys accept the same values:
fuzzyModeTriggerTypetextModeTriggerTypecomboModeTriggerTypetalkModeTriggerType
Their default is "shortcut". Accepted values are "disabled", "shortcut",
"doublePress", and "modifier".
The four double-press keys also share one value set:
activationDoublePressTriggertextModeDoublePressTriggercomboModeDoublePressTriggertalkModeDoublePressTrigger
Their default is "disabled". Accepted values are "disabled", "leftCommand",
"rightCommand", "leftOption", "rightOption", "leftControl", and "rightControl".
comboModeModifierTrigger and talkModeModifierTrigger default to "disabled". They accept
"disabled", "rightCommand", "leftCommand", "rightOption", "leftOption",
"rightCommandOption", "leftCommandOption", and "hyper".
These fields choose how a mode is triggered; the actual app hotkey chords are stored in the
[hotkeys] section described below.
Built-in Hyper
| Key | Default | Accepted values |
|---|---|---|
physicalHyperKeySource |
"off" |
"off", "capsLock", "rightOption", "rightCommand" |
physicalHyperKeyQuickPressBehavior |
"doesNothing" |
"doesNothing", "togglesCapsLock", "triggersEscape" |
includeShiftInHyperKey |
true |
true, false |
shortcutDisplayUsesHyperSymbol |
true |
true, false |
The quick-press behavior matters when a physical key is being used as Hyper. Right Option and Right
Command preserve their normal quick press; Caps Lock can toggle Caps Lock or act as Escape.
When includeShiftInHyperKey is false, the built-in physical Hyper key sends Command+Option+Control;
holding Shift as well gives a separate shortcut. Existing configurations default to true.
Clipboard And Shelf
| Key | Default | Accepted values |
|---|---|---|
clipboardHistoryEnabled |
true |
true, false |
clipboardHistoryRetention |
"oneMonth" |
"oneDay", "sevenDays", "oneMonth", "threeMonths", "sixMonths", "oneYear", "unlimited" |
clipboardIgnoredBundleIdentifiers |
Password-manager defaults | An array of application bundle identifier strings. Supplying it replaces the entire list. |
showTasksIndicatorWhenHidden |
true |
true, false |
shelfWindowAlwaysOnTop |
true |
true, false |
shelfAutoCloseWhenTasksComplete |
false |
true, false |
shelfCatalogEnabled |
true |
true, false |
The built-in clipboard ignore list contains:
clipboardIgnoredBundleIdentifiers = [
"com.1password.1password",
"com.agilebits.onepassword7",
"com.apple.Passwords",
"com.apple.keychainaccess",
"com.bitwarden.desktop",
"com.dashlane.Dashlane",
"com.keepersecurity.KeeperPasswordManager",
"com.nordpass.NordPass",
]
Clipboard retention beyond one month requires Tuna Pro.
Catalogs And Diagnostics
| Key | Default | Accepted values |
|---|---|---|
advancedCatalogsEnabled |
true |
true, false |
textActionsFileExtension |
"txt" |
A file extension without the leading dot. |
proxyDiagnosticsLoggingEnabled |
false |
true, false |
devicesDiagnosticsLoggingEnabled |
false |
true, false |
Older files may contain catalogPeriodicRescanEnabled and
catalogPeriodicRescanIntervalMinutes. Tuna accepts these keys for compatibility but ignores them;
catalogs now update at startup, on demand, or in response to filesystem changes.
Combo Mode
| Key | Default | Accepted values |
|---|---|---|
comboModeCheatsheetBehavior |
"delay" |
"never", "delay", "always" |
comboModeCheatsheetDelayMS |
2000 |
Milliseconds as a non-negative integer. |
comboModeCheatsheetExpandGroups |
false |
true, false |
comboModeCheatsheetShowIcons |
true |
true, false |
comboModeCheatsheetShowDetails |
true |
true, false |
comboModeModifierConfiguration |
"controlGroupOptionSticky" |
"controlGroupOptionSticky", "optionGroupControlSticky" |
comboModeKeyboardLayoutBehavior |
"respectCurrentLayout" |
"respectCurrentLayout", "forceUS" |
comboModeBackspaceBehavior |
"resetToRoot" |
"resetToRoot", "stepBack" |
comboModeThemeStyle |
"inherit" |
"inherit", "breadcrumb", "cheatsheet", "none" |
Talk Mode Presentation
| Key | Default | Accepted values |
|---|---|---|
dictationActivationMode |
"pushToTalk" |
"pushToTalk", "toggle", "hybrid" |
dictationWindowPosition |
"bottomCenter" |
"center", "topLeft", "topCenter", "topRight", "bottomLeft", "bottomCenter", "bottomRight" |
dictationWindowBecomesKey |
false |
true, false |
When dictationWindowBecomesKey is true, Talk Mode takes keyboard focus when it opens so Return,
Escape, and Tab work immediately. Tuna returns focus to the previous app after pasting or canceling.
Older files may contain dictationPresentationStyle. Tuna accepts but ignores this retired key;
Talk Mode now always uses its dedicated floating window.
Other Configuration Sections
Tuna writes these top-level sections when they contain non-default or user-created data:
| Section | What it contains |
|---|---|
[catalogs] |
Per-catalog browse sort, global-search scope, and search-priority overrides. Priorities are -2, -1, 1, or 2; 0 means no override and is omitted. |
[catalogConfiguration] |
Folder depth overrides, custom folders, script directories, and custom items. Custom item kinds are "url", "path", and "text"; custom-folder entry types are "directory" and "file"; filters are "folders" and "extensions". Paths may use ~. |
[[catalogSettings]] |
String values declared by built-in or installed extensions. Available keys and values depend on the extension. A present list replaces all stored extension settings; omitting the section resets them. |
[hotkeys] |
Tuna’s five app hotkeys—activate, Text Mode, Combo Mode, stage Finder selection, and dictation—plus custom command hotkeys. |
[comboMode] |
The complete non-default Combo Mode binding tree. |
[smartLinks] |
The complete Smart Links list when it differs from the built-in list. |
[aliases] |
Explicit aliases and their ordered exact-result targets. |
[actionPreferences] |
Sparse action ordering and default-action overrides. |
These structures use canonical catalog references. The easiest and safest way to author them is to
make the change in Tuna, then inspect the TOML Tuna writes. Smart Links are identified by their
unique name — commands refer to them as tuna.smart-links/<name> — and Combo bindings carry no
persisted identity at all. Custom hotkeys have a UUID id, which you may omit when authoring by
hand: Tuna assigns one on load and writes it back on the next save.
App hotkeys, custom hotkeys, aliases, and action-preference overrides have no built-in entries.
The built-in Combo tree opens Safari (s), Terminal (t), Finder (f), Messages (m), Notes
(n), Downloads (d), and the home folder (h). Tuna omits that tree from the file until it is
customized.
Catalog Objects
[catalogs] contains three complete arrays. Catalog IDs must be canonical and unique within each
array. Sort-order values come from the catalog’s declared sort options. For an already-known
catalog, an omitted global scope means all current and future items are included. A newly discovered
catalog first uses the extension’s declared initial scope, and Tuna then persists that choice. A
"none" scope excludes all current and future items without an item list. Partial selections use
"only" or "excluding" with item IDs; these respectively exclude or include future items. Search
priority is -2, -1, 1, or 2 (0 removes the override).
Global item scopes apply only to item-bearing source and snapshot catalogs. Enabled browse-root and live-search entries remain available in global search; a browse root’s scope belongs to its contents catalog, not its navigation entry. Its switch in Sources enables both the entry and contents; an item scope alone does not enable a disabled source. Browse items in a source remain findable regardless of its item scope. Tuna ignores and removes scopes saved for browse-root, live-search, or hidden catalogs. To hide a navigation entry, disable its catalog in Settings instead.
[catalogs]
[[catalogs.sortOrders]]
catalogIdentifier = "tuna.applications.all"
sortOrder = "name.asc"
[[catalogs.sortOrders]]
catalogIdentifier = "tuna.filesystem-browse"
sortOrder = "capturedAt.desc"
[[catalogs.globalScopes]]
catalogIdentifier = "example.catalog"
scope = { kind = "only", itemIDs = ["inbox", "today"] }
[[catalogs.searchPriorities]]
catalogIdentifier = "example.catalog"
level = 1
Folder-browse sort order uses tuna.filesystem-browse; the older
Tuna.FileSystemBrowseSort identifier is migrated on load.
[catalogConfiguration] contains four complete arrays:
| Array | Required fields | Optional fields |
|---|---|---|
folderDepthOverrides |
catalogIdentifier, depthRawValue |
— |
customFolders |
UUID id, path, depthRawValue |
entryType, filterMode, fileExtensions |
scriptsDirectories |
UUID id, path |
— |
customItems |
UUID id, kind, value |
label |
depthRawValue = 0 means unlimited; positive values are depth limits. A custom folder’s omitted
entryType means "directory", and omitted filterMode means all items. Entry types are
"directory" and "file"; filters are "folders" and "extensions". An extensions filter uses
fileExtensions. Filters apply to directory entries; file entries always include the selected file.
Custom item kinds are "url", "path", and "text". Paths may start with ~.
[catalogConfiguration]
[[catalogConfiguration.folderDepthOverrides]]
catalogIdentifier = "tuna.user-folders"
depthRawValue = 2
[[catalogConfiguration.customFolders]]
id = "ad9cf00d-dbd5-4437-8f2d-352488004a87"
path = "~/Projects"
depthRawValue = 0
entryType = "directory"
filterMode = "extensions"
fileExtensions = ["md", "txt"]
[[catalogConfiguration.scriptsDirectories]]
id = "2ed52442-1f05-4bb1-bf3a-665e1a4249ac"
path = "~/.local/bin"
[[catalogConfiguration.customItems]]
id = "f3ac968c-4742-4ae0-8e38-b7ff61e6884a"
kind = "url"
value = "https://tunaformac.com"
label = "Tuna"
Each [[catalogSettings]] object has a catalogIdentifier and a string-to-string values table.
Available keys come from that catalog’s declaration. A present list replaces all extension
settings; omitting the section resets them.
[[catalogSettings]]
catalogIdentifier = "example.catalog"
[catalogSettings.values]
ProjectRoot = "~/Projects"
View = "assigned"
Smart Links request fallback icons directly from each website by default. Its built-in
UseFavicone value is "false". Set it to "true" to opt in to sending each Smart Link host to
favicone.com in exchange for higher-resolution icons:
[[catalogSettings]]
catalogIdentifier = "tuna.smart-links"
[catalogSettings.values]
UseFavicone = "true"
Smart Links Objects
Each [[smartLinks.entries]] object has four required fields:
| Field | Meaning |
|---|---|
name |
The title shown in Tuna, and the entry’s identity: saved commands and hotkeys refer to tuna.smart-links/<name>. Names must be unique (case-insensitive). |
template |
URL template. Usually contains {{input}} or {{clipboard}}. |
requiresInput |
Whether Tuna requires a target value before opening the link. |
enabled |
Whether the entry is available in the Smart Links catalog. |
[[smartLinks.entries]]
name = "GitHub Search"
template = "https://github.com/search?q={{input}}"
requiresInput = true
enabled = true
[[smartLinks.entries]]
name = "Tuna Website"
template = "https://tunaformac.com"
requiresInput = false
enabled = true
Renaming a Smart Link in Tuna’s Settings rewrites every command that refers to it. Renaming one by editing this file does not — commands referring to the old name stop resolving until you update them.
The entries are a complete ordered list, not a patch. To deliberately clear them, use:
[smartLinks]
entries = []
Names and templates must not be empty, and names must be unique (case-insensitive). See Smart Links for template placeholders and filters.
All built-ins have requiresInput = true and enabled = true:
| Name | Template |
|---|---|
https://www.google.com/search?q={{input}} |
|
| DuckDuckGo | https://duckduckgo.com/?q={{input}} |
| Bing | https://www.bing.com/search?q={{input}} |
| Wikipedia | https://en.wikipedia.org/wiki/Special:Search?search={{input}} |
| YouTube | https://www.youtube.com/results?search_query={{input}} |
| GitHub | https://github.com/search?q={{input}} |
| Stack Overflow | https://stackoverflow.com/search?q={{input}} |
Alias Objects
Aliases are explicit, synced configuration. Each [[aliases.entries]] object contains a
case-insensitive abbreviation and an ordered list of exact catalog targets:
[[aliases.entries]]
abbreviation = "d"
targets = [
{ catalogID = "tuna.smart-links", id = "Dictionary" },
{ catalogID = "tuna.smart-links", id = "DuckDuckGo" },
]
Target order is priority order when several items share an alias. Catalog and item IDs must use
the canonical reference grammar. Tuna trims and lowercases abbreviations; they must be non-empty and
unique case-insensitively. Every targets array must be non-empty and contain unique references. A
present aliases list replaces all explicit aliases; use entries = [] or omit the section to clear
them on reload. Learned usage and ranking remain local to each Mac and are not written to
config.toml.
Combo Mode Binding Objects
[comboMode] contains one required bindings array. Every binding has an optional
single-character key, an optional label, an optional iconPath, and a destination object.
Destination types are "url", "group", "command", and "route".
For a "url" destination, url is a plain string with an external scheme, such as
"https://tunaformac.com". Scheme-less URLs and tuna:// URLs are rejected; use a typed "route"
for Tuna’s own modes. Older files with a URL table are migrated to this string format on app startup,
with a backup of the original file.
This example contains a website, a nested group, and a Tuna search route:
[comboMode]
[[comboMode.bindings]]
key = "w"
label = "Tuna Website"
[comboMode.bindings.destination]
type = "url"
url = "https://tunaformac.com"
[[comboMode.bindings]]
key = "g"
label = "Go"
[comboMode.bindings.destination]
type = "group"
[[comboMode.bindings.destination.bindings]]
key = "s"
label = "Search Tuna"
[comboMode.bindings.destination.bindings.destination]
type = "route"
[comboMode.bindings.destination.bindings.destination.route]
type = "search"
query = "Tuna"
A command destination embeds the same saved-command object used by a custom hotkey:
[comboMode]
[[comboMode.bindings]]
key = "e"
label = "Open Example"
[comboMode.bindings.destination]
type = "command"
[comboMode.bindings.destination.command]
type = "savedCommand"
subjectIdentifiers = ["url:https://example.com"]
actionIdentifier = "tuna.common-actions/open-url"
behavior = "run"
presentation = "automatic"
Saved-command behavior is "run" or "stage"; presentation is "automatic", "show", or
"hidden". A command may also have a targetIdentifier. Subject and target values use canonical
item references, while the action uses catalog-id/action-id. See URL Schemes for the reference
grammar.
type, subjectIdentifiers, behavior, and presentation are required. Run requires an action.
Stage may omit the action, but a target always requires one, and Stage cannot use "hidden".
External URL destinations must have a non-tuna scheme. iconPath may be an app path, image path,
or SF Symbol name.
Route objects can open Tuna search, Text Mode, Combo Mode, Talk Mode, Settings, configuration reload, or extension-development actions. Let Tuna’s Combo Mode editor generate these objects so all fields match the selected route.
Route type values and optional fields are: search (query), text (value), combo, talk,
settings (pane), configurationReload, and extensionDevelopment (action is "reload" or
"rescan", with optional bundleIdentifier).
The bindings array is a complete tree.
bindings = [] deliberately clears Combo Mode; removing the whole section restores Tuna’s
built-in bindings on reload.
Hotkey Objects
[hotkeys] has an optional app object and a required custom array. App shortcuts are named
activate, textMode, comboMode, stageFinderSelection, and dictation. A custom hotkey’s id
is optional when authoring by hand; Tuna adopts the stored hotkey with the same command or assigns a
fresh identity, and writes it back on the next save.
[hotkeys]
[[hotkeys.custom]]
[hotkeys.custom.shortcut]
carbonKeyCode = 18
carbonModifiers = 6400
[hotkeys.custom.command]
type = "savedCommand"
subjectIdentifiers = ["text:hello"]
actionIdentifier = "tuna.common-actions/run-text-as-shell-command"
behavior = "run"
presentation = "hidden"
[hotkeys.app]
activate = { carbonKeyCode = 49, carbonModifiers = 2304 }
textMode = { carbonKeyCode = 17, carbonModifiers = 2304 }
carbonKeyCode and carbonModifiers are the macOS key representation used by Tuna’s shortcut
library. They are intentionally low-level: record shortcuts in Settings -> Hotkeys, then copy or
debug the generated values instead of calculating them by hand. A missing shortcut on a custom
hotkey means the command exists but has no assigned chord.
The custom array is a complete replacement. Including [hotkeys] with custom = [] removes all
custom hotkeys. If the section is present but [hotkeys.app] or one of its five fields is absent,
that app shortcut is cleared on reload. Removing the entire [hotkeys] section clears all hotkeys
on reload.
Every custom hotkey UUID must be unique. Its command follows the saved-command shape described in
the Combo Mode section above. A staged command cannot use presentation = "hidden" because staging
requires Tuna’s interface.
Action Preference Objects
Action preferences are sparse overrides layered on top of Tuna and extension defaults. The section contains three required arrays:
[actionPreferences]
[[actionPreferences.typeOrderOverrides]]
typeID = "com.tuna.type.url"
actions = [
{ catalogIdentifier = "tuna.common-actions", actionID = "open-url" },
{ catalogIdentifier = "tuna.common-actions", actionID = "copy-to-clipboard" },
]
[[actionPreferences.itemDefaultOverrides]]
scopeKind = "item"
scopeIdentifier = "tuna.smart-links/GitHub Search"
action = { catalogIdentifier = "tuna.smart-links.actions", actionID = "open-smart-link" }
[[actionPreferences.itemDefaultOverrides]]
scopeKind = "type"
scopeIdentifier = "com.tuna.type.text-snippet"
action = { catalogIdentifier = "tuna.common-actions", actionID = "copy-to-clipboard" }
[[actionPreferences.applicationOrderOverrides]]
bundleIdentifier = "com.apple.Safari"
actions = [
{ catalogIdentifier = "tuna.common-actions", actionID = "open" },
{ catalogIdentifier = "tuna.common-actions", actionID = "reveal" },
]
typeOrderOverridesreplaces the action order for one type ID. A direct type override wins; otherwise Tuna combines overrides inherited from parent types. Safari’s Last Download usescom.tuna.type.safari-last-download: its default order puts Resolve ahead of inherited file actions without changing the order for ordinary files.itemDefaultOverrideschooses one default action for either a canonical item reference or a type ID.scopeKindis"item"or"type"and determines howscopeIdentifieris parsed.applicationOrderOverridesreplaces the action order used for one application bundle identifier.
Each scope, type, and normalized application bundle identifier may appear only once. An action may appear only once within an order. References to an unavailable extension are retained so the preference starts working again if that extension returns. Resetting an order or default in Settings removes its object and reveals the current built-in or extension default.
All three arrays describe the complete set of overrides. To reset all action preferences through the
file, set all three arrays to [] or remove the section; either way, reloading restores the defaults.
Catalog enablement is intentionally not stored in config.toml. Installed extensions and available
catalogs can differ from Mac to Mac, so Tuna resolves their current availability locally. Likewise,
built-in action rankings are resolved live; only your overrides are saved.
Cross-Section Debugging Example
This fragment defines one Smart Link, opts in to favicone.com icons, and refers to that same item
from Combo Mode, a custom hotkey, an alias, and an item default. Item and alias objects spell the key
catalogID; action objects spell it catalogIdentifier.
[[smartLinks.entries]]
name = "Docs Search"
template = "https://tunaformac.com/docs/search?q={{input}}"
requiresInput = true
enabled = true
[[catalogSettings]]
catalogIdentifier = "tuna.smart-links"
[catalogSettings.values]
UseFavicone = "true"
[[comboMode.bindings]]
key = "d"
label = "Docs"
[comboMode.bindings.destination]
type = "group"
[[comboMode.bindings.destination.bindings]]
key = "s"
label = "Search Docs"
[comboMode.bindings.destination.bindings.destination]
type = "command"
[comboMode.bindings.destination.bindings.destination.command]
type = "savedCommand"
subjectIdentifiers = ["tuna.smart-links/Docs Search"]
actionIdentifier = "tuna.smart-links.actions/open-smart-link"
behavior = "run"
presentation = "automatic"
[[hotkeys.custom]]
[hotkeys.custom.command]
type = "savedCommand"
subjectIdentifiers = ["tuna.smart-links/Docs Search"]
actionIdentifier = "tuna.smart-links.actions/open-smart-link"
behavior = "stage"
presentation = "show"
[[aliases.entries]]
abbreviation = "docs"
targets = [{ catalogID = "tuna.smart-links", id = "Docs Search" }]
[actionPreferences]
typeOrderOverrides = []
applicationOrderOverrides = []
[[actionPreferences.itemDefaultOverrides]]
scopeKind = "item"
scopeIdentifier = "tuna.smart-links/Docs Search"
action = { catalogIdentifier = "tuna.smart-links.actions", actionID = "open-smart-link" }
For the command references used by custom hotkeys, Combo Mode, and action preferences, see URL Schemes. For the corresponding UI, see Hotkeys and Activation, Combo Mode, and Smart Links.
Syncing Between Macs
Choose the same custom config folder on each Mac, or manage config.toml with your normal sync
tool. Tuna keeps paths portable where it can by writing locations inside your home directory with
~.
Some references can still be machine-specific: an application or extension may not exist on every Mac, a custom path may point to local content, and a hotkey may conflict with another system setup. Tuna retains valid references to temporarily unavailable extensions so they work again when the extension returns.
Before resolving a sync conflict, quit Tuna on the other Mac or reload both copies so neither has
pending local changes. Treat config.toml as one document: Tuna validates and applies it as a whole.
