skills$openclaw/shortcuts-generator
erik-agens7.3k

by erik-agens

shortcuts-generator – OpenClaw Skill

shortcuts-generator is an OpenClaw Skills integration for ai ml workflows. 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.

7.3k stars3.9k forksSecurity L1
Updated Feb 7, 2026Created Feb 7, 2026ai ml

Skill Snapshot

nameshortcuts-generator
descriptionGenerate 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. OpenClaw Skills integration.
ownererik-agens
repositoryerik-agens/shortcuts-skill
languageMarkdown
licenseMIT
topics
securityL1
installopenclaw add @erik-agens/shortcuts-skill
last updatedFeb 7, 2026

Maintainer

erik-agens

erik-agens

Maintains shortcuts-generator in the OpenClaw Skills directory.

View GitHub profile
File Explorer
10 files
.
_meta.json
290 B
ACTIONS.md
25.5 KB
APPINTENTS.md
11.6 KB
CONTROL_FLOW.md
11.9 KB
EXAMPLES.md
20.2 KB
FILTERS.md
8.7 KB
PARAMETER_TYPES.md
10.1 KB
PLIST_FORMAT.md
8.6 KB
SKILL.md
7.7 KB
VARIABLES.md
9.1 KB
SKILL.md

name: shortcuts-generator description: 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. allowed-tools: Write, Bash

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: is.workflow.actions.<name> (e.g., 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:

  1. The source action needs a UUID parameter
  2. Reference it using OutputUUID in an attachmentsByRange dictionary
  3. Use (U+FFFC) as placeholder in the string where the variable goes
  4. Set WFSerializationType to WFTextTokenString

3. Control Flow

Control flow actions (repeat, conditional, menu) use:

  • GroupingIdentifier: UUID linking start/middle/end actions
  • WFControlFlowMode: 0=start, 1=middle (else/case), 2=end

Common Actions Quick Reference

ActionIdentifierKey Parameters
Textis.workflow.actions.gettextWFTextActionText
Show Resultis.workflow.actions.showresultText
Ask for Inputis.workflow.actions.askWFAskActionPrompt, WFInputType
Use AI Modelis.workflow.actions.askllmWFLLMPrompt, WFLLMModel, WFGenerativeResultType
Commentis.workflow.actions.commentWFCommentActionText
URLis.workflow.actions.urlWFURLActionURL
Get Contents of URLis.workflow.actions.downloadurlWFURL, WFHTTPMethod
Get Weatheris.workflow.actions.weather.currentconditions(none required)
Open Appis.workflow.actions.openappWFAppIdentifier
Open URLis.workflow.actions.openurlWFInput
Alertis.workflow.actions.alertWFAlertActionTitle, WFAlertActionMessage
Notificationis.workflow.actions.notificationWFNotificationActionTitle, WFNotificationActionBody
Set Variableis.workflow.actions.setvariableWFVariableName, WFInput
Get Variableis.workflow.actions.getvariableWFVariable
Numberis.workflow.actions.numberWFNumberActionNumber
Listis.workflow.actions.listWFItems
Dictionaryis.workflow.actions.dictionaryWFItems
Repeat (count)is.workflow.actions.repeat.countWFRepeatCount, GroupingIdentifier, WFControlFlowMode
Repeat (each)is.workflow.actions.repeat.eachWFInput, GroupingIdentifier, WFControlFlowMode
If/Otherwiseis.workflow.actions.conditionalWFInput, WFCondition, GroupingIdentifier, WFControlFlowMode
Choose from Menuis.workflow.actions.choosefrommenuWFMenuPrompt, WFMenuItems, GroupingIdentifier, WFControlFlowMode
Find Photosis.workflow.actions.filter.photosWFContentItemFilter (see FILTERS.md)
Delete Photosis.workflow.actions.deletephotosphotos (NOT WFInput!)

Detailed Reference Files

For complete documentation, see:

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:

  1. Write your plist as XML to a .shortcut file
  2. Run shortcuts sign to add cryptographic signature (~19KB added)
  3. The signed file can be opened/imported into Shortcuts.app

Workflow for Creating Shortcuts

  1. Define actions - List what the shortcut should do
  2. Generate UUIDs - Each action that produces output needs a unique UUID
  3. Build action array - Create each action dictionary with identifier and parameters
  4. Wire variable references - Connect outputs to inputs using OutputUUID
  5. Wrap in plist - Add the root structure with icon, name, version
  6. Write to file - Save as .shortcut (XML plist format is fine)
  7. Sign - Run shortcuts sign to make it importable

Key Rules

  1. UUIDs must be uppercase: A1B2C3D4-E5F6-7890-ABCD-EF1234567890
  2. WFControlFlowMode is an integer: Use <integer>0</integer> not <string>0</string>
  3. Range keys use format: {position, length} - e.g., {0, 1} for first character
  4. The placeholder character: (U+FFFC) marks where variables are inserted
  5. Control flow needs matching ends: Every repeat/if/menu start needs an end action with same GroupingIdentifier
README.md

No README available.

Permissions & Security

Security level L1: Low-risk skills with minimal permissions. Review inputs and outputs before running in production.

Requirements

  • OpenClaw CLI installed and configured.
  • Language: Markdown
  • License: MIT
  • Topics:

FAQ

How do I install shortcuts-generator?

Run openclaw add @erik-agens/shortcuts-skill in your terminal. This installs shortcuts-generator into your OpenClaw Skills catalog.

Does this skill run locally or in the cloud?

OpenClaw Skills execute locally by default. Review the SKILL.md and permissions before running any skill.

Where can I verify the source code?

The source repository is available at https://github.com/openclaw/skills/tree/main/skills/erik-agens/shortcuts-skill. Review commits and README documentation before installing.