MoE Code
개발자 도구
무료 · iPad용으로 디자인됨 · macOS용으로는 확인되지 않음
MoE Code adds additional useful actions to Apple's Shortcuts app.
After spending ~2 years developing ~40 distinct shortcuts (https://routinehub.co/user/mythofechelon) over ~650 versions and encountering all sorts of functionality gaps, I decided to develop and share my own native solutions.
These are currently as follows, and I'm happy to take suggestions!
• AI
◦ "Count Tokens For On-Device AI Model" (iOS 27+ only)
◦ "Is Apple Intelligence Functional?"
◦ "Is Apple Intelligence-Capable?"
◦ "Use On-Device AI Model (Extended)" (e.g., with images and files) (iOS 27+ only)
• Clipboard (arbitrary formats)
◦ "Get Clipboards"
◦ "Set Clipboards"
• Data: HTML
◦ "Convert HTML Tables To JSON"
◦ "Extract HTML Elements Using SwiftSoup"
• Data: JSON
◦ "Delete Nested Dictionary / JSON Object Key"
◦ "Pretty Print Dictionaries / JSON"
◦ "Set Nested Dictionary / JSON Object Value"
◦ "Transform List / Dictionaries / JSON Using JQ"
• Data: Lists
◦ "Add Value(s) To List / Merge Lists"
◦ "Convert JSON Array To Shortcuts List"
◦ "Convert String / Shortcuts List To JSON Array"
◦ "Get Items From List At Indexes (Values)"
◦ "Get Items From List At Indexes (Files)"
◦ "Get Value Position In List"
◦ "List Contains List?"
◦ "List Contains Value?"
◦ "Remove Value From List"
◦ "Sort Keys Of Dicts In List"
◦ "Subtract Lists"
• Data: Text
◦ "Extract Strings From Binary"
◦ "Multi Replace Text"
• Device
◦ "Get Device Ground Speed"
◦ "Get Device Model"
◦ "Get Device Type"
◦ "Is App Installed?"
• Files
◦ "Get Details of File / Folder"
◦ "Save Files"
• Media
◦ "Change Photos Items' Captions" (iOS 27+ only)
◦ "Change Photos Items' Creation Dates"
◦ "Change Photos Items' Locations"
◦ "Chunk Video"
◦ "Find Photos Items By Captions" (iOS 27+ only)
◦ "Get Details of Photos Items (Extended)" (iOS 27+ only)
◦ "Mark Photos Items As Favourited, Unfavourited, Or Hidden"
◦ "Play System Sound"
◦ "Remove Photos Items' Captions" (iOS 27+ only)
◦ "Remove Photos Items' Locations" (iOS 27+ only)
◦ "Resize Images With Fill (HDR)" (iOS 26+ only)
• Network
◦ "Get Certificate Chain"
◦ "Is Internet-Connected?"
◦ "Make HTTP Request"
• Settings
◦ "Get Reminders Default List"
◦ "Open Settings Deep Link"
• Shortcuts
◦ "Convert JSON To PLIST" (XML or Base64-encoded binary)
◦ "Convert PLIST Binary To JSON"
◦ "Extract Action Blocks"
◦ "Find Invalid Variable References"
• UI
◦ "Show Markdown"
• Widget
◦ "Delete Widget / Complication Key"
◦ "Get Widget / Complication Value"
◦ "Set Circular Widget / Complication Value"
◦ "Set Text Widget / Complication Value"
◦ "Sync And Reload App Widgets"
더 보기 Created:
• Action "Save Files".
• Action "Get Items From List At Indexes (Values)".
• Action "Get Items From List At Indexes (Files)".
Functional changes / improvements:
• Action "Multi Replace Text":
◦ Marked existing one as deprecated (necessary so not to disrupt current usage) and created new version that supports multiple strings to perform find-and-replaces on.
◦ Added parameter "Output List Type" and, following that one, "Pretty Print JSON" and "Correct Data Types".
• Action "Make HTTP Request": Added parameter "Timeout Throws Errors?" so they can be suppressed if you want to design your shortcut to retry.
Cosmetic changes / improvements:
• Action "Multi Replace Text": In the description, added guidance on how to prefix and suffix.
1.22.0 1시간 전
Created:
• [iOS 27+ only] Action "Get Details of Photos Items (Extended)".
• [iOS 27+ only] Action "Remove Photos Items' Captions".
• Action "Remove Photos Items' Locations".
• [iOS 27+ only] Action "Count Tokens For On-Device AI Model".
Functional changes / improvements:
• Action "Is App Installed?": Added new apps which are likely to be used in shortcuts:
◦ Microsoft Outlook
◦ Pythonista
◦ Scriptable
◦ WhatsApp
• Action "Change Photos Items' Locations": Marked existing one as deprecated (necessary so not to disrupt current usage) and created new version that supports setting multiple different locations.
• Action "Find Photos Items By Captions": Changed the output files' creation and modification dates and times to be the same as in Photos so that this data can be piped back into my actions.
• Action "Multi Replace Text": Disabled trimming of wrapping whitespace in string list inputs.
• Action "Change Photos Items' Captions": Added ability to re-use the existing caption in the new caption.
• Actions "Change Photos Items' Captions", "Change Photos Items' Creation Dates", "Change Photos Items' Locations", and "Mark Photos Items As Favourited, Unfavourited, Or Hidden":
◦ Added validation of the changes and changed the output to be a dictionary of this.
◦ Removed error throwing in favour of the above.
◦ Added handling of scenario where the given filenames and datetimes aren't strings.
• Action "Use On-Device AI Model (Extended)":
◦ Added parameters for maximum response tokens and temperature.
◦ Made parameter for images / files optional.
• Action "Pretty Print Dictionaries / JSON": Added parameter for output list type.
• Actions "Add Value(s) To List / Merge Lists", "Pretty Print Dictionaries", "Remove Value(s) From List", "Subtract Lists", "Transform JSON Using JQ": Integrated pretty print parameter into Shortcuts list output when data type correction is enabled.
• Actions that output a JSON string: Disabled escaping of forward slashes.
• Action "Find Invalid Variable References": Corrected index numbers from zero based to one based.
Failed changes:
• Tried to make an action to filter shortcut files, but it seems that iOS has to share each one every single time, so the performance was terrible. And the expected properties weren't available via IntentFile anyway.
Cosmetic changes / improvements:
• Action "Use On-Device AI Model (Extended)":
◦ Added information on input size limitations.
◦ Updated description to make clear that this is only available on iOS 27.
◦ Renamed from "Use AI Model With Images / Files".
• watchOS complications: Added guidance on how to see the data for always-on displays when the wrist is down.
• Action "Transform JSON / Lists Using JQ" descripton:
◦ Added guidance on using this to deduplicate lists.
◦ Removed now-redundant guidance on making the output compatible with list-related actions.
• Renamed actions:
◦ "Delete Nested Dictionary Key" → "Delete Nested Dictionary / JSON Object Key".
◦ "* Existing Images' / Videos*" → "* Photos Items' *".
◦ "Find Images / Videos By Captions" → "Find Photos Items By Captions".
◦ "Get File / Folder Properties" → "Get Details of File / Folder".
◦ "Mark Images / Videos As Favourited, Unfavourited, Or Hidden" → "Mark Photos Items As Favourited, Unfavourited, Or Hidden".
◦ "Transform JSON Using JQ" → "Transform List / Dictionaries / JSON Using JQ".
◦ "Use AI Model With Images / Files" → "Use On-Device AI Model (Extended)".
◦ "Pretty Print Dictionaries" → "Pretty Print Dictionaries / JSON".
• Renamed categories:
◦ "Data: Dictionaries" → "Data: JSON".
• Changed action categories:
◦ "Set Clipboards": None → "Clipboard".
◦ 13 actions (too long for App Store release notes): → "X Deprecated"
1.21.0 2일 전
Created:
• [iOS 27+ only] Action "Use AI Model With Images / Files".
• [iOS 27+ only] Action "Find Photos By Captions".
• Action "Is App Installed?"
Functional changes / improvements:
• Action "Change Existing Images' / Videos' Captions": Added support for supplying one caption for multiple PHAssets.
• Actions "Change Existing Images' / Videos' Captions", "Change Existing Images' / Videos' Creation Dates", "Change Existing Images' / Videos' Locations", and "Mark Images / Videos As Favourited, Unfavourited, Or Hidden":
◦ Added throwing of error if a mismatching number of filenames and timestamps are provided.
◦ Removed advice that input must be the output of a Photos action, as Shortcut Input can be used - all that matters is the data type.
◦ Added advice that an error will be thrown if an item fails.
Cosmetic changes / improvements:
• Actions "Is Apple Intelligence-Capable?" and "Is Apple Intelligence Functional?": Changed category from "Device" to "AI".
1.20.0 9월 17일
Created:
• [iOS 27+ only] Action "Change Existing Images' / Videos' Captions".
Functional changes / improvements:
• Action "Delete Nested Dictionary Key": Added parameter for pretty printing JSON.
Cosmetic changes / improvements:
• Lock screen widgets: Added guidance on how to see the data for always-on displays when the device is locked.
1.19.0 9월 15일
Created:
• Action "Get Clipboards".
• Action "Set Clipboards".
• Action "Convert JSON To PLIST" (XML or Base64-encoded binary).
Functional changes / improvements:
• Action "Transform JSON Using JQ": Marked existing one as deprecated (necessary so not to disrupt current usage, as the value parameter's data type needed to be changed) and created new version that supports Shortcuts lists of dictionaries.
• Action "Convert PLIST Binary To JSON":
◦ Added handling of backslashes in the Base64.
◦ Enabled pretty printing and key sorting by default.
Breaking:
• Action "Boolean": Removed, as I now have a native solution, this was very recent, and other apps had already done this.
Cosmetic changes / improvements::
• Action "Convert Action PLIST Binary To JSON": Renamed to "Convert PLIST Binary To JSON".
• Actions "Convert PLIST Binary To JSON" and "Extract Strings From Binary": Specified "Base64" in the parameter summary.
1.18.0 9월 9일
Created:
• Action "Subtract Lists".
• Action "Change Existing Images' / Videos' Locations".
• Action "Get Certificate Chain".
• Action "Boolean".
• Action "Pretty Print Dictionaries".
Functional changes / improvements:
• Action "Set Nested Dictionary Value": Marked existing one as deprecated (necessary so not to disrupt current usage, as the value parameter's data type needed to be changed) and created new version that supports setting a value that's an array of one item, unlike the native action which always unwraps in this scenario.
• Parameter "Correct Data Types": Fixed bug where this wouldn't happen if a list / array only contained one item.
• Action "Make HTTP Request": Corrected handling of scenario where a timeout has occurred but a custom timeout message hasn't been provided - the default error of "The request timed out" will now throw, rather than "(iOS_App.HTTPRequestError, 1)".
• Actions "Add Value(s) To List / Merge Lists", "Remove Value(s) From List", and "Transform JSON Using JQ": Fixed bug where JSON wouldn't be correctly serialised to string.
Cosmetic changes / improvements:
• Action "Change Images' / Videos' Creation Dates": Renamed to "Change Existing Images' / Videos' Creation Dates".
• Action "Make HTTP Request": Changed summary from "Request URL" to "Make HTTP request to URL".
Attempted changes:
• Actions "Is Internet-Connected?" and "Make HTTP Request": Attempted to add parameter to ignore TLS certificate failures but discovered that per-domain App Transport Security (ATS) exceptions are needed.
1.17.0 9월 2일
-Created-
• Action "Show Markdown".
• Action "Find Invalid Variable References".
-Functional changes-
• Action "Make HTTP Request": Added parameter for custom timeout message.
• Actions "Get Value Position In List", "List Contains Value(s)?", and "Remove Value(s) From List": Added specific handling for dictionaries so that key order doesn't matter.
• Action "Sort Keys Of Dicts In List": Added graceful handling (skipping) of an error scenario where the value that's meant to be a dict is malformed.
• Actions "Convert JSON Array To Shortcuts List" and "List Contains List?": Added parameter for correcting data types.
• Action "Extract Action Blocks": Added an error throw for if a +++ comment doesn't end with a label.
• Action "Set Circular Widget / Complication Value": Added trimming of SF symbol name.
• Action "Transform JSON Using JQ": Added parameters for output list type, pretty print, and correct data types.
• Action "Multi Replace Text": Split up parameter for delimiter into one for targets and one for substitutions.
• Data correction parameters: Expanded to convert full strings "true" and "false" to their literal Boolean equivalents.
• Below actions: Changed Shortcuts list output so that if correcting of data type is enabled then true and false will be converted to "Yes" and "No" respectively.
◦ "Add Value(s) To List / Merge Lists"
◦ "Remove Value(s) From List"
• Implemented improved / proper parsing of list parameters for the following actions, including allowing empty inputs more broadly and removing requirement for a string list delimiter. An unavoidable side effect of this is that parameters / variables need to be re-linked, so I chose to create new versions and mark the old ones as deprecated to be removed in the future, rather than break anything.
◦ "List Contains List?"
◦ "List Contains Value(s)?"
◦ "Convert String / Shortcuts List To JSON Array"
◦ "Add Value(s) To List / Merge Lists"
◦ "Remove Value(s) From List"
◦ "Sort Keys Of Dicts In List"
◦ "Get Value Position In List"
◦ "Multi Replace Text"
◦ "Extract Action Blocks"
◦ "Change Images' / Videos' Creation Dates"
◦ "Mark Photos / Videos"
• String-to-array conversions: Changed handling of no delimiter from throwing an error to returning the original string, as I've now removed a default from parameters, adding a default that's guaranteed to not appear in strings is difficult, and it should be obvious that the string hasn't been converted to an array.
• Action "Get Device Type": Tried to change output from string to an AppEnum of possible values to make it easier to use, but it was rejected as it contained product names. Instead, I tried to added a link to the documentation where the possible values can be found, but that was rejected too. So, it now just provides a relative link.
-Cosmetic changes / improvements-
• Action "Remove Value From List": Renamed to "Remove Value(s) From List"
• Action "List Contains Value?": Renamed to "List Contains Value(s)?"
• Category "Widget / Complication": Renamed to "Widgets / Complications"
• Action "Mark Photos / Videos": Renamed to "Mark Images / Videos As Favourited, Unfavourited, Or Hidden"
• Below actions: Changed parameter summary to be similar to the title.
◦ "List Contains Value(s)?"
◦ "Change Images' / Videos' Creation Dates"
◦ "Mark Images / Videos As Favourited, Unfavourited, Or Hidden"
1.16.1 8월 19일
Changes are in decreasing order of importance.
Removed:
• Action "Extract Strings From Binary To JSON Array", as superseded by new version of "Extract Strings From Binary".
Added:
• Action "Remove Value From List": Created.
• Action "Get File / Folder Properties": Created.
• Action "Open Settings Deep Link": Created.
• Action "Get Device Type": Created.
• Action "Extract Action Blocks": Created.
Changed:
• Action "Merge Lists":
◦ Fixed bug where, when filtering of duplicates was disabled, array add mode was always suffix.
◦ Fixed likely bug where, when filtering of duplicates was enabled and array add mode was set to prefix, order of added items would be reversed.
◦ Renamed to "Add Value(s) To List / Merge Lists".
◦ Reworded / cleaned up summary.
• Action "Extract Strings From Binary To Shortcuts List":
◦ Added parameter for output list type (as I figured out how to output either a Shortcuts-compatible list or a JSON array string, despite one AppIntent being limited to one output data type).
◦ Renamed to "Extract Strings From Binary".
• Action "Sort Keys Of Dicts In List": Added parameters for JSON array output.
• Action "Set Nested Dictionary Value": Added parameter for pretty printing JSON.
• Actions "Get Value Position In List" and "Merge Lists":
◦ Allowed list to be empty.
• Action "Get Value Position In List":
◦ Changed the auto linking from the list variable to the value variable.
◦ Reworded summary.
• Action "Extract HTML Elements": Renamed to "Extract HTML Elements Using SwiftSoup".
• Action "Resize With Fill (HDR)": Renamed to "Resize Image With Fill (HDR)"
• Various category changes.
1.15.0 8월 6일
Added:
• Action "Play System Sound": Created.
• Action "Change Images' / Videos' Creation Dates": Created.
• Actions "Convert String / Shortcuts List To JSON Array" and "Merge Lists": Added parameter for pretty print.
• Action "Merge Lists": Added "Shortcuts lists" to the summary to make it clear that it's supported.
Changed:
• Actions "Mark Photos / Videos" and "Change Images' / Videos' Creation Dates": Massively expanded supported list of datetime formats.
• Action "Make HTTP Request": Improved description for timeout parameter and enforced (AppIntent's) maximum of 30 seconds.
• Implemented named output variables, so they won't just be the action name.
• Split up data category.
• Action "Get Reminders Default List": Changed category from "Data" to new one "Settings". Also looked into whether there's a Swift API for setting the default Reminders list, but it seems that there is not.
1.14.0 8월 2일
Added:
• Action "Get Value Position In List": Created.
• Action "Convert JSON Array To Shortcuts List": Created.
• Action "Extract Strings From Binary To JSON Array": Created.
• Action "Convert Action PLIST Binary To JSON": Added parameters for whether to pretty print and sort keys.
Changed:
• Action "Resize With Fill (HDR)": Fixed bugs with HDR sometimes beind lost in auto gradient mode.
• All complications: Completely rearchitected the data flow so that iPhone actions are more likely to update the Watch complications much faster, whilst preserving eventual updates from iCloud KVS on other, non-paired devices. A side effect of this is that keys (max 1,024) are no longer deleted but marked as inactive.
• Action "Convert String List To JSON Array": Renamed to "Convert String / Shortcuts List To JSON Array" to make it clear that it can be used for this too.
• Actions "Convert String / Shortcuts List To JSON Array", "List Contains List?", "Mark Photos / Videos", "Merge Lists", "Multi Replace Text", and "Sort Keys Of Dicts In List": Improved parsing of JSON array strings, standardised stripping of certain wrapping characters, removed throwing of errors if the resulting array is empty for runtime reliability, and moved delimited out of action summary.
• Action "Extract Strings From Binary": Renamed to "Extract Strings From Binary To Shortcuts List"
• Actions "Extract Strings From Binary To JSON Array" and "Extract Strings From Binary To Shortcuts List": Added parameter "Output Maximum: Mode" for whether to output the first or last items if the max is hit.
• Action "Convert String / Shortcuts List To JSON Array": Added parameter for pretty print.
• Action "Get Widget / Complication Value": Made available on watchOS and changed behaviour for when a value isn't found from throwing an error to returning an empty string.
• Circular complications: Fixed opaque background not actually applying, and disabled by default.
• Home screen text widgets: Changed default font weight from medium to semibold.
• Action "Sync And Reload App Widgets": Renamed to include complications.
1.13.0 7월 27일
• Created new data actions:
= "Extract Strings From Binary"
= "Convert Action PLIST Binary To JSON"
• All widgets and complications and related actions:
= Implemented usage of WatchConnectivity so the iOS actions can get watchOS to request that it sync with iCloud KVS and reload the complications. This increases reliability, but it's still not guaranteed immediacy by any means.
= Adjusted code so that actions can have default values set for user reference, but they only take effect if the respective mode is "Shortcut-Set".
• Circular complication:
= Split colour parameter into separate ones for symbol and gauge.
= Made symbol name, symbol colour, and gauge colour set-able by the action.
• Action "Sync And Reload App Widgets": Made available on watchOS.
• Actions "Is Internet-Connected?", "Is Apple Intelligence-Capable?", and "Is Apple Intelligence Functional?": Changed summaries to make use of "Invert Output?"
1.12.0 7월 15일
• Action "Resize With Fill (HDR)": Fixed bug where gradient background would sometimes be pure white in the gallery view and transparent in full view.
• All widgets:
= Reconfigured so that on-tap URL can be set from the Shortcuts actions. The schema had to be changed for this, so the shortcut actions will need to be re-run once.
= Lowered default refresh period from 30 to 15 minutes.
• Home screen widgets: Added parameters for font weight and design.
• Circular complication: Added colour parameter (for symbol / icon and gauge).
1.11.0 7월 11일
• Created action "Multi Replace Text".
• Added watchOS complications / widgets. Updated related actions accordingly.
• Added circular widgets and complications and action "Set Circular Widget / Complication Value".
• Created action "Sync And Reload App Widgets".
• Split widgets into kinds for home screen and lock screen with slightly different parameters.
• For lock screen widgets:
= Added parameter "Opaque Background".
= For simple ones, added placeholder text.
= Added rounded edges for "accessoryRectangular".
= Added .privacySensitive() to prevent default values being displayed when the always-on display is active.
• For home screen widgets, changed defaults for custom colour scheme to white text on black background.
• For all widgets: Removed filtering out of default on-tap URL as it was confusing.
• Actions that use data type correction: Fixed potential bug with stripping of existing double quotation marks from strings.
• Lowered watchOS requirement for custom framework from 26.2 to 11.0 to be in line with the other watchOS targets.
• Updated SwiftSoup package from v2.13.0 to v2.13.6.
1.10.0 7월 9일
For widgets:
• Added parameter for refresh period. Useful for when values are set from other devices (which are then synced via iCloud).
• Added parameter for colour scheme, set to system by default so it uses light and dark mode.
• Added parameter for URL to open on tap, which can be used for running shortcuts and opening apps.
1.9.1 7월 4일
Added widgets.
Created actions:
• "Convert String List To JSON Array"
• "List Contains List?"
• "Merge Lists"
• "Get Reminders Default List"
• "Set Nested Dictionary Value"
• "Delete Nested Dictionary Key"
• "Set Widget Value"
• "Get Widget Value"
• "Delete Widget Key"
Modified actions:
• "Make HTTP Request": Removed special handling for Cloudflare error pages.
1.8.0 6월 30일
"Resize With Fill (HDR)":
• Fixed visible banding in gradient backgrounds for HDR images by avoiding 8-bit PNG/JPEG output and forcing HEIC/HEIF10.
"Make HTTP Request":
• Added detection and handling of Cloudflare error pages (which return the actual status code in the HTML).
• Reduced default timeout from 60 to 5 and added a test URL to the description.
• Disabled "Wait For Connectivity" by default.
• Documented output structure in description.
"Is Internet-Connected?", "Is Apple Intelligence Functional?", "Is Apple Intelligence-Capable?":
• Added parameters "Invert Output?", disabled by default to preserve current usage / functionality.
"Get Device Ground Speed":
• In advanced output, corrected unit key from "speed" to "distance".
• Updated description with information about reliability.
"Transform JSON Using JQ":
• Updated description clarifying advice around lists of items.
"Extract HTML Elements", "Transform JSON Using JQ":
• Updated descriptions with information about license location.
"Get Camera Settings":
• Tried to create this, but it turned out to not be possible to get things like the Exposure Value (EV) used by the actual Camera app, unfortunately.
1.7.0 5월 26일
"Extract HTML Elements":
Changed output from string to list.
Added parameter for method to use.
1.6.0 5월 11일
Created:
• Action "Save Files".
• Action "Get Items From List At Indexes (Values)".
• Action "Get Items From List At Indexes (Files)".
Functional changes / improvements:
• Action "Multi Replace Text":
◦ Marked existing one as deprecated (necessary so not to disrupt current usage) and created new version that supports multiple strings to perform find-and-replaces on.
◦ Added parameter "Output List Type" and, following that one, "Pretty Print JSON" and "Correct Data Types".
• Action "Make HTTP Request": Added parameter "Timeout Throws Errors?" so they can be suppressed if you want to design your shortcut to retry.
Cosmetic changes / improvements:
• Action "Multi Replace Text": In the description, added guidance on how to prefix and suffix.
더 보기 버전 1.22.0 1시간 전
데이터가 수집되지 않음 개발자가 이 앱에서 데이터를 수집하지 않습니다.