{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-375", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/375", "wordCount": 1729, "segments": [{"start": 7.0, "text": "Hi, I'm Antonio, an Engineer on the Image Playground team."}, {"start": 11.0, "text": "Today, I'll show you how to bring Image Playground into your app."}, {"start": 17.0, "text": "People have been creating images with Image Playground in Messages,"}, {"start": 21.0, "text": "Freeform, and in your apps."}, {"start": 24.0, "text": "They have been combining scenes,"}, {"start": 26.0, "text": "experimenting with different looks, and making things feel personal."}, {"start": 31.0, "text": "We are reimagining the experience with powerful image models at the core."}, {"start": 37.0, "text": "And now, it makes a real leap,"}, {"start": 40.0, "text": "with the ability to make high quality images in virtually any style,"}, {"start": 45.0, "text": "even photorealistic ones, that now look genuinely true to life."}, {"start": 51.0, "text": "The ImagePlayground framework brings that full experience,"}, {"start": 54.0, "text": "the same powerful models,"}, {"start": 56.0, "text": "the same styles,"}, {"start": 58.0, "text": "the same quality, directly into your app."}, {"start": 62.0, "text": "The Image Playground app is available on iOS, iPadOS, macOS, and visionOS."}, {"start": 69.0, "text": "It runs on devices with Apple Intelligence support,"}, {"start": 72.0, "text": "bringing the full power of generative models to your app."}, {"start": 77.0, "text": "Just like the Image Playground app,"}, {"start": 79.0, "text": "you can leverage ImagePlayground.framework APIs"}, {"start": 83.0, "text": "on the same platforms."}, {"start": 85.0, "text": "Let's walk through how you can add Image Playground to your app."}, {"start": 89.0, "text": "I'll start with capabilities,"}, {"start": 92.0, "text": "a look at what the image creation model can create."}, {"start": 96.0, "text": "Then I'll show you how to adopt Image Playground,"}, {"start": 100.0, "text": "how to present the sheet and seed it with context from your app."}, {"start": 105.0, "text": "After that, options, configuring size, aspect ratio, and style."}, {"start": 112.0, "text": "And finally, availability,"}, {"start": 115.0, "text": "making sure your app handles both supported"}, {"start": 118.0, "text": "and unsupported devices gracefully."}, {"start": 122.0, "text": "Before writing any code,"}, {"start": 123.0, "text": "let's look at what Image Playground can enable in your app."}, {"start": 127.0, "text": "Give the model a text description,"}, {"start": 129.0, "text": "and it creates a matching image."}, {"start": 132.0, "text": "You can be as specific or as open-ended as you like;"}, {"start": 136.0, "text": "\"a birthday celebration with dogs, balloons and confetti\""}, {"start": 141.0, "text": "or just \"celebration.\""}, {"start": 143.0, "text": "The model handles the rest."}, {"start": 146.0, "text": "The model can create images with people,"}, {"start": 149.0, "text": "including multiple people in a single scene."}, {"start": 152.0, "text": "With personalization enabled,"}, {"start": 154.0, "text": "users can bring in someone from their Photos library"}, {"start": 157.0, "text": "or simply describe an appearance using text."}, {"start": 161.0, "text": "The result is an image that feels personal."}, {"start": 164.0, "text": "You have a range of styles to work with."}, {"start": 167.0, "text": "You can ask for an image without specifying a style."}, {"start": 171.0, "text": "You can specify your desired style in text,"}, {"start": 174.0, "text": "such as by asking for an oil painting style."}, {"start": 178.0, "text": "Or use one of our presets."}, {"start": 181.0, "text": "Animation adds playful character."}, {"start": 184.0, "text": "Illustration gives a polished, editorial look."}, {"start": 189.0, "text": "Sketch creates a hand-drawn feel."}, {"start": 193.0, "text": "Genmoji is a style tuned for expressive,"}, {"start": 196.0, "text": "emoji-scale characters you can embed directly in text."}, {"start": 201.0, "text": "Image Playground supports multiple sizes and aspect ratios."}, {"start": 205.0, "text": "You can request a landscape image for a banner."}, {"start": 209.0, "text": "A portrait image for full screen on iPhone."}, {"start": 213.0, "text": "Or square for a thumbnail."}, {"start": 216.0, "text": "The model picks the closest supported resolution"}, {"start": 218.0, "text": "to the size you ask for."}, {"start": 220.0, "text": "All of this runs on Private Cloud Compute,"}, {"start": 224.0, "text": "Apple's privacy-preserving cloud infrastructure."}, {"start": 227.0, "text": "Your data is never stored or shared, even with Apple."}, {"start": 232.0, "text": "For a deeper look at how it works, check out"}, {"start": 235.0, "text": "\"Build with the new Apple Foundation Model on Private Cloud Compute\"."}, {"start": 241.0, "text": "Image Playground has a usage limit"}, {"start": 243.0, "text": "because it relies on powerful server models."}, {"start": 247.0, "text": "Increased access is available with most iCloud+ subscription plans."}, {"start": 252.0, "text": "And as the developer, none of this is your problem to solve."}, {"start": 257.0, "text": "There's no server to provision,"}, {"start": 259.0, "text": "no infrastructure to maintain."}, {"start": 262.0, "text": "The system manages usage limits on behalf of your users,"}, {"start": 266.0, "text": "you never need to build any usage-related UI."}, {"start": 270.0, "text": "You call the framework."}, {"start": 272.0, "text": "Apple handles the rest."}, {"start": 274.0, "text": "Moving the models to Private Cloud Compute also meant rethinking the API."}, {"start": 279.0, "text": "ImageCreator, the non-UI API for generating images"}, {"start": 283.0, "text": "directly in your code, is deprecated."}, {"start": 287.0, "text": "Everything is now available through a new API"}, {"start": 290.0, "text": "with greater image quality, built-in privacy,"}, {"start": 293.0, "text": "and a full experience people already know how to use."}, {"start": 297.0, "text": "If your app uses ImageCreator today, keep watching."}, {"start": 301.0, "text": "So now let us look at how to add Image Playground to your app."}, {"start": 307.0, "text": "To show you how this comes together in code,"}, {"start": 309.0, "text": "I've been building Postcards, a greeting card creator."}, {"start": 313.0, "text": "With Postcards, you can design custom cards,"}, {"start": 317.0, "text": "write a personal message, and choose a layout."}, {"start": 321.0, "text": "The last piece is custom artwork for the front of each card."}, {"start": 325.0, "text": "That's where Image Playground comes in."}, {"start": 328.0, "text": "Adopting Image Playground starts with one view modifier."}, {"start": 332.0, "text": "No SDK initialization, no API keys, no server endpoints, just the modifier."}, {"start": 339.0, "text": "I add .imagePlaygroundSheet to my button with a binding to a @State boolean."}, {"start": 346.0, "text": "When the binding flips to true, the sheet appears."}, {"start": 349.0, "text": "Image Playground handles everything,"}, {"start": 352.0, "text": "the UI, the model interaction, the style picker."}, {"start": 357.0, "text": "When someone accepts an image,"}, {"start": 359.0, "text": "the completion closure receives a URL to the generated file."}, {"start": 363.0, "text": "That URL points to a temporary location inside your app container,"}, {"start": 368.0, "text": "save it elsewhere before the session ends."}, {"start": 371.0, "text": "The sheet drops into your app as a fully-formed, consistent experience."}, {"start": 377.0, "text": "The user can type a description, browse style options,"}, {"start": 381.0, "text": "include people from their library,"}, {"start": 383.0, "text": "and preview results before confirming."}, {"start": 386.0, "text": "Your app gets the final URL, ready to display."}, {"start": 391.0, "text": "The sheet can open with an empty prompt or can be seeded with context from your app"}, {"start": 396.0, "text": "for a richer initial experience."}, {"start": 399.0, "text": "ImagePlaygroundConcept has two factory methods here:"}, {"start": 403.0, "text": "text wraps a direct description,"}, {"start": 406.0, "text": "I'm passing the card's theme, like cherry blossoms;"}, {"start": 410.0, "text": "extracted takes longer text and lets the system pull out the most relevant ideas,"}, {"start": 417.0, "text": "I'm passing the card's message,"}, {"start": 419.0, "text": "so the model picks up on what the card is about."}, {"start": 423.0, "text": "With concepts in place,"}, {"start": 424.0, "text": "the sheet opens already primed for this specific card."}, {"start": 429.0, "text": "The user doesn't have to start from scratch."}, {"start": 432.0, "text": "You can also seed the sheet with an image."}, {"start": 435.0, "text": "Pass any SwiftUI Image to the sourceImage parameter,"}, {"start": 439.0, "text": "a photo the person picked from their library,"}, {"start": 442.0, "text": "or an image the card already has."}, {"start": 445.0, "text": "Image Playground uses it as visual inspiration alongside the concepts."}, {"start": 451.0, "text": "The user can replace or refine it inside the sheet,"}, {"start": 454.0, "text": "it's a starting point, not a constraint."}, {"start": 457.0, "text": "On iPad, Postcards shows a small canvas below the card front."}, {"start": 462.0, "text": "ImagePlaygroundConcept.drawing takes a PKDrawing from PencilKit"}, {"start": 467.0, "text": "and adds it as a concept alongside the text."}, {"start": 470.0, "text": "The model treats the strokes as a visual suggestion,"}, {"start": 474.0, "text": "they guide the composition without locking it in."}, {"start": 478.0, "text": "To know more about drawings in PencilKit,"}, {"start": 480.0, "text": "check out \"Read between the strokes with PencilKit\"."}, {"start": 485.0, "text": "If you're building a UIKit or AppKit app,"}, {"start": 489.0, "text": "ImagePlaygroundViewController gives you the same experience as a view controller."}, {"start": 494.0, "text": "Set concepts and options as properties before presentation,"}, {"start": 499.0, "text": "then implement"}, {"start": 500.0, "text": "imagePlaygroundViewController, didCreateImageAt"}, {"start": 503.0, "text": "on the delegate to receive the result."}, {"start": 506.0, "text": "The API mirrors SwiftUI."}, {"start": 509.0, "text": "Now, let's configure the sheet to fit Postcards,"}, {"start": 513.0, "text": "configuring options like size, style, and personalization."}, {"start": 519.0, "text": "ImagePlaygroundOptions and ImagePlaygroundStyle"}, {"start": 522.0, "text": "allow you to manage the configuration of the playground,"}, {"start": 526.0, "text": "size and aspect ratio,"}, {"start": 528.0, "text": "available and preselected styles, and personalization."}, {"start": 532.0, "text": "Whether you're generating card artwork, a lock screen wallpaper,"}, {"start": 537.0, "text": "a banner, or a Genmoji icon, the same API adapts to fit."}, {"start": 542.0, "text": "Postcards supports three card formats: landscape, portrait, and square."}, {"start": 548.0, "text": "Each format stores a CGSize"}, {"start": 552.0, "text": "I pass it directly to .closest(to: ,"}, {"start": 555.0, "text": "and the system maps it to the closest supported aspect ratio and resolution."}, {"start": 561.0, "text": "Because format is a property of the card, the size request adapts automatically."}, {"start": 567.0, "text": "A landscape card requests a wide image, a portrait card requests a tall one."}, {"start": 573.0, "text": "I pass the options to the sheet using .imagePlaygroundOptions."}, {"start": 579.0, "text": "ImagePlaygroundStyle has several values, like: illustration,"}, {"start": 583.0, "text": "sketch, animation, and emoji."}, {"start": 587.0, "text": "imagePlaygroundGenerationStyle takes two arguments:"}, {"start": 591.0, "text": "a default style that the picker opens on,"}, {"start": 594.0, "text": "and an allowed list that limits which styles appear."}, {"start": 598.0, "text": "If you pass a single style in the allowed list, the picker locks to that style."}, {"start": 604.0, "text": "In Postcards, each card carries a StylePreset"}, {"start": 608.0, "text": "that maps directly to these values."}, {"start": 611.0, "text": "A classic card defaults to illustration,"}, {"start": 613.0, "text": "and allows only illustration and sketch."}, {"start": 616.0, "text": "While an expressive card defaults to animation"}, {"start": 619.0, "text": "and also allows illustration and emoji."}, {"start": 623.0, "text": "The style picker automatically reflects whichever card is open."}, {"start": 628.0, "text": "externalProvider is an opt-in style that surfaces"}, {"start": 631.0, "text": "whatever third-party provider the person has configured in Settings,"}, {"start": 635.0, "text": "ChatGPT, for example."}, {"start": 638.0, "text": "To offer it, append it to your .allowedStyles list."}, {"start": 642.0, "text": "If the user has a provider configured, the tab appears in the picker."}, {"start": 646.0, "text": "If they haven't, the system handles its setup,"}, {"start": 650.0, "text": "no check required on your side."}, {"start": 652.0, "text": "You can also pass it as the default style"}, {"start": 655.0, "text": "if your app has a context where that makes sense."}, {"start": 658.0, "text": "Either way, the picker adapts to what's actually available."}, {"start": 662.0, "text": "ImagePlaygroundStyle.emoji is tuned for expressive, emoji-scale characters."}, {"start": 669.0, "text": "When it's active, the sheet fires a separate completion,"}, {"start": 673.0, "text": "onAdaptiveImageGlyphCreation,"}, {"start": 676.0, "text": "and hands you an NSAdaptiveImageGlyph instead of a URL."}, {"start": 681.0, "text": "An adaptive image glyph is special -"}, {"start": 684.0, "text": "it can be embedded directly inline with text,"}, {"start": 687.0, "text": "just like an emoji,"}, {"start": 689.0, "text": "which is exactly what you want for a card thumbnail"}, {"start": 692.0, "text": "that appears next to the recipient's name."}, {"start": 695.0, "text": "For everything you can do with adaptive image glyphs in text,"}, {"start": 699.0, "text": "rendering, storing, custom text engines,"}, {"start": 704.0, "text": "check out \"Bring expression to your app with Genmoji\"."}, {"start": 708.0, "text": "Personalization is enabled by default."}, {"start": 711.0, "text": "It lets people include someone from their Photos library,"}, {"start": 715.0, "text": "a powerful way to make a greeting card feel genuinely personal."}, {"start": 720.0, "text": "If your app context doesn't call for it,"}, {"start": 723.0, "text": "say, you're building a product image generator,"}, {"start": 725.0, "text": "you can set options.personalization to disabled."}, {"start": 730.0, "text": "The people picker and name detection disappear from the sheet entirely."}, {"start": 735.0, "text": "Last up: making sure Postcards handles every device gracefully."}, {"start": 741.0, "text": "Image Playground is available on devices that support Apple Intelligence,"}, {"start": 745.0, "text": "across a growing set of languages and regions,"}, {"start": 749.0, "text": "and when the user has image generation enabled in Settings."}, {"start": 753.0, "text": "The supportsImageGeneration environment value is all you need."}, {"start": 758.0, "text": "It returns true when image generation is fully available,"}, {"start": 761.0, "text": "the device has the capability,"}, {"start": 763.0, "text": "the current language and region are supported,"}, {"start": 766.0, "text": "and the user has it enabled."}, {"start": 768.0, "text": "When it's true, I navigate to CardEditorView,"}, {"start": 772.0, "text": "the full Image Playground experience."}, {"start": 775.0, "text": "When it's false, I navigate to CardPickerView,"}, {"start": 778.0, "text": "a simple Photos picker fallback."}, {"start": 781.0, "text": "No entitlement, no extra capability check, no setup step,"}, {"start": 786.0, "text": "just the environment value and a conditional."}, {"start": 789.0, "text": "That's all it takes to support both paths cleanly."}, {"start": 794.0, "text": "With Image Playground,"}, {"start": 795.0, "text": "it's easy to provide a high-quality image creation experience in your app."}, {"start": 801.0, "text": "Consider where images live in your design."}, {"start": 804.0, "text": "A card someone sends to a friend."}, {"start": 807.0, "text": "A profile that represents them."}, {"start": 810.0, "text": "A message they've been trying to put into words."}, {"start": 814.0, "text": "The right shape and feel changes everything."}, {"start": 817.0, "text": "And then think about what only your app knows."}, {"start": 821.0, "text": "What relationships, what memories,"}, {"start": 823.0, "text": "what context can you bring into the picture"}, {"start": 826.0, "text": "to make the result feel like it was made"}, {"start": 828.0, "text": "for that specific person?"}, {"start": 831.0, "text": "That's the real opportunity."}, {"start": 833.0, "text": "Image Playground brings the models, you bring the story."}, {"start": 837.0, "text": "Thanks for watching,"}, {"start": 839.0, "text": "now go build something that earns a spot on someone's refrigerator."}]}