shortcuts-generator

v2026.09.24

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.

GitHub
Install command
npx skhub add sundial-org/shortcuts-generator
Markdown
SKILL.md

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
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

Not specified

Source path

skills/shortcuts-generator

Default branch

main

Latest commit

b80cde2

Tree SHA

fc3a971