"WFQuickActionSurfaces": [], "WFWorkflowClientVersion": "1146.16", "WFWorkflowHasOutputFallback": false, "WFWorkflowHasShortcutInputVariables": true, "WFWorkflowIcon": { "WFWorkflowIconStartColor": 463140863, "WFWorkflowIconGlyphNumber": 61488 }, "WFWorkflowImportQuestions": [ { "ParameterKey": "WFFolder", "Category": "Parameter", "ActionIndex": 7, "Text": "Pick the Files/Finder folder you want to use as the SOURCE of screenshots when framing images via the Apple Frames API." }, { "ParameterKey": "WFFolder", "Category": "Parameter", "ActionIndex": 10, "Text": "Pick the folder you want to use as the DESTINATION of framed images when saving to Files or Finder." } ], "WFWorkflowInputContentItemClasses": [ "WFImageContentItem" ], "WFWorkflowMinimumClientVersion": 1106, "WFWorkflowMinimumClientVersionString": "1106", "WFWorkflowOutputContentItemClasses": [], "WFWorkflowTypes": [ "ActionExtension", "QuickActions", "MenuBar" ]
Add device frames to screenshots for iPhones (11, 8/SE, and 12-13-14 generations in mini/standard/Plus/Pro Max sizes), iPad Pro (11" and 12.9", 2018-2022 models), iPad Air (10.9", 2020-2022 models), iPad mini (2021 model), Apple Watch S4/5/6/7/8/Ultra, iMac (24" model, 2021), MacBook Air (2020-2022 models), and MacBook Pro (2021 models). 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. 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 and framed results.
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
📁📁📁 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.
3.1
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 }
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.
AlertActionCancelButtonShown
false
AlertActionMessage
You're running this input command on macOS. Due to a macOS bug, Shortcuts is unable to successfully read the contents of the clipboard with this input command. The shortcut will continue, but you'll have to pick screenshots manually. We hope this bug will be fixed soon.
AlertActionTitle
⚠️ macOS Issue ⚠️
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.
The input command says to capture a screenshot immediately and frame it. This is best used on macOS.
ContentItemSortProperty
Name
ContentItemSortOrder
A to Z
More input conditions here
Type contents of alerts below
It looks like the Frames folder for Apple Frames 3.1 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 alomg 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
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" }
[101 File]
NotificationActionSound
false
NotificationActionBody
A newer version of Apple Frames assets has to be downloaded. This will only occur once.
AskWhereToSave
false
SaveFileOverwrite
true
FileDestinationPath
/Frames/
AlertActionCancelButtonShown
false
AlertActionMessage
[Thank You Message]
AlertActionTitle
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
ContentItemFilter
Is a Screenshot
ContentItemSortOrder
Latest First
ContentItemLimitNumber
100
ContentItemLimitEnabled
false
ContentItemSortProperty
Creation Date
ChooseFromListActionPrompt
Select Screenshots
ChooseFromListActionSelectMultiple
true
Set a screenshot variable for each pass of repeat loop and reset it every time
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
1242
NumberValue
1242
11 Pro Max frame
Check for Pro Max screenshot height. Width is the same as an 8 Plus
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
2688
NumberValue
2688
Otherwise it is an iPhone 8 Plus in portrait mode
ImageResizeWidth
1080
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
1125
NumberValue
1125
Pro portrait
Additional check to see we're not dealing with an iPhone 12 mini
It is an iPhone 12 mini in portrait
ImageResizeHeight
2340
ImageResizeWidth
1080
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
2688
NumberValue
2688
Pro Max landscape
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
2436
NumberValue
2436
iPhone 12-13 mini landscape
ImageResizeHeight
1080
ImageResizeWidth
2340
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
368
NumberValue
368
Apple Watch S4 44mm
ImageResizeWidth
368
ConditionalLegacyComparisonBehavior
true
ConditionalActionString
750
NumberValue
750
iPhone 8 and SE 2020
iPad Pro 12.9-inch (2018/2021 model landscape)
ConditionalActionString
2732
ConditionalLegacyComparisonBehavior
true
NumberValue
2732
iPad Pro 12.9-inch (2018/2020 model) portrait mode
ConditionalActionString
2048
ConditionalLegacyComparisonBehavior
true
NumberValue
2048
Additional check to make sure 6th gen iPad does not get matched here
It is not the base model iPad, so it's a 12.9" Pro in portrait
End of check for 6th gen iPad height
2021 iPad mini in portrait
ConditionalActionString
1488
ConditionalLegacyComparisonBehavior
true
NumberValue
2208
2021 iPad mini landscape
ConditionalActionString
2266
ConditionalLegacyComparisonBehavior
true
NumberValue
1334
Landscape iPad Pro 11" 2018
ConditionalActionString
2388
ConditionalLegacyComparisonBehavior
true
NumberValue
2388
iPad Pro 11" 2018 Portrait
ConditionalActionString
1668
ConditionalLegacyComparisonBehavior
true
NumberValue
1668
Apple Watch S4 40mm
ConditionalActionString
324
ConditionalLegacyComparisonBehavior
true
NumberValue
324
iPhone 11
iPhone 11 frame
iPhone 11 landscape
iPhone 11 landscape frame
iPhone 12-13 and 12-13 Pro
iPhone 12-13 and 12-13 Pro in landscape
iPhone 12-13 Pro Max in portrait
CustomMaskImage
[257 13 Pro Max Portrait Mask]
iPhone 12-13 Pro Max landscape
CustomMaskImage
[266 File]
iPad Air 2020 in landscape
iPad Air 2020 portrait
iMac 24" at default resolution
iPad base model 9th gen
2020 MacBook Air @ 2880px resolution
Resize screenshot to match frame
ImageResizeWidth
2560
Apple Watch S7 45mm
MBP 2021 14"
MBP 2021 16" at default resolution
iPad Pro 12.9" with More Space display scaling
ImageResizeHeight
2048
ImageResizeWidth
2732
iPhone 14 Pro Max, portrait mode. We need to mask the image, then overlay the first frame without Dynamic Island shown.
CustomMaskImage
[329 File]
ShouldShowImageEditor
false
ImageX
80
OverlayImageOpacity
100
Rotation
0
ImageY
70
ImagePosition
Custom
iPhone 14 Pro Max, landscape
CustomMaskImage
[341 File]
ShouldShowImageEditor
false
ImageX
70
OverlayImageOpacity
100
Rotation
0
ImageY
80
ImagePosition
Custom
Apple Watch Ultra, 2022
iPhone 14 Pro in portrait
CustomMaskImage
[358 File]
ShouldShowImageEditor
false
ImageX
80
OverlayImageOpacity
100
Rotation
0
ImageY
80
ImagePosition
Custom
iPhone 14 Pro in landscape
CustomMaskImage
[370 File]
ShouldShowImageEditor
false
ImageX
80
OverlayImageOpacity
100
Rotation
0
ImageY
80
ImagePosition
Custom
12.9” iPad Pro with more space, portrait mode
ImageResizeHeight
2732
ImageResizeWidth
2048
iPad Air M1 with More Space display setting in landscape
ImageResizeHeight
1640
ImageResizeWidth
2360
iPad Air M1 with More Space display setting in portrait
ImageResizeHeight
2360
ImageResizeWidth
1640
11” iPad Pro with display scaling enabled in landscape
ImageResizeHeight
1668
ImageResizeWidth
2388
11” iPad Pro with display scaling enabled in portrait
ImageResizeHeight
2388
ImageResizeWidth
1668
M1 MacBook Air with More Space resolution
Resize screenshot
ImageResizeWidth
2560
M2 MacBook Air with default resolution
ImageResizeHeight
1664
ImageResizeWidth
2560
M2 MacBook Air with More Space resolution
ImageResizeHeight
1664
ImageResizeWidth
2560
MBP 16" with More Space resolution
ImageResizeWidth
3456
iMac 24" at More Space resolution
ImageResizeWidth
4480
MBP 14" with More Space resolution
ImageResizeWidth
3024
Apple Watch S7/8 41mm
MacBook Pro 13"
iPhone 8 Plus in landscape
ImageResizeWidth
1920
More devices here
Screenshots from older devices and those with Dynamic Island use a different logic. Thus we need to have a condition here to check if there is a variable for frame without island.
OverlayImageOpacity
100
Rotation
0
ShouldShowImageEditor
false
Reset value of Frame No Island variable
ShouldShowImageEditor
false
ImageX
[Matched Device Dictionary as Dictionary.x]
OverlayImageOpacity
100
Rotation
0
ImageY
[Matched 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.
ConditionalLegacyComparisonBehavior
true
screenshots
Here we can add a check to see if we want to combine multiple images or not
Apparently the text value for a Boolean set to True is 'Yes'
ImageCombineSpacing
60
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
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 }
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
[577 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
MenuItemAttributedTitle
🔠 Rename and Save to [Filesystem App]
AskActionPrompt
Rename Your File
MenuItemAttributedTitle
📁 Quick Save to [Filesystem App]
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