{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-310", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/310", "wordCount": 1704, "segments": [{"start": 7.0, "text": "Hi!"}, {"start": 8.0, "text": "My name is Duraid and I'm a member of the Shortcuts team."}, {"start": 12.0, "text": "With Shortcuts, you can combine actions that you perform in your apps every day"}, {"start": 17.0, "text": "and quickly run them from different places across the system,"}, {"start": 21.0, "text": "like Siri,"}, {"start": 22.0, "text": "Control Center,"}, {"start": 24.0, "text": "Action Button,"}, {"start": 25.0, "text": "and more."}, {"start": 27.0, "text": "In this session, I'm going to share some exciting improvements coming to Shortcuts"}, {"start": 32.0, "text": "and how you can make your app's actions and content fit right in."}, {"start": 37.0, "text": "I'll start by going over updates to the way automations are set up,"}, {"start": 41.0, "text": "and a set of new automation types that are available."}, {"start": 44.0, "text": "Next, I'll go over the Use Model action and a new way to debug its behavior."}, {"start": 49.0, "text": "And finally, I'll cover storage, a feature that lets you persist"}, {"start": 53.0, "text": "data between runs of a shortcut."}, {"start": 56.0, "text": "Let's dive in!"}, {"start": 57.0, "text": "With automations, you can make your shortcuts run automatically in response to events,"}, {"start": 63.0, "text": "for example, here's a shortcut that runs every time I leave work."}, {"start": 67.0, "text": "It calculates my route home, and sends a message to my partner Helen"}, {"start": 71.0, "text": "with my estimated time of arrival."}, {"start": 75.0, "text": "Automations now live directly in the Shortcuts editor,"}, {"start": 77.0, "text": "alongside the actions that run in a shortcut"}, {"start": 80.0, "text": "and they're easier to set up than ever."}, {"start": 82.0, "text": "To browse them and add one to a shortcut, you can visit"}, {"start": 86.0, "text": "the \"Automation\" section in the editor."}, {"start": 89.0, "text": "In addition to the current set of automations,"}, {"start": 91.0, "text": "there are also three new types available:"}, {"start": 94.0, "text": "the screenshot automation, which runs when a screenshot is saved,"}, {"start": 98.0, "text": "the keyboard automation, which triggers when an external keyboard"}, {"start": 102.0, "text": "is connected or disconnected,"}, {"start": 104.0, "text": "and the notification automation, which runs when"}, {"start": 107.0, "text": "a notification is received from a specific app."}, {"start": 111.0, "text": "I'll dive into an example of how I can use the notification automation"}, {"start": 114.0, "text": "with an app I'm working on."}, {"start": 117.0, "text": "This is Soup Chef, an app that allows me to browse soups and order them for delivery."}, {"start": 123.0, "text": "When a soup delivery is close, my app sends a notification"}, {"start": 126.0, "text": "with the driver's name, and how soon to expect them."}, {"start": 130.0, "text": "I like to turn my porch lights on when I get that notification"}, {"start": 134.0, "text": "so the driver can find the door when it's late at night."}, {"start": 138.0, "text": "I'd love for that to happen automatically!"}, {"start": 141.0, "text": "To do this, I've created a shortcut that turns on my porch lights,"}, {"start": 145.0, "text": "and has my living room HomePod announce that my soup is about to arrive."}, {"start": 149.0, "text": "The notification automation is triggered when I receive"}, {"start": 152.0, "text": "a notification from the Soup Chef app."}, {"start": 155.0, "text": "I don't want it running for every notification from the app"}, {"start": 158.0, "text": "so I've added a filter for the word \"arriving.\""}, {"start": 161.0, "text": "That way, it only runs when the app is notifying me that my soup is arriving."}, {"start": 166.0, "text": "Now, my delivery person will always have a safe, well lit walk up to my front door."}, {"start": 174.0, "text": "This works well because my app provides a concise, informative notification."}, {"start": 179.0, "text": "The driver's name makes it distinct, the verb \"arriving\" makes it specific,"}, {"start": 184.0, "text": "and the time until arrival makes it actionable."}, {"start": 187.0, "text": "These details make the notification easy to parse and interpret within a shortcut."}, {"start": 194.0, "text": "If you follow the best practices for designing notifications"}, {"start": 197.0, "text": "in the Human Interface Guidelines,"}, {"start": 199.0, "text": "your users will be able to harness your notifications to build"}, {"start": 202.0, "text": "powerful automations like this one."}, {"start": 205.0, "text": "Next, I'll talk about the Use Model action."}, {"start": 208.0, "text": "The Use Model action lets you tap into the power of large language models,"}, {"start": 213.0, "text": "directly within your shortcuts."}, {"start": 215.0, "text": "Now, it's more powerful than ever."}, {"start": 218.0, "text": "With access to new, more capable Apple Intelligence models"}, {"start": 222.0, "text": "that have the ability to go out to the web for up-to-date information."}, {"start": 227.0, "text": "All of these models can work with content from your apps,"}, {"start": 230.0, "text": "like this example, where the action is able to find the events"}, {"start": 233.0, "text": "related to my upcoming trip to Montreal,"}, {"start": 236.0, "text": "when a large list of upcoming events is passed in."}, {"start": 239.0, "text": "Let's go back to the Soup Chef app."}, {"start": 242.0, "text": "I'd like to build a shortcut that picks a soup I'll like"}, {"start": 244.0, "text": "and lets me quickly order it."}, {"start": 246.0, "text": "I'll call it Soup of the Day."}, {"start": 250.0, "text": "To build this, my shortcut will need access to my app's soup data."}, {"start": 254.0, "text": "Using an EntityPropertyQuery in App Intents,"}, {"start": 258.0, "text": "I've already exposed a Find Soups action"}, {"start": 260.0, "text": "that fetches all soups from my app with the ability to filter"}, {"start": 263.0, "text": "to the ones available today."}, {"start": 266.0, "text": "I've also built an action called Order Soup,"}, {"start": 269.0, "text": "which takes a soup as a parameter, asks me to confirm, and places the order."}, {"start": 275.0, "text": "I'll start building my shortcut"}, {"start": 276.0, "text": "by stringing these together with the Use Model action."}, {"start": 281.0, "text": "This shortcut finds today's available soups, then uses a model to pick one"}, {"start": 285.0, "text": "that matches my spice level preference."}, {"start": 288.0, "text": "Let's run it!"}, {"start": 294.0, "text": "It picked a chicken tortilla soup."}, {"start": 296.0, "text": "But in Soup Chef, that's one of the milder options on the menu."}, {"start": 300.0, "text": "I'm looking for something spicier."}, {"start": 303.0, "text": "When a model produces a result you didn't expect, you might want to know exactly"}, {"start": 307.0, "text": "what the model saw, so you can understand what went wrong."}, {"start": 311.0, "text": "There's a way to do exactly that: you can now inspect the model transcript"}, {"start": 316.0, "text": "and see everything that was passed to the model, in its raw format."}, {"start": 320.0, "text": "I'll add a Show Content action right after the Use Model action."}, {"start": 324.0, "text": "Next, I'll select the Transcript property on its output in the Show Content action."}, {"start": 331.0, "text": "And now, when I run my shortcut, I can see the transcript."}, {"start": 337.0, "text": "Here, I can see the exact soup entities that were passed to the model"}, {"start": 342.0, "text": "and I can expand each one to understand exactly what the model saw."}, {"start": 347.0, "text": "Here is the structured representation of a Soup entity that was passed to the model."}, {"start": 352.0, "text": "And these are the properties exposed on that entity."}, {"start": 356.0, "text": "With just the name and availability,"}, {"start": 358.0, "text": "the model doesn't have enough to accurately judge spice level."}, {"start": 362.0, "text": "Adding an ingredients property, which lists each ingredient and its quantity,"}, {"start": 367.0, "text": "should give the model what it needs."}, {"start": 370.0, "text": "Let's add that."}, {"start": 372.0, "text": "Here's my SoupEntity."}, {"start": 374.0, "text": "It exposes properties for the name and availability of a given soup."}, {"start": 380.0, "text": "Let's add ingredients here as well"}, {"start": 382.0, "text": "as a simple array of strings."}, {"start": 386.0, "text": "Each string will contain an ingredient and its quantity per serving."}, {"start": 391.0, "text": "I've removed the \"Show Content\" action that was used to debug,"}, {"start": 395.0, "text": "and I'll try running the shortcut again with the change."}, {"start": 399.0, "text": "Now that the model has access to each soup's ingredients,"}, {"start": 402.0, "text": "it picked a Tom Yum soup that has some real heat!"}, {"start": 406.0, "text": "I think I'll order that one!"}, {"start": 409.0, "text": "For more on building App Intents for the Use Model action,"}, {"start": 412.0, "text": "check out"}, {"start": 413.0, "text": "\"Develop for Shortcuts and Spotlight with App Intents\" from WWDC25."}, {"start": 419.0, "text": "Finally, I'll talk about Storage!"}, {"start": 421.0, "text": "With Storage, you can now save content within a shortcut,"}, {"start": 425.0, "text": "to persist it between runs."}, {"start": 428.0, "text": "In the shortcuts editor, there's now a view that allows you to create, view,"}, {"start": 432.0, "text": "and edit the values that are stored in a shortcut."}, {"start": 435.0, "text": "You can also create a global value which is shared across multiple shortcuts."}, {"start": 440.0, "text": "This is useful for data you need to access in more than one shortcut, like an API key."}, {"start": 446.0, "text": "These three actions enable you to retrieve and update this data"}, {"start": 450.0, "text": "from within your shortcut,"}, {"start": 452.0, "text": "unlocking so many possibilities:"}, {"start": 454.0, "text": "from simple shortcuts that count or log items, like daily coffees,"}, {"start": 459.0, "text": "to advanced ones that track richer context across runs."}, {"start": 463.0, "text": "Let's take a look at how I can use storage to improve a shortcut I use every day."}, {"start": 469.0, "text": "I closely follow motor racing,"}, {"start": 471.0, "text": "and I have a shortcut that shows me a technical fact every morning!"}, {"start": 475.0, "text": "The Use Model action is designed to be deterministic"}, {"start": 479.0, "text": "which is great when you want predictable model output."}, {"start": 482.0, "text": "But for this shortcut, I want fresh facts every morning."}, {"start": 487.0, "text": "I can use the Storage actions to achieve this."}, {"start": 491.0, "text": "I'll start by retrieving a stored value that I'll name \"Previous Facts\"."}, {"start": 495.0, "text": "That'll be my list that contains every past fact."}, {"start": 500.0, "text": "Next, I'll pass it to the model, and ask the model"}, {"start": 503.0, "text": "to stay away from these previous facts."}, {"start": 506.0, "text": "Once the model responds with a fact,"}, {"start": 508.0, "text": "I'll use the \"Add to List\" action which outputs a list with the new fact appended."}, {"start": 514.0, "text": "I can use the setter action to store the new list."}, {"start": 518.0, "text": "Now, my shortcut will come up with something new every day!"}, {"start": 522.0, "text": "The great thing is that storage works with any type of data in Shortcuts,"}, {"start": 526.0, "text": "including App Entities."}, {"start": 528.0, "text": "Using Storage, I'd like to make a final improvement"}, {"start": 531.0, "text": "to my Soup of the Day shortcut."}, {"start": 533.0, "text": "I've noticed that when I run it, the model often picks the same"}, {"start": 536.0, "text": "soup several days in a row."}, {"start": 539.0, "text": "I want to give the model a memory of recent selections"}, {"start": 541.0, "text": "so it can pick a different one every day."}, {"start": 544.0, "text": "Just like my motor racing example, I'll use the Storage actions here."}, {"start": 549.0, "text": "With that, the Use Model action knows not to repeat past picks."}, {"start": 555.0, "text": "And now, once I've run the shortcut a few times, when I open the storage view"}, {"start": 560.0, "text": "there's a list of previous soups!"}, {"start": 562.0, "text": "I've been building and running this shortcut on my iPhone, but the great thing"}, {"start": 566.0, "text": "is its stored values sync across my devices, so if I'm using my iPad,"}, {"start": 571.0, "text": "I can run the shortcut there and it'll remember my past soups."}, {"start": 576.0, "text": "Because these values sync across devices, entities need a consistent identity"}, {"start": 580.0, "text": "across every device."}, {"start": 582.0, "text": "An entity saved on iPhone should be identified by your iPad or Mac app"}, {"start": 587.0, "text": "as the same entity."}, {"start": 589.0, "text": "For example, here's a simple shortcut that retrieves a stored soup"}, {"start": 593.0, "text": "and passes it into my \"Order Soup\" intent."}, {"start": 596.0, "text": "Since the stored value may have originated on a different device, the order intent"}, {"start": 601.0, "text": "needs to recognize the soup no matter which device originally stored it."}, {"start": 607.0, "text": "To make this work, I ensured my identifier comes from a source that produces"}, {"start": 611.0, "text": "the same value on every device, not one that varies per device."}, {"start": 616.0, "text": "My Soup app is backed by an online database of soups,"}, {"start": 619.0, "text": "so I use each soup's database row ID as its stable entity identifier."}, {"start": 625.0, "text": "So those are some of the new capabilities coming to Shortcuts!"}, {"start": 628.0, "text": "Next, try building shortcuts that integrate with your app"}, {"start": 631.0, "text": "to get a sense of what your users might want to automate."}, {"start": 635.0, "text": "Refine your notifications so your users can build powerful automations."}, {"start": 640.0, "text": "And finally, test your App Entities to make sure they play well"}, {"start": 644.0, "text": "with the Use Model action and Storage in Shortcuts."}, {"start": 648.0, "text": "\"Your soup is almost here.\""}, {"start": 650.0, "text": "Well, time to go pick up my soup!"}, {"start": 653.0, "text": "Thanks for joining me!"}]}