"WFQuickActionSurfaces": [ "Services", "Finder" ], "WFWorkflowClientVersion": "4407", "WFWorkflowHasOutputFallback": false, "WFWorkflowHasShortcutInputVariables": true, "WFWorkflowIcon": { "WFWorkflowIconStartColor": -23508481, "WFWorkflowIconGlyphNumber": 61488 }, "WFWorkflowImportQuestions": [ { "ParameterKey": "WFFile", "Category": "Parameter", "ActionIndex": 13, "Text": "📁📁📁\n\nPick the Files/Finder folder you want to use as the SOURCE of screenshots when framing images via the Apple Frames API." }, { "ParameterKey": "WFFile", "Category": "Parameter", "ActionIndex": 16, "Text": "📁📁📁\n\nPick the folder you want to use as the DESTINATION of framed images when saving to Files or Finder." } ], "WFWorkflowInputContentItemClasses": [ "WFImageContentItem" ], "WFWorkflowMinimumClientVersion": 1106, (iOS 15) "WFWorkflowMinimumClientVersionString": "1106", "WFWorkflowOutputContentItemClasses": [ "WFImageContentItem", "WFDictionaryContentItem" ], "WFWorkflowTypes": [ "QuickActions", "ActionExtension", "WFWorkflowTypeShowInSearch", "WFWorkflowTypeReceivesInputFromSearch" ]
Add device frames to screenshots for iPhones (8/SE, 12-13, 15, 16, 17 generations in mini/standard/Plus/Pro/Pro Max sizes), iPhone Air, iPad Pro (11" and 12.9"/13", 2018-2025 models), iPad Air, iPad mini, iPad, Apple Watch Series 7/10/11, Apple Watch Ultra 2 and Ultra 3, iMac M4, Studio Display, Studio Display XDR, MacBook Air (2020/M5 13"/M5 15"), MacBook Pro (13"/M5 14"/M5 16"), and MacBook Neo. Apple Frames 4 supports colored device frames for iPhones 16 and 17, iPhone Air, MacBook Pro M5, MacBook Air M5, MacBook Neo, iMac M4, Studio Display, Studio Display XDR, Apple Watch Ultra, and Apple Watch Series 11. The shortcut supports portrait and landscape orientations but does not support Display Zoom; on iPadOS and macOS, the shortcut supports Default and More Space resolutions. When two device generations share the same screenshot resolution, Apple Frames offers the newer device frame by default with older models available as variants. If multiple screenshots are passed as input, they will be combined in a single image. The shortcut can be run in the Shortcuts app, as a Home Screen widget, as a Finder Quick Action, or via the share sheet. The shortcut also supports an API for automating input images, frame colors, and framed results.
Choose colors.
{ "Watch Ultra 3": [ "Black + Alpine Loop Black", "Black + Alpine Loop Light Blue", "Black + Milanese Loop", "Black + Ocean Band Anchor Blue", "Black + Ocean Band Black", "Black + Trail Loop Black Charcoal", "Natural + Alpine Loop Light Blue", "Natural + Alpine Loop Terra Cotta", "Natural + Milanese Loop", "Natural + Ocean Band Anchor Blue", "Natural + Ocean Band Neon Green", "Natural + Trail Loop Blue Bright Blue", "Natural + Trail Loop Green Neon" ], "MacBook Air M5 13": [ "Midnight", "Silver", "Sky Blue", "Starlight" ], "MacBook Air M5 15": [ "Midnight", "Silver", "Sky Blue", "Starlight" ], "iPhone 17 Pro Portrait": [ "Cosmic Orange", "Silver", "Deep Blue" ], "iPhone 17 Pro Landscape": [ "Cosmic Orange", "Deep Blue", "Silver" ], "iPhone 17 Pro Max Portrait": [ "Cosmic Orange", "Deep Blue", "Silver" ], "iPhone 17 Pro Max Landscape": [ "Cosmic Orange", "Deep Blue", "Silver" ], "iPhone 17 Portrait": [ "Black", "Lavender", "Mist Blue", "Sage", "White" ], "iPhone 17 Landscape": [ "Black", "Lavender", "Mist Blue", "Sage", "White" ], "iPhone Air Portrait": [ "Black", "White", "Gold", "Blue" ], "iPhone Air Landscape": [ "Black", "White", "Gold", "Blue" ], "MacBook Pro M5 14": [ "Space Black", "Silver" ], "MacBook Pro M5 16": [ "Silver", "Space Black" ], "MacBook Neo": [ "Blush", "Citrus", "Indigo", "Silver" ], "iMac M4": [ "Silver", "Blue", "Green", "Orange", "Pink", "Purple", "Yellow" ], "Studio Display": [ "Light", "Dark" ], "Studio Display XDR": [ "Light", "Dark" ], "iPhone 16 Pro Portrait": [ "Natural", "Desert", "Black", "White" ], "iPhone 16 Pro Landscape": [ "Natural", "Desert", "Black", "White" ], "iPhone 16 Pro Max Portrait": [ "White", "Desert", "Natural", "Black" ], "iPhone 16 Pro Max Landscape": [ "Black", "Desert", "Natural", "White" ], "iPhone 16 Portrait": [ "Ultramarine", "Teal", "Pink", "Black", "White" ], "iPhone 16 Landscape": [ "Ultramarine", "Teal", "Pink", "Black", "White" ], "iPhone 16 Plus Portrait": [ "Ultramarine", "White", "Teal", "Pink", "Black" ], "iPhone 16 Plus Landscape": [ "Ultramarine", "Teal", "Pink", "Black", "White" ], "Watch Ultra 2024": [ "Orange Beige Trail Loop", "Black + Trail Loop Green", "Natural + Titanium Milanese Loop", "Natural + Ocean Band Navy", "Black + Alpine Loop Tan", "Blue Alpine Loop", "Natural + Alpine Loop Tan", "Black + Ocean Band Ice Blue", "Black + Ocean Band Navy", "Black + Ocean Band Black", "Natural + Ocean Band Black", "Natural + Alpine Loop Dark Green", "Black + Alpine Loop Dark Green", "Natural + Trail Loop Black", "Natural + Ocean Band Ice Blue", "Natural + Alpine Loop Navy", "Orange Ocean Band", "Natural + Trail Loop Blue", "Black + Trail Loop Blue", "Black + Titanium Milanese Loop", "Black + Trail Loop Black", "Black + Alpine Loop Navy" ], "Watch Series 11 42": [ "Aluminum Jet Black + Sport Band Black", "Aluminum Jet Black + Sport Loop Dark Gray", "Aluminum Rose Gold + Sport Band Light Blush", "Aluminum Rose Gold + Sport Loop Purple Fog", "Aluminum Silver + Sport Band Neon Yellow", "Aluminum Silver + Sport Band Purple Fog", "Aluminum Silver + Sport Loop Forest", "Aluminum Silver + Sport Loop Neon Yellow", "Aluminum Space Gray + Sport Band Anchor Blue", "Aluminum Space Gray + Sport Band Black", "Aluminum Space Gray + Sport Loop Anchor Blue", "Aluminum Space Gray + Sport Loop Forest", "Titanium Gold + Magnetic Link Sage Gray", "Titanium Gold + Milanese Loop", "Titanium Gold + Sport Band Light Blush", "Titanium Gold + Sport Band Purple Fog", "Titanium Natural + Magnetic Link Caramel", "Titanium Natural + Milanese Loop", "Titanium Natural + Sport Band Stone Gray", "Titanium Slate + Magnetic Link Navy", "Titanium Slate + Milanese Loop", "Titanium Slate + Sport Band Black" ], "Watch Series 11 46": [ "Aluminum Jet Black + Sport Band Black", "Aluminum Jet Black + Sport Loop Dark Gray", "Aluminum Rose Gold + Sport Band Light Blush", "Aluminum Rose Gold + Sport Loop Purple Fog", "Aluminum Silver + Sport Band Neon Yellow", "Aluminum Silver + Sport Band Purple Fog", "Aluminum Silver + Sport Loop Forest", "Aluminum Silver + Sport Loop Neon Yellow", "Aluminum Space Gray + Sport Band Anchor Blue", "Aluminum Space Gray + Sport Band Black", "Aluminum Space Gray + Sport Loop Anchor Blue", "Aluminum Space Gray + Sport Loop Forest", "Titanium Gold + Magnetic Link Sage Gray", "Titanium Gold + Milanese Loop", "Titanium Gold + Sport Band Light Blush", "Titanium Gold + Sport Band Purple Fog", "Titanium Natural + Magnetic Link Caramel", "Titanium Natural + Milanese Loop", "Titanium Natural + Sport Band Stone Gray", "Titanium Slate + Magnetic Link Navy", "Titanium Slate + Milanese Loop", "Titanium Slate + Sport Band Black" ] }

Pick a variant for devices with the same resolution.
{ "iPhone 17 Portrait": [ "iPhone 17 Pro Portrait", "iPhone 16 Pro Portrait", "iPhone 17 Portrait" ], "iPhone 17 Landscape": [ "iPhone 17 Pro Landscape", "iPhone 17 Landscape", "iPhone 16 Pro Landscape" ], "iPhone 17 Pro Max Portrait": [ "iPhone 17 Pro Max Portrait", "iPhone 16 Pro Max Portrait" ], "iPhone 17 Pro Max Landscape": [ "iPhone 17 Pro Max Landscape", "iPhone 16 Pro Max Landscape" ], "iPhone 16 Portrait": [ "iPhone 16 Portrait", "iPhone 15 Pro Portrait" ], "iPhone 16 Landscape": [ "iPhone 16 Landscape", "iPhone 15 Pro Landscape" ], "iPhone 16 Plus Portrait": [ "iPhone 16 Plus Portrait", "iPhone 15 Pro Max Portrait" ], "iPhone 16 Plus Landscape": [ "iPhone 16 Plus Landscape", "iPhone 15 Pro Max Landscape" ], "MacBook Pro M5 14": [ "MacBook Pro M5 14", "MacBook Pro 2021 14" ], "MacBook Pro M5 16": [ "MacBook Pro M5 16", "MacBook Pro 2021 16" ], "MacBook Air M5 13": [ "MacBook Air M5 13", "MacBook Air 2022" ], "Studio Display": [ "Studio Display", "Studio Display XDR" ], "Watch Series 11 42": [ "Watch Series 11 42", "Watch Series 10 42" ], "Watch Series 11 46": [ "Watch Series 11 46", "Watch Series 10 46" ] }

Create a control variable that checks if the input is empty or not. We can use this to define how input is passed to the shortcut.
Next, check if the input contains an `&command` to skip the final list of actions. To do this, we're going to save this variable for later as a plain text string. Potential options: - quickLook - photos - quickSave - copy - airDrop - upload - passthrough

📁📁📁 Pick the Files/Finder folder you want to use as the SOURCE of screenshots when framing images via the Apple Frames API.

📁📁📁 Pick the folder you want to use as the DESTINATION of framed images when saving to Files or Finder.

4


The Oldest First setting controls whether you should see the latest or oldest screenshots first when the manual photo picker is presented.\u{space} Defaults to False, meaning that the latest screenshots will be shown in the photo picker instead. Change to True to make oldest screenshots appear first instead. Leave 'False' enabled to see your latest screenshots first. Change it to 'True' to see your oldest screenshots first instead.
{ "Oldest First": false }

The Merge Spacing variable controls the spacing between multiple framed images that should be merged together. Defaults to 60, but supports an override via the Frames API.
{ "mergeSpacing": 60 }


Override Merge Spacing variable with input data sent from the API in this format: +mergeSpacing(number)



A variable that controls whether multiple framed screenshots should be merged into a single one or not. By default, it is set to True, meaning that Apple Frames will merge multiple images into a single one.
{ "mergeImages": true }

The default is True. However, users can override this via shortcut input by using: +mergeImages=False
{ "mergeImages": false }

Create control variables for True and False for international users.
{ "True": true }

{ "False": false }

Start defining input types for Apple Frames. These are strings of text that are sent to Apple Frames using the 'Run Shortcut' action, and they tell Apple Frames where to get images from. They are a way to automate Apple Frames. Potential options: - clipboard: get an image from the system clipboard. - latest: get the latest screenshot. - number: pass a numeric value to the shortcut that tells it how many recent screenshots to retrieve. - capture: tell Apple Frames to capture a screenshot when it runs. Best used on macOS. - folder: pick all images from a specific folder in Finder or Files. - pick: pick images manually. This basic command is necessary if you want to use one of the &output modes later.
You passed the clipboard type to Apple Frames. This means you want to get an image from the clipboard.
(Image|Photo media)


MatchTextCaseSensitive
:
false


AlertActionCancelButtonShown
:
false
AlertActionMessage
:
There's no screenshot in your clipboard. Copy a screenshot and run Apple Frames again.
AlertActionTitle
:
❌ Error ❌
You passed the latest type to the Apple Frames API. This means you want to get the latest screenshot from the Photos app.








Create a numeric value that will be what we substract first from the repeat loop to get the last item from a list and then start proceeding in the opposite direction.

Flip the order of screenshots from newest to oldest so that oldest screenshots are on the left and newest on the right. This list needs to be reversed and re-saved.



The input command says to capture a screenshot immediately and frame it. This is best used on macOS.




SelectMultiple
:
true

Check the sorting order.
[Oldest First.Oldest First]

ContentItemSortProperty
:
Creation Date
ContentItemSortOrder
:
Latest First
ContentItemFilter
:
Is a Screenshot
ContentItemSortProperty
:
Creation Date
ContentItemSortOrder
:
Oldest First
ContentItemFilter
:
Is a Screenshot

ChooseFromListActionPrompt
:
Select Screenshots
ChooseFromListActionSelectMultiple
:
true


Folder
:
[Source Folder]

ContentItemSortProperty
:
Name
ContentItemSortOrder
:
A to Z


More input conditions here
Type contents of alerts below
It looks like the Frames folder for Apple Frames 4 is not installed on your device. You'll have to download this zipped folder ONCE for Apple Frames to work. Click OK and Shortcuts will download the zipped folder from MacStories.net and take care of installing it for you. (The download will take a few seconds.)

The Frames folder has been successfully saved in iCloud Drive/Shortcuts. There's nothing else you have to do now. Do NOT modify the contents of iCloud Drive/Shortcuts/Frames. In the future, to install new versions of Apple Frames, you may have to delete the Frames folder and download it again. But for now: welcome to Apple Frames, and enjoy. ☺️ - Federico

Start routine to check for JSON file
FileErrorIfNotFound
:
false


Frames.json file is not installed. It needs to be downloaded along with the entire folder.
AlertActionCancelButtonShown
:
false
AlertActionMessage
:
[Setup File Message]
AlertActionTitle
:
⚠️


Folder
:
{ "fileLocation": { "WFFileLocationType": "Shortcuts", "fileProviderDomainID": "com.apple.CloudDocs.MobileDocumentsFileProvider", "relativeSubpath": "", "appContainerBundleIdentifier": "com.apple.shortcuts", "crossDeviceItemID": "docs.icloud.com:iCloud.is.workflow.my.workflows/documents/1606a76f1c059bd4a79eae2e94fd0d390f0be810" }, "filename": "Documents", "displayName": "Shortcuts" }
AskWhereToSave
:
false
SaveFileOverwrite
:
true
FileDestinationPath
:
/Frames/
AlertActionCancelButtonShown
:
false
AlertActionMessage
:
[Thank You Message]
AlertActionTitle
:
\u{space}
FileErrorIfNotFound
:
false

There is already a Frames.json file. Now we need to check for the version.
File
:
{ "fileLocation": { "WFFileLocationType": "Shortcuts", "fileProviderDomainID": "com.apple.CloudDocs.MobileDocumentsFileProvider", "relativeSubpath": "", "appContainerBundleIdentifier": "com.apple.shortcuts", "crossDeviceItemID": "docs.icloud.com:iCloud.is.workflow.my.workflows/documents/1606a76f1c059bd4a79eae2e94fd0d390f0be810" }, "filename": "Documents", "displayName": "Shortcuts" }

[152 File]

NotificationActionSound
:
false


AskWhereToSave
:
false
SaveFileOverwrite
:
true
FileDestinationPath
:
/Frames/
AlertActionCancelButtonShown
:
false
AlertActionMessage
:
[Thank You Message]
AlertActionTitle
:
\u{space}
FileErrorIfNotFound
:
false

The user has the latest version of Frames installed. The shortcut can continue. The Frames Dictionary variable has already been set.
Check if the input has any value or not.

ConditionalActionString
:
Text
Check whether the user wants to see the latest or oldest screenshots first.
[Oldest First.Oldest First]

The user wants to see the latest screenshots first
ContentItemSortProperty
:
Creation Date
ContentItemSortOrder
:
Latest First
ContentItemFilter
:
Is a Screenshot
Oldest First is enabled
ContentItemFilter
:
Is a Screenshot
ContentItemSortOrder
:
Oldest First
ContentItemLimitNumber
:
100
ContentItemLimitEnabled
:
false
ContentItemSortProperty
:
Creation Date

ChooseFromListActionPrompt
:
Select Screenshots
ChooseFromListActionSelectMultiple
:
true


Start iterating over each image to frame it.

Set a screenshot variable for each pass of repeat loop and reset it every time.
Start checking device dimensions.


Screenshots matched; now we get the frame assets. Assets are fetched from a JSON file that uses the Width as main key for each device.


Check if this width overlaps with another device. If so, use the Height to disambiguate.



Check if we need to use a device variant.

There is a model variant.

[216 Item from List]

The user has selected a model variant. We need to reset the model name and get a new device dictionary.

There is a model variant, but the user has not selected it.
There are no model variants, move on.
Now we check the default color value for devices that support multiple colors. Then we set the Frame Asset.
The device supports multiple colors. Get the first item from the Frame Colors dictionary.



Yes


Check API commands for frame colors.
ConditionalActionString
:
+color=random



Color passed as name (e.g. Silver) or index number (e.g. 2). Extract the value after +color= and resolve to a color name.


Check if Color Input is a number or a name. - If numeric: get color at that 1-based index from Frame Colors for Model Name - If text: use Color Input directly as the color name - Result stored in Chosen Color, used to load the frame asset
Numeric index. Get the color at that position from Frame Colors.


Color name passed directly. Use as-is.

Colors not supported for this device model.
Check if the screenshot needs to be resized.
Screenshot needs to be resized.
ImageResizeWidth
:
[Device Dictionary as Dictionary.resizeWidth]

Let's check if the screenshot needs to be masked.

CustomMaskImage
:
[283 Mask]

Screenshot doesn't have to be masked.
Overlay screenshots and frames.
ShouldShowImageEditor
:
false
ImageX
:
[Device Dictionary as Dictionary.x]
OverlayImageOpacity
:
100
Rotation
:
0
ImageY
:
[Device Dictionary as Dictionary.y]
ImagePosition
:
Custom

OverlayImageOpacity
:
100
Rotation
:
0
ShouldShowImageEditor
:
false





If dealing with more than one device, combine them into a single image.

screenshots

Here we can add a check to see if we want to combine multiple images or not\u{space}
Check if the Merge Images variable is True
GetWebPageTitle
:
false






ImageResizeWidth
:
[321 Rounded Number]
This is such a weird bug. The Flip Image action behaves differently on Mac compared to iOS.


ImageCombineSpacing
:
[Merge Spacing]

The user does not want to merge multiple images
A single device was passed, no need to combine images.
screenshot

Strip metadata and rename. You have to add a repeat loop and reset the variable here

ImagePreserveMetadata
:
false

DateFormatStyle
:
Custom
DateFormat
:
EEEE, dd MMM yyyy HH:mm:ss


Final menu of actions for the framed images.

Framed [Framed Screenshots Count] [Noun]. Pick an action below.
Use the proper name for the filesystem based on user device
Finder

Files

Check the input command. Potential options: - quickLook - photos - quickSave - copy - airDrop - upload - passthrough

Folder
:
[Quick Save Folder]
AskWhereToSave
:
false
Input
:
[Framed Screenshots]
Put your own shortcut to upload images here.
Input
:
[Framed Screenshots]
Workflow
:
{ "workflowIdentifier": "53088819-147D-4D0A-B3F0-384EB6E6225A", "workflowName": "Upload Images", "isSelf": false }
Pass the framed screenshots along as output
More input commands here
No input command has been passed for the framed image. Thus, we need to bring up a list of actions to choose from manually.
MenuPrompt
:
[362 Menu Title]
MenuItems
:
[🌄 Save to Photos, "🔠 Rename and Save to [Filesystem App]", "📁 Quick Save to [Filesystem App]", 📋 Copy, 🔀 Copy as JPEG, ⬆️ Share, 📡 AirDrop, 👁 Preview with Quick Look, ☁️ Upload]
MenuLegacyCancelBehavior
:
true
MenuLegacyCancelBehavior
:
true
AskActionPrompt
:
Rename Your File


Folder
:
[Quick Save Folder]
AskWhereToSave
:
false
MenuLegacyCancelBehavior
:
true
ImageCompressionQuality
:
1
ImagePreserveMetadata
:
false

LocalOnly
:
false
Input
:
[Framed Screenshots]
MenuLegacyCancelBehavior
:
true
If you have a shortcut that uploads images to your server, this is where you can run that shortcut.
Input
:
[Framed Screenshots]
Workflow
:
{ "workflowIdentifier": "53088819-147D-4D0A-B3F0-384EB6E6225A", "workflowName": "Upload Images", "isSelf": false }
MenuLegacyCancelBehavior
:
true