alfred,dash: Add Dash workflow, use blanket PNG LFS rule
Assisted-by: Claude Opus 4.5 via Claude Code
diff --git a/.gitattributes b/.gitattributes
index aad58943..75936686 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,5 +1,6 @@
Alfred.alfredpreferences/workflows/*/info.plist filter=alfredworkflow
-Alfred.alfredpreferences/workflows/user.workflow.35F259A3-BBD9-4A1B-B237-5E149EE1E723/*.png filter=lfs diff=lfs merge=lfs -text
-osx/websters-1913.dictionary filter=lfs diff=lfs merge=lfs -text
macos/Dash.dashsync/Preferences.plist filter=dash-prefs
+
+osx/websters-1913.dictionary filter=lfs diff=lfs merge=lfs -text
*.icns filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dashAlfredWorkflow b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dashAlfredWorkflow
new file mode 100755
index 00000000..be592ade
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dashAlfredWorkflow differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_crate.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_crate.png
new file mode 100644
index 00000000..07fbac83
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_crate.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_hs.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_hs.png
new file mode 100644
index 00000000..d8e263b5
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_hs.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rb.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rb.png
new file mode 100644
index 00000000..c556595d
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rb.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rs.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rs.png
new file mode 100644
index 00000000..90c1b97d
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_keyword_rs.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_note_readme.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_note_readme.png
new file mode 100755
index 00000000..70c7df3f
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/dash_note_readme.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/icon.png b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/icon.png
new file mode 100755
index 00000000..fe386d3c
Binary files /dev/null and b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/icon.png differ
diff --git a/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/info.plist b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/info.plist
new file mode 100644
index 00000000..3f9111ca
--- /dev/null
+++ b/macos/Alfred.alfredpreferences/workflows/user.workflow.F918039A-9360-42F3-A012-C37000F2CDEB/info.plist
@@ -0,0 +1,596 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>bundleid</key>
+ <string>com.kapeli.dash.workflow</string>
+ <key>category</key>
+ <string>Tools</string>
+ <key>connections</key>
+ <dict>
+ <key>12B8CAB5-9FEE-46F2-B67E-026F4BE48A88</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>5C09F008-55F3-4966-BACC-DF3176E148A5</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ <key>406C4166-C9CF-496F-8DB1-D43CE5211BEA</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>5C09F008-55F3-4966-BACC-DF3176E148A5</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ <key>5C09F008-55F3-4966-BACC-DF3176E148A5</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_normal</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_cmd</string>
+ <key>modifiers</key>
+ <integer>1048576</integer>
+ <key>modifiersubtext</key>
+ <string>Open</string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_alt</string>
+ <key>modifiers</key>
+ <integer>524288</integer>
+ <key>modifiersubtext</key>
+ <string>Copy</string>
+ </dict>
+ </array>
+ <key>dash_keyword_crate</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_normal</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_cmd</string>
+ <key>modifiers</key>
+ <integer>1048576</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_alt</string>
+ <key>modifiers</key>
+ <integer>524288</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ <key>dash_keyword_hs</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_normal</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_cmd</string>
+ <key>modifiers</key>
+ <integer>1048576</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_alt</string>
+ <key>modifiers</key>
+ <integer>524288</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ <key>dash_keyword_rb</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_normal</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_cmd</string>
+ <key>modifiers</key>
+ <integer>1048576</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_alt</string>
+ <key>modifiers</key>
+ <integer>524288</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ <key>dash_keyword_rs</key>
+ <array>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_normal</string>
+ <key>modifiers</key>
+ <integer>0</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_cmd</string>
+ <key>modifiers</key>
+ <integer>1048576</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ <dict>
+ <key>destinationuid</key>
+ <string>dash_action_alt</string>
+ <key>modifiers</key>
+ <integer>524288</integer>
+ <key>modifiersubtext</key>
+ <string></string>
+ </dict>
+ </array>
+ </dict>
+ <key>createdby</key>
+ <string>Kapeli</string>
+ <key>description</key>
+ <string>Search Dash for query</string>
+ <key>disabled</key>
+ <false/>
+ <key>name</key>
+ <string>Dash</string>
+ <key>objects</key>
+ <array>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>escaping</key>
+ <integer>127</integer>
+ <key>script</key>
+ <string>open -g "dash-workflow-callback://{query}?openInNewTab=${openInNewTab}"</string>
+ <key>type</key>
+ <integer>0</integer>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.action.script</string>
+ <key>uid</key>
+ <string>dash_action_normal</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>action</key>
+ <integer>0</integer>
+ <key>argument</key>
+ <integer>0</integer>
+ <key>leftcursor</key>
+ <false/>
+ <key>modsmode</key>
+ <integer>0</integer>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.trigger.hotkey</string>
+ <key>uid</key>
+ <string>12B8CAB5-9FEE-46F2-B67E-026F4BE48A88</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>escaping</key>
+ <integer>127</integer>
+ <key>script</key>
+ <string>open -g "dash-workflow-callback://{query}?modifierkey=cmd"</string>
+ <key>type</key>
+ <integer>0</integer>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.action.script</string>
+ <key>uid</key>
+ <string>dash_action_cmd</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>110</integer>
+ <key>keyword</key>
+ <string>dash</string>
+ <key>runningsubtext</key>
+ <string>Searching for "{query}"</string>
+ <key>script</key>
+ <string>./dashAlfredWorkflow "{query}"</string>
+ <key>subtext</key>
+ <string>Search Dash for "{query}"</string>
+ <key>title</key>
+ <string>Search Dash</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>5C09F008-55F3-4966-BACC-DF3176E148A5</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>action</key>
+ <integer>0</integer>
+ <key>argument</key>
+ <integer>1</integer>
+ <key>leftcursor</key>
+ <false/>
+ <key>modsmode</key>
+ <integer>0</integer>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.trigger.hotkey</string>
+ <key>uid</key>
+ <string>406C4166-C9CF-496F-8DB1-D43CE5211BEA</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>escaping</key>
+ <integer>127</integer>
+ <key>script</key>
+ <string>open -g "dash-workflow-callback://{query}?modifierkey=alt"</string>
+ <key>type</key>
+ <integer>0</integer>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.action.script</string>
+ <key>uid</key>
+ <string>dash_action_alt</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>0</integer>
+ <key>runningsubtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>script</key>
+ <string>Dash dynamically updates this workflow with docset and search profile keywords.
+
+Do not try to change the keywords from within Alfred, as Dash will overwrite your changes. If you want to change a keyword, change it from within Dash (in Settings > Docsets).
+
+That said, you can edit anything else within this workflow (including adding new triggers/actions/hotkeys).</string>
+ <key>subtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>title</key>
+ <string>PLEASE README</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_note_readme</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>0</integer>
+ <key>runningsubtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>script</key>
+ <string>Dash dynamically updates this workflow with docset and search profile keywords.
+
+Do not try to change the keywords from within Alfred, as Dash will overwrite your changes. If you want to change a keyword, change it from within Dash (in Settings > Docsets).
+
+That said, you can edit anything else within this workflow (including adding new triggers/actions/hotkeys).</string>
+ <key>subtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>title</key>
+ <string>PLEASE README</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_note_readme</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>0</integer>
+ <key>runningsubtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>script</key>
+ <string>Dash dynamically updates this workflow with docset and search profile keywords.
+
+Do not try to change the keywords from within Alfred, as Dash will overwrite your changes. If you want to change a keyword, change it from within Dash (in Settings > Docsets).
+
+That said, you can edit anything else within this workflow (including adding new triggers/actions/hotkeys).</string>
+ <key>subtext</key>
+ <string>Please read what's in the "Script:" section below</string>
+ <key>title</key>
+ <string>PLEASE README</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_note_readme</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>110</integer>
+ <key>keyword</key>
+ <string>crate</string>
+ <key>runningsubtext</key>
+ <string>Searching for "{query}"</string>
+ <key>script</key>
+ <string>./dashAlfredWorkflow "crate:{query}"</string>
+ <key>subtext</key>
+ <string>Search xdg and 1 other for "{query}"</string>
+ <key>title</key>
+ <string>Search xdg</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_keyword_crate</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>110</integer>
+ <key>keyword</key>
+ <string>hs</string>
+ <key>runningsubtext</key>
+ <string>Searching for "{query}"</string>
+ <key>script</key>
+ <string>./dashAlfredWorkflow "hs:{query}"</string>
+ <key>subtext</key>
+ <string>Search Hammerspoon for "{query}"</string>
+ <key>title</key>
+ <string>Search Hammerspoon</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_keyword_hs</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>110</integer>
+ <key>keyword</key>
+ <string>rb</string>
+ <key>runningsubtext</key>
+ <string>Searching for "{query}"</string>
+ <key>script</key>
+ <string>./dashAlfredWorkflow "rb:{query}"</string>
+ <key>subtext</key>
+ <string>Search Ruby 4 for "{query}"</string>
+ <key>title</key>
+ <string>Search Ruby 4</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_keyword_rb</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>argumenttype</key>
+ <integer>0</integer>
+ <key>escaping</key>
+ <integer>110</integer>
+ <key>keyword</key>
+ <string>rs</string>
+ <key>runningsubtext</key>
+ <string>Searching for "{query}"</string>
+ <key>script</key>
+ <string>./dashAlfredWorkflow "rs:{query}"</string>
+ <key>subtext</key>
+ <string>Search Rust for "{query}"</string>
+ <key>title</key>
+ <string>Search Rust</string>
+ <key>type</key>
+ <integer>0</integer>
+ <key>withspace</key>
+ <true/>
+ </dict>
+ <key>type</key>
+ <string>alfred.workflow.input.scriptfilter</string>
+ <key>uid</key>
+ <string>dash_keyword_rs</string>
+ <key>version</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>readme</key>
+ <string>Usage:
+'dash {query}'
+'{keyword} {query}'
+
+The keyword is either a docset keyword (defined in Dash's Preferences > Docsets) or a search profile keyword trigger (defined by clicking on the loupe icon of the main search field).</string>
+ <key>uidata</key>
+ <dict>
+ <key>12B8CAB5-9FEE-46F2-B67E-026F4BE48A88</key>
+ <dict>
+ <key>ypos</key>
+ <real>60</real>
+ </dict>
+ <key>406C4166-C9CF-496F-8DB1-D43CE5211BEA</key>
+ <dict>
+ <key>ypos</key>
+ <real>210</real>
+ </dict>
+ <key>5C09F008-55F3-4966-BACC-DF3176E148A5</key>
+ <dict>
+ <key>ypos</key>
+ <real>140</real>
+ </dict>
+ <key>dash_action_alt</key>
+ <dict>
+ <key>ypos</key>
+ <real>270</real>
+ </dict>
+ <key>dash_action_cmd</key>
+ <dict>
+ <key>ypos</key>
+ <real>140</real>
+ </dict>
+ <key>dash_action_normal</key>
+ <dict>
+ <key>ypos</key>
+ <real>10</real>
+ </dict>
+ <key>dash_keyword_crate</key>
+ <dict>
+ <key>ypos</key>
+ <integer>930</integer>
+ </dict>
+ <key>dash_keyword_hs</key>
+ <dict>
+ <key>ypos</key>
+ <integer>1050</integer>
+ </dict>
+ <key>dash_keyword_rb</key>
+ <dict>
+ <key>ypos</key>
+ <integer>1170</integer>
+ </dict>
+ <key>dash_keyword_rs</key>
+ <dict>
+ <key>ypos</key>
+ <integer>1290</integer>
+ </dict>
+ <key>dash_note_readme</key>
+ <dict>
+ <key>ypos</key>
+ <integer>690</integer>
+ </dict>
+ </dict>
+ <key>userconfigurationconfig</key>
+ <array>
+ <dict>
+ <key>config</key>
+ <dict>
+ <key>default</key>
+ <false/>
+ <key>required</key>
+ <false/>
+ <key>text</key>
+ <string>Results open in a new tab in Dash</string>
+ </dict>
+ <key>description</key>
+ <string></string>
+ <key>label</key>
+ <string>Open behavior</string>
+ <key>type</key>
+ <string>checkbox</string>
+ <key>variable</key>
+ <string>openInNewTab</string>
+ </dict>
+ </array>
+ <key>webaddress</key>
+ <string>kapeli.com</string>
+</dict>
+</plist>
diff --git a/macos/Dash.dashsync/Preferences.plist b/macos/Dash.dashsync/Preferences.plist
index 5ca1e12d..353608fe 100644
--- a/macos/Dash.dashsync/Preferences.plist
+++ b/macos/Dash.dashsync/Preferences.plist
@@ -90,6 +90,20 @@
<dict>
<key>installed</key>
<dict>
+ <key>color-eyre</key>
+ <dict>
+ <key>date</key>
+ <date>2026-01-29T14:59:00Z</date>
+ <key>entry</key>
+ <dict>
+ <key>name</key>
+ <string>color-eyre</string>
+ <key>platform</key>
+ <string>crate</string>
+ <key>uniqueIdentifier</key>
+ <string>color-eyre</string>
+ </dict>
+ </dict>
<key>xdg</key>
<dict>
<key>date</key>