Awesome-openclaw-skills shortcuts-generator
Generate macOS/iOS Shortcuts by creating plist files. Use when asked to create shortcuts, automate workflows, build .shortcut files, or generate Shortcuts plists. Covers 1,155 actions (427 WF*Actions + 728 AppIntents), variable references, and control flow.
install
source · Clone the upstream repo
git clone https://github.com/sundial-org/awesome-openclaw-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/shortcuts-generator" ~/.claude/skills/sundial-org-awesome-openclaw-skills-shortcuts-generator && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/shortcuts-generator" ~/.openclaw/skills/sundial-org-awesome-openclaw-skills-shortcuts-generator && rm -rf "$T"
manifest:
skills/shortcuts-generator/SKILL.mdsource content
macOS Shortcuts Generator
Generate valid
.shortcut files that can be signed and imported into Apple's Shortcuts app.
Quick Start
A shortcut is a binary plist with this structure:
<?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>WFWorkflowActions</key> <array> <!-- Actions go here --> </array> <key>WFWorkflowClientVersion</key> <string>2700.0.4</string> <key>WFWorkflowHasOutputFallback</key> <false/> <key>WFWorkflowIcon</key> <dict> <key>WFWorkflowIconGlyphNumber</key> <integer>59511</integer> <key>WFWorkflowIconStartColor</key> <integer>4282601983</integer> </dict> <key>WFWorkflowImportQuestions</key> <array/> <key>WFWorkflowMinimumClientVersion</key> <integer>900</integer> <key>WFWorkflowMinimumClientVersionString</key> <string>900</string> <key>WFWorkflowName</key> <string>My Shortcut</string> <key>WFWorkflowOutputContentItemClasses</key> <array/> <key>WFWorkflowTypes</key> <array/> </dict> </plist>
Minimal Hello World
<dict> <key>WFWorkflowActionIdentifier</key> <string>is.workflow.actions.gettext</string> <key>WFWorkflowActionParameters</key> <dict> <key>UUID</key> <string>A1B2C3D4-E5F6-7890-ABCD-EF1234567890</string> <key>WFTextActionText</key> <string>Hello World!</string> </dict> </dict> <dict> <key>WFWorkflowActionIdentifier</key> <string>is.workflow.actions.showresult</string> <key>WFWorkflowActionParameters</key> <dict> <key>Text</key> <dict> <key>Value</key> <dict> <key>attachmentsByRange</key> <dict> <key>{0, 1}</key> <dict> <key>OutputName</key> <string>Text</string> <key>OutputUUID</key> <string>A1B2C3D4-E5F6-7890-ABCD-EF1234567890</string> <key>Type</key> <string>ActionOutput</string> </dict> </dict> <key>string</key> <string></string> </dict> <key>WFSerializationType</key> <string>WFTextTokenString</string> </dict> </dict> </dict>
Core Concepts
1. Actions
Every action has:
- Identifier:
(e.g.,is.workflow.actions.<name>
)is.workflow.actions.showresult - Parameters: Action-specific configuration in
WFWorkflowActionParameters - UUID: Unique identifier for referencing this action's output
2. Variable References
To use output from a previous action:
- The source action needs a
parameterUUID - Reference it using
in anOutputUUID
dictionaryattachmentsByRange - Use
(U+FFFC) as placeholder in the string where the variable goes - Set
toWFSerializationTypeWFTextTokenString
3. Control Flow
Control flow actions (repeat, conditional, menu) use:
: UUID linking start/middle/end actionsGroupingIdentifier
: 0=start, 1=middle (else/case), 2=endWFControlFlowMode
Common Actions Quick Reference
| Action | Identifier | Key Parameters |
|---|---|---|
| Text | | |
| Show Result | | |
| Ask for Input | | , |
| Use AI Model | | , , |
| Comment | | |
| URL | | |
| Get Contents of URL | | , |
| Get Weather | | (none required) |
| Open App | | |
| Open URL | | |
| Alert | | , |
| Notification | | , |
| Set Variable | | , |
| Get Variable | | |
| Number | | |
| List | | |
| Dictionary | | |
| Repeat (count) | | , , |
| Repeat (each) | | , , |
| If/Otherwise | | , , , |
| Choose from Menu | | , , , |
| Find Photos | | (see FILTERS.md) |
| Delete Photos | | (NOT !) |
Detailed Reference Files
For complete documentation, see:
- PLIST_FORMAT.md - Complete plist structure
- ACTIONS.md - All 427 WF*Action identifiers and parameters
- APPINTENTS.md - All 728 AppIntent actions
- PARAMETER_TYPES.md - All parameter value types and serialization formats
- VARIABLES.md - Variable reference system
- CONTROL_FLOW.md - Repeat, Conditional, Menu patterns
- FILTERS.md - Content filters for Find/Filter actions (photos, files, etc.)
- EXAMPLES.md - Complete working examples
Signing Shortcuts
Shortcuts MUST be signed before they can be imported. Use the macOS
shortcuts CLI:
# Sign for anyone to use shortcuts sign --mode anyone --input MyShortcut.shortcut --output MyShortcut_signed.shortcut # Sign for people who know you shortcuts sign --mode people-who-know-me --input MyShortcut.shortcut --output MyShortcut_signed.shortcut
The signing process:
- Write your plist as XML to a
file.shortcut - Run
to add cryptographic signature (~19KB added)shortcuts sign - The signed file can be opened/imported into Shortcuts.app
Workflow for Creating Shortcuts
- Define actions - List what the shortcut should do
- Generate UUIDs - Each action that produces output needs a unique UUID
- Build action array - Create each action dictionary with identifier and parameters
- Wire variable references - Connect outputs to inputs using
OutputUUID - Wrap in plist - Add the root structure with icon, name, version
- Write to file - Save as
(XML plist format is fine).shortcut - Sign - Run
to make it importableshortcuts sign
Key Rules
- UUIDs must be uppercase:
A1B2C3D4-E5F6-7890-ABCD-EF1234567890 - WFControlFlowMode is an integer: Use
not<integer>0</integer><string>0</string> - Range keys use format:
- e.g.,{position, length}
for first character{0, 1} - The placeholder character:
(U+FFFC) marks where variables are inserted - Control flow needs matching ends: Every repeat/if/menu start needs an end action with same
GroupingIdentifier