{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-252", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/252", "wordCount": 2789, "segments": [{"start": 7.0, "text": "Hi, my name is Saschka Unseld."}, {"start": 9.0, "text": "And I am a Creative Director at Apple."}, {"start": 13.0, "text": "Whenever I work on an idea"}, {"start": 14.0, "text": "it is really important to me"}, {"start": 16.0, "text": "that I can quickly mock it up"}, {"start": 18.0, "text": "and iterate on it"}, {"start": 19.0, "text": "again… and again… and again."}, {"start": 22.0, "text": "Reality Composer Pro 3 lets me do just that"}, {"start": 25.0, "text": "without writing a single line of code."}, {"start": 28.0, "text": "In this session I'll share how I build a RealityKit game from scratch"}, {"start": 33.0, "text": "in Reality Composer Pro 3's Script Graph."}, {"start": 37.0, "text": "If you want to get the basics first,"}, {"start": 39.0, "text": "there's a Reality Composer Pro 3 session just for you."}, {"start": 42.0, "text": "But if you're creative"}, {"start": 44.0, "text": "and find yourself with an idea you want to quickly mock up,"}, {"start": 48.0, "text": "this is the session for you."}, {"start": 51.0, "text": "I'll explain what a Script Graph is."}, {"start": 54.0, "text": "I'll show how I build my game."}, {"start": 56.0, "text": "And as I flesh it out.."}, {"start": 58.0, "text": "I'll dive deeper into some more advanced techniques."}, {"start": 62.0, "text": "Ok, Script Graph, what is it?"}, {"start": 65.0, "text": "It is Reality Composer Pro's Node-Based Visual Scripting."}, {"start": 71.0, "text": "A Script Graph lets me build games through Event Driven logic."}, {"start": 76.0, "text": "What does that mean?"}, {"start": 78.0, "text": "It means you can create games like this."}, {"start": 81.0, "text": "Here I listen to Pinch Events to animate these leaves to open and close."}, {"start": 86.0, "text": "I listen to Drag Gesture Events to let the player drag this nut around."}, {"start": 91.0, "text": "And I create custom events"}, {"start": 93.0, "text": "that tell the game to scroll the level"}, {"start": 95.0, "text": "when the character reaches certain waypoints."}, {"start": 99.0, "text": "But my favorite part of Script Graph"}, {"start": 101.0, "text": "is that I can directly test them and iterate on them"}, {"start": 104.0, "text": "in Reality Composer Pro"}, {"start": 106.0, "text": "and on my Vision Pro."}, {"start": 109.0, "text": "When I create something new,"}, {"start": 111.0, "text": "it always starts with a wish that something might exist"}, {"start": 115.0, "text": "and then I work on it until it does."}, {"start": 118.0, "text": "The wish for this game started with something small."}, {"start": 121.0, "text": "It started with…"}, {"start": 123.0, "text": "a little Squirrel."}, {"start": 125.0, "text": "It is blissfully asleep because it found a nut."}, {"start": 128.0, "text": "But the Squirrel forgot that night was about to fall."}, {"start": 131.0, "text": "So I wished that the player could help"}, {"start": 135.0, "text": "steal its nut"}, {"start": 137.0, "text": "but just to guide it back home."}, {"start": 139.0, "text": "And what better platform is there"}, {"start": 140.0, "text": "to steal a nut from a squirrel"}, {"start": 142.0, "text": "than Vision Pro."}, {"start": 144.0, "text": "The player will literally be able to reach out with their hand,"}, {"start": 148.0, "text": "steal the nut from the Squirrel"}, {"start": 150.0, "text": "and freely drag it around"}, {"start": 151.0, "text": "to help guide my little friend back home."}, {"start": 155.0, "text": "Let's start to build the game."}, {"start": 157.0, "text": "I want to allow the player"}, {"start": 159.0, "text": "to be able to pick up the Squirrel's nut"}, {"start": 161.0, "text": "and move it around."}, {"start": 163.0, "text": "I already created the scene with my Squirrel and Nut Entity."}, {"start": 167.0, "text": "I decided on a cut-out look"}, {"start": 170.0, "text": "so the Squirrel and the Nut"}, {"start": 171.0, "text": "are just simple planes with textures on them."}, {"start": 175.0, "text": "To make my nut draggable"}, {"start": 176.0, "text": "I add a few components to it."}, {"start": 179.0, "text": "To make it a gaze target"}, {"start": 181.0, "text": "I add an Input Target Component."}, {"start": 184.0, "text": "To define the size of the gaze target"}, {"start": 187.0, "text": "I add a Collision Component."}, {"start": 189.0, "text": "And since I also want it to highlight when the player gazes at it,"}, {"start": 193.0, "text": "I add a Hover Effect Component."}, {"start": 196.0, "text": "Now I'm ready to create my first Script Graph."}, {"start": 199.0, "text": "I right click in my Project Browser,"}, {"start": 202.0, "text": "select New,"}, {"start": 203.0, "text": "and then Script Graph."}, {"start": 206.0, "text": "This Script Graph is where I will create all my logic."}, {"start": 210.0, "text": "Let's call it dragNut."}, {"start": 213.0, "text": "I want the logic of my Script Graph to run on my Nut Entity"}, {"start": 217.0, "text": "so I add a Scripting Component to it"}, {"start": 221.0, "text": "and in the Inspector assign my dragNut Script Graph."}, {"start": 226.0, "text": "Wonderful."}, {"start": 228.0, "text": "Let's open my Script Graph and start to build some logic."}, {"start": 232.0, "text": "Any logic that a Script Graph runs"}, {"start": 234.0, "text": "starts with an event that triggers the logic."}, {"start": 239.0, "text": "There are many nodes that can listen to a whole range of events."}, {"start": 242.0, "text": "In my case I want to listen to the event of the player trying to pinch and drag the nut."}, {"start": 249.0, "text": "For this I utilize the \"On Drag\" Event node."}, {"start": 254.0, "text": "Now all I need to do"}, {"start": 255.0, "text": "is use the info I get from the On Drag node"}, {"start": 259.0, "text": "and apply it to the transform of my Nut Entity."}, {"start": 263.0, "text": "For this I use a Set node."}, {"start": 265.0, "text": "Set nodes are nodes that allow me to write data into components"}, {"start": 270.0, "text": "and loads of other things."}, {"start": 272.0, "text": "In my case I want to adjust the position of the Nut's transform component"}, {"start": 277.0, "text": "so I use a Set Transform node."}, {"start": 280.0, "text": "Now I just need to connect these two."}, {"start": 283.0, "text": "First I connect the On Drag Event to trigger the Set Transform node."}, {"start": 288.0, "text": "This means the Set Transform gets triggered"}, {"start": 291.0, "text": "every time the On Drag Event is triggered."}, {"start": 294.0, "text": "Next I connect the Scene Location that I get from the On Drag node"}, {"start": 299.0, "text": "to the Set Transform's translation input."}, {"start": 303.0, "text": "This way the position of my Nut will be set"}, {"start": 306.0, "text": "based on the drag transform I get from the drag gesture."}, {"start": 310.0, "text": "And that's it."}, {"start": 312.0, "text": "To me fast testing and iteration is key to all creative workflows."}, {"start": 317.0, "text": "And I can do this right in Reality Composer Pro 3."}, {"start": 321.0, "text": "I press the Play button at the top of my workspace"}, {"start": 325.0, "text": "and it allows me to test my logic right here in the viewport."}, {"start": 329.0, "text": "I can click and drag the Nut around just as I defined in my Script Graph."}, {"start": 335.0, "text": "But let's go one step further"}, {"start": 337.0, "text": "with Live preview,"}, {"start": 339.0, "text": "a feature that will be available later this year."}, {"start": 342.0, "text": "To truly know how an interaction feels"}, {"start": 346.0, "text": "I want to try it on my Vision Pro."}, {"start": 350.0, "text": "I switch the Simulation Mode to \"Preview on Device\","}, {"start": 354.0, "text": "select my Vision Pro,"}, {"start": 355.0, "text": "and press Play."}, {"start": 357.0, "text": "And Tada!"}, {"start": 359.0, "text": "My Squirrel and its Nut appear right next to me."}, {"start": 362.0, "text": "I can move the app around to place it nicely"}, {"start": 365.0, "text": "and I can press Play."}, {"start": 366.0, "text": "And now, I can look at the Nut, and tap to drag it."}, {"start": 371.0, "text": "Hmmm... I feel like I have to move my hand too much to drag the Nut around."}, {"start": 376.0, "text": "To do adjustments like this, I love to bring up my Mac Virtual Display"}, {"start": 381.0, "text": "so I can directly see my adjustments."}, {"start": 384.0, "text": "There's tons of nodes that allow me to apply math and logic to my Script Graphs."}, {"start": 388.0, "text": "To fix the jumping at the start"}, {"start": 390.0, "text": "and to get the Nut to be more responsive to my drag"}, {"start": 394.0, "text": "I'll use the On Drag's Scene Translation with a \"Multiply by Number\" node."}, {"start": 400.0, "text": "I know I will want to noodle around with the multiplication factor."}, {"start": 404.0, "text": "To do this I'll create an Input variable."}, {"start": 407.0, "text": "I add one in the Inspector of my Script Graph."}, {"start": 411.0, "text": "Let's call it dragSpeed,"}, {"start": 413.0, "text": "make it of type number,"}, {"start": 416.0, "text": "set it to public, and give it a default 1.3."}, {"start": 422.0, "text": "Then I add an Input node"}, {"start": 424.0, "text": "and plug the dragSpeed variable into the multiply node."}, {"start": 429.0, "text": "Since I set dragSpeed to be a public variable,"}, {"start": 432.0, "text": "it shows up in my Nut's Scripting Component."}, {"start": 434.0, "text": "Which means that I can,"}, {"start": 437.0, "text": "while testing it all on my Vision Pro,"}, {"start": 439.0, "text": "adjust my dragSpeed to find just the right value."}, {"start": 443.0, "text": "1.5?"}, {"start": 446.0, "text": "Nah… too much…"}, {"start": 449.0, "text": "Maybe 1.1…"}, {"start": 454.0, "text": "Nearly there…"}, {"start": 457.0, "text": "1.15..."}, {"start": 462.0, "text": "Yeah. I think that's it."}, {"start": 465.0, "text": "One more thing…"}, {"start": 466.0, "text": "When I changed the dragSpeed value, its name shifted to be shown in bold."}, {"start": 472.0, "text": "This means my dragSpeed value is not applied to the script itself,"}, {"start": 477.0, "text": "but as an Override."}, {"start": 479.0, "text": "Overrides are unique variations of a variable"}, {"start": 482.0, "text": "that are unique to each Scripting Component."}, {"start": 485.0, "text": "This means I can have multiple Nuts in my scene"}, {"start": 489.0, "text": "and, while they share the same Script Graph logic,"}, {"start": 492.0, "text": "can use different dragSpeed settings."}, {"start": 497.0, "text": "I love to iterate like this on how my interactions feel."}, {"start": 500.0, "text": "But to be honest, that movement still felt a bit bland."}, {"start": 504.0, "text": "I want the Nut to feel more dynamic"}, {"start": 506.0, "text": "and most of all I want to be able to toss it around."}, {"start": 511.0, "text": "To achieve this, let's add some physics."}, {"start": 514.0, "text": "First I need to make the Nut be part of the physics simulation."}, {"start": 518.0, "text": "So I add a Physics Body Component to it."}, {"start": 522.0, "text": "Now I need to change my Script Graph"}, {"start": 524.0, "text": "so that my drag gesture drives the Nut's physics."}, {"start": 528.0, "text": "I can do this with the Add Force node."}, {"start": 532.0, "text": "This node adds a force to the Nut's physics simulation"}, {"start": 535.0, "text": "which makes the Nut move in the direction of the force."}, {"start": 539.0, "text": "But this is an additive force,"}, {"start": 541.0, "text": "so I need to know how much my drag changes over time."}, {"start": 545.0, "text": "This is not data I get by default from the drag gesture."}, {"start": 548.0, "text": "So let's add it."}, {"start": 551.0, "text": "Instead of directly applying the drag's translation, I am going to store it."}, {"start": 556.0, "text": "To do this I created a variable called targetPosition"}, {"start": 559.0, "text": "and then use a Set Variable node"}, {"start": 562.0, "text": "to store the drag's translation into it."}, {"start": 566.0, "text": "Next I want to calculate how much the drag has changed."}, {"start": 570.0, "text": "All I need to do is subtract the position I got previously"}, {"start": 574.0, "text": "from the position I got currently."}, {"start": 577.0, "text": "I wired up this logic to calculate this change"}, {"start": 580.0, "text": "and store it in a variable I called dragDelta."}, {"start": 584.0, "text": "Now all I need to do is trigger the Add Force node,"}, {"start": 589.0, "text": "wire dragDelta"}, {"start": 590.0, "text": "via a little multiplication to give it more weight"}, {"start": 593.0, "text": "into the Add Force node."}, {"start": 596.0, "text": "Let's try it out to see how it behaves."}, {"start": 599.0, "text": "Well, I love that it feels more physical,"}, {"start": 601.0, "text": "and that I can toss the Nut around and it falls down."}, {"start": 604.0, "text": "But it's kinda hard to lift it up."}, {"start": 607.0, "text": "That's cause gravity is a constant drag in life,"}, {"start": 610.0, "text": "it pulls you down."}, {"start": 611.0, "text": "So let's turn it off while I hold the Nut."}, {"start": 615.0, "text": "To do this I will use another Set node,"}, {"start": 618.0, "text": "the Set PhysicsBodyComponent node."}, {"start": 621.0, "text": "This node allows me to change the settings"}, {"start": 623.0, "text": "of my PhysicsBodyComponent dynamically."}, {"start": 627.0, "text": "In my case I want to not have the Nut be affected by gravity"}, {"start": 631.0, "text": "while it is dragged."}, {"start": 633.0, "text": "And I want it to be less finicky when dragging it."}, {"start": 636.0, "text": "To do that I'll raise its linear damping value."}, {"start": 640.0, "text": "This will add more friction and will make it slow down faster."}, {"start": 646.0, "text": "I added some logic to my Script Graph that triggers this change"}, {"start": 649.0, "text": "in the PhysicsBodyComponent"}, {"start": 651.0, "text": "when the Nut gets picked up and when it gets dropped."}, {"start": 655.0, "text": "Let's test it out."}, {"start": 658.0, "text": "Oh, perfect, this feels so much nicer."}, {"start": 661.0, "text": "And that's the basics of Script Graph."}, {"start": 663.0, "text": "They listen to event nodes,"}, {"start": 665.0, "text": "do some logic with the data they get from them,"}, {"start": 668.0, "text": "and then utilize set nodes to modify components."}, {"start": 672.0, "text": "But with that basic idea I can do so much."}, {"start": 676.0, "text": "Let's dive into some more advanced techniques."}, {"start": 679.0, "text": "Like a lot of things in life,"}, {"start": 681.0, "text": "over time things have a tendency to get complicated."}, {"start": 685.0, "text": "And there's one thing I love nearly as much as creative work."}, {"start": 689.0, "text": "It's getting things organized."}, {"start": 692.0, "text": "That's where Prototyped Subgraphs come in."}, {"start": 695.0, "text": "They can not only help me clean up my logic"}, {"start": 698.0, "text": "but also create reusable logic."}, {"start": 701.0, "text": "Let's look at this piece of Script Graph I built earlier."}, {"start": 705.0, "text": "All this does"}, {"start": 706.0, "text": "is that it checks if the isEnd bool of my Drag Event has just changed"}, {"start": 712.0, "text": "and if it does, trigger some logic."}, {"start": 716.0, "text": "But when I look at it I'm like… Whaaaaaat does this do again?"}, {"start": 720.0, "text": "So let's clean it up with the Subgraph."}, {"start": 723.0, "text": "I select all the nodes that make up this part of my logic,"}, {"start": 726.0, "text": "right click,"}, {"start": 727.0, "text": "and select Compose Subgraph."}, {"start": 730.0, "text": "I'll call this one Check for Change."}, {"start": 734.0, "text": "Ahhhh… This looks so much less complicated already."}, {"start": 738.0, "text": "Wait a second…"}, {"start": 739.0, "text": "Triggering things when a bool variable changes is something I need all the time."}, {"start": 746.0, "text": "That's where Prototyped Subgraphs come in."}, {"start": 749.0, "text": "They allow me to reuse my Subgraphs in all my Scripts."}, {"start": 754.0, "text": "And making one is easy as pie."}, {"start": 756.0, "text": "I just right click and select Convert to Prototyped Subgraph..."}, {"start": 761.0, "text": "It will show up in my asset browser."}, {"start": 765.0, "text": "And from now on I see my Subgraph alongside all the other nodes in the add node menu."}, {"start": 771.0, "text": "Building reusable pieces of logic like this"}, {"start": 774.0, "text": "allows me to speed up my workflow"}, {"start": 777.0, "text": "and keep my logic streamlined."}, {"start": 780.0, "text": "Ok, back to my Squirrel."}, {"start": 783.0, "text": "Right now, if I steal the Squirrel's Nut,"}, {"start": 785.0, "text": "the Squirrel doesn't react at all."}, {"start": 788.0, "text": "That's doesn't feel right. Let's fix it."}, {"start": 791.0, "text": "I want the Squirrel to look at the Nut when I drag it around."}, {"start": 796.0, "text": "To do this I'll give the Squirrel its own Script Graph."}, {"start": 800.0, "text": "But how will it know that the Nut is being dragged around?"}, {"start": 804.0, "text": "I can create my own Custom Event for it."}, {"start": 807.0, "text": "And for that, I need a Custom Node Library."}, {"start": 811.0, "text": "I can create one right here in my Project Browser."}, {"start": 815.0, "text": "And in it, add a Custom Event."}, {"start": 819.0, "text": "Let's call it \"nutIsDragged\"."}, {"start": 822.0, "text": "In order for the Squirrel to know where the Nut is"}, {"start": 825.0, "text": "I want to send the Nut's position with the Event."}, {"start": 829.0, "text": "For that I add a property to my Custom Event."}, {"start": 833.0, "text": "Let's call it nutPosition."}, {"start": 835.0, "text": "The only thing I have to do now is click Sync Nodes"}, {"start": 839.0, "text": "so my custom node is being made available."}, {"start": 843.0, "text": "What I want now is"}, {"start": 844.0, "text": "to have the Script Graph on my Nut send this Event"}, {"start": 848.0, "text": "to a Script Graph on my Squirrel."}, {"start": 851.0, "text": "Since I added it to my Node Library,"}, {"start": 854.0, "text": "the Send \"nutIsDragged\" node"}, {"start": 856.0, "text": "is available alongside all the other nodes."}, {"start": 860.0, "text": "I wire it up to be triggered when the Nut is dragged"}, {"start": 863.0, "text": "and pass along the Nut's world position."}, {"start": 867.0, "text": "And in the Squirrel's Script Graph"}, {"start": 869.0, "text": "I create an On \"nutIsDragged\" Event"}, {"start": 873.0, "text": "so I can listen to it."}, {"start": 876.0, "text": "Then I use the nutPosition of the Event to drive the Squirrel's rotation."}, {"start": 882.0, "text": "Let me check how this feels in my Vision Pro."}, {"start": 886.0, "text": "Wonderful."}, {"start": 887.0, "text": "The logic I added gives the Squirrel a nice snappy flip when looking at the Nut."}, {"start": 893.0, "text": "This underscores the game's cut-out design and just makes it more fun."}, {"start": 897.0, "text": "Oh and yea, I snuck in another small thing."}, {"start": 900.0, "text": "When I steal the Nut, the Squirrel now looks appropriately upset."}, {"start": 904.0, "text": "It was an easy addition."}, {"start": 906.0, "text": "Where I drive a change in the Squirrel's Material from my Script Graph."}, {"start": 912.0, "text": "In the Shader Graph of my Squirrel's Material"}, {"start": 915.0, "text": "I use a public input variable I called isNutDragged."}, {"start": 919.0, "text": "And I use it to decide"}, {"start": 921.0, "text": "which one of my two Squirrel textures to use in the Material."}, {"start": 926.0, "text": "In my Squirrel's Script Graph"}, {"start": 929.0, "text": "I added a Set Material Parameter node,"}, {"start": 932.0, "text": "set the Parameter to type Bool,"}, {"start": 935.0, "text": "and called it isNutDragged."}, {"start": 939.0, "text": "I then told it where to find the Entity"}, {"start": 941.0, "text": "that has the Squirrel's Model Component,"}, {"start": 944.0, "text": "made sure it gets triggered,"}, {"start": 947.0, "text": "and told if the Nut is dragged or not dragged."}, {"start": 951.0, "text": "And that was it."}, {"start": 953.0, "text": "To really have my Squirrel express its disagreement though"}, {"start": 956.0, "text": "I want to give it a voice so it can properly complain."}, {"start": 960.0, "text": "Sticking with my cut-out style,"}, {"start": 961.0, "text": "I want that voice to be a Speech Bubble."}, {"start": 964.0, "text": "I love using SwiftUI for interfaces like this,"}, {"start": 968.0, "text": "it makes it effortless and they look beautiful."}, {"start": 972.0, "text": "But to use SwiftUI I need to run my game via Xcode."}, {"start": 976.0, "text": "Easy… I just switch preview mode to \"Run with Xcode\"."}, {"start": 980.0, "text": "But wait… I don't have an Xcode project…"}, {"start": 983.0, "text": "No problem."}, {"start": 984.0, "text": "Reality Composer Pro 3 can just create one for me."}, {"start": 988.0, "text": "Over in Xcode I made this little SwiftUI Speech Bubble."}, {"start": 993.0, "text": "But how do I get it to pop up"}, {"start": 994.0, "text": "when I steal the Squirrel's Nut?"}, {"start": 997.0, "text": "Again… Script Graph Events are there for me."}, {"start": 1001.0, "text": "Because they can also be listen to"}, {"start": 1003.0, "text": "and send from Swift."}, {"start": 1006.0, "text": "All I need to do in my Script Graph"}, {"start": 1008.0, "text": "is use a Send Scene Event node,"}, {"start": 1012.0, "text": "let's call it squirrelTalk,"}, {"start": 1014.0, "text": "and since I want to send over what the Squirrel should say,"}, {"start": 1018.0, "text": "I add a variable to it."}, {"start": 1021.0, "text": "Call it sayThis,"}, {"start": 1023.0, "text": "set it to type String,"}, {"start": 1025.0, "text": "and set it to what I want Squirrel to say."}, {"start": 1028.0, "text": "For example: \"Hey, that's my nut!\""}, {"start": 1032.0, "text": "Then in Xcode I needed to write some code."}, {"start": 1035.0, "text": "As a designer,"}, {"start": 1036.0, "text": "I love that I can now simply prompt Coding Intelligence"}, {"start": 1039.0, "text": "to write this code for me."}, {"start": 1042.0, "text": "To listen to my Scene Event all I needed to do was tell my coding assistant"}, {"start": 1047.0, "text": "to subscribe to my Scene Event called squirrelTalk"}, {"start": 1051.0, "text": "and to store its sayThis variable."}, {"start": 1055.0, "text": "And then, when squirrelTalk is called,"}, {"start": 1058.0, "text": "show my SwiftUI Speech Bubble"}, {"start": 1060.0, "text": "as an Attachment over my Squirrel Entity"}, {"start": 1064.0, "text": "and of course use the sayThis variable as its text."}, {"start": 1070.0, "text": "Now my Squirrel can really let me know"}, {"start": 1072.0, "text": "what it thinks of me when I steal its nut."}, {"start": 1075.0, "text": "There's so many more things Script Graphs allow me to add to my game,"}, {"start": 1080.0, "text": "like letting the Squirrel walk and jump to get its nut back"}, {"start": 1084.0, "text": "and creating draggable leaves that allow my Squirrel"}, {"start": 1087.0, "text": "to traverse through a whole level."}, {"start": 1090.0, "text": "Or even a visionOS ornament that,"}, {"start": 1092.0, "text": "if I get stuck,"}, {"start": 1093.0, "text": "I can use to jump to any place in the level."}, {"start": 1096.0, "text": "So don't worry my little Squirrel."}, {"start": 1098.0, "text": "I'll get you back home."}, {"start": 1101.0, "text": "I love using Script Graphs like this."}, {"start": 1104.0, "text": "They help me sketch out my ideas,"}, {"start": 1106.0, "text": "noodle around on how to best steal nuts,"}, {"start": 1108.0, "text": "and most of all,"}, {"start": 1110.0, "text": "allow me to bring my wish to life."}, {"start": 1113.0, "text": "If you want to keep going, download Reality Composer Pro 3."}, {"start": 1117.0, "text": "Take a deep dive into advanced workflows"}, {"start": 1120.0, "text": "or check out the full Squirrel Sample Project"}, {"start": 1122.0, "text": "from the Apple Developer Website."}]}