{
  "source": "guitaripod/wwdc-sessions catalog.json",
  "rawBase": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master",
  "source_commit": {
    "commit": "b63232f22ad9ff0da807ae5d6223575cb08689f3",
    "commit_date": "2026-06-18T19:48:35+00:00",
    "subject": "chore: refresh WWDC knowledge base"
  },
  "event": "wwdc2026",
  "counts": {
    "sessions": 121,
    "withTranscript": 118
  },
  "sessions": [
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-101",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 101,
      "title": "Keynote",
      "description": "Don’t miss the exciting reveal of the latest Apple software and technologies.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/101",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/101",
      "type": "Special Event",
      "publishedAt": "2026-06-08T10:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 4574,
      "hasTranscript": true,
      "transcriptWordCount": 11299,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://events-delivery.apple.com/0601eknundukyswuegvjcidvurtztakr/vod_main_vdhwwrygnmzydhppixlrqwduiqffztdw/vod_main_vdhwwrygnmzydhppixlrqwduiqffztdw.m3u8",
        "duration": 4574
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/101-keynote/",
      "files": {
        "metadata": "sessions/wwdc2026/101-keynote/metadata.json",
        "readme": "sessions/wwdc2026/101-keynote/README.md",
        "transcript": "sessions/wwdc2026/101-keynote/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/101-keynote/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-102",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 102,
      "title": "Platforms State of the Union",
      "description": "Discover the newest advancements on Apple platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/102",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/102",
      "type": "Special Event",
      "publishedAt": "2026-06-08T13:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "sotu",
        "sotu 2026"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 3698,
      "hasTranscript": true,
      "transcriptWordCount": 9220,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/102/2/abb4bd38-dfae-46cf-985f-160769b92d41/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/102/2/abb4bd38-dfae-46cf-985f-160769b92d41/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/102/2/abb4bd38-dfae-46cf-985f-160769b92d41/downloads/wwdc2026-102_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/102/2/abb4bd38-dfae-46cf-985f-160769b92d41/downloads/wwdc2026-102_hd.mp4",
        "duration": 3698
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/102-platforms-state-of-the-union/",
      "files": {
        "metadata": "sessions/wwdc2026/102-platforms-state-of-the-union/metadata.json",
        "readme": "sessions/wwdc2026/102-platforms-state-of-the-union/README.md",
        "transcript": "sessions/wwdc2026/102-platforms-state-of-the-union/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/102-platforms-state-of-the-union/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-111",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 111,
      "title": "Keynote (ASL)",
      "description": "Don’t miss the exciting reveal of the latest Apple software and technologies.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/111",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/111",
      "type": "Special Event",
      "publishedAt": "2026-06-08T10:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "asl"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 4574,
      "hasTranscript": false,
      "transcriptWordCount": 0,
      "availableLanguages": [],
      "media": {
        "hls": "https://events-delivery.apple.com/0601eknundukyswuegvjcidvurtztakr/vod_asl_xywfnqqbxvfzvwqytojhyuvrfwjxgkqr/vod_asl_xywfnqqbxvfzvwqytojhyuvrfwjxgkqr.m3u8",
        "duration": 4574
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/111-keynote-asl/",
      "files": {
        "metadata": "sessions/wwdc2026/111-keynote-asl/metadata.json",
        "readme": "sessions/wwdc2026/111-keynote-asl/README.md"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-112",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 112,
      "title": "Platforms State of the Union (ASL)",
      "description": "Discover the newest advancements on Apple platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/112",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/112",
      "type": "Special Event",
      "publishedAt": "2026-06-08T13:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "asl",
        "sotu",
        "sotu 2026"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 3698,
      "hasTranscript": true,
      "transcriptWordCount": 9220,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/112/1/0e1d49e8-277b-49f9-aaff-d937c5956d86/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/112/1/0e1d49e8-277b-49f9-aaff-d937c5956d86/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/112/1/0e1d49e8-277b-49f9-aaff-d937c5956d86/downloads/wwdc2026-112_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/112/1/0e1d49e8-277b-49f9-aaff-d937c5956d86/downloads/wwdc2026-112_hd.mp4",
        "duration": 3698
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/112-platforms-state-of-the-union-asl/",
      "files": {
        "metadata": "sessions/wwdc2026/112-platforms-state-of-the-union-asl/metadata.json",
        "readme": "sessions/wwdc2026/112-platforms-state-of-the-union-asl/README.md",
        "transcript": "sessions/wwdc2026/112-platforms-state-of-the-union-asl/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/112-platforms-state-of-the-union-asl/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-121",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 121,
      "title": "Announcing Apple’s next big step for Siri and iPhone",
      "description": "Introducing Siri AI in iOS 27, with more power than ever. Transform your images with next-generation AI. Create photorealistic imagery for wallpapers, Contact Posters, and backgrounds across the system in Image Playground. Use a more conversational Siri AI with natural language abilities to edit and write emails, texts, and documents. Keep your personal information safe with Siri AI and update compromised passwords with just a tap.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/121",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/121",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "keynote",
        "keynote 2026",
        "recap"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 91,
      "hasTranscript": true,
      "transcriptWordCount": 197,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/121/1/f1e6baa3-3c16-4944-abec-3525818a2702/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/121/1/f1e6baa3-3c16-4944-abec-3525818a2702/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/121/1/f1e6baa3-3c16-4944-abec-3525818a2702/downloads/wwdc2026-121_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/121/1/f1e6baa3-3c16-4944-abec-3525818a2702/downloads/wwdc2026-121_hd.mp4",
        "duration": 91
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/121-announcing-apple-s-next-big-step-for-siri-and-iphone/",
      "files": {
        "metadata": "sessions/wwdc2026/121-announcing-apple-s-next-big-step-for-siri-and-iphone/metadata.json",
        "readme": "sessions/wwdc2026/121-announcing-apple-s-next-big-step-for-siri-and-iphone/README.md",
        "transcript": "sessions/wwdc2026/121-announcing-apple-s-next-big-step-for-siri-and-iphone/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/121-announcing-apple-s-next-big-step-for-siri-and-iphone/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-122",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 122,
      "title": "WWDC26 Platforms State of the Union Recap",
      "description": "Catch up quickly on the newest advancements for your apps and games — all in five minutes.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/122",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/122",
      "type": "Video",
      "publishedAt": "2026-06-08T13:00:00-07:00",
      "platforms": [],
      "keywords": [
        "recap",
        "sotu",
        "sotu 2026"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 272,
      "hasTranscript": true,
      "transcriptWordCount": 715,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/122/3/acc0a465-b6fa-446b-8f3f-dc122d862f47/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/122/3/acc0a465-b6fa-446b-8f3f-dc122d862f47/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/122/3/acc0a465-b6fa-446b-8f3f-dc122d862f47/downloads/wwdc2026-122_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/122/3/acc0a465-b6fa-446b-8f3f-dc122d862f47/downloads/wwdc2026-122_hd.mp4",
        "duration": 272
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/122-wwdc26-platforms-state-of-the-union-recap/",
      "files": {
        "metadata": "sessions/wwdc2026/122-wwdc26-platforms-state-of-the-union-recap/metadata.json",
        "readme": "sessions/wwdc2026/122-wwdc26-platforms-state-of-the-union-recap/README.md",
        "transcript": "sessions/wwdc2026/122-wwdc26-platforms-state-of-the-union-recap/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/122-wwdc26-platforms-state-of-the-union-recap/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-201",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 201,
      "title": "Secure your apps with App Attest",
      "description": "Harness App Attest to protect your app from unauthorized modification and fraud. Uncover how attackers exploit modified apps to spoof data and bypass security checks, and how App Attest defends against these threats. Learn to generate and manage App Attest keys bound to the Secure Enclave, validate attestations and assertions, and use the fraud metric to detect abuse. Discover best practices across all Apple platforms, including new signals in iOS 27 to strengthen your validation.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/201",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/201",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "🎈",
        "fraud",
        "mitigate"
      ],
      "topics": [
        "App Services",
        "App Store, Distribution & Marketing",
        "Business & Education",
        "Privacy & Security"
      ],
      "primaryTopic": "Privacy & Security",
      "duration": 1202,
      "hasTranscript": true,
      "transcriptWordCount": 2960,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/201/4/d3eb2e5b-5104-4aee-a754-9985008a5b06/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/201/4/d3eb2e5b-5104-4aee-a754-9985008a5b06/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/201/4/d3eb2e5b-5104-4aee-a754-9985008a5b06/downloads/wwdc2026-201_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/201/4/d3eb2e5b-5104-4aee-a754-9985008a5b06/downloads/wwdc2026-201_hd.mp4",
        "duration": 1202
      },
      "codeSnippets": [
        {
          "title": "Generate a Secure Enclave–bound key",
          "language": "swift",
          "startTimeSeconds": 307,
          "code": "import DeviceCheck\n\nlet keyID = try await DCAppAttestService.shared.generateKey()"
        },
        {
          "title": "Attestation API",
          "language": "swift",
          "startTimeSeconds": 392,
          "code": "import DeviceCheck\n\nlet keyId: String = ...\nlet clientDataHash: Data = ...\nlet attestation = try await DCAppAttestService.shared.attestKey(keyId: keyId, clientDataHash: clientDataHash)"
        },
        {
          "title": "Assertion API",
          "language": "swift",
          "startTimeSeconds": 753,
          "code": "import DeviceCheck\n\nlet keyId: String = ...\nlet clientDataHash: Data = ...\nlet assertion = try await DCAppAttestService.shared.generateAssertion(keyId: String, clientDataHash: Data)"
        }
      ],
      "resources": [
        {
          "title": "W3C Authenticator Data",
          "url": "https://www.w3.org/TR/webauthn-3/#sctn-authenticator-data",
          "type": "documentation",
          "description": null
        },
        {
          "title": "About System Integrity Protection on your Mac",
          "url": "https://support.apple.com/en-us/102149",
          "type": "documentation",
          "description": "System Integrity Protection is a security technology that helps protect your Mac from malicious software."
        },
        {
          "title": "DeviceCheck",
          "url": "https://developer.apple.com/documentation/DeviceCheck",
          "type": "documentation",
          "description": "Reduce fraudulent use of your services by managing device state and asserting app",
          "sosumiURL": "https://sosumi.ai/documentation/DeviceCheck",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/DeviceCheck.json"
        }
      ],
      "path": "sessions/wwdc2026/201-secure-your-apps-with-app-attest/",
      "files": {
        "metadata": "sessions/wwdc2026/201-secure-your-apps-with-app-attest/metadata.json",
        "readme": "sessions/wwdc2026/201-secure-your-apps-with-app-attest/README.md",
        "transcript": "sessions/wwdc2026/201-secure-your-apps-with-app-attest/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/201-secure-your-apps-with-app-attest/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-203",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 203,
      "title": "Read between the strokes with PencilKit",
      "description": "Unlock handwriting recognition in your apps using the same powerful technology behind Apple apps like Freeform and Notes. Discover how to use handwriting recognition across a wide range of alphabets and languages, and explore new capabilities for integrating PencilKit into a wider variety of apps.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/203",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/203",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "🎈",
        "pencil"
      ],
      "topics": [
        "SwiftUI & UI Frameworks",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 910,
      "hasTranscript": true,
      "transcriptWordCount": 1641,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/203/4/eb979cd5-af5b-4091-87ec-4839e8d131b9/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/203/4/eb979cd5-af5b-4091-87ec-4839e8d131b9/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/203/4/eb979cd5-af5b-4091-87ec-4839e8d131b9/downloads/wwdc2026-203_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/203/4/eb979cd5-af5b-4091-87ec-4839e8d131b9/downloads/wwdc2026-203_hd.mp4",
        "duration": 910
      },
      "codeSnippets": [
        {
          "title": "Recognized text",
          "language": "swift",
          "startTimeSeconds": 233,
          "code": "import PencilKit\n\nlet recognizer = PKStrokeRecognizer()\nawait recognizer.updateDrawing(drawing)\nmyLabel.text = await recognizer.recognizedText()"
        },
        {
          "title": "Indexable content",
          "language": "swift",
          "startTimeSeconds": 322,
          "code": "import PencilKit\n\nlet recognizer = PKStrokeRecognizer()\nawait recognizer.updateDrawing(drawing)\nif let indexedContent = await recognizer.indexableContent {\n    index(text: indexedContent)\n}"
        },
        {
          "title": "Find text",
          "language": "swift",
          "startTimeSeconds": 418,
          "code": "import PencilKit\n\nlet recognizer = PKStrokeRecognizer()\nawait recognizer.updateDrawing(drawing)\nlet results = await recognizer.search(\"apple\")\nfor result in results {\n    highlight(bounds: result.bounds)\n}"
        }
      ],
      "resources": [
        {
          "title": "Controlling stroke rendering for animation and editing",
          "url": "https://developer.apple.com/documentation/PencilKit/controlling-stroke-rendering-for-animation-and-editing",
          "type": "documentation",
          "description": "Slice, animate, and blend PencilKit strokes in code, while keeping grain texture and wet ink intact.",
          "sosumiURL": "https://sosumi.ai/documentation/PencilKit/controlling-stroke-rendering-for-animation-and-editing",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PencilKit/controlling-stroke-rendering-for-animation-and-editing.json"
        },
        {
          "title": "Recognizing handwriting and converting it to text",
          "url": "https://developer.apple.com/documentation/PencilKit/recognizing-handwriting-and-converting-to-text",
          "type": "documentation",
          "description": "Analyze handwritten strokes in a PencilKit canvas using on-device recognition, and convert them to text that your app can display, copy, or index.",
          "sosumiURL": "https://sosumi.ai/documentation/PencilKit/recognizing-handwriting-and-converting-to-text",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PencilKit/recognizing-handwriting-and-converting-to-text.json"
        },
        {
          "title": "Building a handwriting recognition experience with PencilKit",
          "url": "https://developer.apple.com/documentation/PencilKit/building-a-handwriting-recognition-experience-with-pencilkit",
          "type": "samplecode",
          "description": "Integrate handwriting recognition into your app to identify written text across multiple languages, and explore path conversion and substrokes to enhance the drawing experience.",
          "sosumiURL": "https://sosumi.ai/documentation/PencilKit/building-a-handwriting-recognition-experience-with-pencilkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PencilKit/building-a-handwriting-recognition-experience-with-pencilkit.json"
        },
        {
          "title": "PencilKit",
          "url": "https://developer.apple.com/documentation/PencilKit",
          "type": "documentation",
          "description": "Capture touch and Apple Pencil input as a drawing, and display that content from your app.",
          "sosumiURL": "https://sosumi.ai/documentation/PencilKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PencilKit.json"
        }
      ],
      "path": "sessions/wwdc2026/203-read-between-the-strokes-with-pencilkit/",
      "files": {
        "metadata": "sessions/wwdc2026/203-read-between-the-strokes-with-pencilkit/metadata.json",
        "readme": "sessions/wwdc2026/203-read-between-the-strokes-with-pencilkit/README.md",
        "transcript": "sessions/wwdc2026/203-read-between-the-strokes-with-pencilkit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/203-read-between-the-strokes-with-pencilkit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-204",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 204,
      "title": "What’s new in WebKit for Safari 27",
      "description": "Explore what’s new in WebKit — from Grid Lanes and Customizable Select, to HTML Model and Immersive Environments, and the latest for Web Extensions. You’ll also discover the work behind over 1,000 browser engine improvements that make the web more reliable.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/204",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/204",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 992,
      "hasTranscript": true,
      "transcriptWordCount": 2351,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/204/5/0226f57f-eb7b-4c8d-91cb-0ac8f245d88b/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/204/5/0226f57f-eb7b-4c8d-91cb-0ac8f245d88b/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/204/5/0226f57f-eb7b-4c8d-91cb-0ac8f245d88b/downloads/wwdc2026-204_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/204/5/0226f57f-eb7b-4c8d-91cb-0ac8f245d88b/downloads/wwdc2026-204_hd.mp4",
        "duration": 992
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "WebKit.org - CSS Grid Lanes Field Guide",
          "url": "https://gridlanes.webkit.org",
          "type": "documentation",
          "description": "The field guide to CSS Grid Lanes — masonry layouts in pure CSS, no JavaScript required. Syntax reference, property guide, and interactive demos."
        },
        {
          "title": "Packaging and distributing Safari Web Extensions with App Store Connect",
          "url": "https://developer.apple.com/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect",
          "type": "documentation",
          "description": "Upload and distribute Safari Web Extensions without using a Mac or Xcode.",
          "sosumiURL": "https://sosumi.ai/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect.json"
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "Learn more about MapKitJS",
          "url": "https://developer.apple.com/maps/web/",
          "type": "guide",
          "description": null,
          "sosumiURL": "https://sosumi.ai/maps/web/"
        },
        {
          "title": "Safari Technology Preview",
          "url": "https://developer.apple.com/safari/technology-preview/",
          "type": "download",
          "description": "Safari Technology Preview",
          "sosumiURL": "https://sosumi.ai/safari/technology-preview/"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/204-what-s-new-in-webkit-for-safari-27/",
      "files": {
        "metadata": "sessions/wwdc2026/204-what-s-new-in-webkit-for-safari-27/metadata.json",
        "readme": "sessions/wwdc2026/204-what-s-new-in-webkit-for-safari-27/README.md",
        "transcript": "sessions/wwdc2026/204-what-s-new-in-webkit-for-safari-27/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/204-what-s-new-in-webkit-for-safari-27/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-205",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 205,
      "title": "Enhance your presence on the App Store",
      "description": "Reimagine how you market your apps and games on the App Store by using your images and videos in new places. Discover how you can tell a richer story across the App Store with new visual placements on your product page, search results, and Apple Ads campaigns. Explore how to streamline all your visual assets in one place with the new Asset Library, as well as learn about a new tool to help you view your product page before it goes live.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/205",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/205",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [],
      "topics": [
        "App Services",
        "Developer Tools",
        "App Store, Distribution & Marketing"
      ],
      "primaryTopic": "App Store, Distribution & Marketing",
      "duration": 494,
      "hasTranscript": true,
      "transcriptWordCount": 1054,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/205/4/47ee16f9-fba0-48a3-9d60-065befef7a95/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/205/4/47ee16f9-fba0-48a3-9d60-065befef7a95/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/205/4/47ee16f9-fba0-48a3-9d60-065befef7a95/downloads/wwdc2026-205_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/205/4/47ee16f9-fba0-48a3-9d60-065befef7a95/downloads/wwdc2026-205_hd.mp4",
        "duration": 494
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Design your own ads with creative assets",
          "url": "https://ads.apple.com/app-store/h/help/design-your-own-ads-with-creative-assets",
          "type": "documentation",
          "description": null
        },
        {
          "title": "App Store - What's New",
          "url": "https://developer.apple.com/app-store/whats-new/",
          "type": "documentation",
          "description": "Describes the features of the new App Store.",
          "sosumiURL": "https://sosumi.ai/app-store/whats-new/"
        },
        {
          "title": "Creating your Product Page",
          "url": "https://developer.apple.com/app-store/product-page/",
          "type": "documentation",
          "description": "Help users find and engage with your app on the App Store through thoughtfully crafted app metadata.",
          "sosumiURL": "https://sosumi.ai/app-store/product-page/"
        }
      ],
      "path": "sessions/wwdc2026/205-enhance-your-presence-on-the-app-store/",
      "files": {
        "metadata": "sessions/wwdc2026/205-enhance-your-presence-on-the-app-store/metadata.json",
        "readme": "sessions/wwdc2026/205-enhance-your-presence-on-the-app-store/README.md",
        "transcript": "sessions/wwdc2026/205-enhance-your-presence-on-the-app-store/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/205-enhance-your-presence-on-the-app-store/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-206",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 206,
      "title": "What’s new in managing Apple devices",
      "description": "Discover the latest updates to declarative device management, Apple Business, and Apple School Manager. Explore how these advancements help you streamline deployment, strengthen security, and improve the experience for people using your managed devices. Whether you’re building device management solutions or managing enterprise fleets, you’ll learn practical ways to take advantage of these new capabilities.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/206",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/206",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "enterprise"
      ],
      "topics": [
        "App Store, Distribution & Marketing",
        "Business & Education"
      ],
      "primaryTopic": "Business & Education",
      "duration": 1382,
      "hasTranscript": true,
      "transcriptWordCount": 3139,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/206/4/e49f983e-700d-4d52-ae6b-a0fa1ea89fd0/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/206/4/e49f983e-700d-4d52-ae6b-a0fa1ea89fd0/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/206/4/e49f983e-700d-4d52-ae6b-a0fa1ea89fd0/downloads/wwdc2026-206_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/206/4/e49f983e-700d-4d52-ae6b-a0fa1ea89fd0/downloads/wwdc2026-206_hd.mp4",
        "duration": 1382
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/206-what-s-new-in-managing-apple-devices/",
      "files": {
        "metadata": "sessions/wwdc2026/206-what-s-new-in-managing-apple-devices/metadata.json",
        "readme": "sessions/wwdc2026/206-what-s-new-in-managing-apple-devices/README.md",
        "transcript": "sessions/wwdc2026/206-what-s-new-in-managing-apple-devices/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/206-what-s-new-in-managing-apple-devices/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-207",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 207,
      "title": "Deliver workout insights with HealthKit workout zones",
      "description": "HealthKit makes it easier to provide workout insights — like heart rate and cycling power zones — in your app. Learn to leverage the built-in, personalized zones or create custom ones. Discover how to use the current zone and time spent in each zone to provide meaningful guidance during and after workouts.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/207",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/207",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks",
        "Health & Fitness"
      ],
      "primaryTopic": "Health & Fitness",
      "duration": 735,
      "hasTranscript": true,
      "transcriptWordCount": 1802,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/207/5/8627c1d4-7a34-46f2-8491-f0d1c138edd1/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/207/5/8627c1d4-7a34-46f2-8491-f0d1c138edd1/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/207/5/8627c1d4-7a34-46f2-8491-f0d1c138edd1/downloads/wwdc2026-207_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/207/5/8627c1d4-7a34-46f2-8491-f0d1c138edd1/downloads/wwdc2026-207_hd.mp4",
        "duration": 735
      },
      "codeSnippets": [
        {
          "title": "Reading Heart Rate Zones from a completed workout",
          "language": "swift",
          "startTimeSeconds": 234,
          "code": "// Read heart rate zones from the completed workout\n\nif let heartRateZoneGroup = workout.zoneGroupsByType?[HKQuantityType(.heartRate)] {\nlet zones = ZoneDisplayData(\n    zoneCount: heartRateZoneGroup.configuration.zones.count,\n    currentZoneIndex: nil,\n    durations: heartRateZoneGroup.zoneDurations.map(\\.duration)\n)"
        },
        {
          "title": "Handling Live Zone Updates",
          "language": "swift",
          "startTimeSeconds": 477,
          "code": "func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder,\n                    didUpdateWorkoutZone zoneUpdate: HKLiveWorkoutZoneUpdate) {\n    guard let zoneGroup = zoneUpdate.zoneGroup else {\n        return\n    }\n    if let currentIndex = zoneUpdate.currentZoneDuration?.zone.index {\n        let data = ZoneDisplayData(\n            zoneCount: zoneGroup.configuration.zones.count,\n            currentZoneIndex: currentIndex,\n            durations: zoneGroup.zoneDurations.map(\\.duration)\n        )\n        Task { @MainActor in\n            self.heartRateZones = data\n        }\n    }\n}"
        },
        {
          "title": "Check if Preferred Zone has been set",
          "language": "swift",
          "startTimeSeconds": 559,
          "code": "if try await builder.zoneConfiguration(for: HKQuantityType(.heartRate)) == nil {"
        },
        {
          "title": "Create Zone Boundaries",
          "language": "swift",
          "startTimeSeconds": 564,
          "code": "let defaultHeartRateZoneThresholds = [91.0, 114.0, 136.0, 158.0]\n    let bpmUnit = HKUnit.count().unitDivided(by: HKUnit.minute())\n    let boundaries = defaultHeartRateZoneThresholds.map(\n        {HKQuantity(unit: bpmUnit, doubleValue:$0)}\n    )"
        },
        {
          "title": "Create Default Workout Zone Configuration",
          "language": "swift",
          "startTimeSeconds": 573,
          "code": "let heartRate = HKQuantityType(.heartRate)\n    let defaultConfiguration = try HKWorkoutZoneConfiguration(quantityType: heartRate,\n                                                              zoneBoundaries: boundaries)"
        },
        {
          "title": "Set Custom Zone Configuration",
          "language": "swift",
          "startTimeSeconds": 598,
          "code": "try await builder.setCustomZoneConfiguration(defaultConfiguration,\n                                                 for: heartRate)\n}"
        },
        {
          "title": "Begin Data Collection",
          "language": "swift",
          "startTimeSeconds": 603,
          "code": "// Begin data collection\nlet startDate = Date()\ntry await builder.beginCollection(at: startDate)"
        }
      ],
      "resources": [
        {
          "title": "Tracking heart rate zones for workouts",
          "url": "https://developer.apple.com/documentation/HealthKit/tracking-heart-rate-zones-for-workouts",
          "type": "samplecode",
          "description": "Start a workout on iOS or watchOS and track and display heart rate zones.",
          "sosumiURL": "https://sosumi.ai/documentation/HealthKit/tracking-heart-rate-zones-for-workouts",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/HealthKit/tracking-heart-rate-zones-for-workouts.json"
        },
        {
          "title": "Accessing workout zone data",
          "url": "https://developer.apple.com/documentation/HealthKit/accessing-workout-zone-data",
          "type": "documentation",
          "description": "Provide training insights to people on your app using workout zone data.",
          "sosumiURL": "https://sosumi.ai/documentation/HealthKit/accessing-workout-zone-data",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/HealthKit/accessing-workout-zone-data.json"
        }
      ],
      "path": "sessions/wwdc2026/207-deliver-workout-insights-with-healthkit-workout-zones/",
      "files": {
        "metadata": "sessions/wwdc2026/207-deliver-workout-insights-with-healthkit-workout-zones/metadata.json",
        "readme": "sessions/wwdc2026/207-deliver-workout-insights-with-healthkit-workout-zones/README.md",
        "transcript": "sessions/wwdc2026/207-deliver-workout-insights-with-healthkit-workout-zones/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/207-deliver-workout-insights-with-healthkit-workout-zones/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-209",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 209,
      "title": "What’s new in Wallet",
      "description": "Explore the newest design updates and developer tools for Apple Wallet passes. Refresh your passes with beautiful new styles for rich, vibrant designs. Discover new barcode formats and a flexible pass actions API. Meet Pass Designer and Pass Builder, powerful tools that simplify designing, personalizing, and distributing your passes at scale.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/209",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/209",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "certificate",
        "certificates",
        "distribution",
        "package",
        "pass",
        "passes",
        "signature",
        "signing",
        "wallet"
      ],
      "topics": [
        "System Services",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 949,
      "hasTranscript": true,
      "transcriptWordCount": 2161,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/209/5/25eb40d5-b64d-4677-bc99-f5c3a30d386a/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/209/5/25eb40d5-b64d-4677-bc99-f5c3a30d386a/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/209/5/25eb40d5-b64d-4677-bc99-f5c3a30d386a/downloads/wwdc2026-209_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/209/5/25eb40d5-b64d-4677-bc99-f5c3a30d386a/downloads/wwdc2026-209_hd.mp4",
        "duration": 949
      },
      "codeSnippets": [
        {
          "title": "Adopting Poster Generic",
          "language": "json",
          "startTimeSeconds": 101,
          "code": "// Adopting Poster Generic\n\"posterGeneric\": {\n  \"headerFields\": [\n    {\n      \"key\": \"memberID\",\n      \"label\": \"Guest No.\",\n      \"value\": \"102035\"\n    }\n  ],\n  \"footerFields\": [\n    {\n      \"key\": \"membershipType\",\n      \"value\": \"Family Pass\"\n    }\n  ]\n}"
        },
        {
          "title": "Adopting Poster Generic with Generic fallback",
          "language": "json",
          "startTimeSeconds": 131,
          "code": "// Adopting Poster Generic and supporting Generic on iOS 26 and earlier\n\"posterGeneric\": {\n  \"headerFields\": [\n    {\n      \"key\": \"memberID\",\n      \"label\": \"Guest No.\",\n      \"value\": \"102035\"\n    }\n  ],\n  \"footerFields\": [\n    {\n      \"key\": \"membershipType\",\n      \"value\": \"Family Pass\"\n    }\n  ]\n},\n\"generic\": {\n  \"headerFields\": [\n    {\n      \"key\": \"memberID\",\n      \"label\": \"Guest No.\",\n      \"value\": \"102035\"\n    }\n  ],\n  \"footerFields\": [\n    {\n      \"key\": \"membershipType\",\n      \"value\": \"Family Pass\"\n    }\n  ]\n}"
        },
        {
          "title": "Barcodes: Add new types for iOS 27",
          "language": "json",
          "startTimeSeconds": 172,
          "code": "// Adopting new barcode types\n\"barcodes\": [\n  {\n    \"format\": \"PKBarcodeFormatCodabar\"\n    \"message\": \"…\"\n    \"messageEncoding\": \"…\"\n  }\n]"
        },
        {
          "title": "Barcodes: Supporting iOS 26 and earlier",
          "language": "json",
          "startTimeSeconds": 217,
          "code": "// Adopting new barcode types and supporting iOS 26 and earlier.\n\"barcodes\": [\n  {\n    \"format\": \"PKBarcodeFormatCodabar\"\n    \"message\": \"123456789\"\n    \"messageEncoding\": \"iso-8859-1\"\n  },\n  {\n    \"format\": \"PKBarcodeFormatQR\"\n    \"message\": \"123456789\"\n    \"messageEncoding\": \"iso-8859-1\"\n  }\n]"
        },
        {
          "title": "Featured actions",
          "language": "json",
          "startTimeSeconds": 288,
          "code": "// Featured actions\n\"featuredActions\": [\n  {\n    \"identifier\": \"my-offer-id\",\n    \"type\": \"membershipBenefits\",\n    \"url\": \"www.example.com/offers\"\n  }\n]"
        },
        {
          "title": "Package.swift",
          "language": "swift",
          "startTimeSeconds": 656,
          "code": "// Package.swift\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyServer\",\n    products: [\n          .library(\n              name: \"MyServer\",\n              targets: [\"MyServer\"]\n        ),\n    ],\n    dependencies: [\n        .package(path: \"./path/to/PassBuilder\")\n    ],\n    targets: [\n        .target(\n            name: \"MyServer\",\n            dependencies: [\n                .product(name: \"PassBuilder\", package: \"PassBuilder\")\n            ]\n        ),\n        …\n    ]"
        },
        {
          "title": "CreatePass.swift",
          "language": "swift",
          "startTimeSeconds": 665,
          "code": "// CreatePass.swift\n\nimport PassBuilder\n\nfunc createPass(for doggo: MemeberModel) async throws -> URL {\n    var package = PassPackage(url: \"template.pkpasstemplate\")\n\n    package.pass.fields.setValue(doggo.name, forKey: \"DOG_NAME\")\n    package.pass.fields.setValue(doggo.favoriteToy, forKey: \"LOVES\")\n    package.pass.fields.setValue(doggo.id, forKey: \"MEMBER_ID\")\n\n    package.background = PassImage(url: doggo.photoURL)\n\n    package.pass.barcodes = [\n        Pass.Barcode(message: doggo.id, format: .pdf417)\n    ]\n\n    package.featuredActions = [\n        Pass.Action(id: \"action-1\", type: \"viewMembership\", url: doggo.membershipURL) \n    ]\n    …\n}"
        },
        {
          "title": "CreatePass.swift",
          "language": "swift",
          "startTimeSeconds": 791,
          "code": "// CreatePass.swift\n\nimport PassBuilder\n\nfunc createPass(for doggo: MemeberModel) async throws -> URL {\n    var package = PassPackage(url: \"template.pkpasstemplate\")\n\n    package.pass.fields.setValue(doggo.name, forKey: \"DOG_NAME\")\n    package.pass.fields.setValue(doggo.favoriteToy, forKey: \"LOVES\")\n    package.pass.fields.setValue(doggo.id, forKey: \"MEMBER_ID\")\n\n    package.background = PassImage(url: doggo.photoURL)\n\n    package.pass.barcodes = [\n        Pass.Barcode(message: doggo.id, format: .pdf417)\n    ]\n\n    package.featuredActions = [\n        Pass.Action(id: \"action-1\", type: \"viewMembership\", url: doggo.membershipURL) \n    ]\n\n    let passCertificate = try PassCertificate(url: \"pass.p12\", password: \"s3cr3t\")\n    let wwdrCertificate = try PassCertificate(url: \"wwdr.cer\")\n\n    let signer = PassSigner(\n        passCertificate: passCertificate,\n        wwdrCertifiate: wwdrCertificate\n    )\n\n    let destinationURL = URL(string: \"/www/passes/\" + doggo.id)\n    try signer.signPass(package, writingTo: destinationURL)\n\n    return destinationURL\n}"
        }
      ],
      "resources": [
        {
          "title": "Pass Designer",
          "url": "https://developer.apple.com/pass-designer",
          "type": "guide",
          "description": "Use Pass Designer on macOS to create and style Wallet passes, then export templates to personalize, sign, and distribute with Pass Builder.",
          "sosumiURL": "https://sosumi.ai/pass-designer"
        },
        {
          "title": "Creating a pass with Pass Designer",
          "url": "https://developer.apple.com/documentation/walletpasses/creating-a-pass-with-pass-designer",
          "type": "documentation",
          "description": "Use Pass Designer on macOS, to create, style, and export Wallet passes as template files to sign and distribute with Pass Builder.",
          "sosumiURL": "https://sosumi.ai/documentation/walletpasses/creating-a-pass-with-pass-designer",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/walletpasses/creating-a-pass-with-pass-designer.json"
        },
        {
          "title": "Pass Builder",
          "url": "https://github.com/apple/pass-builder",
          "type": "guide",
          "description": "A Swift library and command-line tool for creating, validating, and signing Apple Wallet passes."
        },
        {
          "title": "Pass.Barcodes",
          "url": "https://developer.apple.com/documentation/WalletPasses/Pass/Barcodes-data.dictionary",
          "type": "documentation",
          "description": "An array of barcode objects on a Pass.",
          "sosumiURL": "https://sosumi.ai/documentation/WalletPasses/Pass/Barcodes-data.dictionary",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/WalletPasses/Pass/Barcodes-data.dictionary.json"
        },
        {
          "title": "Learn more about Pass Designer",
          "url": "https://developer.apple.com/pass-designer/",
          "type": "documentation",
          "description": null,
          "sosumiURL": "https://sosumi.ai/pass-designer/"
        }
      ],
      "path": "sessions/wwdc2026/209-what-s-new-in-wallet/",
      "files": {
        "metadata": "sessions/wwdc2026/209-what-s-new-in-wallet/metadata.json",
        "readme": "sessions/wwdc2026/209-what-s-new-in-wallet/README.md",
        "transcript": "sessions/wwdc2026/209-what-s-new-in-wallet/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/209-what-s-new-in-wallet/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-210",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 210,
      "title": "What’s new in Apple In-App Purchase",
      "description": "Discover how monthly subscriptions with a 12-month commitment give people a more affordable option to pay for your subscription and secure a longer-term commitment. Explore how to configure and test this new payment option using App Store Connect, StoreKit APIs, Xcode testing, and more. Plus, learn about improvements to offer code redemption APIs, and enhancements to the App Review submission experience.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/210",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/210",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "App Services",
        "App Store, Distribution & Marketing"
      ],
      "primaryTopic": "App Store, Distribution & Marketing",
      "duration": 806,
      "hasTranscript": true,
      "transcriptWordCount": 2031,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/210/4/f029ab19-6670-48c6-b9b1-88ac6692cdda/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/210/4/f029ab19-6670-48c6-b9b1-88ac6692cdda/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/210/4/f029ab19-6670-48c6-b9b1-88ac6692cdda/downloads/wwdc2026-210_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/210/4/f029ab19-6670-48c6-b9b1-88ac6692cdda/downloads/wwdc2026-210_hd.mp4",
        "duration": 806
      },
      "codeSnippets": [
        {
          "title": "Merchandise pricing terms with StoreKit views",
          "language": "swift",
          "startTimeSeconds": 209,
          "code": "// Merchandise pricing terms with StoreKit views\n\nimport StoreKit\nimport SwiftUI\n\nstruct SubscriptionStore: View {\n    var body: some View {\n        SubscriptionStoreView(groupID: \"3F19ED53\") {\n            // Custom marketing content\n        }\n        .preferredSubscriptionPricingTerms {_, subscriptionInfo in\n            subscriptionInfo.pricingTerms.first {\n                $0.billingPlanType == .monthly\n            }\n        }\n    }\n}"
        },
        {
          "title": "Get subscription pricing terms and make a purchase",
          "language": "swift",
          "startTimeSeconds": 242,
          "code": "// Get subscription pricing terms and make a purchase\n\nimport StoreKit\n\nvar product: Product?\n// Fetch and assign product\n\n// Get the monthly billing plan's pricing terms for merchandising\nlet pricingTerms = product?.subscription?.pricingTerms\n  .first(where: {$0.billingPlanType == .monthly })\nif let pricingTerms {\n  let monthlyPrice = pricingTerms.billingDisplayPrice\n  let totalCommitmentPrice = pricingTerms.commitmentInfo.price\n  // Display both monthly and total commitment price to the customer\n}\n\nlet result = try? await product?.purchase(options: [.billingPlanType(.monthly)])\nswitch result {\n  // Verify the transaction, give the customer access to\n  // the purchased content, and then finish the transaction\n}"
        },
        {
          "title": "Sheet to manage subscriptions by subscriptionGroupID",
          "language": "swift",
          "startTimeSeconds": 305,
          "code": "// Sheet to manage subscriptions by subscriptionGroupID\n\nimport SwiftUI\nimport StoreKit\n\nstruct ManageSubscriptionsButton: View {\n    let subscriptionGroupID: String\n    @State var presentingManageSubscriptionsSheet: Bool = false\n\n    var body: some View {\n        Button(\"Manage Subscriptions\") {\n            presentingManageSubscriptionsSheet = true\n        }\n        .manageSubscriptionsSheet(\n            isPresented: $presentingManageSubscriptionsSheet,\n            subscriptionGroupID: subscriptionGroupID\n        )\n    }\n}"
        },
        {
          "title": "JWSTransaction (decoded) for a monthly subscription with a 12-month commitment",
          "language": "json",
          "startTimeSeconds": 465,
          "code": "// JWSTransaction (decoded) for a monthly subscription with a 12-month commitment\n\n{\n    // …\n    \"expiresDate\": 1783503660000, // for this billing period\n    \"price\": 10990, // for this billing period\n    \"productId\": \"plus.pro.annual\",\n    \"purchaseDate\": 1780911660000,\n    \"type\": \"Auto-Renewable Subscription\",\n    \"billingPlanType\": \"MONTHLY\",\n    \"commitmentInfo\": {\n        \"billingPeriodNumber\": 1,\n        \"totalBillingPeriods\": 12,\n        \"commitmentExpiresDate\": 1812447660000,\n        \"commitmentPrice\": 131880,\n    }\n}"
        },
        {
          "title": "JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment",
          "language": "json",
          "startTimeSeconds": 479,
          "code": "// JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment\n\n{\n    // … \n    \"renewalBillingPlanType\": \"MONTHLY\",\n    \"commitmentInfo\": {\n        \"commitmentAutoRenewProductId\": “plus.standard.annual”,\n        \"commitmentAutoRenewStatus\": 0,\n        \"commitmentRenewalDate\": 1812447660000,\n        \"commitmentRenewalPrice\": 10990,\n        \"commitmentRenewalBillingPlanType\": \"BILLED_UPFRONT\"\n    }\n}"
        },
        {
          "title": "Sheet to redeem an offer code",
          "language": "swift",
          "startTimeSeconds": 598,
          "code": "// Sheet to redeem an offer code\n\nstruct OfferCodeRedemption: View {\n    @State var presentingOfferCodeSheet: Bool = false\n\n    var body: some View {\n        Button(\"Redeem Offer Code\") {\n            presentingOfferCodeSheet = true\n        }\n        .offerCodeRedemption(options: [], isPresented: $presentingOfferCodeSheet) {result in\n            switch result {\n            case .success(let verificationResult):\n                switch verificationResult {\n                    // Verify the transaction, give the customer access to\n                    // the purchased content, and then finish the transaction\n                }\n            case .failure(let error):\n                // Handle error\n            }\n        }\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "In-App Purchase types",
          "url": "https://developer.apple.com/help/app-store-connect/reference/in-app-purchases-and-subscriptions/in-app-purchase-types",
          "type": "documentation",
          "description": "In-App Purchase types refer to the different types of In-App Purchase options available.",
          "sosumiURL": "https://sosumi.ai/help/app-store-connect/reference/in-app-purchases-and-subscriptions/in-app-purchase-types"
        },
        {
          "title": "Managing the life cycle of monthly subscriptions with a 12-month commitment",
          "url": "https://developer.apple.com/documentation/StoreKit/managing-lifecycle-of-monthly-subscriptions-with-a-12-month-commitment-",
          "type": "documentation",
          "description": "Handle renewals, cancellations, billing issues, refund requests, and price changes, and test subscriptions with a commitment plan.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit/managing-lifecycle-of-monthly-subscriptions-with-a-12-month-commitment-",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit/managing-lifecycle-of-monthly-subscriptions-with-a-12-month-commitment-.json"
        },
        {
          "title": "Supporting monthly subscriptions with a 12-month commitment",
          "url": "https://developer.apple.com/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment",
          "type": "documentation",
          "description": "Configure, merchandise, and grant access to a monthly subscription with a 12-month commitment.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment.json"
        },
        {
          "title": "App Store Server Notifications V2",
          "url": "https://developer.apple.com/documentation/AppStoreServerNotifications/App-Store-Server-Notifications-V2",
          "type": "documentation",
          "description": "Specify your secure server’s URL in App Store Connect to receive version 2 notifications.",
          "sosumiURL": "https://sosumi.ai/documentation/AppStoreServerNotifications/App-Store-Server-Notifications-V2",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppStoreServerNotifications/App-Store-Server-Notifications-V2.json"
        },
        {
          "title": "Supporting offer codes in your app",
          "url": "https://developer.apple.com/documentation/StoreKit/supporting-offer-codes-in-your-app",
          "type": "documentation",
          "description": "Enable customers to redeem offer codes through the App Store or within your app.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit/supporting-offer-codes-in-your-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit/supporting-offer-codes-in-your-app.json"
        },
        {
          "title": "Implementing a store in your app using the StoreKit API",
          "url": "https://developer.apple.com/documentation/StoreKit/implementing-a-store-in-your-app-using-the-storekit-api",
          "type": "samplecode",
          "description": "Offer In-App Purchases and manage entitlements using signed transactions and status information.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit/implementing-a-store-in-your-app-using-the-storekit-api",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit/implementing-a-store-in-your-app-using-the-storekit-api.json"
        }
      ],
      "path": "sessions/wwdc2026/210-what-s-new-in-apple-in-app-purchase/",
      "files": {
        "metadata": "sessions/wwdc2026/210-what-s-new-in-apple-in-app-purchase/metadata.json",
        "readme": "sessions/wwdc2026/210-what-s-new-in-apple-in-app-purchase/README.md",
        "transcript": "sessions/wwdc2026/210-what-s-new-in-apple-in-app-purchase/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/210-what-s-new-in-apple-in-app-purchase/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-212",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 212,
      "title": "Rev up your CarPlay app",
      "description": "Explore new features for your CarPlay audio, navigation, voice-based conversational apps, and more. Discover how to create CarPlay video apps so people can browse and watch their favorite videos in supported vehicles when parked. Learn how to integrate thumbnails, media information, and voice controls in your CarPlay app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/212",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/212",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS"
      ],
      "keywords": [
        "🚗",
        "🚙",
        "car",
        "instrument cluster"
      ],
      "topics": [
        "System Services"
      ],
      "primaryTopic": "System Services",
      "duration": 980,
      "hasTranscript": true,
      "transcriptWordCount": 2617,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/212/4/c594f5de-1012-4f5a-bad4-95ca200f5f58/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/212/4/c594f5de-1012-4f5a-bad4-95ca200f5f58/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/212/4/c594f5de-1012-4f5a-bad4-95ca200f5f58/downloads/wwdc2026-212_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/212/4/c594f5de-1012-4f5a-bad4-95ca200f5f58/downloads/wwdc2026-212_hd.mp4",
        "duration": 980
      },
      "codeSnippets": [
        {
          "title": "Disable the MiniPlayer",
          "language": "swift",
          "startTimeSeconds": 405,
          "code": "// Disable the MiniPlayer\n\nCPNowPlayingTemplate.shared.allowsMiniPlayer = false"
        },
        {
          "title": "Enable route sharing",
          "language": "swift",
          "startTimeSeconds": 906,
          "code": "// Enable route sharing\n\nfunc mapTemplateShouldProvideRouteSharing(_ mapTemplate: CPMapTemplate) -> Bool { true }"
        },
        {
          "title": "Disable route sharing for this trip",
          "language": "swift",
          "startTimeSeconds": 912,
          "code": "// Disable route sharing for this trip\n\ntrip.routeSegmentsAvailableForRegion = false"
        }
      ],
      "resources": [
        {
          "title": "CarPlay for developers",
          "url": "https://developer.apple.com/carplay",
          "type": "guide",
          "description": "Guide to CarPlay development",
          "sosumiURL": "https://sosumi.ai/carplay"
        }
      ],
      "path": "sessions/wwdc2026/212-rev-up-your-carplay-app/",
      "files": {
        "metadata": "sessions/wwdc2026/212-rev-up-your-carplay-app/metadata.json",
        "readme": "sessions/wwdc2026/212-rev-up-your-carplay-app/README.md",
        "transcript": "sessions/wwdc2026/212-rev-up-your-carplay-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/212-rev-up-your-carplay-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-213",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 213,
      "title": "Translate your app using agents in Xcode",
      "description": "Find out how Xcode and coding agents help you translate String Catalogs using the context of your app. We’ll walk through strategies for reviewing translated output and iterating on your localizations, so you can deliver a tailored experience to people around the world.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/213",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/213",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "🍁",
        "l10n"
      ],
      "topics": [
        "AI & Machine Learning",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 892,
      "hasTranscript": true,
      "transcriptWordCount": 2280,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/213/4/be1ee662-a447-4df4-89a5-5411447c0eeb/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/213/4/be1ee662-a447-4df4-89a5-5411447c0eeb/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/213/4/be1ee662-a447-4df4-89a5-5411447c0eeb/downloads/wwdc2026-213_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/213/4/be1ee662-a447-4df4-89a5-5411447c0eeb/downloads/wwdc2026-213_hd.mp4",
        "duration": 892
      },
      "codeSnippets": [
        {
          "title": "Localizing strings in SwiftUI",
          "language": "swift",
          "startTimeSeconds": 182,
          "code": "// Localizing strings in SwiftUI\n\nText(\"Hello, world!\", comment: \"A standard greeting\")"
        },
        {
          "title": "Localizing strings in SwiftUI with custom table name",
          "language": "swift",
          "startTimeSeconds": 191,
          "code": "// Localizing strings in SwiftUI with custom table name\n\nText(\"Hello, world!\", tableName: \"Greetings\", comment: \"A standard greeting\")"
        },
        {
          "title": "Localizing strings in SwiftUI",
          "language": "swift",
          "startTimeSeconds": 681,
          "code": "// Localizing strings in SwiftUI\n\nText(\"Hello, world!\", comment: \"A standard greeting\")"
        },
        {
          "title": "Localizing strings elsewhere",
          "language": "swift",
          "startTimeSeconds": 685,
          "code": "// Localizing strings elsewhere\n\nString(localized: \"Hello, world!\", comment: \"A standard greeting\")\n\nLocalizedStringResource(\"Hello World!\", bundle: #bundle, comment: \"A standard greeting\")"
        },
        {
          "title": "Field for machine-translated strings in the XLIFF",
          "language": "xml",
          "startTimeSeconds": 819,
          "code": "// Field for machine-translated strings in the XLIFF\n\n<trans-unit id=\"Grand Canyon\" xml:space=\"preserve\">\n  <source>Grand Canyon</source>\n  <target state=\"translated\" state-qualifier=\"leveraged-mt\">Grand Canyon</target>\n  <note>Name of the ‘Grand Canyon’ landmark.</note>\n</trans-unit>"
        }
      ],
      "resources": [
        {
          "title": "Localizing your app using agents",
          "url": "https://developer.apple.com/documentation/Xcode/localizing-your-app-using-agents",
          "type": "documentation",
          "description": "Use agentic coding tools to translate the strings in your app into multiple languages and regions.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/localizing-your-app-using-agents",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/localizing-your-app-using-agents.json"
        },
        {
          "title": "Expanding Your App to New Markets",
          "url": "https://developer.apple.com/localization/",
          "type": "guide",
          "description": "Internationalization and Localization. Expanding Your App to New Markets.",
          "sosumiURL": "https://sosumi.ai/localization/"
        }
      ],
      "path": "sessions/wwdc2026/213-translate-your-app-using-agents-in-xcode/",
      "files": {
        "metadata": "sessions/wwdc2026/213-translate-your-app-using-agents-in-xcode/metadata.json",
        "readme": "sessions/wwdc2026/213-translate-your-app-using-agents-in-xcode/README.md",
        "transcript": "sessions/wwdc2026/213-translate-your-app-using-agents-in-xcode/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/213-translate-your-app-using-agents-in-xcode/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-215",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 215,
      "title": "Get started with the HTML Model Element",
      "description": "Learn how the model element brings interactive 3D content to your websites — now on iOS, iPadOS, macOS, and visionOS. Discover tools for creating and optimizing 3D assets. Explore model element’s features and see how web standards are shaping the future of 3D on the web.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/215",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/215",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "css",
        "html",
        "javascript",
        "model",
        "spatial",
        "web"
      ],
      "topics": [
        "Spatial Computing",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 952,
      "hasTranscript": true,
      "transcriptWordCount": 2127,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/215/4/b7d159c9-ee29-45d9-80f5-87b6a1c90565/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/215/4/b7d159c9-ee29-45d9-80f5-87b6a1c90565/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/215/4/b7d159c9-ee29-45d9-80f5-87b6a1c90565/downloads/wwdc2026-215_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/215/4/b7d159c9-ee29-45d9-80f5-87b6a1c90565/downloads/wwdc2026-215_hd.mp4",
        "duration": 952
      },
      "codeSnippets": [
        {
          "title": "Load a model",
          "language": "xml",
          "startTimeSeconds": 259,
          "code": "<!-- Using the src attribute -->\n<model src=\"mallet.usdz\"></model>\n\n<!-- Using a <source> child for MIME type -->\n<model>\n    <source src=\"mallet.usdz\" type=\"model/vnd.usdz+zip\">\n</model>"
        },
        {
          "title": "Image fallback",
          "language": "xml",
          "startTimeSeconds": 279,
          "code": "<model id=\"mallet\" src=\"mallet.usdz\">\n    <img src=\"mallet.png\"\n         alt=\"Rubber mallet with wooden handle\">\n</model>"
        },
        {
          "title": "Ready promise",
          "language": "xml",
          "startTimeSeconds": 309,
          "code": "<model id=\"mallet\" src=\"mallet.usdz\"></model>\n\n<script>\n    const model = document.getElementById(\"mallet\");\n    model.ready.then(result => {\n        // Hide the loading indicator\n    }).catch(error => {\n        // Loading failed, show fallback\n    });\n</script>"
        },
        {
          "title": "Polyfill fallback",
          "language": "xml",
          "startTimeSeconds": 339,
          "code": "<script type=\"module\">\n    if (!window.HTMLModelElement) {\n        import(\"model-element-polyfill.js\").then(() => {\n            // Polyfill ready to use\n        });\n    }\n</script>"
        },
        {
          "title": "Model background",
          "language": "xml",
          "startTimeSeconds": 373,
          "code": "<model id=\"mallet\" src=\"mallet.usdz\"></model>\n<style>\n    model {\n        background-color: #f4f1ec;\n    }\n</style>"
        },
        {
          "title": "Stage mode",
          "language": "xml",
          "startTimeSeconds": 407,
          "code": "<model id=\"mallet\"\n       src=\"mallet.usdz\"\n       stagemode=\"orbit\">\n</model>"
        },
        {
          "title": "Custom transforms",
          "language": "xml",
          "startTimeSeconds": 451,
          "code": "<model id=\"boot\" src=\"boot.usdz\"></model>\n<button id=\"button-side\">Side</button>\n<button id=\"button-reset\">Reset</button>\n\n<script>\n    const model = document.getElementById(\"boot\");\n    const initialTransform = model.entityTransform;\n\n    document.getElementById(\"button-side\")\n            .addEventListener(\"click\", () => {\n        const transform = new DOMMatrix();\n        transform.rotateSelf(0, 135, 0);\n        model.entityTransform = transform;\n    });\n\n    document.getElementById(\"button-reset\")\n            .addEventListener(\"click\", () => {\n        model.entityTransform = initialTransform;\n    });\n</script>"
        },
        {
          "title": "Transition animation",
          "language": "xml",
          "startTimeSeconds": 515,
          "code": "<script>\n    const model = document.getElementById(\"boot\");\n    const duration = 500;\n    let currentAngle = 0;\n    let animationId = null;\n\n    function animateTo(targetAngle) {\n        if (animationId) cancelAnimationFrame(animationId);\n        const startAngle = currentAngle;\n        const startTime = performance.now();\n\n        function step(now) {\n            const progress = Math.min((now - startTime) / duration, 1);\n            const ease = 1 - Math.pow(1 - progress, 3);\n            currentAngle = startAngle + (targetAngle - startAngle) * ease;\n            model.entityTransform = new DOMMatrix().rotateSelf(0, currentAngle, 0);\n            if (progress < 1) animationId = requestAnimationFrame(step);\n        }\n\n        requestAnimationFrame(step);\n    }\n\n    document.getElementById(\"button-side\").addEventListener(\"click\", () => animateTo(135));\n    document.getElementById(\"button-reset\").addEventListener(\"click\", () => animateTo(0));\n</script>"
        },
        {
          "title": "Animation playback",
          "language": "xml",
          "startTimeSeconds": 607,
          "code": "<model id=\"bottle\" src=\"bottle.usdz\"></model>\n<button id=\"button-play\" onclick=\"play(5)\">\n    Play\n</button>\n<button id=\"button-reverse\" onclick=\"play(-5)\">\n    Reverse\n</button>\n\n<script>\n    const model = document.getElementById(\"bottle\");\n\n    function play(rate) {\n        model.playbackRate = rate;\n        model.play();\n    }\n</script>"
        },
        {
          "title": "AR Quick Look",
          "language": "xml",
          "startTimeSeconds": 666,
          "code": "<a rel=\"ar\" href=\"bottle.usdz\">\n    <model id=\"boot\" src=\"bottle.usdz\"></model>\n</a>"
        }
      ],
      "resources": [
        {
          "title": "WebKit.org - Theater Ticket Sales immersive website environment demo for Apple Vision Pro",
          "url": "https://webkit.org/demos/model-demos/ticket-sales.html",
          "type": "documentation",
          "description": "Test drive an example ticket sales website where you can explore the view of the stage from any seat you choose. Then, on Apple Vision Pro explore the view from inside the theater with the immersive website experience. Use Web Inspector to explore the code that makes this experience possible with Safari 27.0 in visionOS."
        },
        {
          "title": "The HTML model element in Apple Vision Pro",
          "url": "https://webkit.org/blog/17118/a-step-into-the-spatial-web-the-html-model-element-in-apple-vision-pro/",
          "type": "documentation",
          "description": "visionOS 26 brings a major update to an important building block for the spatial web: The HTML model element is enabled by default, with a new API that’s ready to use today."
        },
        {
          "title": "GitHub: model element samples",
          "url": "https://immersive-web.github.io/model-element-samples/",
          "type": "samplecode",
          "description": "Various examples of HTML model element."
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "AOUSD – Alliance for OpenUSD",
          "url": "https://aousd.org",
          "type": "documentation",
          "description": "Alliance for OpenUSD"
        },
        {
          "title": "w3.org – Model element",
          "url": "https://immersive-web.github.io/model-element",
          "type": "documentation",
          "description": "w3.org – Model element"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/215-get-started-with-the-html-model-element/",
      "files": {
        "metadata": "sessions/wwdc2026/215-get-started-with-the-html-model-element/metadata.json",
        "readme": "sessions/wwdc2026/215-get-started-with-the-html-model-element/README.md",
        "transcript": "sessions/wwdc2026/215-get-started-with-the-html-model-element/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/215-get-started-with-the-html-model-element/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-216",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 216,
      "title": "Create web extensions for Safari",
      "description": "Get started with Safari web extensions by building and testing one from the ground up — no Xcode required. Explore how content blocking, page modification, native messaging, and the permissions mode work together to create a powerful, privacy-preserving browsing experience across platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/216",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/216",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "app store connect",
        "css",
        "html",
        "javascript",
        "json",
        "safari",
        "web extensions"
      ],
      "topics": [
        "App Store, Distribution & Marketing",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 1602,
      "hasTranscript": true,
      "transcriptWordCount": 3967,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/216/5/4fceecc8-1e28-465c-b894-fd0d03067c18/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/216/5/4fceecc8-1e28-465c-b894-fd0d03067c18/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/216/5/4fceecc8-1e28-465c-b894-fd0d03067c18/downloads/wwdc2026-216_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/216/5/4fceecc8-1e28-465c-b894-fd0d03067c18/downloads/wwdc2026-216_hd.mp4",
        "duration": 1602
      },
      "codeSnippets": [
        {
          "title": "Manifest file",
          "language": "json",
          "startTimeSeconds": 224,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0\n}"
        },
        {
          "title": "Adding an extension icon",
          "language": "json",
          "startTimeSeconds": 269,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    }\n}"
        },
        {
          "title": "Adding an action button",
          "language": "json",
          "startTimeSeconds": 330,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"action\": {\n        \"default_popup\": \"popup.html\"\n    }\n}"
        },
        {
          "title": "Adding custom UI to your extension",
          "language": "json",
          "startTimeSeconds": 377,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    }\n}"
        },
        {
          "title": "Including the UI in the extension manifest",
          "language": "json",
          "startTimeSeconds": 390,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    }\n}"
        },
        {
          "title": "Hello World",
          "language": "xml",
          "startTimeSeconds": 400,
          "code": "<!DOCTYPE html>\n<html>\n    <body>\n    <p>Hello World</p>\n    </body>\n</html>"
        },
        {
          "title": "Adding declarativeNetRequest permission",
          "language": "json",
          "startTimeSeconds": 498,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \"declarativeNetRequest\" ]\n}"
        },
        {
          "title": "Blocking network requests",
          "language": "javascript",
          "startTimeSeconds": 502,
          "code": "// block rule\n{\n    id: 1,\n    priority: 1,\n    action: {\n        type: \"block\"\n    },\n    condition: {\n        urlFilter: \"||webkit.org\",\n        resourceTypes: [ \"main_frame\" ]\n    }\n}"
        },
        {
          "title": "Modifying network requests",
          "language": "json",
          "startTimeSeconds": 521,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \"declarativeNetRequest\" ],\n\n    \"declarativeNetRequest\": {\n        \"rule_resources\": [\n            {\n                \"id\": \"ruleset_id\",\n                \"enabled\": true,\n                \"path\": \"rules.json\"\n            }\n        ]\n    }\n}"
        },
        {
          "title": "Updating dynamic rules",
          "language": "javascript",
          "startTimeSeconds": 530,
          "code": "await browser.declarativeNetRequest.updateDynamicRules({\n    addRules: [ rule ]\n})"
        },
        {
          "title": "Wiring up the static declarativeNetRequest rules",
          "language": "json",
          "startTimeSeconds": 559,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \n      \"declarativeNetRequest\" \n    ]\n}"
        },
        {
          "title": "Adding block rules dynamically",
          "language": "javascript",
          "startTimeSeconds": 580,
          "code": "// A helper function to map the host to the declarative net request rule ID.\nexport function hostToRuleID(host) {\n\tlet hash = 0;\n\tfor (let i = 0; i < host.length; i++) {\n\t\thash = ((hash << 5) + hash) + host.charCodeAt(i);\n\t\thash |= 0;\n\t}\n\treturn Math.abs(hash) || 1;\n}\n\nfunction createBlockRule(host) {\n\treturn {\n\t\tid: hostToRuleID(host),\n\t\tpriority: 1,\n\t\taction: {\n\t\t\ttype: \"block\"\n\t\t},\n\t\tcondition: {\n\t\t\turlFilter: `||${host}`,\n\t\t\tresourceTypes: [\"main_frame\"]\n\t\t}\n\t}\n}\n\nexport async function createRules(hosts) {\n\ttry {\n\t\tawait browser.declarativeNetRequest.updateDynamicRules({\n\t\t\taddRules: hosts.map(createBlockRule)\n\t\t})\n\t} catch {\n\t\tconsole.log(\"Failed to create declarative net request rules\")\n\t}\n}"
        },
        {
          "title": "Handling adding hosts to the settings",
          "language": "javascript",
          "startTimeSeconds": 610,
          "code": "import { createRules, removeAllRules, removeRule } from './rules.js'\n\nexport async function addHost(host, blockingMode) {\n  if (!host)\n    return\n\n  if (blockingMode === \"full\")\n    await createRules([host])\n}"
        },
        {
          "title": "Redirecting network requests",
          "language": "javascript",
          "startTimeSeconds": 648,
          "code": "{\n    id: 1,\n    priority: 1,\n    action: {\n        type: \"redirect\",\n        redirect: {\n            extensionPath: \"/blocked.html\"\n        }\n    },\n    condition: {\n        urlFilter: \"||webkit.org\",\n        resourceTypes: [ \"main_frame\" ]\n    }\n}"
        },
        {
          "title": "Declaring optional host permissions",
          "language": "json",
          "startTimeSeconds": 677,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \"declarativeNetRequestWithHostAccess\" ],\n    \"optional_host_permissions\": [ \"https://webkit.org/*\" ]\n\n}"
        },
        {
          "title": "Declaring optional host permissions for all sites",
          "language": "json",
          "startTimeSeconds": 714,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \"declarativeNetRequestWithHostAccess\" ],\n    \"optional_host_permissions\": [ \"*://*/*\" ]\n\n}"
        },
        {
          "title": "Add the redirect rule",
          "language": "javascript",
          "startTimeSeconds": 792,
          "code": "// A helper function to map the host to the declarative net request rule ID.\nexport function hostToRuleID(host) {\n\tlet hash = 0;\n\tfor (let i = 0; i < host.length; i++) {\n\t\thash = ((hash << 5) + hash) + host.charCodeAt(i);\n\t\thash |= 0;\n\t}\n\treturn Math.abs(hash) || 1;\n}\n\nfunction createBlockRule(host) {\n\treturn {\n\t\tid: hostToRuleID(host),\n\t\tpriority: 1,\n\t\taction: {\n\t\t\ttype: \"block\"\n\t\t},\n\t\tcondition: {\n\t\t\turlFilter: `||${host}`,\n\t\t\tresourceTypes: [\"main_frame\"]\n\t\t}\n\t}\n}\n\nfunction createRedirectRule(host) {\n\treturn {\n\t\tid: hostToRuleID(host),\n\t\tpriority: 1,\n\t\taction: {\n\t\t\ttype: \"redirect\",\n\t\t\tredirect: { extensionPath: \"/blocked.html\" }\n\t\t},\n\t\tcondition: {\n\t\t\turlFilter: `||${host}`,\n\t\t\tresourceTypes: [\"main_frame\"]\n\t\t}\n\t}\n}\n\nexport async function createRules(hosts) {\n\ttry {\n\t\tawait browser.declarativeNetRequest.updateDynamicRules({\n\t\t\taddRules: hosts.map(createRedirectRule)\n\t\t})\n\t} catch {\n\t\tconsole.log(\"Failed to create declarative net request rules\")\n\t}\n}"
        },
        {
          "title": "Dynamically ask for host permissions",
          "language": "javascript",
          "startTimeSeconds": 822,
          "code": "import { createRules, removeAllRules, removeRule } from './rules.js'\n\nexport async function addHost(host, blockingMode) {\n  if (!host)\n    return\n\n  const granted = await browser.permissions.request({\n    origins: [`*://${host}/*`, `*://*.${host}/*`]\n  })\n  if (!granted)\n    return\n\n  if (blockingMode === \"full\")\n    await createRules([host])\n}"
        },
        {
          "title": "Defining content scripts",
          "language": "json",
          "startTimeSeconds": 895,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_ui\": {\n        \"page\": \"options.html\"\n    },\n\n    \"permissions\": [ \"declarativeNetRequestWithHostAccess\" ],\n    \"optional_host_permissions\": [ \"*://*/*\" ],\n\n    \"content_scripts\": [\n        {\n            \"js\": [ \"content.js\" ],\n            \"css\": [ \"content.css\" ],\n            \"matches\": [ \"*://*.webkit.org/*\" ]\n        }\n    ]\n}"
        },
        {
          "title": "Dynamically registering content scripts",
          "language": "javascript",
          "startTimeSeconds": 913,
          "code": "let script = {\n    id: \"id\",\n    js: [ \"content.js\" ],\n    css: [ \"content.css\" ],\n    matches: [ \"*://*.webkit.org/*\" ],\n    persistAcrossSessions: true\n}\n\nawait browser.scripting.registerContentScripts([ script ])"
        },
        {
          "title": "Adding the scripting permission",
          "language": "json",
          "startTimeSeconds": 931,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_page\": \"options.html\",\n\n    \"permissions\": [\n        \"declarativeNetRequestWithHostAccess\",\n        \"scripting\"\n    ],\n\n    \"optional_host_permissions\": [ \"*://*/*\" ]\n}"
        },
        {
          "title": "Registering content scripts",
          "language": "javascript",
          "startTimeSeconds": 941,
          "code": "// scripting.js\n\nfunction contentScript(host) {\n    return {\n        id: `cs-${host}`,\n        js: [ \"content.js\" ],\n        css: [ \"content.css\" ],\n        matches: [ `*://${host}/*`, `*://*.${host}/*` ],\n        persistAcrossSessions: true\n    }\n}\n\nexport function registerScripts(hosts) {\n    const scripts = hosts.map(contentScript)\n    try {\n        await browser.scripting.registerContentScripts(scripts)\n    } catch {\n        console.log(\"Failed to register content scripts\")\n    }\n}"
        },
        {
          "title": "Adding a host",
          "language": "javascript",
          "startTimeSeconds": 962,
          "code": "// host.js\n\nexport async function addHost(host, blockMode) {\n    if (!host)\n        return\n\n    const granted = await browser.permissions.request({\n        origins: [`*://${host}/*`, `*://*.${host}/*`]\n    })\n\n    if (!granted)\n        return\n\n    if (blockingMode === \"full\")\n        await createRules([ host ])\n\n    await registerScripts([ host ])\n}"
        },
        {
          "title": "Web extensions storage APIs",
          "language": "javascript",
          "startTimeSeconds": 1026,
          "code": "await browser.session.storage.set({\n  key: value\n})\n\nawait browser.local.storage.set({\n  key: value\n})"
        },
        {
          "title": "Adding storage permission to the web extension manifest.json",
          "language": "json",
          "startTimeSeconds": 1041,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_page\": \"options.html\",\n\n    \"permissions\": [\n        \"declarativeNetRequestWithHostAccess\",\n        \"scripting\",\n        \"storage\"\n    ],\n\n    \"optional_host_permissions\": [ \"*://*/*\" ]\n}"
        },
        {
          "title": "Saving data with storage",
          "language": "javascript",
          "startTimeSeconds": 1050,
          "code": "// storage.js\n\nexport async function updateHosts(hosts) {\n    await browser.storage.local.set({ hosts: hosts })\n}\n\nexport async function getHosts() {\n    const { hosts = [] } = await browser.storage.local.get(\"hosts\")\n    return hosts\n}\n\nexport async function saveBlockMode(mode) {\n    await browser.storage.local.set({ blockMode: mode })\n}\n\nexport async function getBlockMode() {\n    const { blockMode = \"full\" } = await browser.storage.local.get(\"blockMode\")\n    return blockMode\n}"
        },
        {
          "title": "Persisting hosts to storage",
          "language": "javascript",
          "startTimeSeconds": 1061,
          "code": "// host.js\n\nexport async function addHost(host, blockMode) {\n    if (!host)\n        return\n\n    const granted = await browser.permissions.request({\n        origins: [`*://${host}/*`, `*://*.${host}/*`]\n    })\n\n    if (!granted)\n        return\n\n    if (blockingMode === \"full\")\n        await createRules([ host ])\n\n    await registerScripts([ host ])\n\n    let existingHosts = await getHosts()\n    let updatedHosts = [ ...existingHosts, host ]\n    await updateHosts(updatedHosts)\n}"
        },
        {
          "title": "Reading from storage",
          "language": "javascript",
          "startTimeSeconds": 1071,
          "code": "// options.js\n\nlet existingHosts = await getHosts()\nlet blockMode = await getBlockMode()\n\ndisplayBlocklist(existingHosts)"
        },
        {
          "title": "Switching block modes",
          "language": "javascript",
          "startTimeSeconds": 1080,
          "code": "// host.js\n\nexport async function userDidSwitchMode(blockMode) {\n    await saveBlockMode(blockMode)\n\n    if (blockMode === \"full\") {\n        let hosts = await getHosts()\n        await createRules(hosts)\n    } else\n        await removeAllRules()\n}"
        },
        {
          "title": "Adding a background script",
          "language": "json",
          "startTimeSeconds": 1141,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_page\": \"options.html\",\n\n    \"permissions\": [\n        \"declarativeNetRequestWithHostAccess\",\n        \"scripting\",\n        \"storage\"\n    ],\n\n    \"optional_host_permissions\": [ \"*://*/*\" ],\n\n    \"background\": {\n        \"scripts\": [ \"background.js\" ],\n        \"type\": \"module\"\n    }\n}"
        },
        {
          "title": "Background script",
          "language": "javascript",
          "startTimeSeconds": 1179,
          "code": "// background.js\n\nimport { registerScripts } from \"./utilities/scripting.js\"\nimport { getHosts } from \"./utilities/storage.js\"\n\nbrowser.runtime.onInstalled.addListener(async (details) => {\n    if (details.reason !== \"update\")\n        return\n\n    const hosts = await getHosts()\n    await registerScripts(hosts)\n})"
        },
        {
          "title": "Package your web extension into an app for Xcode",
          "language": "bash",
          "startTimeSeconds": 1369,
          "code": "xcrun safari-web-extension-packager --copy-resources /path/to/ShinyOnTrack"
        },
        {
          "title": "Adding the nativeMessaging permission",
          "language": "json",
          "startTimeSeconds": 1412,
          "code": "{\n    \"manifest_version\": 3,\n    \"name\": \"Shiny OnTrack\",\n    \"description\": \"Stay on track while you browse the web\",\n    \"version\": 1.0,\n\n    \"icons\": {\n        \"512\": \"images/icon.svg\"\n    },\n\n    \"options_page\": \"options.html\",\n\n    \"permissions\": [\n        \"declarativeNetRequestWithHostAccess\",\n        \"scripting\",\n        \"storage\",\n        \"nativeMessaging\"\n    ],\n\n    \"optional_host_permissions\": [ \"*://*/*\" ],\n\n    \"background\": {\n        \"scripts\": [ \"background.js\" ],\n        \"type\": \"module\"\n    }\n}"
        },
        {
          "title": "Sending a native message",
          "language": "javascript",
          "startTimeSeconds": 1420,
          "code": "// background.js\n\nimport { registerScripts } from \"./utilities/scripting.js\"\nimport { getHosts } from \"./utilities/storage.js\"\n\nbrowser.runtime.onInstalled.addListener(async (details) => {\n    if (details.reason !== \"update\")\n        return\n\n    const hosts = await getHosts()\n    await registerScripts(hosts)\n})\n\nexport async function requestBioAuth() {\n    const message = { message: \"requestBioAuth\" }\n    const response = await browser.runtime.sendNativeMessage(message)\n    return response?.success\n}"
        },
        {
          "title": "Handling native messages",
          "language": "swift",
          "startTimeSeconds": 1435,
          "code": "// SafariWebExtensionHandler.swift\n\nimport LocalAuthentication\n\nclass SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {\n    func beginRequest(with context: NSExtensionContext) {\n        let request = context.inputItems.first as? NSExtensionItem\n        let message = request?.userInfo?[SFExtensionMessageKey] as? [String: Any]\n\n        if message?[\"message\"] as? String == \"requestBioAuth\" {\n            let lAContext = LAContext()\n            Task {\n                do {\n                    let success = try await lAContext.evaluatePolicy(\n                        .deviceOwnerAuthenticationWithBiometrics,\n                        localizedReason: \"Authenticate to change blocked sites\"\n                    )\n                    self.reply(context: context, success: success)\n                } catch {\n                    self.reply(context: context, success: false)\n                }\n            }\n        }\n    }\n}"
        },
        {
          "title": "Replying to a native message",
          "language": "swift",
          "startTimeSeconds": 1465,
          "code": "// SafariWebExtensionHandler.swift\n\nimport LocalAuthentication\n\nclass SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {\n    func beginRequest(with context: NSExtensionContext) {\n        let request = context.inputItems.first as? NSExtensionItem\n        let message = request?.userInfo?[SFExtensionMessageKey] as? [String: Any]\n\n        if message?[\"message\"] as? String == \"requestBioAuth\" {\n            let lAContext = LAContext()\n            Task {\n                do {\n                    let success = try await lAContext.evaluatePolicy(\n                        .deviceOwnerAuthenticationWithBiometrics,\n                        localizedReason: \"Authenticate to change blocked sites\"\n                    )\n                    self.reply(context: context, success: success)\n                } catch {\n                    self.reply(context: context, success: false)\n                }\n            }\n        }\n    }\n\n    private func reply(context: NSExtensionContext, success: Bool) {\n        let response = NSExtensionItem()\n        response.userInfo = [SFExtensionMessageKey: [\"success\": success]]\n        context.completeRequest(returningItems: [response], completionHandler: nil)\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "w3.org — W3C WebExtensions Community Group",
          "url": "https://www.w3.org/community/webextensions/",
          "type": "documentation",
          "description": "The WebExtensions Community Group specifies the model, permissions, and common core of APIs for web browser extensions."
        },
        {
          "title": "Packaging and distributing Safari Web Extensions with App Store Connect",
          "url": "https://developer.apple.com/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect",
          "type": "documentation",
          "description": "Upload and distribute Safari Web Extensions without using a Mac or Xcode.",
          "sosumiURL": "https://sosumi.ai/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SafariServices/packaging-and-distributing-safari-web-extensions-with-app-store-connect.json"
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MDN Web Docs - Web Extensions API",
          "url": "https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API",
          "type": "documentation",
          "description": "JavaScript APIs for web extensions."
        }
      ],
      "path": "sessions/wwdc2026/216-create-web-extensions-for-safari/",
      "files": {
        "metadata": "sessions/wwdc2026/216-create-web-extensions-for-safari/metadata.json",
        "readme": "sessions/wwdc2026/216-create-web-extensions-for-safari/README.md",
        "transcript": "sessions/wwdc2026/216-create-web-extensions-for-safari/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/216-create-web-extensions-for-safari/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-219",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 219,
      "title": "Enhance the accessibility of your reading app",
      "description": "Learn how to create robust reading experiences for VoiceOver, Speak Screen, and more. Find out how to provide intuitive text selection, clear navigation between lines and paragraphs, and continuous reading across individual elements and multiple pages.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/219",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/219",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks",
        "Accessibility & Inclusion"
      ],
      "primaryTopic": "Accessibility & Inclusion",
      "duration": 1200,
      "hasTranscript": true,
      "transcriptWordCount": 2752,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/219/4/da70a3a7-e193-4513-904f-991788c1fa81/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/219/4/da70a3a7-e193-4513-904f-991788c1fa81/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/219/4/da70a3a7-e193-4513-904f-991788c1fa81/downloads/wwdc2026-219_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/219/4/da70a3a7-e193-4513-904f-991788c1fa81/downloads/wwdc2026-219_hd.mp4",
        "duration": 1200
      },
      "codeSnippets": [
        {
          "title": "Link text elements together with navigation APIs",
          "language": "swift",
          "startTimeSeconds": 449,
          "code": "// Link text elements together with navigation APIs\n\nimport UIKit\n\nclass TravelGuidePageController: UIViewController {\n\n    var paragraphs: [TravelGuideParagraph]\n\n    func configureNavigationElements() {\n        for (index, paragraph) in paragraphs.enumerated() {\n            if index + 1 < paragraphs.count {\n                paragraph.accessibilityNextTextNavigationElement = paragraphs[index + 1]\n            }\n            if index - 1 >= 0 {\n                paragraph.accessibilityPreviousTextNavigationElement = paragraphs[index - 1]\n            }\n        }\n    }\n}"
        },
        {
          "title": "Link text elements together with a linked group",
          "language": "swift",
          "startTimeSeconds": 479,
          "code": "// Link text elements together with a linked group\n\nimport SwiftUI\n\nstruct PageView : View {\n    @Namespace private var pageNamespace\n    var paragraphs: [String\n    var pageNumber: Int\n\n    var body: some View {\n        Text(paragraphs[0])\n            .textSelection(.enabled)\n            .accessibilityLinkedGroup(id: pageNumber, in: pageNamespace)\n\n        Text(paragraphs[1])\n            .textSelection(.enabled)\n            .accessibilityLinkedGroup(id: pageNumber, in: pageNamespace)\n    }\n}"
        },
        {
          "title": "Turn pages automatically after reading",
          "language": "swift",
          "startTimeSeconds": 590,
          "code": "// Turn pages automatically after reading\n\nimport UIKit\n\nclass TravelGuidePageController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        self.lastParagraphView.accessibilityTraits.insert(.causesPageTurn)\n    }\n\n    override func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool {\n        moveToPage(direction)\n        var scrollString = \"Page \\(currentPage) of \\(pages.count)\"\n        UIAccessibility.post(notification: .pageScrolled, argument: scrollString)\n        return true\n    }\n}"
        },
        {
          "title": "Add actions to the editor rotor",
          "language": "swift",
          "startTimeSeconds": 705,
          "code": "// Add actions to the editor rotor\n\nimport UIKit\n\nclass TravelGuideParagraph: UITextView {\n\n    override var accessibilityCustomActions: [UIAccessibilityCustomAction]? {\n        get {\n            let saveAction = UIAccessibilityCustomAction(name: \"Save Recommendation\") { _ in\n                self.saveRecommendation()\n            }\n            saveAction.category = UIAccessibilityCustomAction.editCategory\n            return (super.accessibilityCustomActions ?? []) + [saveAction]\n        }\n        set { }\n    }\n\n    private func saveRecommendation() -> Bool {\n        ...\n        return true\n    }\n}"
        },
        {
          "title": "Adopt UITextInput",
          "language": "swift",
          "startTimeSeconds": 970,
          "code": "// Adopt UITextInput\n\nimport UIKit\n\nclass ScannedPage: UIView, UITextInput {\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        let interaction = UITextInteraction(for: .nonEditable)\n        interaction.textInput = self\n        addInteraction(interaction)\n    }\n\n    func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {\n        var rects: [UITextSelectionRect] = []\n\n        let startLine = lineIndex(for: range.start)\n        let endLine = lineIndex(for: range.end)\n\n        for line in startLine...endLine {\n            let rect = selectionRectFromImage(for: range, in: line)\n            rects.append(rect)\n        }\n\n        return rects\n    }\n\n    func text(in range: UITextRange) -> String? {\n        let nsRange = nsRange(from: range)\n        guard let range = Range(nsRange, in: scannedText) else {\n            return nil\n        }\n        return String(scannedText[range])\n    }\n\n    var tokenizer: any UITextInputTokenizer { CustomHandwritingTokenizer(textInput: self) }\n\n    weak var inputDelegate: UITextInputDelegate?\n\n      var selectedTextRange: UITextRange? {\n        // Update visuals when assistive technologies change selection\n        willSet { inputDelegate?.selectionWillChange(self) }\n        didSet { inputDelegate?.selectionDidChange(self) }\n    }\n\n}"
        }
      ],
      "resources": [
        {
          "title": "accessibilityNextTextNavigationElement",
          "url": "https://developer.apple.com/documentation/ObjectiveC/NSObject-swift.class/accessibilityNextTextNavigationElement",
          "type": "documentation",
          "description": "An accessibility element that contains text that semantically follows this element’s text.",
          "sosumiURL": "https://sosumi.ai/documentation/ObjectiveC/NSObject-swift.class/accessibilityNextTextNavigationElement",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/ObjectiveC/NSObject-swift.class/accessibilityNextTextNavigationElement.json"
        },
        {
          "title": "editCategory",
          "url": "https://developer.apple.com/documentation/UIKit/UIAccessibilityCustomAction/editCategory",
          "type": "documentation",
          "description": "A constant that an app specifies through the category property on a UIKit accessibility custom action.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/UIAccessibilityCustomAction/editCategory",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/UIAccessibilityCustomAction/editCategory.json"
        },
        {
          "title": "accessibilityLinkedGroup(id:in:)",
          "url": "https://developer.apple.com/documentation/SwiftUI/View/accessibilityLinkedGroup(id:in:)",
          "type": "documentation",
          "description": "Links multiple accessibility elements so that the user can quickly",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/View/accessibilityLinkedGroup(id:in:)",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/View/accessibilityLinkedGroup(id:in:).json"
        },
        {
          "title": "causesPageTurn",
          "url": "https://developer.apple.com/documentation/SwiftUI/AccessibilityTraits/causesPageTurn",
          "type": "documentation",
          "description": "The accessibility element causes an automatic page turn when VoiceOver",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/AccessibilityTraits/causesPageTurn",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/AccessibilityTraits/causesPageTurn.json"
        },
        {
          "title": "UITextInput",
          "url": "https://developer.apple.com/documentation/UIKit/UITextInput",
          "type": "documentation",
          "description": "A set of methods for interacting with the text input system and enabling features in documents.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/UITextInput",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/UITextInput.json"
        },
        {
          "title": "Accessibility for UIKit",
          "url": "https://developer.apple.com/documentation/UIKit/accessibility-for-uikit",
          "type": "documentation",
          "description": "Make your UIKit apps accessible to everyone who uses iOS and tvOS.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/accessibility-for-uikit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/accessibility-for-uikit.json"
        }
      ],
      "path": "sessions/wwdc2026/219-enhance-the-accessibility-of-your-reading-app/",
      "files": {
        "metadata": "sessions/wwdc2026/219-enhance-the-accessibility-of-your-reading-app/metadata.json",
        "readme": "sessions/wwdc2026/219-enhance-the-accessibility-of-your-reading-app/README.md",
        "transcript": "sessions/wwdc2026/219-enhance-the-accessibility-of-your-reading-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/219-enhance-the-accessibility-of-your-reading-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-220",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 220,
      "title": "Refine accessibility for custom controls",
      "description": "Unlock the full potential of your app’s interactive elements by making them accessible to everyone. We’ll break down how people understand and use controls with VoiceOver and other assistive technologies, exploring a variety of input methods like actions, the passthrough gesture, and direct touch. Join us for an in-depth exploration of several example controls as we refine and elevate the accessibility experience in each one.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/220",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/220",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks",
        "Accessibility & Inclusion"
      ],
      "primaryTopic": "Accessibility & Inclusion",
      "duration": 985,
      "hasTranscript": true,
      "transcriptWordCount": 2192,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/downloads/wwdc2026-220_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/downloads/wwdc2026-220_hd.mp4",
        "duration": 985
      },
      "codeSnippets": [
        {
          "title": "Improve accessibility for coffee dispenser",
          "language": "swift",
          "startTimeSeconds": 301,
          "code": "// Improve accessibility for coffee dispenser\n\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n    @State var coffee: Double = 0.0\n    var body: some View {\n        CoffeeSlider(value: coffee)\n            .accessibilityElement()\n            .accessibilityLabel(\"Coffee Dispenser\")\n            .accessibilityValue(\"\\(Int(coffee)) ounces\")\n            .accessibilityAddTraits(.adjustable)\n            .accessibilityAdjustableAction { direction in\n                switch direction {\n                case .increment:\n                    increaseCoffeeAmount()\n                case .decrement:\n                    decreaseCoffeeAmount()\n                }\n            }\n    }\n}"
        },
        {
          "title": "Set the accessibility activation point",
          "language": "swift",
          "startTimeSeconds": 425,
          "code": "// Set the accessibility activation point\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n    @State var coffee: Double = 0.0\n\n    var body: some View {\n        CoffeeSlider(value: coffee)\n            .accessibilityActivationPoint(\n                UnitPoint(x: 0.5, y: 1 - coffee)\n            )\n    }\n}"
        },
        {
          "title": "Post accessibility announcements",
          "language": "swift",
          "startTimeSeconds": 447,
          "code": "// Post accessibility announcements \n\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n    @State var coffee: Double = 0.0\n\n    var body: some View {\n        CoffeeSlider(value: coffee)\n            // ...\n            .onChange(of: coffee) { _, newValue in\n                if sufficientTimeSinceLastAnnouncement() && valueHasChanged() {\n                    cacheLastSpokenValue(newValue)\n                    AccessibilityNotification\n                        .Announcement(newValue)\n                        .post()\n                }\n            }\n    }\n}"
        },
        {
          "title": "Add custom actions",
          "language": "swift",
          "startTimeSeconds": 613,
          "code": "// Add custom actions\n\nimport SwiftUI\n\nstruct EqualizerView: View {\n    var body: some View {\n        EqualizerPad()\n            .accessibilityActions(\"Move Up\") {\n                increaseY(by: 10)\n            }\n            .accessibilityActions(\"Move Right\") {\n                increaseX(by: 10)\n            }\n            .accessibilityActions(\"Move Down\") {\n                decreaseY(by: 10)\n            }\n            .accessibilityActions(\"Move Left\") {\n                decreaseX(by: 10)\n            }\n     }\n }"
        },
        {
          "title": "Customize accessibility for the interactive cat surface",
          "language": "swift",
          "startTimeSeconds": 767,
          "code": "// Customize accessibility for the interactive cat surface\n\nimport SwiftUI\n\nstruct VirtualCat: View {\n    var cat: CatModel\n    var body: some View {\n        InteractiveCatSurface()\n            .accessibilityLabel(\"Virtual Cat\")\n            .accessibilityValue(cat.currentReaction.description)\n            .accessibilityDirectTouch([.requiresActivation])\n     }\n}"
        }
      ],
      "resources": [
        {
          "title": "Accessible controls",
          "url": "https://developer.apple.com/documentation/SwiftUI/Accessible-controls",
          "type": "documentation",
          "description": "Improve access to actions that your app can undertake.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessible-controls",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessible-controls.json"
        },
        {
          "title": "Accessible descriptions",
          "url": "https://developer.apple.com/documentation/SwiftUI/Accessible-descriptions",
          "type": "documentation",
          "description": "Describe interface elements to help people understand what they represent.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessible-descriptions",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessible-descriptions.json"
        },
        {
          "title": "Accessibility fundamentals",
          "url": "https://developer.apple.com/documentation/SwiftUI/Accessibility-fundamentals",
          "type": "documentation",
          "description": "Make your SwiftUI apps accessible to everyone, including people with",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessibility-fundamentals",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessibility-fundamentals.json"
        },
        {
          "title": "Creating accessible views",
          "url": "https://developer.apple.com/documentation/SwiftUI/creating-accessible-views",
          "type": "samplecode",
          "description": "Make your app accessible to everyone by applying accessibility modifiers to your SwiftUI views.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/creating-accessible-views",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/creating-accessible-views.json"
        }
      ],
      "path": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/",
      "files": {
        "metadata": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/metadata.json",
        "readme": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/README.md",
        "transcript": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-221",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 221,
      "title": "Prepare your tvOS apps for Dynamic Type",
      "description": "Dynamic Type empowers people to comfortably read and interact with your app by letting them choose the text size that works best for them. You’ll learn how to get your app ready for Dynamic Type on tvOS through practical techniques for implementing font scaling and adapting your layouts for larger content. You’ll also discover how to optimize your media-focused interfaces like grids and carousels, ensuring a great experience for everyone who relies on different text sizes.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/221",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/221",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "tvOS"
      ],
      "keywords": [],
      "topics": [
        "Audio & Video",
        "Accessibility & Inclusion"
      ],
      "primaryTopic": "Accessibility & Inclusion",
      "duration": 608,
      "hasTranscript": true,
      "transcriptWordCount": 1406,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/downloads/wwdc2026-221_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/downloads/wwdc2026-221_hd.mp4",
        "duration": 608
      },
      "codeSnippets": [
        {
          "title": "Adopt standard text styles",
          "language": "swift",
          "startTimeSeconds": 298,
          "code": "// Adopt standard text styles\n\nVStack(spacing: 20) {\n  Text(\"Signup information\")\n    .font(.caption.bold())\n    .lineLimit(1)\n    .foregroundStyle(.secondary)\n    .frame(width: 300, alignment: .leading)\n  HStack(alignment: .top, spacing: 40) { \n      //* ... *//\n  }\n}"
        },
        {
          "title": "Use flexible constraints",
          "language": "swift",
          "startTimeSeconds": 310,
          "code": "// Adopt standard text styles\n\nVStack(spacing: 20) {\n  Text(\"Signup information\")\n    .font(.caption.bold())\n    .lineLimit(1)\n    .foregroundStyle(.secondary)\n    .frame(maxWidth: .infinity, alignment: .leading)\n  HStack(alignment: .top, spacing: 40) { \n      /* ... */\n  }\n}"
        },
        {
          "title": "Dynamic Type with text styles in UIKit",
          "language": "swift",
          "startTimeSeconds": 355,
          "code": "// Hard coded text size in UIKit\n\ntitleLabel.font = UIFont.boldSystemFont(ofSize: 28)\n\n// Dynamic Type with text styles in UIKit\n\ntitleLabel.font = UIFont.preferredFont(forTextStyle: .headline)\ntitleLabel.adjustsFontForContentSizeCategory = true"
        },
        {
          "title": "Adapt layout in response to dynamic type",
          "language": "swift",
          "startTimeSeconds": 429,
          "code": "// A view that shows a collection of movie posters\n\nstruct MovieShelf: View {\n  @Environment(\\.dynamicTypeSize) private var dynamicTypeSize\n  var body: some View {\n    ScrollView(.horizontal) {\n      LazyHStack(spacing: 40) {\n        ForEach(Asset.allCases) { asset in\n          Button { \n            /* ... */\n          } label: {\n            asset.portraitImage\n            Text(asset.title)\n          }\n          .containerRelativeFrame(\n            .horizontal,\n            count: dynamicTypeSize.isAccessibilitySize ? 4 : 6,\n            spacing: 40)\n        }\n      }\n    }\n  }\n}"
        },
        {
          "title": "Provide a conditional layout for when larger sizes are turned on",
          "language": "swift",
          "startTimeSeconds": 487,
          "code": "// A view that shows content in a card\n\nstruct CardContentView: View {\n  @Environment(\\.dynamicTypeSize) private var dynamicTypeSize\n  var asset: Asset\n\n  var body: some View {\n    let layout = dynamicTypeSize.isAccessibilitySize ?\n      AnyLayout(VStackLayout(alignment: .leading, spacing: 10)) :\n      AnyLayout(HStackLayout(alignment: .top, spacing: 10))\n    layout {\n      /* ... */\n    }\n  }\n}"
        },
        {
          "title": "UIKit adaptive layout that responds to content size changes",
          "language": "swift",
          "startTimeSeconds": 511,
          "code": "// UIKit adaptive layout that responds to content size changes\n\nclass AdaptiveLayoutViewController: UIViewController {\n  let stackView = UIStackView()\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n    updateLayout()\n\n    let sizeTraits: [UITrait] = [UITraitPreferredContentSizeCategory.self]\n    registerForTraitChanges(sizeTraits, action: #selector(updateLayout))\n  }\n\n  private func updateLayout() {\n    if traitCollection.preferredContentSizeCategory.isAccessibilityCategory {\n      stackView.axis = .vertical\n    } else {\n      stackView.axis = .horizontal\n    }\n  }\n\n}"
        }
      ],
      "resources": [
        {
          "title": "Applying custom fonts to text",
          "url": "https://developer.apple.com/documentation/SwiftUI/Applying-Custom-Fonts-to-Text",
          "type": "documentation",
          "description": "Add and use a font in your app that scales with Dynamic Type.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Applying-Custom-Fonts-to-Text",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Applying-Custom-Fonts-to-Text.json"
        },
        {
          "title": "Scaling fonts automatically",
          "url": "https://developer.apple.com/documentation/UIKit/scaling-fonts-automatically",
          "type": "documentation",
          "description": "Scale text in your interface automatically using Dynamic Type.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/scaling-fonts-automatically",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/scaling-fonts-automatically.json"
        }
      ],
      "path": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/",
      "files": {
        "metadata": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/metadata.json",
        "readme": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/README.md",
        "transcript": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-222",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 222,
      "title": "Meet the new MetricKit",
      "description": "Find and fix performance problems faster than ever. Join us to explore how MetricKit equips you with vital performance metrics and actionable diagnostics to help you understand exactly where your app has opportunities for improvements. We’ll also cover how to intersect your app’s metrics and diagnostics by app state by using the StateReporting framework, providing you with the full picture to investigate optimizations in your app’s experience.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/222",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/222",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "Developer Tools",
        "System Services"
      ],
      "primaryTopic": "System Services",
      "duration": 1063,
      "hasTranscript": true,
      "transcriptWordCount": 2668,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/222/4/86b76599-f095-4bd8-8004-f1dbd1bacb84/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/222/4/86b76599-f095-4bd8-8004-f1dbd1bacb84/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/222/4/86b76599-f095-4bd8-8004-f1dbd1bacb84/downloads/wwdc2026-222_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/222/4/86b76599-f095-4bd8-8004-f1dbd1bacb84/downloads/wwdc2026-222_hd.mp4",
        "duration": 1063
      },
      "codeSnippets": [
        {
          "title": "Receive metrics from MetricKit",
          "language": "swift",
          "startTimeSeconds": 299,
          "code": "// Receive metrics from MetricKit\n\nimport MetricKit\n\nlet manager = MetricManager()\n\nfor await report in manager.metricReports {\n    processReport(report)\n}"
        },
        {
          "title": "Send your metrics to the server",
          "language": "swift",
          "startTimeSeconds": 325,
          "code": "// Send your metrics to the server\n\nimport MetricKit\n\nfor await report in manager.metricReports {\n    let jsonData = try JSONEncoder().encode(report)\n    sendToServer(jsonData)\n}"
        },
        {
          "title": "Access your performance metrics",
          "language": "swift",
          "startTimeSeconds": 344,
          "code": "// Access your performance metrics\n\nimport MetricKit\n\nfor await report in manager.metricReports {\n    let intervalEntries = report.intervalEntries\n    let fullDayEntry = intervalEntries.fullDayEntry\n\n    for entry in intervalEntries {\n        let memoryMetrics = entry.values.filter { $0.metricGroup == .memory }\n\n        for metric in memoryMetrics {\n            switch metric {\n            case .peakMemory(let peak):\n                processPeakMemory(peak)\n            default: break\n            }\n        }\n    }\n}"
        },
        {
          "title": "Receive diagnostics",
          "language": "swift",
          "startTimeSeconds": 539,
          "code": "// Receive diagnostics\n\nimport MetricKit\n\nlet manager = MetricManager()\n\nfor await report in manager.diagnosticReports {\n    processReport(report)\n}"
        },
        {
          "title": "Send your diagnostic data to the server",
          "language": "swift",
          "startTimeSeconds": 554,
          "code": "// Send your diagnostic data to the server\n\nimport MetricKit\n\nfor await report in manager.diagnosticReports {\n    let jsonData = try JSONEncoder().encode(report)\n    sendToServer(jsonData)\n}"
        },
        {
          "title": "Access your diagnostic data",
          "language": "swift",
          "startTimeSeconds": 579,
          "code": "// Access your diagnostic data\n\nimport MetricKit\n\nfor await report in manager.diagnosticReports {\n    switch report.result {\n    case .crash(let crash):\n        let backtrace = crash.callStackTree\n        let reason = crash.terminationReason\n        let category = crash.terminationCategory\n        processCrash(backtrace: backtrace, reason: reason, category: category)\n    case .hang(let hang):\n        processHangDiagnostic(hang)\n    default: break\n    }\n}"
        },
        {
          "title": "Receive MetricKit data with states",
          "language": "swift",
          "startTimeSeconds": 837,
          "code": "// Receive MetricKit data with states\n\nimport MetricKit\nimport StateReporting\n\nlet domain = StateReportingDomain(\"com.metrickitsample.tabs\")\nlet manager = MetricManager(enabledStateReportingDomains: [domain])\n\n\n// Report transitions throughout the app\n\nlet reporter = StateReporter.reporter(for: domain.rawValue)\nreporter.reportTransition(to: \"Reports\")"
        },
        {
          "title": "Define custom structured types",
          "language": "swift",
          "startTimeSeconds": 861,
          "code": "// Define custom structured types\n\nimport StateReporting\n\n@ReportableMetadata\nstruct ViewConfiguration {\n    let listSize: String\n    let isSorted: Bool\n}\n\nlet reporter = StateReporter.reporter(\n    for: domain.rawValue,\n    stableMetadata: ViewConfiguration.self\n)\n\nreporter.reportTransition(\n    to: \"Reports\",\n    stableMetadata: ViewConfiguration(listSize: \"large\", isSorted: false)\n)"
        },
        {
          "title": "Send encoded metric reports to the server",
          "language": "swift",
          "startTimeSeconds": 929,
          "code": "// Send encoded metric reports to the server\n\nimport MetricKit\n\nfor await report in manager.metricReports {\n    let encoder = JSONEncoder()\n\n    let formatKey = MetricReport.encodingFormatKey\n    encoder.userInfo[formatKey] = MetricReport.EncodingFormat.byStateReportingDomain\n\n    let jsonData = try encoder.encode(report)\n    sendToServer(jsonData)\n}"
        }
      ],
      "resources": [
        {
          "title": "Getting started with StateReporting",
          "url": "https://developer.apple.com/documentation/StateReporting/getting-started-with-statereporting",
          "type": "documentation",
          "description": "Define reportable metadata types, obtain a state reporter for your domain, and report transitions at the right call sites in your app.",
          "sosumiURL": "https://sosumi.ai/documentation/StateReporting/getting-started-with-statereporting",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StateReporting/getting-started-with-statereporting.json"
        },
        {
          "title": "Analyzing app performance with MetricKit",
          "url": "https://developer.apple.com/documentation/MetricKit/analyzing-app-performance-with-metrickit",
          "type": "documentation",
          "description": "Work with the metric values, diagnostic data, and environments in MetricKit reports.",
          "sosumiURL": "https://sosumi.ai/documentation/MetricKit/analyzing-app-performance-with-metrickit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MetricKit/analyzing-app-performance-with-metrickit.json"
        },
        {
          "title": "Monitoring app performance with MetricKit",
          "url": "https://developer.apple.com/documentation/MetricKit/monitoring-app-performance-with-metrickit",
          "type": "documentation",
          "description": "Receive daily performance and diagnostic reports from real device usage.",
          "sosumiURL": "https://sosumi.ai/documentation/MetricKit/monitoring-app-performance-with-metrickit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MetricKit/monitoring-app-performance-with-metrickit.json"
        },
        {
          "title": "Track performance by app state using MetricKit",
          "url": "https://developer.apple.com/documentation/MetricKit/track-performance-by-app-state-using-metrickit",
          "type": "samplecode",
          "description": "Collect performance metrics, diagnostic reports, and experiment data related to your app’s current state using the MetricKit framework.",
          "sosumiURL": "https://sosumi.ai/documentation/MetricKit/track-performance-by-app-state-using-metrickit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MetricKit/track-performance-by-app-state-using-metrickit.json"
        },
        {
          "title": "MetricKit",
          "url": "https://developer.apple.com/documentation/MetricKit",
          "type": "documentation",
          "description": "Measure your app’s performance using daily metric and diagnostic reports from real users.",
          "sosumiURL": "https://sosumi.ai/documentation/MetricKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MetricKit.json"
        }
      ],
      "path": "sessions/wwdc2026/222-meet-the-new-metrickit/",
      "files": {
        "metadata": "sessions/wwdc2026/222-meet-the-new-metrickit/metadata.json",
        "readme": "sessions/wwdc2026/222-meet-the-new-metrickit/README.md",
        "transcript": "sessions/wwdc2026/222-meet-the-new-metrickit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/222-meet-the-new-metrickit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-223",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 223,
      "title": "Live Activities essentials",
      "description": "Elevate your app experience with Live Activities. Explore many of the places where Live Activities appear, including a new style in the Dynamic Island that delivers more information when iPhone is used in landscape. Learn how to tailor your Live Activity for each space, structure your content and data, and drive real time updates from start to finish using ActivityKit and push notifications.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/223",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/223",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 916,
      "hasTranscript": true,
      "transcriptWordCount": 2205,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/223/4/9098c495-ea8b-44f9-b852-f6eb64840161/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/223/4/9098c495-ea8b-44f9-b852-f6eb64840161/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/223/4/9098c495-ea8b-44f9-b852-f6eb64840161/downloads/wwdc2026-223_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/223/4/9098c495-ea8b-44f9-b852-f6eb64840161/downloads/wwdc2026-223_hd.mp4",
        "duration": 916
      },
      "codeSnippets": [
        {
          "title": "Define initial Live Activity",
          "language": "swift",
          "startTimeSeconds": 256,
          "code": "// Define initial Live Activity.\n\nimport ActivityKit\nimport Foundation\n\npublic struct DrinkOrderAttributes: ActivityAttributes {\n    let shopName: String\n    let drink: Drink\n    let orderID: UUID\n\n    public struct ContentState: Codable, Hashable {\n        var phase: DrinkOrder.Phase = .waiting\n        var estimatedReadyDate: Date\n        var rating: DrinkOrder.Rating?\n    }\n}"
        },
        {
          "title": "Create each Live Activity view",
          "language": "swift",
          "startTimeSeconds": 335,
          "code": "// Create each Live Activity view\n\nimport ActivityKit\nimport SwiftUI\nimport WidgetKit\n\nstruct DrinkOrderLiveActivity: Widget {\n    var body: some WidgetConfiguration {\n        ActivityConfiguration(for: DrinkOrderAttributes.self) { context in\n            ActivityView(context: context)\n        } dynamicIsland: { context in\n            DynamicIsland {\n                DynamicIslandExpandedRegion(.leading) {\n                    ExpandedLeadingView(context: context)\n                }\n                DynamicIslandExpandedRegion(.center) {\n                    ExpandedCenterView(context: context)\n                }\n                DynamicIslandExpandedRegion(.trailing) {\n                    ExpandedTrailingView(context: context)\n                }\n                DynamicIslandExpandedRegion(.bottom) {\n                    ExpandedBottomView(context: context)\n                }\n            } compactLeading: {\n                CompactLeadingView(context: context)\n            } compactTrailing: {\n                CompactTrailingView(context: context)\n            } minimal: {\n                MinimalView(context: context)\n            }\n        }\n    }\n}"
        },
        {
          "title": "Start and update a Live Activity",
          "language": "swift",
          "startTimeSeconds": 463,
          "code": "// Start a Live Activity\n\nfunc launchLiveActivity(order: DrinkOrder) throws {\n    guard ActivityAuthorizationInfo().areActivitiesEnabled else { return }\n    let attributes = DrinkOrderAttributes(shopName: \"Coffee Shop\", drink: order.drink, orderID: order.id)\n    let estimatedReadyDate = Date.now + (15 * 60)\n    let contentState = DrinkOrderAttributes.ContentState(phase: .waiting, estimatedReadyDate: estimatedReadyDate)\n    let activityContent = ActivityContent(state: contentState, staleDate: nil)\n    let activity = try Activity.request(attributes: attributes, content: activityContent)\n\n}\n\n// Update a Live Activity\n\nawait activity.update(\n    ActivityContent(\n        state: DrinkOrderAttributes.ContentState(\n            phase: .preparing,\n            estimatedReadyDate: estimatedReadyDate\n        ),\n        staleDate: nil\n    )\n)"
        },
        {
          "title": "Optimize for limited width in the Dynamic Island",
          "language": "swift",
          "startTimeSeconds": 633,
          "code": "// Optimize for limited width in the Dynamic Island\n\nstruct CompactTrailingView: View {\n    @Environment(\\.isDynamicIslandLimitedInWidth) var isDynamicIslandLimitedInWidth\n    var context: ActivityViewContext<DrinkOrderAttributes>\n    var body: some View {\n        if isDynamicIslandLimitedInWidth {\n            StepProgressIconView(context: context)\n        } else if context.state.phase.showsTimer {\n            EstimatedReadyView(context: context, font: .system(.body).monospacedDigit())\n                .multilineTextAlignment(.trailing)\n                .frame(maxWidth: maximumTimerLabelWidth)\n        } else {\n            OrderPhaseLabelView(context: context, font: .caption2.bold(), color: .brown)\n                .multilineTextAlignment(.trailing)\n        }\n    }\n}"
        },
        {
          "title": "Extend background color in StandBy",
          "language": "swift",
          "startTimeSeconds": 694,
          "code": "// Extend background color in StandBy\n\nstruct ActivityView: View {\n\n    @Environment(\\.showsWidgetContainerBackground) var showsWidgetContainerBackground\n    var context: ActivityViewContext<DrinkOrderAttributes>\n\n    var body: some View {\n        DetailView(context: context)\n            .background {\n                if showsWidgetContainerBackground {\n                    LinearGradient.barista\n                }\n            }\n            .activityBackgroundTint(.espresso)\n    }\n}"
        },
        {
          "title": "Add support for activityFamily small",
          "language": "swift",
          "startTimeSeconds": 750,
          "code": "// Add support for activityFamily small\n\nimport ActivityKit\nimport SwiftUI\nimport WidgetKit\n\nstruct DrinkOrderLiveActivity: Widget {\n    var body: some WidgetConfiguration {\n        ActivityConfiguration(for: DrinkOrderAttributes.self) { context in\n            ActivityView(context: context)\n        } dynamicIsland: { context in\n            DynamicIsland {\n                DynamicIslandExpandedRegion(.leading) {\n                    ExpandedLeadingView(context: context)\n                }\n                DynamicIslandExpandedRegion(.center) {\n                    ExpandedCenterView(context: context)\n                }\n                DynamicIslandExpandedRegion(.trailing) {\n                    ExpandedTrailingView(context: context)\n                }\n                DynamicIslandExpandedRegion(.bottom) {\n                    ExpandedBottomView(context: context)\n                }\n            } compactLeading: {\n                CompactLeadingView(context: context)\n            } compactTrailing: {\n                CompactTrailingView(context: context)\n            } minimal: {\n                MinimalView(context: context)\n            }\n        }\n        .supplementalActivityFamilies([.small])\n    }\n}"
        },
        {
          "title": "Optimize for small family",
          "language": "swift",
          "startTimeSeconds": 763,
          "code": "// Optimize for small family\n\nstruct ActivityView: View {\n    @Environment(\\.showsWidgetContainerBackground) var showsWidgetContainerBackground\n    @Environment(\\.activityFamily) var activityFamily\n\n    var context: ActivityViewContext<DrinkOrderAttributes>\n\n    var body: some View {\n        contentView\n            .background {\n                if showsWidgetContainerBackground {\n                    LinearGradient.barista\n                }\n            }\n            .activityBackgroundTint(.espresso)\n    }\n\n    @ViewBuilder\n    var contentView: some View {\n        if activityFamily == .small {\n            SmallView(context: context)\n        } else {\n            DetailView(context: context)\n        }\n    }\n}"
        },
        {
          "title": "Add interactivity with App Intents",
          "language": "swift",
          "startTimeSeconds": 816,
          "code": "// Add interactivity with App Intents\n\nstruct RateDrinkIntent: LiveActivityIntent {\n    static var title: LocalizedStringResource = \"Rate Drink\"\n\n    @Parameter(title: \"Order ID\")\n    var orderID: String\n\n    @Parameter(title: \"Positive\")\n    var isPositive: Bool\n\n    func perform() async throws -> some IntentResult {\n        await updateLocalDatastore(rating: isPositive ? .great : .poor, dismissPolicy: .after(.now + 15))\n        return .result()\n    }\n}"
        },
        {
          "title": "Associate an intent with a button",
          "language": "swift",
          "startTimeSeconds": 846,
          "code": "// Associate an intent with a button\n\nstruct RatingButtons: View {\n    var context: ActivityViewContext<DrinkOrderAttributes>\n    var body: some View {\n        HStack(spacing: 12) {\n            Button(intent: RateDrinkIntent(\n                orderID: context.attributes.orderID.uuidString, isPositive: false)) {\n                Label(\"Not Good\", systemImage: \"hand.thumbsdown.fill\")\n            }\n            .buttonStyle(RatingButtonStyle(color: .red))\n\n            Button(intent: RateDrinkIntent(\n                orderID: context.attributes.orderID.uuidString, isPositive: true)) {\n                Label(\"Great\", systemImage: \"hand.thumbsup.fill\")\n            }\n            .buttonStyle(RatingButtonStyle(color: .green))\n        }\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Human Interface Guidelines: Live Activities",
          "url": "https://developer.apple.com/design/human-interface-guidelines/live-activities",
          "type": "documentation",
          "description": "A Live Activity displays up-to-date information from your app, allowing people to view the progress of events or tasks at a glance.",
          "sosumiURL": "https://sosumi.ai/design/human-interface-guidelines/live-activities"
        },
        {
          "title": "Starting and updating Live Activities with ActivityKit push notifications",
          "url": "https://developer.apple.com/documentation/ActivityKit/starting-and-updating-live-activities-with-activitykit-push-notifications",
          "type": "documentation",
          "description": "Use ActivityKit to receive push tokens and to remotely start, update, and end your Live Activity with ActivityKit notifications.",
          "sosumiURL": "https://sosumi.ai/documentation/ActivityKit/starting-and-updating-live-activities-with-activitykit-push-notifications",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/ActivityKit/starting-and-updating-live-activities-with-activitykit-push-notifications.json"
        },
        {
          "title": "ActivityKit",
          "url": "https://developer.apple.com/documentation/ActivityKit",
          "type": "documentation",
          "description": "Share live updates from your app as Live Activities on iPhone, iPad, Apple Watch, and the Mac.",
          "sosumiURL": "https://sosumi.ai/documentation/ActivityKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/ActivityKit.json"
        }
      ],
      "path": "sessions/wwdc2026/223-live-activities-essentials/",
      "files": {
        "metadata": "sessions/wwdc2026/223-live-activities-essentials/metadata.json",
        "readme": "sessions/wwdc2026/223-live-activities-essentials/README.md",
        "transcript": "sessions/wwdc2026/223-live-activities-essentials/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/223-live-activities-essentials/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-224",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 224,
      "title": "Expand the capabilities of your Virtualization app",
      "description": "Bring powerful new capabilities in macOS 27 to your Virtualization app. Discover how to automate the setup of macOS guests through user account setup on first boot. We’ll explore advanced workflows that involve passthrough of USB accessories to virtual machines, as well as custom network topologies and port forwarding. You’ll also learn about recent improvements that can enrich the experience of running your app’s virtual machines.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/224",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/224",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "System Services"
      ],
      "primaryTopic": "System Services",
      "duration": 1229,
      "hasTranscript": true,
      "transcriptWordCount": 3051,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/224/5/33a91529-8caf-409e-9c54-1b8952744651/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/224/5/33a91529-8caf-409e-9c54-1b8952744651/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/224/5/33a91529-8caf-409e-9c54-1b8952744651/downloads/wwdc2026-224_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/224/5/33a91529-8caf-409e-9c54-1b8952744651/downloads/wwdc2026-224_hd.mp4",
        "duration": 1229
      },
      "codeSnippets": [
        {
          "title": "Provision a macOS guest",
          "language": "swift",
          "startTimeSeconds": 117,
          "code": "import Virtualization\n\nlet provisioningOptions = VZMacGuestProvisioningOptions()\nprovisioningOptions.fullName = fullName\nprovisioningOptions.username = username\nprovisioningOptions.password = password\nprovisioningOptions.logsInAutomatically = true\nprovisioningOptions.enablesRemoteLogin = true\n\nlet startOptions = VZMacOSVirtualMachineStartOptions()\ntry startOptions.setGuestProvisioning(provisioningOptions)\n\ntry await virtualMachine.start(options: startOptions)"
        },
        {
          "title": "Register an Accessory Access listener",
          "language": "swift",
          "startTimeSeconds": 432,
          "code": "import AccessoryAccess\n\nlet criteria: [AAUSBAccessoryMatchingCriteria] = []\nlet accessories = try await AAUSBAccessoryManager.shared.registerListener(self, matchingCriteria: criteria)\n\nfor accessory in accessories {\n    // Handle previously attached accessories.\n}"
        },
        {
          "title": "Respond to USB accessory connection",
          "language": "swift",
          "startTimeSeconds": 459,
          "code": "import AccessoryAccess\nimport Virtualization\n\nclass AccessoryListener: NSObject, AAUSBAccessoryListener {\n    func usbAccessoryDidConnect(_ usbAccessory: AAUSBAccessory) {\n        virtualMachine.queue.async {\n            do {\n                let configuration = VZUSBPassthroughDeviceConfiguration(device: usbAccessory)\n                let device = try VZUSBPassthroughDevice(configuration: configuration)\n                self.virtualMachine.usbControllers.first?.attach(device: device) { error in\n                    // Handle error if necessary...\n                }\n            } catch {\n                // Handle error...\n            }\n        }\n    }\n}"
        },
        {
          "title": "Create a custom vmnet network",
          "language": "swift",
          "startTimeSeconds": 604,
          "code": "import Virtualization\nimport vmnet\n\nvar status: vmnet_return_t = .VMNET_FAILURE\nguard let networkConfiguration =\n    vmnet_network_configuration_create(.VMNET_SHARED_MODE, &status) else { ... }\n\nguard let network =\n    vmnet_network_create(networkConfiguration, &status) else { ... }\n\nlet attachment = VZVmnetNetworkDeviceAttachment(network: network)\n\nlet networkDeviceConfiguration = VZVirtioNetworkDeviceConfiguration()\nnetworkDeviceConfiguration.attachment = attachment\n\nvirtualMachineConfiguration.networkDevices = [networkDeviceConfiguration]\n\nlet virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)"
        },
        {
          "title": "Use DiskImageKit with Virtualization",
          "language": "swift",
          "startTimeSeconds": 894,
          "code": "import DiskImageKit\nimport Virtualization\n\nlet baseImage = try DiskImage(opening: .open(url: baseLayerURL, mode: .readOnly))\nlet cacheImage = try baseImage.appending(.asifLayer(url: cacheLayerURL, type: .cache))\nlet overlayImage = try DiskImage(opening: .open(url: overlayLayerURL))\nlet stackedImage = try cacheImage.appending(overlayImage)\n\nlet storageDeviceAttachment = try VZDiskImageStorageDeviceAttachment(diskImage: stackedImage)\n\nlet storageDeviceConfiguration =\n    VZVirtioBlockDeviceConfiguration(attachment: storageDeviceAttachment)\n\nvirtualMachineConfiguration.storageDevices = [storageDeviceConfiguration]\n\nlet virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)"
        },
        {
          "title": "Configure a custom Virtio device",
          "language": "swift",
          "startTimeSeconds": 1061,
          "code": "import Virtualization\n\nlet deviceConfiguration = VZCustomVirtioDeviceConfiguration()\n\n// Virtio entropy device.\ndeviceConfiguration.deviceID = 4\n// PCI class for crypto devices.\ndeviceConfiguration.pciClassID = 0x10\n// PCI subclass for network and computing encryption controllers.\ndeviceConfiguration.pciSubclassID = 0x00\n// An entropy device uses a single Virtio queue.\ndeviceConfiguration.virtioQueueCount = 1\n\ndeviceConfiguration.provider =\n    VZCustomVirtioDeviceDelegateProvider(deviceQueue: deviceQueue, delegate: provider)\n\nvirtualMachineConfiguration.customVirtioDevices = [deviceConfiguration]\n\nlet virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)"
        },
        {
          "title": "Attach a delegate to a VZCustomVirtioDevice",
          "language": "swift",
          "startTimeSeconds": 1100,
          "code": "import Virtualization\n\nclass DeviceConfigurationDelegate: NSObject, VZCustomVirtioDeviceConfigurationDelegate {\n    func customVirtioConfiguration(_ deviceConfiguration: VZCustomVirtioDeviceConfiguration,\n                                   didCreateDevice device: VZCustomVirtioDevice) {\n        device.delegate = deviceDelegate\n        self.device = device\n    }\n}"
        },
        {
          "title": "Process Virtio queue elements",
          "language": "swift",
          "startTimeSeconds": 1122,
          "code": "import Virtualization\n\nclass DeviceDelegate: NSObject, VZCustomVirtioDeviceDelegate {\n    func customVirtioDevice(_ device: VZCustomVirtioDevice,\n                            didReceiveNotificationFor queue: VZVirtioQueue) {\n        while let element = queue.nextElement() {\n            // Process element...\n            element.returnToQueue()\n        }\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "DiskImageKit",
          "url": "https://developer.apple.com/documentation/DiskImageKit",
          "type": "documentation",
          "description": "Create, open, and manage disk images.",
          "sosumiURL": "https://sosumi.ai/documentation/DiskImageKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/DiskImageKit.json"
        },
        {
          "title": "Accessory Access",
          "url": "https://developer.apple.com/documentation/AccessoryAccess",
          "type": "documentation",
          "description": "Manage access to connected USB accessories.",
          "sosumiURL": "https://sosumi.ai/documentation/AccessoryAccess",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AccessoryAccess.json"
        },
        {
          "title": "vmnet",
          "url": "https://developer.apple.com/documentation/vmnet",
          "type": "documentation",
          "description": "Connect with network interfaces to read and write packets on guest operating systems.",
          "sosumiURL": "https://sosumi.ai/documentation/vmnet",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/vmnet.json"
        },
        {
          "title": "Virtual I/O Device (VIRTIO) Version 1.4",
          "url": "https://docs.oasis-open.org/virtio/virtio/v1.4/virtio-v1.4.html",
          "type": "documentation",
          "description": "This document describes the specifications of the “virtio” family of devices. These devices are found in virtual environments, yet by design they look like physical devices to the guest within the virtual machine - and this document treats them as such. This similarity allows the guest to use standard drivers and discovery mechanisms."
        },
        {
          "title": "Virtualization",
          "url": "https://developer.apple.com/documentation/Virtualization",
          "type": "documentation",
          "description": "Create virtual machines and run macOS and Linux-based operating systems.",
          "sosumiURL": "https://sosumi.ai/documentation/Virtualization",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Virtualization.json"
        }
      ],
      "path": "sessions/wwdc2026/224-expand-the-capabilities-of-your-virtualization-app/",
      "files": {
        "metadata": "sessions/wwdc2026/224-expand-the-capabilities-of-your-virtualization-app/metadata.json",
        "readme": "sessions/wwdc2026/224-expand-the-capabilities-of-your-virtualization-app/README.md",
        "transcript": "sessions/wwdc2026/224-expand-the-capabilities-of-your-virtualization-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/224-expand-the-capabilities-of-your-virtualization-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-226",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 226,
      "title": "Create live communication experiences",
      "description": "LiveCommunicationKit transforms your real-time communication apps into integrated experiences. We’ll show you how to deliver a rich, native conversation UI that puts your app right where people need it: from a full-screen presentation on the Lock Screen to seamless multitasking with the Dynamic Island. Join us as we step through integrating the framework for incoming, outgoing, and group conversations.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/226",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/226",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "System Services",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 1038,
      "hasTranscript": true,
      "transcriptWordCount": 2881,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/226/4/f8343d5b-0c78-4396-be05-956666fb4ae0/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/226/4/f8343d5b-0c78-4396-be05-956666fb4ae0/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/226/4/f8343d5b-0c78-4396-be05-956666fb4ae0/downloads/wwdc2026-226_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/226/4/f8343d5b-0c78-4396-be05-956666fb4ae0/downloads/wwdc2026-226_hd.mp4",
        "duration": 1038
      },
      "codeSnippets": [
        {
          "title": "Set up a conversation manager",
          "language": "swift",
          "startTimeSeconds": 401,
          "code": "// Set up a conversation manager\n\nimport LiveCommunicationKit\n\nlet configuration = ConversationManager.Configuration(\n  ringtoneName: \"SampleRingtone.caf\",\n  iconTemplateImageData: UIImage(named: \"SampleIcon\")?.pngData(),\n  maximumConversationGroups: 1,\n  maximumConversationsPerConversationGroup: 2,\n  includesConversationInRecents: true,\n  supportsVideo: true,\n  supportedHandleTypes: [.phoneNumber, .emailAddress]\n)\n\nlet manager = ConversationManager(configuration: configuration)\nmanager.delegate = self"
        },
        {
          "title": "Report the incoming conversation to the system",
          "language": "swift",
          "startTimeSeconds": 562,
          "code": "// Report the incoming conversation to the system\n\nimport LiveCommunicationKit\nimport PushKit\n\nfinal class SamplePushHandler: NSObject, PKPushRegistryDelegate {\n  func pushRegistry(\n    _ registry: PKPushRegistry,\n    didReceiveIncomingVoIPPushWith payload: PKPushPayload,\n    metadata: PKVoIPPushMetadata) async {\n\n    guard let (handle, uuid) = parseConversationPayload(from: payload) else { return }\n\n    let capabilities = [.video, .pausing, .merging]\n    let update = Conversation.Update(members: [handle], capabilities: capabilities)\n    try? await manager.reportNewIncomingConversation(uuid: uuid, update: update)\n  }\n}"
        },
        {
          "title": "Implement the delegate",
          "language": "swift",
          "startTimeSeconds": 597,
          "code": "// Implement the delegate\n\nimport LiveCommunicationKit\n\nfinal class SampleDelegate: ConversationManagerDelegate {\n  func conversationManager(\n    _ manager: ConversationManager,\n    perform action: ConversationAction\n  ) {\n    switch action {\n    case let action as JoinConversationAction:\n      handleJoinAction(action)\n    default:\n      action.fail()\n    }\n  }\n}"
        },
        {
          "title": "Fulfill the join action",
          "language": "swift",
          "startTimeSeconds": 613,
          "code": "// Handle a failed connection\n\nextension SampleDelegate {\n func handleJoinAction(_ action: JoinConversationAction) {\n    guard let conversation = manager.conversations.first(where: {$0.uuid == uuid })else {\n      return action.fail()\n    }\n\n    manager.reportConversationEvent(.conversationStartedConnecting(.now), for: conversation)\n\n    Task {\n      do {\n        try await setupMediaStream(with: action.conversationUUID)\n        manager.reportConversationEvent(.conversationConnected(.now), for: conversation)\n        action.fulfill(dateConnected: .now)\n      } catch {\n        action.fail()\n      }\n    }\n  }\n}"
        },
        {
          "title": "Route end actions",
          "language": "swift",
          "startTimeSeconds": 677,
          "code": "// Route end actions\n\nfinal class SampleDelegate: ConversationManagerDelegate {\n  // …\n  func conversationManager(\n    _ manager: ConversationManager,\n    perform action: ConversationAction\n  ) {\n    switch action {\n    case let action as JoinConversationAction:\n      handleJoinAction(action)\n    case let action as EndConversationAction:\n      handleEndAction(action)\n    default:\n      action.fail()\n    }\n  }\n}"
        },
        {
          "title": "Create a start action",
          "language": "swift",
          "startTimeSeconds": 734,
          "code": "let startAction = StartConversationAction(\n  conversationUUID: UUID(),\n  handles: [Handle(type: .phoneNumber, value: \"+1-650-555-0199\", displayName: \"Ryan Notch\")],\n  isVideo: false\n)"
        },
        {
          "title": "Perform the action",
          "language": "swift",
          "startTimeSeconds": 743,
          "code": "try await manager.perform([startAction])"
        },
        {
          "title": "Route start actions",
          "language": "swift",
          "startTimeSeconds": 749,
          "code": "// Route start actions\n\nfinal class SampleDelegate: ConversationManagerDelegate {\n  // …\n  func conversationManager(\n    _ manager: ConversationManager,\n    perform action: ConversationAction\n  ) {\n    switch action {\n    case let action as JoinConversationAction:\n      handleJoinAction(action)\n    case let action as EndConversationAction:\n      handleEndAction(action)\n    case let action as StartConversationAction:\n      handleStartAction(action)\n    default:\n      action.fail()\n    }\n  }\n}"
        },
        {
          "title": "Start group conversations",
          "language": "swift",
          "startTimeSeconds": 831,
          "code": "// Start group conversations\n\nlet adam = Handle(type: .emailAddress,\n                  value: \"adam.halwani@icloud.com\",\n                  displayName: \"Adam Halwani\")\nlet david = Handle(type: .emailAddress,\n                   value: \"david@example.com\",\n                   displayName: \"David Evans\")\nlet ryan = Handle(type: .phoneNumber,\n                  value: \"+16505550199\",\n                  displayName: \"Ryan Notch\")\n\nlet startAction = StartConversationAction(\n  conversationUUID: UUID(),\n  handles: [david, ryan],\n  isVideo: false\n)\ntry await manager.perform([startAction])"
        },
        {
          "title": "Report group membership updates",
          "language": "swift",
          "startTimeSeconds": 841,
          "code": "// Report group membership updates\n\nlet update = Conversation.Update(\n  localMember: adam,\n  members: [david, ryan],\n  activeRemoteMembers: [david, ryan],\n  capabilities: [.merging, .pausing, .unmerging]\n)\n\nmanager.reportConversationEvent(\n  .conversationUpdated(update),\n  for: conversation\n)"
        },
        {
          "title": "Route merge actions",
          "language": "swift",
          "startTimeSeconds": 926,
          "code": "// Route merge actions\n\nfinal class SampleDelegate: ConversationManagerDelegate {\n  func conversationManager(\n    _ manager: ConversationManager,\n    perform action: ConversationAction\n  ) {\n    switch action {\n    case let action as JoinConversationAction:\n      handleJoinAction(action)\n    case let action as EndConversationAction:\n      handleEndAction(action)\n    case let action as StartConversationAction:\n        handleStartAction(action)\n    case let action as MergeConversationAction:\n      handleMergeAction(action)\n    default:\n      action.fail()\n    }\n  }\n}"
        },
        {
          "title": "Handle the merge action",
          "language": "swift",
          "startTimeSeconds": 933,
          "code": "// Handle the merge action\n\nextension SampleDelegate {\n  func handleMergeAction(_ action: MergeConversationAction) {\n    let sourceUUID = action.conversationUUID\n    let targetUUID = action.conversationUUIDToMergeWith\n    guard manager.conversations.contains(where: { $0.uuid == sourceUUID }),\n          manager.conversations.contains(where: { $0.uuid == targetUUID }) else {\n      return action.fail()\n    }\n\n    Task {\n      do {\n        let update = try await combineStreams(from: sourceUUID, into: targetUUID)\n        manager.reportConversationEvent(.conversationUpdated(update), for: target)\n        action.fulfill()\n      } catch {\n        action.fail()\n      }\n    }\n  }\n}"
        }
      ],
      "resources": [
        {
          "title": "Initiating VoIP conversations with LiveCommunicationKit",
          "url": "https://developer.apple.com/documentation/LiveCommunicationKit/initiating-voip-conversations-with-livecommunicationkit",
          "type": "documentation",
          "description": "Let people initiate and receive VoIP conversations, and configure your app so it can be the default calling app on a person’s device.",
          "sosumiURL": "https://sosumi.ai/documentation/LiveCommunicationKit/initiating-voip-conversations-with-livecommunicationkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/LiveCommunicationKit/initiating-voip-conversations-with-livecommunicationkit.json"
        },
        {
          "title": "Responding to VoIP Notifications from PushKit",
          "url": "https://developer.apple.com/documentation/PushKit/responding-to-voip-notifications-from-pushkit",
          "type": "documentation",
          "description": "Receive incoming Voice-over-IP (VoIP) push notifications and use them to display the system call interface to the user.",
          "sosumiURL": "https://sosumi.ai/documentation/PushKit/responding-to-voip-notifications-from-pushkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PushKit/responding-to-voip-notifications-from-pushkit.json"
        },
        {
          "title": "LiveCommunicationKit",
          "url": "https://developer.apple.com/documentation/LiveCommunicationKit",
          "type": "documentation",
          "description": "Initiate and handle VoIP and cellular conversations, coordinate them with other communication apps and the system, and get ready to be a default calling or dialer app.",
          "sosumiURL": "https://sosumi.ai/documentation/LiveCommunicationKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/LiveCommunicationKit.json"
        }
      ],
      "path": "sessions/wwdc2026/226-create-live-communication-experiences/",
      "files": {
        "metadata": "sessions/wwdc2026/226-create-live-communication-experiences/metadata.json",
        "readme": "sessions/wwdc2026/226-create-live-communication-experiences/README.md",
        "transcript": "sessions/wwdc2026/226-create-live-communication-experiences/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/226-create-live-communication-experiences/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-227",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 227,
      "title": "Create UI prototypes using agents in Xcode",
      "description": "Learn how to prototype your app using agents in Xcode. Explore techniques for using AI to prototype interactions, iterate on layouts, and generate creative solutions to design challenges. You’ll learn how to evaluate ideas critically and refine them into polished, people-centered experiences for your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/227",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/227",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "animation",
        "coding agents",
        "design",
        "prototyping",
        "swiftui",
        "xcode",
        "xcode previews"
      ],
      "topics": [
        "AI & Machine Learning",
        "Developer Tools",
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 1091,
      "hasTranscript": true,
      "transcriptWordCount": 2809,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/227/4/f96c1da6-a49b-4d9a-8612-340d198d201b/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/227/4/f96c1da6-a49b-4d9a-8612-340d198d201b/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/227/4/f96c1da6-a49b-4d9a-8612-340d198d201b/downloads/wwdc2026-227_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/227/4/f96c1da6-a49b-4d9a-8612-340d198d201b/downloads/wwdc2026-227_hd.mp4",
        "duration": 1091
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/227-create-ui-prototypes-using-agents-in-xcode/",
      "files": {
        "metadata": "sessions/wwdc2026/227-create-ui-prototypes-using-agents-in-xcode/metadata.json",
        "readme": "sessions/wwdc2026/227-create-ui-prototypes-using-agents-in-xcode/README.md",
        "transcript": "sessions/wwdc2026/227-create-ui-prototypes-using-agents-in-xcode/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/227-create-ui-prototypes-using-agents-in-xcode/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-230",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 230,
      "title": "What’s new in assessment on macOS",
      "description": "Explore the Automatic Assessment Configuration framework on macOS to deliver secure tests for education apps. Learn how to leverage new APIs to create a secure, configurable testing environment that incorporates more system-level features on Mac. Find out how built-in system prechecks and accessibility controls make it easier than ever to deliver a reliable exam experience.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/230",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/230",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "🎈"
      ],
      "topics": [
        "App Services",
        "Business & Education"
      ],
      "primaryTopic": "Business & Education",
      "duration": 841,
      "hasTranscript": true,
      "transcriptWordCount": 1871,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/230/4/03914f48-0bbe-4f2d-bb09-3ae676579cf2/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/230/4/03914f48-0bbe-4f2d-bb09-3ae676579cf2/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/230/4/03914f48-0bbe-4f2d-bb09-3ae676579cf2/downloads/wwdc2026-230_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/230/4/03914f48-0bbe-4f2d-bb09-3ae676579cf2/downloads/wwdc2026-230_hd.mp4",
        "duration": 841
      },
      "codeSnippets": [
        {
          "title": "Set up precondition checks",
          "language": "swift",
          "startTimeSeconds": 150,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowLockdownMode = false\n    configuration.allowPrivateRelay = false\n    configuration.requiresSIP = true\n    configuration.requiresManagedDevice = true\n    configuration.requiresSingleUser = true\n    configuration.requiresUserAccountType = .standard\n\n    return configuration\n}"
        },
        {
          "title": "Restrict accessibility features",
          "language": "swift",
          "startTimeSeconds": 241,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowsAccessibilityVoiceOver = true\n    configuration.allowsAccessibilitySwitchControl = false\n    configuration.allowsAccessibilityAlternativeInputMethods = true\n    configuration.allowsAccessibilityBackgroundSounds = true\n    configuration.allowsAccessibilityHoverText = true\n    configuration.allowsAccessibilityLiveSpeech = true\n    configuration.allowsAccessibilitySpokenContent = true\n    configuration.allowsAccessibilityVoiceControl = true\n    configuration.allowsAccessibilityZoom = true\n\n    return configuration\n}"
        },
        {
          "title": "Customize the Menu Bar items",
          "language": "swift",
          "startTimeSeconds": 332,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowsMenuBar = true\n    configuration.allowedMenuBarItems = [\n        .battery,\n        .clock,\n        .volume\n    ]\n    configuration.allowedAppleMenuItems = [\n        .sleep\n    ]\n\n    return configuration\n}"
        },
        {
          "title": "Define input restrictions",
          "language": "swift",
          "startTimeSeconds": 421,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowsDictation = false\n    configuration.allowsAutoFill = false\n    configuration.allowsStructuralInput = false\n    configuration.allowsEmojiKeyboard = false\n\n    return configuration\n}"
        },
        {
          "title": "Enable dock appearance",
          "language": "swift",
          "startTimeSeconds": 458,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowsDock = true\n\n    return configuration\n}"
        },
        {
          "title": "Set allowed directories and files",
          "language": "swift",
          "startTimeSeconds": 515,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowedDirectoriesAndFiles = [\n        URL(fileURLWithPath: \"~/Documents/\")\n    ]\n\n    return configuration\n}"
        },
        {
          "title": "Set application launch restrictions",
          "language": "swift",
          "startTimeSeconds": 598,
          "code": "import AutomaticAssessmentConfiguration\n\nfunc makeAssessmentConfiguration() -> AEAssessmentConfiguration {\n    let configuration = AEAssessmentConfiguration()\n\n    configuration.allowOnlyParticipantsToRun = true\n    configuration.allowsUserScriptExecution = false\n\n    return configuration\n}"
        }
      ],
      "resources": [
        {
          "title": "Automatic Assessment Configuration",
          "url": "https://developer.apple.com/documentation/AutomaticAssessmentConfiguration",
          "type": "documentation",
          "description": "Enter single-app mode and prevent students from accessing specific system features while taking an exam.",
          "sosumiURL": "https://sosumi.ai/documentation/AutomaticAssessmentConfiguration",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AutomaticAssessmentConfiguration.json"
        }
      ],
      "path": "sessions/wwdc2026/230-what-s-new-in-assessment-on-macos/",
      "files": {
        "metadata": "sessions/wwdc2026/230-what-s-new-in-assessment-on-macos/metadata.json",
        "readme": "sessions/wwdc2026/230-what-s-new-in-assessment-on-macos/README.md",
        "transcript": "sessions/wwdc2026/230-what-s-new-in-assessment-on-macos/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/230-what-s-new-in-assessment-on-macos/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-232",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 232,
      "title": "Run local agentic AI on the Mac using MLX",
      "description": "Run AI agents locally with privacy, low latency, and offline access. Dive into how MLX advancements and Mac hardware make powerful agentic workflows possible entirely on-device. You’ll explore code agents such as OpenCode, see how they integrate into Xcode, learn techniques for multi-Mac scaling, and discover how to integrate tools seamlessly — without ever leaving your machine.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/232",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/232",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 817,
      "hasTranscript": true,
      "transcriptWordCount": 2032,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/232/4/f309be4a-8e5b-4c0f-843a-fcbd84c5e2d1/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/232/4/f309be4a-8e5b-4c0f-843a-fcbd84c5e2d1/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/232/4/f309be4a-8e5b-4c0f-843a-fcbd84c5e2d1/downloads/wwdc2026-232_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/232/4/f309be4a-8e5b-4c0f-843a-fcbd84c5e2d1/downloads/wwdc2026-232_hd.mp4",
        "duration": 817
      },
      "codeSnippets": [
        {
          "title": "Set up MLX-LM and start the local server",
          "language": "bash",
          "startTimeSeconds": 280,
          "code": "# Step 1: Install MLX-LM\npip install mlx-lm\n\n# Step 2: Start the server\nmlx_lm.server --model mlx-community/Qwen-3.5-4B-8bit\n\n# Step 3: Point your agent to the server\ncurl -X POST \\\n  http://127.0.0.1:8080/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\":\"default_model\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello!\"}]}'"
        },
        {
          "title": "Configure an agent to use your local MLX server",
          "language": "json",
          "startTimeSeconds": 318,
          "code": "{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"model\": \"mlx/default_model\",\n  \"small_model\": \"mlx/default_model\",\n  \"provider\": {\n    \"mlx\": {\n      \"npm\": \"@ai-sdk/openai-compatible\",\n      \"name\": \"MLX (local)\",\n      \"options\": {\n        \"baseURL\": \"http://127.0.0.1:8080/v1\"\n      },\n      \"models\": {\n        \"default_model\": {\n          \"name\": \"Default MLX Model\"\n        }\n      }\n    }\n  }\n}"
        },
        {
          "title": "Launch distributed inference with MLX",
          "language": "bash",
          "startTimeSeconds": 513,
          "code": "mlx.launch --hostfile hosts.json \\\n  --backend jaccl \\\n  /remote/path/to/mlx_lm.server \\\n  --model mlx-community/Qwen-3.5-122B-A3B-8bit"
        }
      ],
      "resources": [
        {
          "title": "MLX Swift LM on GitHub",
          "url": "https://github.com/ml-explore/mlx-swift-lm",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX Swift Examples",
          "url": "https://github.com/ml-explore/mlx-swift-examples",
          "type": "samplecode",
          "description": "MLX Swift Examples"
        },
        {
          "title": "MLX Examples",
          "url": "https://github.com/ml-explore/mlx-examples",
          "type": "samplecode",
          "description": "This repo contains a variety of standalone examples using the MLX framework."
        },
        {
          "title": "MLX Swift",
          "url": "https://github.com/ml-explore/mlx-swift",
          "type": "documentation",
          "description": "MLX Swift is a Swift API for MLX."
        },
        {
          "title": "MLX LM - Python API",
          "url": "https://github.com/ml-explore/mlx-lm",
          "type": "documentation",
          "description": "MLX LM is a Python package for generating text and fine-tuning large language models on Apple silicon with MLX."
        },
        {
          "title": "MLX Explore - Python API",
          "url": "https://github.com/ml-explore/mlx",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        },
        {
          "title": "MLX Framework",
          "url": "https://mlx-framework.org",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX",
          "url": "https://ml-explore.github.io/mlx/",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        }
      ],
      "path": "sessions/wwdc2026/232-run-local-agentic-ai-on-the-mac-using-mlx/",
      "files": {
        "metadata": "sessions/wwdc2026/232-run-local-agentic-ai-on-the-mac-using-mlx/metadata.json",
        "readme": "sessions/wwdc2026/232-run-local-agentic-ai-on-the-mac-using-mlx/README.md",
        "transcript": "sessions/wwdc2026/232-run-local-agentic-ai-on-the-mac-using-mlx/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/232-run-local-agentic-ai-on-the-mac-using-mlx/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-233",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 233,
      "title": "Explore distributed inference and training with MLX",
      "description": "Scale your machine learning workloads across multiple Macs using MLX. Learn how to tackle interconnect efficiency, large model inference, request batching, and distributed training challenges. Discover how a few Macs on your desk can replace expensive cloud infrastructure for demanding AI workloads.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/233",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/233",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1326,
      "hasTranscript": true,
      "transcriptWordCount": 2975,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/233/4/379c319a-5718-4fd2-aac6-2f97180c5892/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/233/4/379c319a-5718-4fd2-aac6-2f97180c5892/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/233/4/379c319a-5718-4fd2-aac6-2f97180c5892/downloads/wwdc2026-233_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/233/4/379c319a-5718-4fd2-aac6-2f97180c5892/downloads/wwdc2026-233_hd.mp4",
        "duration": 1326
      },
      "codeSnippets": [
        {
          "title": "Hostfile format for a 4-node MLX cluster",
          "language": "json",
          "startTimeSeconds": 511,
          "code": "[\n  {\n    \"ssh\": \"m3-ultra-0\",\n    \"ips\": [\"192.168.1.10\"],\n    \"rdma\": [null, \"rdma_en5\", \"rdma_en4\", \"rdma_en3\"]\n  },\n  {\n    \"ssh\": \"m3-ultra-1\",\n    \"ips\": [\"192.168.1.11\"],\n    \"rdma\": [\"rdma_en5\", null, \"rdma_en4\", \"rdma_en3\"]\n  },\n  {\n    \"ssh\": \"m3-ultra-2\",\n    \"ips\": [\"192.168.1.12\"],\n    \"rdma\": [\"rdma_en5\", \"rdma_en4\", null, \"rdma_en3\"]\n  },\n  {\n    \"ssh\": \"m3-ultra-3\",\n    \"ips\": [\"192.168.1.13\"],\n    \"rdma\": [\"rdma_en5\", \"rdma_en4\", \"rdma_en3\", null]\n  }\n]"
        },
        {
          "title": "Generate the cluster hostfile with mlx.distributed_config",
          "language": "bash",
          "startTimeSeconds": 536,
          "code": "mlx.distributed_config \\\n    --hosts m3-ultra-0,m3-ultra-1,m3-ultra-2,m3-ultra-3 \\\n    --output \"m3-ultra-jaccl.json\" \\\n    --env MLX_METAL_FAST_SYNCH=1 \\\n    --auto-setup \\\n    --backend jaccl"
        },
        {
          "title": "Run distributed LLM inference with mlx_lm.chat",
          "language": "bash",
          "startTimeSeconds": 664,
          "code": "# Single-device LLM inference\nmlx_lm.chat --model \"Qwen/Qwen3.6-27B\" --max-tokens 2048\n\n# Distributed LLM inference across the cluster\nmlx.launch --hostfile \"m3-ultra-jaccl.json\" -- \\\n    /remote/path/to/mlx_lm.chat --model \"Qwen/Qwen3.6-27B\" --max-tokens 2048"
        },
        {
          "title": "Run distributed inference with pipeline parallelism",
          "language": "bash",
          "startTimeSeconds": 903,
          "code": "# Tensor parallelism (default)\nmlx.launch --hostfile \"m3-ultra-jaccl.json\" -- \\\n    /remote/path/to/mlx_lm.chat --model \"moonshotai/Kimi-K2.6\" \\\n                                 --max-tokens 2048\n\n# Pipeline parallelism — append --pipeline flag\nmlx.launch --hostfile \"m3-ultra-jaccl.json\" -- \\\n    /remote/path/to/mlx_lm.chat --model \"moonshotai/Kimi-K2.6\" \\\n                                 --max-tokens 2048 \\\n                                 --pipeline"
        },
        {
          "title": "Run distributed fine-tuning with mlx_lm.lora",
          "language": "bash",
          "startTimeSeconds": 1038,
          "code": "# Single-device fine-tuning\nmlx_lm.lora --model \"Qwen/Qwen3.5-9B\" \\\n             --data \"mlx-community/wikisql\" \\\n             --train --batch-size 4\n\n# Distributed fine-tuning (scale --batch-size by number of devices)\nmlx.launch --hostfile \"hostfile.json\" -- \\\n    /remote/path/to/mlx_lm.lora --model \"Qwen/Qwen3.5-9B\" \\\n                                  --data \"mlx-community/wikisql\" \\\n                                  --train --batch-size 16"
        },
        {
          "title": "Distributed inference with the MLX LM Python API",
          "language": "python",
          "startTimeSeconds": 1141,
          "code": "import mlx.core as mx\nfrom mlx_lm import stream_generate\nfrom mlx_lm.utils import sharded_load\n\n# Initialise distributed backend\ngroup = mx.distributed.init(strict=True, backend=\"jaccl\")\n# Define parallelism\ntensor_group, pipeline_group = group, None\n\n# Shard the model\nmodel, tokenizer = sharded_load(\"moonshotai/Kimi-K2.6\", pipeline_group, tensor_group)\nfor response in stream_generate(model, tokenizer, prompt, max_tokens=1024):\n    if group.rank() == 0:\n        print(response.text, end=\"\", flush=True)"
        },
        {
          "title": "Shard a layer with the MLX Python API",
          "language": "python",
          "startTimeSeconds": 1171,
          "code": "import mlx.core as mx\nimport mlx.nn as nn\n\n# Initialise distributed backend\ngroup = mx.distributed.init(strict=True, backend=\"jaccl\")\n\n# Define layer and shard it column-wise\nlayer = nn.Linear(1024, 1024)\nsharded_layer = nn.layers.distributed.shard_linear(\n    layer, strategy=\"all-to-sharded\", group=group\n)\ndata = mx.random.normal((1, 1, 1024))\noutput = sharded_layer(data)\nmx.eval(output)"
        },
        {
          "title": "All-reduce across devices in Python, Swift, and C++",
          "language": "python",
          "startTimeSeconds": 1187,
          "code": "# Python\nimport mlx.core as mx\nworld = mx.distributed.init(strict=True, backend=\"jaccl\")\ndata = mx.full((4,), float(world.rank()), dtype=mx.float32)\nresult = mx.distributed.all_sum(data, group=world)\nmx.eval(result)\n\n# Swift\nlet group = try DistributedGroup(strict: .ring)\nlet data = rank == 0\n    ? MLXArray(converting: [1.0, 2.0, 3.0])\n    : MLXArray(converting: [5.0, 6.0, 7.0])\nlet result = try group.allSum(data)\n\n// C++\nnamespace mx = mlx::core;\nauto world = mx::distributed::init(/* strict */ true, \"jaccl\");\nmx::array data = mx::full({4}, static_cast<float>(world.rank()), mx::float32);\nmx::array result = mx::distributed::all_sum(data, world);\nmx::eval(result);"
        },
        {
          "title": "Standalone distributed sum with the JACCL C++ API",
          "language": "cpp",
          "startTimeSeconds": 1206,
          "code": "#include <jaccl/jaccl.h>\n#include <iostream>\n\nint main() {\n    // Initialize JACCL group\n    auto group = jaccl::init();\n    std::cout << \"Rank \" << group->rank() << \" of \" << group->size() << std::endl;\n    // Perform all-reduce sum\n    float data[10] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f};\n    float output[10];\n    group->all_sum(data, output, sizeof(data), jaccl::Float32);\n    std::cout << \"Result: \" << output[0] << std::endl;\n    return 0;\n}"
        }
      ],
      "resources": [
        {
          "title": "MLX Swift LM on GitHub",
          "url": "https://github.com/ml-explore/mlx-swift-lm",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX Swift Examples",
          "url": "https://github.com/ml-explore/mlx-swift-examples",
          "type": "samplecode",
          "description": "MLX Swift Examples"
        },
        {
          "title": "MLX Examples",
          "url": "https://github.com/ml-explore/mlx-examples",
          "type": "samplecode",
          "description": "This repo contains a variety of standalone examples using the MLX framework."
        },
        {
          "title": "MLX Swift",
          "url": "https://github.com/ml-explore/mlx-swift",
          "type": "documentation",
          "description": "MLX Swift is a Swift API for MLX."
        },
        {
          "title": "MLX LM - Python API",
          "url": "https://github.com/ml-explore/mlx-lm",
          "type": "documentation",
          "description": "MLX LM is a Python package for generating text and fine-tuning large language models on Apple silicon with MLX."
        },
        {
          "title": "MLX Explore - Python API",
          "url": "https://github.com/ml-explore/mlx",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        },
        {
          "title": "MLX Framework",
          "url": "https://mlx-framework.org",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX",
          "url": "https://ml-explore.github.io/mlx/",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        }
      ],
      "path": "sessions/wwdc2026/233-explore-distributed-inference-and-training-with-mlx/",
      "files": {
        "metadata": "sessions/wwdc2026/233-explore-distributed-inference-and-training-with-mlx/metadata.json",
        "readme": "sessions/wwdc2026/233-explore-distributed-inference-and-training-with-mlx/README.md",
        "transcript": "sessions/wwdc2026/233-explore-distributed-inference-and-training-with-mlx/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/233-explore-distributed-inference-and-training-with-mlx/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-234",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 234,
      "title": "Design immersive environments for visionOS apps and the spatial web",
      "description": "Learn how you can create photoreal visionOS environments for your apps, websites, and SharePlay experiences. Discover the design principles that make environments feel truly immersive and find out how you can create or capture reference materials, prepare high-fidelity CG assets, and craft real-time effects such as motion and lighting.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/234",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/234",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [
        "environment",
        "environments",
        "spatial design"
      ],
      "topics": [
        "AI & Machine Learning",
        "Graphics & Games",
        "Spatial Computing",
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 958,
      "hasTranscript": true,
      "transcriptWordCount": 2850,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/234/4/88f2dbdd-e1b1-4b50-9fa0-69a32ac768b2/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/234/4/88f2dbdd-e1b1-4b50-9fa0-69a32ac768b2/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/234/4/88f2dbdd-e1b1-4b50-9fa0-69a32ac768b2/downloads/wwdc2026-234_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/234/4/88f2dbdd-e1b1-4b50-9fa0-69a32ac768b2/downloads/wwdc2026-234_hd.mp4",
        "duration": 958
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/234-design-immersive-environments-for-visionos-apps-and-the-spat/",
      "files": {
        "metadata": "sessions/wwdc2026/234-design-immersive-environments-for-visionos-apps-and-the-spat/metadata.json",
        "readme": "sessions/wwdc2026/234-design-immersive-environments-for-visionos-apps-and-the-spat/README.md",
        "transcript": "sessions/wwdc2026/234-design-immersive-environments-for-visionos-apps-and-the-spat/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/234-design-immersive-environments-for-visionos-apps-and-the-spat/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-237",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 237,
      "title": "What’s new in image understanding",
      "description": "Unlock powerful image understanding with the latest Vision framework and Foundation Models framework updates. The new tap-to-segment request lets you segment images in new ways, and Vision now supports watchOS. Combine the new image support in Apple Foundation Model together with OCR, barcode scanning and your own tools to deliver LLM-powered visual understanding in your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/237",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/237",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "ai",
        "machine learning &amp; vision"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 946,
      "hasTranscript": true,
      "transcriptWordCount": 2243,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/237/6/a3bdea1e-5c1d-44bc-8c21-9e1958774bd3/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/237/6/a3bdea1e-5c1d-44bc-8c21-9e1958774bd3/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/237/6/a3bdea1e-5c1d-44bc-8c21-9e1958774bd3/downloads/wwdc2026-237_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/237/6/a3bdea1e-5c1d-44bc-8c21-9e1958774bd3/downloads/wwdc2026-237_hd.mp4",
        "duration": 946
      },
      "codeSnippets": [
        {
          "title": "Segment images (tap-to-segment)",
          "language": "swift",
          "startTimeSeconds": 255,
          "code": "// Generate a segmentation mask of an object with a seed point\nlet handler = ImageRequestHandler(image)\nlet request = GenerateIterativeSegmentationRequest(seed: point)\nlet observation = try await handler.perform(request)\nlet mask = observation?.pixelBuffer\n\n// Refine the mask with a new point\nrequest.addIncludedPoint(newPoint)\nlet refinedObservation = try await handler.perform(request)"
        },
        {
          "title": "Generate an image caption with Foundation Models",
          "language": "swift",
          "startTimeSeconds": 401,
          "code": "// Generate an image caption with Foundation Models\nimport FoundationModels\n\nlet prompt = Prompt {\n    \"Generate a caption for this image\"\n    Attachment(image)\n}\nlet response = try await session.respond(to: prompt)\nlet caption = response.content"
        },
        {
          "title": "Create an image-based tool",
          "language": "swift",
          "startTimeSeconds": 595,
          "code": "// Create an image-based tool\nstruct PlantIdentifierTool: Tool {\n    @SessionProperty(\\.history) var history\n\n    @Generable\n    struct Arguments {\n        var image: ImageReference\n    }\n\n    func call(arguments: Arguments) async throws -> String {\n        let imageReference = arguments.image\n        let transcript = Transcript(history)\n        guard let imageAttachment = imageReference.resolve(in: transcript) else {\n            throw AppError.imageNotFound\n        }\n        let image = try imageAttachment.pixelBuffer()\n        return classifyPlant(image)\n    }\n}"
        },
        {
          "title": "Use Vision tools",
          "language": "swift",
          "startTimeSeconds": 729,
          "code": "// Use Vision tools\nimport FoundationModels\nimport Vision\n\nlet session = LanguageModelSession(model: model, tools: [BarcodeReaderTool()])\nlet response = try await session.respond(generating: EventInfo.self) {\n    \"Get the date, location, and website from this flyer\"\n    Attachment(image)\n        .label(\"flyer\")\n}"
        },
        {
          "title": "Create a crop that highlights a prominent subject (watchOS / saliency)",
          "language": "swift",
          "startTimeSeconds": 834,
          "code": "// Create a crop that highlights a prominent subject\nfunc generateImageCrop(in image: CGImage) async throws -> NormalizedRect? {\n    let request = GenerateObjectnessBasedSaliencyImageRequest()\n    let observation = try await request.perform(on: image)\n    let prominentObjects = observation.salientObjects\n    return prominentObjects.first\n}"
        }
      ],
      "resources": [
        {
          "title": "Segmenting objects using taps, scribbles or rectangles",
          "url": "https://developer.apple.com/documentation/Vision/segmenting-objects-using-taps-scribbles-or-rectangles",
          "type": "documentation",
          "description": "Select objects or regions in a photo using taps, scribbles, or rectangle selection, and generate a segmentation mask using the iterative segmentation API.",
          "sosumiURL": "https://sosumi.ai/documentation/Vision/segmenting-objects-using-taps-scribbles-or-rectangles",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Vision/segmenting-objects-using-taps-scribbles-or-rectangles.json"
        },
        {
          "title": "Implementing saliency-based image cropping in iOS and watchOS",
          "url": "https://developer.apple.com/documentation/Vision/implementing-saliency-based-image-cropping-in-iOS-and-watchOS",
          "type": "samplecode",
          "description": "Crop regions most likely drawing people’s attention from an image in your iOS or watchOS app.",
          "sosumiURL": "https://sosumi.ai/documentation/Vision/implementing-saliency-based-image-cropping-in-iOS-and-watchOS",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Vision/implementing-saliency-based-image-cropping-in-iOS-and-watchOS.json"
        }
      ],
      "path": "sessions/wwdc2026/237-what-s-new-in-image-understanding/",
      "files": {
        "metadata": "sessions/wwdc2026/237-what-s-new-in-image-understanding/metadata.json",
        "readme": "sessions/wwdc2026/237-what-s-new-in-image-understanding/README.md",
        "transcript": "sessions/wwdc2026/237-what-s-new-in-image-understanding/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/237-what-s-new-in-image-understanding/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-240",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 240,
      "title": "Build intelligent Siri experiences with App Schemas",
      "description": "Bring your app’s content and actions to Siri with App Intents. Model your data using App Entities, adopt App Schemas to enable powerful system actions, and support natural language interactions powered by Apple Intelligence. Explore how to enable semantic search, perform actions across apps, and create contextual experiences using onscreen awareness and content transfer. Find out best practices and testing tools to build fast, reliable Siri experiences.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/240",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/240",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "app intents",
        "machine learning",
        "siri",
        "spotlight",
        "xcode"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1643,
      "hasTranscript": true,
      "transcriptWordCount": 3439,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/240/4/d46aac11-3990-42cd-bb33-4ce5e958b902/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/240/4/d46aac11-3990-42cd-bb33-4ce5e958b902/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/240/4/d46aac11-3990-42cd-bb33-4ce5e958b902/downloads/wwdc2026-240_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/240/4/d46aac11-3990-42cd-bb33-4ce5e958b902/downloads/wwdc2026-240_hd.mp4",
        "duration": 1643
      },
      "codeSnippets": [
        {
          "title": "Contributing message content to Apple Intelligence",
          "language": "swift",
          "startTimeSeconds": 479,
          "code": "// Contributing message content to Apple Intelligence\n\n  @AppEntity(schema: .messages.message)\n  struct MessageEntity: IndexedEntity {\n\n      // The text content of the message\n      @Property(indexingKey: \\.textContent)\n      var body: AttributedString?\n  }"
        },
        {
          "title": "An interface that locates entities using arbitrary string input",
          "language": "swift",
          "startTimeSeconds": 516,
          "code": "// An interface that locates entities using arbitrary string input\n\n  struct ContactQuery: EntityStringQuery {\n      func entities(matching string: String) async throws -> [ContactEntity] {\n          let predicate = #Predicate<Person> { person in\n              person.name.localizedStandardContains(string)\n          }\n          let descriptor = FetchDescriptor<Person>(predicate: predicate)\n          let matches = try modelContext.fetch(descriptor)\n          return matches.map(\\.entity)\n      }\n  }"
        },
        {
          "title": "Working across apps - View annotations",
          "language": "swift",
          "startTimeSeconds": 1039,
          "code": "// Working across apps - View annotations\n\n  List {\n      ForEach(messages) { message in\n          MessageRow(message: message)\n              .appEntityIdentifier(\n                  EntityIdentifier(\n                      for: MessageEntity.self,\n                      identifier: message.id\n                  )\n              )\n      }\n  }"
        },
        {
          "title": "Working across apps - Exporting content to another app",
          "language": "swift",
          "startTimeSeconds": 1098,
          "code": "// Working across apps - Exporting content to another app\n\n  extension ContactEntity: Transferable {\n\n      static var transferRepresentation: some TransferRepresentation {\n          IntentValueRepresentation(\n              exporting: \\.person\n          )\n      }\n  }"
        },
        {
          "title": "Working across apps - IntentValueQuery",
          "language": "swift",
          "startTimeSeconds": 1161,
          "code": "// Working across apps - IntentValueQuery\n\n  struct ContactEntityQuery: IntentValueQuery {\n\n      func values(for input: [IntentPerson]) async throws -> [ContactEntity] {\n          let names = input.map(\\.displayName)\n          let descriptor = FetchDescriptor<Contact>()\n          let contacts = try model.mainContext.fetch(descriptor)\n          let matches = contacts.filter { contact in\n              names.contains(where: { name in\n                  contact.name.localizedStandardContains(name)\n              })\n          }\n          return matches.map(\\.entity)\n      }\n  }"
        },
        {
          "title": "Working across apps - IntentValueRepresentation",
          "language": "swift",
          "startTimeSeconds": 1200,
          "code": "// Working across apps - IntentValueRepresentation\n\n  extension ContactEntity: Transferable {\n\n      static var transferRepresentation: some TransferRepresentation {\n          IntentValueRepresentation(exporting: \\.person, importing: { intentPerson in                    \n              let contact = Contact(importing: intentPerson)\n              ContactManager.shared.contacts.append(contact)\n              return contact.entity\n          })\n      }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Integrating your messaging app with Apple Intelligence",
          "url": "https://developer.apple.com/documentation/AppIntents/integrating-your-messaging-app-with-apple-intelligence",
          "type": "samplecode",
          "description": "Adopt message schemas so people can send messages and manage conversations with Siri.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/integrating-your-messaging-app-with-apple-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/integrating-your-messaging-app-with-apple-intelligence.json"
        },
        {
          "title": "Donating your app’s data and actions to the system",
          "url": "https://developer.apple.com/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "type": "documentation",
          "description": "Improve how people interact with your app through Apple Intelligence and Siri",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system.json"
        },
        {
          "title": "Making app entities available in Spotlight",
          "url": "https://developer.apple.com/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "type": "documentation",
          "description": "Update your app entity types to support Spotlight indexing, and donate entities to",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-app-entities-available-in-spotlight.json"
        },
        {
          "title": "Making actions and content discoverable by Apple Intelligence",
          "url": "https://developer.apple.com/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "type": "documentation",
          "description": "Equip the system so that Siri can work with your app by adding specific schemas from relevant domains.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence.json"
        },
        {
          "title": "Providing contextual cues to Apple Intelligence and Siri",
          "url": "https://developer.apple.com/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "type": "documentation",
          "description": "Annotate your interface with app entities to offer contextual information about your app’s",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri.json"
        },
        {
          "title": "Apple Intelligence and Siri AI",
          "url": "https://developer.apple.com/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "type": "documentation",
          "description": "Integrate your app with Apple Intelligence and bring it to Siri AI.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/apple-intelligence-and-siri-ai.json"
        },
        {
          "title": "Messages",
          "url": "https://developer.apple.com/documentation/AppIntents/app-schema-domain-messages",
          "type": "documentation",
          "description": "Make your messaging app’s actions available to Apple Intelligence and Siri by adopting schemas for common messaging actions.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/app-schema-domain-messages",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/app-schema-domain-messages.json"
        },
        {
          "title": "App schema domains",
          "url": "https://developer.apple.com/documentation/AppIntents/app-schema-domains",
          "type": "documentation",
          "description": "Declare support for well-known actions and content by applying system-defined schemas to",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/app-schema-domains",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/app-schema-domains.json"
        }
      ],
      "path": "sessions/wwdc2026/240-build-intelligent-siri-experiences-with-app-schemas/",
      "files": {
        "metadata": "sessions/wwdc2026/240-build-intelligent-siri-experiences-with-app-schemas/metadata.json",
        "readme": "sessions/wwdc2026/240-build-intelligent-siri-experiences-with-app-schemas/README.md",
        "transcript": "sessions/wwdc2026/240-build-intelligent-siri-experiences-with-app-schemas/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/240-build-intelligent-siri-experiences-with-app-schemas/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-241",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 241,
      "title": "What’s new in the Foundation Models framework",
      "description": "Explore what’s new in the Foundation Models framework. Learn how to access Private Cloud Compute, integrate third-party and open source models, and work with vision capabilities. Discover context management APIs, built-in semantic search, and powerful primitives for creating agentic experiences in your apps.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/241",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/241",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "models",
        "prompt",
        "xcode"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1273,
      "hasTranscript": true,
      "transcriptWordCount": 2697,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/241/6/900558cb-1997-490a-9aac-2461b209e578/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/241/6/900558cb-1997-490a-9aac-2461b209e578/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/241/6/900558cb-1997-490a-9aac-2461b209e578/downloads/wwdc2026-241_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/241/6/900558cb-1997-490a-9aac-2461b209e578/downloads/wwdc2026-241_hd.mp4",
        "duration": 1273
      },
      "codeSnippets": [
        {
          "title": "Context size and token counting",
          "language": "swift",
          "startTimeSeconds": 166,
          "code": "// Context size and token counting\n\n  let model = SystemLanguageModel()\n  print(model.contextSize)\n  // 8192\n\n  let count = try await model.tokenCount(for: \"What are the Japanese characters for origami?\")\n  print(count)"
        },
        {
          "title": "Attachable image types",
          "language": "swift",
          "startTimeSeconds": 232,
          "code": "// Insert c// Attachable image types\n\n  let response = try await session.respond {\n      \"What animal is this?\"\n      Attachment(UIImage(...))\n  }ode snippet."
        },
        {
          "title": "Inspecting usage",
          "language": "swift",
          "startTimeSeconds": 525,
          "code": "// Inspecting usage\n\n  let response = try await session.respond(\n      to: \"Recommend a craft that doesn't require scissors.\",\n      contextOptions: ContextOptions(reasoningLevel: .light)\n  )\n\n  print(response.usage.input.totalTokenCount)\n  print(response.usage.input.cachedTokenCount)\n\n  print(response.usage.output.totalTokenCount)\n  print(response.usage.output.reasoningTokenCount)"
        },
        {
          "title": "Routing between craft analysis and brainstorm",
          "language": "swift",
          "startTimeSeconds": 715,
          "code": "// Routing between craft analysis and brainstorm\n\n  @Observable\n  final class AppStates {\n      var mode: Mode\n  }\n\n  let appStates: AppStates\n  var session: LanguageModelSession?\n\n  func updateSession() {\n      let originalTranscript = session?.transcript.dropFirstInstructions() ?? Transcript()\n\n      // Create a new session with new instructions and tools\n      switch appStates.mode {\n      case .craftAnalysis:\n          session = LanguageModelSession(\n              tools: [\n                  RecordImageAnalysisTool(),\n                  SwitchModeTool(states: appStates)\n              ],\n              instructions: \"Analyze the user's craft project...\",\n              transcript: originalTranscript\n          )\n      case .brainstorm:\n          session = LanguageModelSession(\n              tools: [\n                  RecordBrainstormTool(),\n              ],\n              instructions: \"Brainstorm some ideas...\",\n              transcript: originalTranscript\n          )\n      }\n  }\n\n  struct SwitchModeTool: Tool {\n      let description = \"Switch to a different mode.\"\n      let states: AppStates\n\n      @Generable\n      struct Arguments {\n          let mode: Mode\n      }\n\n      func call(arguments: Arguments) async throws -> some PromptRepresentable {\n          appStates.mode = arguments.mode\n          return \"Successfully switched to \\(arguments.mode).\"\n      }\n  }\n\n  // If mode changes, update the session\n  withObservationTracking {\n      appStates.mode\n  } onChange: {\n      updateSession()\n  }"
        },
        {
          "title": "Describing the profile for craft app",
          "language": "swift",
          "startTimeSeconds": 762,
          "code": "// Describing the profile for craft app\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var body: some DynamicProfile {\n          Profile {\n              Instructions {\n                  \"\"\"\n                  You are an expert crafting assistant. \\\n                  Record craft project image analyses   \\\n                  using the recordImageAnalysis tool.\n                  \"\"\"\n              }\n              RecordImageAnalysisTool()\n          }\n      }\n  }\n\n  let session = LanguageModelSession(\n      profile: CraftProfile()\n  )"
        },
        {
          "title": "Describing the profile for craft app",
          "language": "swift",
          "startTimeSeconds": 876,
          "code": "// Describing the profile for craft app\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      let states: CraftProjectStates\n\n      var body: some DynamicProfile {\n          switch states.mode {\n          case .craftAnalysis:\n              Profile {\n                  Instructions { /* ... */ }\n                  RecordImageAnalysisTool()\n                  SwitchModeTool(states: states)\n              }\n          case .brainstorm:\n              Profile {\n                  Instructions { /* ... */ }\n                  BrainstormRecordTool()\n              }\n              .model(states.privateCloudCompute)\n              .reasoningLevel(.deep)\n          }\n      }\n  }"
        },
        {
          "title": "Foundation Models SDK for Python",
          "language": "swift",
          "startTimeSeconds": 1109,
          "code": "# Foundation Models SDK for Python\n\n  import apple_fm_sdk as fm\n\n  model = fm.SystemLanguageModel()\n\n  # Check the model's availability\n  is_available, reason = model.is_available()\n\n  if is_available:\n\n      # Create a session\n      session = fm.LanguageModelSession(model=model)\n\n      # Generate a response\n      response = await session.respond(prompt=\"Hello!\")\n      print(response)"
        }
      ],
      "resources": [
        {
          "title": "Expanding generation with tool calling",
          "url": "https://developer.apple.com/documentation/FoundationModels/expanding-generation-with-tool-calling",
          "type": "documentation",
          "description": "Build tools that enable the model to perform tasks that are specific to your use case.",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/expanding-generation-with-tool-calling",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/expanding-generation-with-tool-calling.json"
        },
        {
          "title": "Analyzing images with multimodal prompting",
          "url": "https://developer.apple.com/documentation/FoundationModels/analyzing-images-with-multimodal-prompting",
          "type": "documentation",
          "description": "Analyze and extract information from images by combining them with descriptive text prompts.",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/analyzing-images-with-multimodal-prompting",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/analyzing-images-with-multimodal-prompting.json"
        },
        {
          "title": "Composing dynamic sessions with instructions and profiles",
          "url": "https://developer.apple.com/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles",
          "type": "documentation",
          "description": "Adapt sessions dynamically at runtime by loading instructions and tools based",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles.json"
        },
        {
          "title": "Adding server-side intelligence with Private Cloud Compute",
          "url": "https://developer.apple.com/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute",
          "type": "documentation",
          "description": "Access a larger context window and stronger reasoning by routing session requests",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute.json"
        }
      ],
      "path": "sessions/wwdc2026/241-what-s-new-in-the-foundation-models-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/241-what-s-new-in-the-foundation-models-framework/metadata.json",
        "readme": "sessions/wwdc2026/241-what-s-new-in-the-foundation-models-framework/README.md",
        "transcript": "sessions/wwdc2026/241-what-s-new-in-the-foundation-models-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/241-what-s-new-in-the-foundation-models-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-242",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 242,
      "title": "Build agentic app experiences with the Foundation Models framework",
      "description": "Learn how to take your intelligence features further with Foundation Models framework primitives for dynamic context and agentic workflows. We’ll walk through engineering shared context, setting up privacy boundaries, and managing key value caching. Discover how to orchestrate smooth handoffs between local and server models.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/242",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/242",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "xcode"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1303,
      "hasTranscript": true,
      "transcriptWordCount": 2984,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/242/4/7f05515d-be1a-43a0-9962-a1f77f115666/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/242/4/7f05515d-be1a-43a0-9962-a1f77f115666/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/242/4/7f05515d-be1a-43a0-9962-a1f77f115666/downloads/wwdc2026-242_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/242/4/7f05515d-be1a-43a0-9962-a1f77f115666/downloads/wwdc2026-242_hd.mp4",
        "duration": 1303
      },
      "codeSnippets": [
        {
          "title": "DynamicInstructions",
          "language": "swift",
          "startTimeSeconds": 304,
          "code": "// DynamicInstructions\n\n  struct BrainstormFacilitator: DynamicInstructions {\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicInstructions {\n          Instructions {\n              \"You are a warm and friendly expert crafting brainstorm facilitator.\"\n          }\n          // Tools\n          GenerateProjectTitle()\n          // Conditionally include Origami knowledge\n          if orchestrator.techniques.contains(.origami) {\n              OrigamiExpert()\n          }\n      }\n  }"
        },
        {
          "title": "DynamicProfile",
          "language": "swift",
          "startTimeSeconds": 401,
          "code": "// DynamicProfile\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .brainstorming:\n              Profile { BrainstormFacilitator(orchestrator: orchestrator) }\n                  .model(orchestrator.pccLanguageModel)\n                  .temperature(1)\n          case .planning:\n              Profile { TutorialAuthor(orchestrator: orchestrator) }\n                  .model(orchestrator.pccLanguageModel)\n                  .reasoningLevel(.deep)\n          case .reviewing:\n              Profile { CraftCoach() }\n                  .model(orchestrator.systemLanguageModel)\n          }\n      }\n  }"
        },
        {
          "title": "Initialize your session with your dynamic profile",
          "language": "swift",
          "startTimeSeconds": 403,
          "code": "// Initialize your session with your dynamic profile\n  let session = LanguageModelSession(profile: CraftProfile(orchestrator: orchestrator))"
        },
        {
          "title": "Transcript management",
          "language": "swift",
          "startTimeSeconds": 513,
          "code": "// Transcript management\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .reviewing:\n              Profile { CraftCoach() }\n                  .model(orchestrator.systemLanguageModel)\n                  .historyTransform { history in\n                      // Update the history for your profile\n                      guard let latestResponseIndex = lastResponseEntryIndex(history) else {\n                          return history\n                      }\n                      let filteredHistory = history[0..<latestResponseIndex].filter { entry in\n                          isToolCallsOrToolOutput(entry)\n                      }\n                      return filteredHistory + history[latestResponseIndex...]\n                  }\n          }\n      }\n  }"
        },
        {
          "title": "Custom modifiers",
          "language": "swift",
          "startTimeSeconds": 555,
          "code": "// Custom modifiers\n\n  struct DroppingToolCallsProfileModifier: LanguageModelSession.DynamicProfileModifier {\n      func body(content: Content) -> some DynamicProfile {\n          content\n              .historyTransform { history in\n                  guard let latestResponseIndex = lastResponseEntryIndex(history) else {\n                      return history\n                  }\n                  let filteredHistory = history[0..<latestResponseIndex].filter { entry in\n                      isToolCallsOrToolOutput(entry)\n                  }\n                  return filteredHistory + history[latestResponseIndex...]\n              }\n      }\n  }\n\n  extension LanguageModelSession.DynamicProfile {\n      func droppingCompletedToolCalls() -> some DynamicProfile {\n          self.modifier(DroppingToolCallsProfileModifier())\n      }\n  }"
        },
        {
          "title": "History management modifiers",
          "language": "swift",
          "startTimeSeconds": 567,
          "code": "// History management modifiers\n\n  import FoundationModelsUtilities\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .reviewing:\n              Profile { CraftCoach() }\n                  // Keep the most recent 10 entries\n                  // after dropping finished tool calls\n                  .rollingWindow(size: .entries(10))\n                  .droppingCompletedToolCalls()\n          }\n      }\n  }"
        },
        {
          "title": "Lifecycle modifiers",
          "language": "swift",
          "startTimeSeconds": 648,
          "code": "// Lifecycle modifiers\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      @SessionProperty(\\.history) var history\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .planning:\n              Profile { TutorialAuthor(orchestrator: orchestrator) }\n                  .model(orchestrator.pccLanguageModel)\n                  .reasoningLevel(.deep)\n                  .onResponse {\n                      // Update history\n                      if history.count > 50, let responseIndex = lastResponseIndex(history) {\n                          history = history[responseIndex...]\n                      }\n                  }\n          }\n      }\n  }"
        },
        {
          "title": "Declare a custom session property",
          "language": "swift",
          "startTimeSeconds": 700,
          "code": "// Session properties — declaration\n\n  extension SessionPropertyValues {\n      @SessionPropertyEntry var summary: String?\n  }"
        },
        {
          "title": "Read and write session properties in a profile",
          "language": "swift",
          "startTimeSeconds": 744,
          "code": "// Session properties\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      @SessionProperty(\\.history) var history\n      @SessionProperty(\\.summary) var summary\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .planning:\n              Profile {\n                  TutorialAuthor(orchestrator: orchestrator)\n                  if let summary {\n                      Instructions { \"Summary: \\(summary)\" }\n                  }\n              }\n              .onResponse {\n                  if history.count > 50, let responseIndex = lastResponse(history.prefix(40)) {\n                      summary = try await summarize(history[0..<responseIndex])\n                      history = history[responseIndex...]\n                  }\n              }\n          }\n      }\n  }"
        },
        {
          "title": "Orchestration: baton-pass",
          "language": "swift",
          "startTimeSeconds": 782,
          "code": "// Baton-pass\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var orchestrator: CraftOrchestrator\n      var body: some DynamicProfile {\n          switch orchestrator.mode {\n          case .brainstorm:\n              Profile {\n                  BrainstormInstructions()\n                  BatonPassTool()\n              }\n              .onToolCall { orchestrator.mode = .tutorial }\n              .model(orchestrator.serverModel)\n          case .tutorial:\n              Profile {\n                  TutorialInstructions()\n                  BatonPassTool()\n              }\n              .onToolCall { orchestrator.mode = .brainstorm }\n              .model(orchestrator.systemModel)\n          }\n      }\n  }"
        },
        {
          "title": "Orchestration: phone-a-friend",
          "language": "swift",
          "startTimeSeconds": 854,
          "code": "// Phone-a-friend\n\n  struct CraftProfile: LanguageModelSession.DynamicProfile {\n      var body: some DynamicProfile {\n          Profile {\n              BrainstormInstructions()\n              PhoneFriendTool(\n                  name: \"generate_title\",\n                  description: \"Generate a creative project title\",\n                  profile: TitleProfile()\n              )\n          }\n      }\n  }\n\n  struct PhoneFriendTool<P: LanguageModelSession.DynamicProfile>: Tool {\n      func call(arguments: GeneratedContent) async throws -> String {\n          let session = LanguageModelSession(profile: profile())\n          let response = try await session.respond(to: arguments)\n          return response.content\n      }\n  }"
        },
        {
          "title": "The skills pattern",
          "language": "swift",
          "startTimeSeconds": 915,
          "code": "// The skills pattern\n\n  struct CraftingSkills: LanguageModelSession.DynamicInstructions {\n      var activations: SkillActivations\n      var body: some DynamicInstructions {\n          Skills(activations: activations) {\n              Skill(\n                  name: \"origami_folds\",\n                  description: \"Details about specific types of folds\",\n                  prompt: \"\"\"\n                      Valley Fold: Paper is folded toward you, creating a V-shaped crease\n                      Mountain Fold: Paper is folded away from you, creating an inverted V\n                      ...\n                      \"\"\"\n              )\n              Skill(...)\n              Skill(...)\n          }\n      }\n  }"
        },
        {
          "title": "Tool calling mode",
          "language": "swift",
          "startTimeSeconds": 931,
          "code": "// Tool calling mode\n\n  public struct ToolCallingMode: Sendable {\n      public static let allowed: ToolCallingMode\n      public static let disallowed: ToolCallingMode\n      public static let required: ToolCallingMode\n  }\n\n  // Pass tool calling mode as a profile modifier\n  struct OrigamiExpert: LanguageModelSession.DynamicProfile {\n      var body: some LanguageModelSession.DynamicProfile {\n          Profile {\n              Instructions(\"You are an origami expert\")\n              QueryOrigamiDatabaseTool()\n              ShowDirectionsTool()\n          }\n          .toolCallingMode(.required)\n      }\n  }\n\n  // Or pass it as a generation option\n  let response = try await session.respond(\n      to: \"Write out the instructions for folding a paper crane.\",\n      options: GenerationOptions(toolCallingMode: .required)\n  )"
        },
        {
          "title": "Escaping a tool call loop",
          "language": "swift",
          "startTimeSeconds": 1007,
          "code": "// Escaping a tool call loop\n\n  struct OrigamiExpert: LanguageModelSession.DynamicProfile {\n      let state: OrigamiAppState\n\n      var body: some LanguageModelSession.DynamicProfile {\n          Profile {\n              Instructions(\"Answer questions about how to fold origami\")\n              QueryOrigamiDatabaseTool()\n          }\n          .toolCallingMode(state.queriedDatabase ? .disallowed : .required)\n          .onToolCall { state.queriedDatabase = true }\n      }\n  }"
        },
        {
          "title": "Define a tool that throws an error",
          "language": "swift",
          "startTimeSeconds": 1017,
          "code": "// Define a tool that throws an error\n      var output: String?\n\n      @Generable struct Arguments {\n          var answer: String\n      }\n\n      func call(arguments: Arguments) async throws -> Never {\n          output = arguments.answer\n          throw CancellationError()\n      }\n  }"
        },
        {
          "title": "Set the transcript error handling policy",
          "language": "swift",
          "startTimeSeconds": 1048,
          "code": "// Specify transcript behavior on a profile\n  struct OrigamiExpert: LanguageModelSession.DynamicProfile {\n      let state: OrigamiAppState\n\n      var body: some LanguageModelSession.DynamicProfile {\n          Profile {\n              Instructions(\"Answer questions about how to fold origami\")\n              QueryOrigamiDatabaseTool()\n          }\n          .transcriptErrorHandlingPolicy(.preserveTranscript)\n      }\n  }\n\n  // Or specify it on a session\n  let session = LanguageModelSession()\n  session.transcriptErrorHandlingPolicy = .preserveTranscript\n\n  // Policy options\n  extension LanguageModelSession {\n      public struct TranscriptErrorHandlingPolicy: Sendable {\n          // Roll the transcript back to its previous state\n          public static let revertTranscript: TranscriptErrorHandlingPolicy\n          // Keep the transcript in state following an error\n          public static let preserveTranscript: TranscriptErrorHandlingPolicy\n      }\n  }"
        },
        {
          "title": "Transcript mutation",
          "language": "swift",
          "startTimeSeconds": 1071,
          "code": "// Transcript mutation\n\n  public final class LanguageModelSession: Sendable {\n      public var transcriptErrorHandlingPolicy: TranscriptErrorHandlingPolicy { get set }\n\n      // Transcript is now settable\n      public var transcript: Transcript { get set }\n\n      // But you must not modify it during a response!\n      public var isResponding: Bool { get }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Composing dynamic sessions with instructions and profiles",
          "url": "https://developer.apple.com/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles",
          "type": "documentation",
          "description": "Adapt sessions dynamically at runtime by loading instructions and tools based",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/composing-dynamic-sessions-with-instructions-and-profiles.json"
        }
      ],
      "path": "sessions/wwdc2026/242-build-agentic-app-experiences-with-the-foundation-models-fra/",
      "files": {
        "metadata": "sessions/wwdc2026/242-build-agentic-app-experiences-with-the-foundation-models-fra/metadata.json",
        "readme": "sessions/wwdc2026/242-build-agentic-app-experiences-with-the-foundation-models-fra/README.md",
        "transcript": "sessions/wwdc2026/242-build-agentic-app-experiences-with-the-foundation-models-fra/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/242-build-agentic-app-experiences-with-the-foundation-models-fra/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-243",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 243,
      "title": "Debug and profile agentic app experiences with Instruments",
      "description": "Explore the enhanced FoundationModels instrument in Xcode to inspect behavior and optimize the performance of agentic flows. Learn how to inspect prompts, analyze latency, and trace control flow in advanced use cases that leverage multiple LanguageModelSessions and profiles.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/243",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/243",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "ai",
        "debug",
        "machine learning",
        "xcode"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 860,
      "hasTranscript": true,
      "transcriptWordCount": 2101,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/243/4/127c397a-8124-4f3d-ad18-ac2a1d275803/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/243/4/127c397a-8124-4f3d-ad18-ac2a1d275803/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/243/4/127c397a-8124-4f3d-ad18-ac2a1d275803/downloads/wwdc2026-243_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/243/4/127c397a-8124-4f3d-ad18-ac2a1d275803/downloads/wwdc2026-243_hd.mp4",
        "duration": 860
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Analyzing the runtime performance of your Foundation Models app",
          "url": "https://developer.apple.com/documentation/FoundationModels/analyzing-the-runtime-performance-of-your-foundation-models-app",
          "type": "documentation",
          "description": "Measure how prompts, responses, and tool calls affect token consumption and",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/analyzing-the-runtime-performance-of-your-foundation-models-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/analyzing-the-runtime-performance-of-your-foundation-models-app.json"
        }
      ],
      "path": "sessions/wwdc2026/243-debug-and-profile-agentic-app-experiences-with-instruments/",
      "files": {
        "metadata": "sessions/wwdc2026/243-debug-and-profile-agentic-app-experiences-with-instruments/metadata.json",
        "readme": "sessions/wwdc2026/243-debug-and-profile-agentic-app-experiences-with-instruments/README.md",
        "transcript": "sessions/wwdc2026/243-debug-and-profile-agentic-app-experiences-with-instruments/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/243-debug-and-profile-agentic-app-experiences-with-instruments/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-246",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 246,
      "title": "LLM search using Core Spotlight",
      "description": "Level up basic search into a retrieval-augmented system using SpotlightSearchTool and LanguageModelSession. Explore Core Spotlight integration, delegate-based hydration patterns, and how metadata quality impacts your search results. Learn how to use custom PipelineStages for tasks like sentiment analysis. Discover best practices for indexing and building flexible, context-rich search experiences in your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/246",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/246",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "spotlight",
        "spot light",
        "spotlight search"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 985,
      "hasTranscript": true,
      "transcriptWordCount": 2830,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/246/4/b390ab9d-d231-4cf5-9d1b-e4270ef5012b/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/246/4/b390ab9d-d231-4cf5-9d1b-e4270ef5012b/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/246/4/b390ab9d-d231-4cf5-9d1b-e4270ef5012b/downloads/wwdc2026-246_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/246/4/b390ab9d-d231-4cf5-9d1b-e4270ef5012b/downloads/wwdc2026-246_hd.mp4",
        "duration": 985
      },
      "codeSnippets": [
        {
          "title": "Ask the model with a Foundation Models session",
          "language": "swift",
          "startTimeSeconds": 59,
          "code": "let response = try await session.respond(to: \"What are some nice hikes near water?\")"
        },
        {
          "title": "Set up SpotlightSearchTool",
          "language": "swift",
          "startTimeSeconds": 260,
          "code": "// Set up SpotlightSearchTool\n  import CoreSpotlight\n  import FoundationModels\n\n  // In one line, the tool is ready to search your app's Core Spotlight index\n  let tool = SpotlightSearchTool()\n\n  // Or provide a custom configuration — e.g. search file paths in your app's sandbox\n  let fileTool = SpotlightSearchTool(\n      configuration: .init(\n          sources: [\n              .files\n          ]\n      )\n  )"
        },
        {
          "title": "Add SpotlightSearchTool to a session",
          "language": "swift",
          "startTimeSeconds": 290,
          "code": "// Add SpotlightSearchTool to a session\n  import CoreSpotlight\n  import FoundationModels\n\n  let tool = SpotlightSearchTool()\n\n  let session = LanguageModelSession(model: model, tools: [tool], instructions: instructions)\n\n  let response = try await session.respond(to: \"What hikes have I gone on?\")"
        },
        {
          "title": "Implement an index delegate",
          "language": "swift",
          "startTimeSeconds": 384,
          "code": "// Implement an index delegate\n  import CoreSpotlight\n\n  class IndexDelegate: NSObject, CSSearchableIndexDelegate {\n\n      // Called when the index requests searchable items for the provided identifiers\n      func searchableItems(forIdentifiers identifiers: [String]) async -> [CSSearchableItem] {\n          let entries = await mystore.fetchEntries(ids: identifiers)\n          return entries.map { makeSearchableItem(from: $0) }\n      }\n  }"
        },
        {
          "title": "Track the query token for refresh",
          "language": "swift",
          "startTimeSeconds": 457,
          "code": "// Track the query token for refresh\n  import CoreSpotlight\n  import FoundationModels\n\n  let tool = SpotlightSearchTool()\n\n  for await reply in tool.searchResults {\n\n      if reply.queryToken != currentToken {\n          // New query — start a new display section\n          currentToken = reply.queryToken\n      }\n\n      switch reply.content {\n      case .items(let searchItems):\n      }\n  }"
        },
        {
          "title": "Set a dynamic guidance profile",
          "language": "swift",
          "startTimeSeconds": 522,
          "code": "// Set a dynamic guidance profile\n  import CoreSpotlight\n  import FoundationModels\n\n  let profile = SpotlightSearchTool.GuidanceProfile(\n      textMatch: true,\n      dates: true,\n      people: false,\n      attributes: [.title, .altitude, .completionDate]\n  )\n\n  let tool = SpotlightSearchTool(\n      configuration: .init(\n          guide: .init(level: .dynamic(profile))\n      )\n  )\n\n  // On-device models have smaller context — prefer focused guidance\n  let focusedTool = SpotlightSearchTool(\n      configuration: .init(\n          guide: .init(level: .focused(.items))\n      )\n  )"
        },
        {
          "title": "Implement a ContactResolver",
          "language": "swift",
          "startTimeSeconds": 572,
          "code": "// Implement a ContactResolver\n  import CoreSpotlight\n  import FoundationModels\n\n  struct MyContactResolver: ContactResolver {\n\n      func userIdentity() -> ResolvedContact {\n          // Pull from whatever identity source your app has —\n          // account profile, Contacts framework, sign-in session, etc.\n          var contact = ResolvedContact(displayName: \"Jane Doe\")\n          contact.emailAddresses = [\"jane@example.com\", \"jdoe@work.com\"]\n          contact.names = [\"Jane\", \"JD\"]\n          return contact\n      }\n  }\n\n  tool.contactResolver = MyContactResolver()"
        },
        {
          "title": "Define a custom stage",
          "language": "swift",
          "startTimeSeconds": 694,
          "code": "// Define a custom stage\n  import CoreSpotlight\n  import FoundationModels\n\n  @Generable\n  struct HappinessStage: CustomStage {\n      static var name = \"happiness\"\n      static var description = \"Scores hike by how happy the author was\"\n      static var inputTypes: [SearchPipelineDataType] = [.items]\n      static var outputTypes: [SearchPipelineDataType] = [.scoredItems]\n\n      @Guide(description: \"Minimum happiness score (0.0-1.0) to include in results\")\n      var threshold: Double?\n\n      func execute(on input: SearchPipelineData) async throws -> SearchPipelineData {\n          return SearchPipelineData(payload: .scoredItems(sorted))\n      }\n  }\n\n  // Register the stage by adding it to the tool's configuration\n  let tool = SpotlightSearchTool(configuration: .init(\n      customStages: [.happinessBoost(threshold: 0.5)])\n  )"
        },
        {
          "title": "Handle a reply data types",
          "language": "swift",
          "startTimeSeconds": 730,
          "code": "// Handle a reply data types\n  import CoreSpotlight\n  import FoundationModels\n\n  for await reply in tool.searchResults {\n\n      let label = reply.label\n      case .items(let searchItems):\n      case .scoredItems(let scored):\n      case .groupedItems(let groups):\n      case .count(let count):\n      case .table(let table):\n      case .statistic(let statistic):\n      case .text(let text):\n          continue\n      }   \n  }"
        },
        {
          "title": "Define an evaluation dataset with ModelSampleProtocol",
          "language": "swift",
          "startTimeSeconds": 827,
          "code": "// Evaluations\n  import Evaluations\n\n  struct TrailRequest: ModelSampleProtocol {\n\n      typealias ExpectedValue = String                    // sample response\n      typealias Expectation   = TrajectoryExpectation     \n\n      var input:  ModelSampleInput\n      var output: ModelSampleOutput<String, TrajectoryExpectation>\n\n      var expectedIdentifiers: [String]\n  }"
        },
        {
          "title": "Define the trajectory expectation",
          "language": "swift",
          "startTimeSeconds": 906,
          "code": "// Evaluations\n  import Evaluations\n\n  TrajectoryExpectation(\n      unordered: [\n          ToolExpectation(\"searchSpotlight\", arguments: [.keyOnly(argumentName: \"query\")])\n      ]   \n  )"
        },
        {
          "title": "Run the evaluation test —",
          "language": "swift",
          "startTimeSeconds": 917,
          "code": "@Test(\"Trail search evaluation meets quality thresholds\")\n  func trailSearchEval() async throws {\n\n      let items = try Self.loadItems()\n      let samples = try Self.loadSamples()\n\n      try await Self.indexDelegate.indexSearchableItems(items)\n      let tool = Self.makeSearchTool()\n\n      let evaluation = TrailSearchEvaluation(\n          tool: tool,\n          dataset: ArrayLoader(samples: samples)\n      )   \n\n      let result = try await evaluation.run()\n      let coverageMean = result.aggregateValue(.mean(of: Metric(\"ResultCoverage\")))\n      #expect(coverageMean >= 0.5, \"Result coverage should be at least 50% across queries\")\n  }"
        }
      ],
      "resources": [
        {
          "title": "Spotlight search tool",
          "url": "https://developer.apple.com/documentation/CoreSpotlight/Spotlight-search-tool",
          "type": "documentation",
          "description": "Make your app’s indexed content available to the system’s Foundation models as additional",
          "sosumiURL": "https://sosumi.ai/documentation/CoreSpotlight/Spotlight-search-tool",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreSpotlight/Spotlight-search-tool.json"
        },
        {
          "title": "Making your indexed content available to Foundation Models",
          "url": "https://developer.apple.com/documentation/CoreSpotlight/making-your-indexed-content-available-to-foundation-models",
          "type": "documentation",
          "description": "Make the content you index for Spotlight available to Foundation models to help",
          "sosumiURL": "https://sosumi.ai/documentation/CoreSpotlight/making-your-indexed-content-available-to-foundation-models",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreSpotlight/making-your-indexed-content-available-to-foundation-models.json"
        }
      ],
      "path": "sessions/wwdc2026/246-llm-search-using-core-spotlight/",
      "files": {
        "metadata": "sessions/wwdc2026/246-llm-search-using-core-spotlight/metadata.json",
        "readme": "sessions/wwdc2026/246-llm-search-using-core-spotlight/README.md",
        "transcript": "sessions/wwdc2026/246-llm-search-using-core-spotlight/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/246-llm-search-using-core-spotlight/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-250",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 250,
      "title": "Principles of great design",
      "description": "Dive deep into fundamental design principles for Apple platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/250",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/250",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Accessibility & Inclusion",
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 1036,
      "hasTranscript": true,
      "transcriptWordCount": 2533,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/250/4/ad804f32-2805-48aa-891c-8c742579acab/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/250/4/ad804f32-2805-48aa-891c-8c742579acab/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/250/4/ad804f32-2805-48aa-891c-8c742579acab/downloads/wwdc2026-250_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/250/4/ad804f32-2805-48aa-891c-8c742579acab/downloads/wwdc2026-250_hd.mp4",
        "duration": 1036
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Human Interface Guidelines: Design principles",
          "url": "https://developer.apple.com/design/human-interface-guidelines/design-principles",
          "type": "documentation",
          "description": null,
          "sosumiURL": "https://sosumi.ai/design/human-interface-guidelines/design-principles"
        }
      ],
      "path": "sessions/wwdc2026/250-principles-of-great-design/",
      "files": {
        "metadata": "sessions/wwdc2026/250-principles-of-great-design/metadata.json",
        "readme": "sessions/wwdc2026/250-principles-of-great-design/README.md",
        "transcript": "sessions/wwdc2026/250-principles-of-great-design/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/250-principles-of-great-design/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-251",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 251,
      "title": "Communicate your brand identity on iOS",
      "description": "Explore practical approaches to branding using typography, color, components, and interactions that balance the familiar with the unique.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/251",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/251",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS"
      ],
      "keywords": [],
      "topics": [
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 1046,
      "hasTranscript": true,
      "transcriptWordCount": 2602,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/251/4/52fb4c75-99ba-419f-90d6-bfef374ac966/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/251/4/52fb4c75-99ba-419f-90d6-bfef374ac966/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/251/4/52fb4c75-99ba-419f-90d6-bfef374ac966/downloads/wwdc2026-251_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/251/4/52fb4c75-99ba-419f-90d6-bfef374ac966/downloads/wwdc2026-251_hd.mp4",
        "duration": 1046
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Human Interface Guidelines",
          "url": "https://developer.apple.com/design/human-interface-guidelines",
          "type": "documentation",
          "description": "The HIG contains guidance and best practices that can help you design a",
          "sosumiURL": "https://sosumi.ai/design/human-interface-guidelines"
        }
      ],
      "path": "sessions/wwdc2026/251-communicate-your-brand-identity-on-ios/",
      "files": {
        "metadata": "sessions/wwdc2026/251-communicate-your-brand-identity-on-ios/metadata.json",
        "readme": "sessions/wwdc2026/251-communicate-your-brand-identity-on-ios/README.md",
        "transcript": "sessions/wwdc2026/251-communicate-your-brand-identity-on-ios/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/251-communicate-your-brand-identity-on-ios/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-252",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 252,
      "title": "Design no-code games with Reality Composer Pro 3",
      "description": "Discover how you can use ScriptGraph in Reality Composer Pro 3 to create no-code 3D content for your apps and games. Learn how to take advantage of visual nodes to build animations, create interactive moments, and incorporate SwiftUI elements to add speech bubbles and other UI to your experience.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/252",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/252",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "visionOS"
      ],
      "keywords": [
        "apple vision pro",
        "game design",
        "reality composer pro",
        "realitykit",
        "squirrel game",
        "visionos",
        "visionos games",
        "vision pro"
      ],
      "topics": [
        "Developer Tools",
        "Graphics & Games",
        "Spatial Computing",
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 1133,
      "hasTranscript": true,
      "transcriptWordCount": 2789,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/252/6/572c2388-69f6-4e57-9eba-c71b65f5f6ed/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/252/6/572c2388-69f6-4e57-9eba-c71b65f5f6ed/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/252/6/572c2388-69f6-4e57-9eba-c71b65f5f6ed/downloads/wwdc2026-252_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/252/6/572c2388-69f6-4e57-9eba-c71b65f5f6ed/downloads/wwdc2026-252_hd.mp4",
        "duration": 1133
      },
      "codeSnippets": [
        {
          "title": "Squirrel Talk",
          "language": "swift",
          "startTimeSeconds": 1043,
          "code": "// Advanced techniques\n\nif let scene = entity.scene {\n    scene.subscribe(forEventName: \"squirrelTalk\", on: { event in\n        if let sayThis: String = try? event.value(\"sayThis\") {\n            self.sayThis = sayThis\n        }\n     } ).store(in: &cancellables)\n}\n\n...\n} attachments: {\n    Attachment(id: \"squirrelTalk\") {\n        SquirrelTalkAttachmentView(text: sayThis)\n   }\n}"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/252-design-no-code-games-with-reality-composer-pro-3/",
      "files": {
        "metadata": "sessions/wwdc2026/252-design-no-code-games-with-reality-composer-pro-3/metadata.json",
        "readme": "sessions/wwdc2026/252-design-no-code-games-with-reality-composer-pro-3/README.md",
        "transcript": "sessions/wwdc2026/252-design-no-code-games-with-reality-composer-pro-3/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/252-design-no-code-games-with-reality-composer-pro-3/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-253",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 253,
      "title": "Meet the Music Understanding framework",
      "description": "Discover Music Understanding, a new framework that lets your app analyze audio across six dimensions, on device: key, rhythm, structure, pace, instrument activity, and loudness. And use the Music Understanding Lab sample app to visualize each result.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/253",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/253",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Audio & Video"
      ],
      "primaryTopic": "Audio & Video",
      "duration": 1000,
      "hasTranscript": true,
      "transcriptWordCount": 1879,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/253/5/db1c3715-aaaf-42db-8e9e-66d2a0011430/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/253/5/db1c3715-aaaf-42db-8e9e-66d2a0011430/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/253/5/db1c3715-aaaf-42db-8e9e-66d2a0011430/downloads/wwdc2026-253_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/253/5/db1c3715-aaaf-42db-8e9e-66d2a0011430/downloads/wwdc2026-253_hd.mp4",
        "duration": 1000
      },
      "codeSnippets": [
        {
          "title": "Initialize the session",
          "language": "swift",
          "startTimeSeconds": 287,
          "code": "import MusicUnderstanding\n\n.fileImporter(isPresented: $isPresented, allowedContentTypes: [.audio]) { result in\n    switch result {\n    case .success(let url):\n        let asset = AVURLAsset(url: url, \n                               options: [AVURLAssetPreferPreciseDurationAndTimingKey : true])\n        let session = try await MusicUnderstandingSession(asset: asset)\n        let results = try await session.analyze()\n    }\n}"
        },
        {
          "title": "Inside SessionResult",
          "language": "swift",
          "startTimeSeconds": 324,
          "code": "import MusicUnderstanding\n\npublic struct SessionResult: Codable, Sendable {\n    public let instrumentActivity: InstrumentActivityResult?\n    public let key: KeyResult?\n    public let loudness: LoudnessResult?\n    public let pace: PaceResult?\n    public let rhythm: RhythmResult?\n    public let structure: StructureResult?\n}"
        },
        {
          "title": "TimedValue",
          "language": "swift",
          "startTimeSeconds": 353,
          "code": "import MusicUnderstanding\n\npublic struct TimedValue<Value>: Codable, Equatable, Sendable\nwhere Value: Codable & Equatable & Sendable {\n    public let time: CMTime\n    public let value: Value\n}"
        },
        {
          "title": "RangedValue",
          "language": "swift",
          "startTimeSeconds": 358,
          "code": "import MusicUnderstanding\n\npublic struct RangedValue<Value>: Codable, Equatable, Sendable\nwhere Value: Codable & Equatable & Sendable {\n    public let range: CMTimeRange\n    public let value: Value\n}"
        },
        {
          "title": "Key analysis",
          "language": "swift",
          "startTimeSeconds": 387,
          "code": "public struct KeyResult: Codable, Sendable {\n    public let ranges: [MusicUnderstandingSession.RangedValue<KeySignature]\n}"
        },
        {
          "title": "KeySignature",
          "language": "swift",
          "startTimeSeconds": 403,
          "code": "public struct KeySignature: Codable, Hashable, Sendable {\n    public let tonic: Tonic\n    public let mode: Mode\n}"
        },
        {
          "title": "Using tonic",
          "language": "swift",
          "startTimeSeconds": 408,
          "code": "@frozen public enum Tonic: String, Codable, Hashable, Sendable {\n    case aFlat, aSharp, a, bFlat, b, c, cSharp, d, dFlat, dSharp, eFlat, e, f, fSharp, g, gFlat, gSharp\n}"
        },
        {
          "title": "Using mode",
          "language": "swift",
          "startTimeSeconds": 419,
          "code": "public enum Mode: String, Codable, Hashable, Sendable {\n    case major, minor\n}"
        },
        {
          "title": "Rhythm analysis",
          "language": "swift",
          "startTimeSeconds": 436,
          "code": "import MusicUnderstanding\n\npublic struct RhythmResult: Codable, Sendable {\n    public let beats: [CMTime]\n    public let bars: [CMTime]\n    public let beatsPerMinute: Float?\n}"
        },
        {
          "title": "StructureResult",
          "language": "swift",
          "startTimeSeconds": 522,
          "code": "import MusicUnderstanding\n\npublic struct StructureResult: Codable, Sendable {\n    public let sections: [CMTimeRange]\n    public let segments: [CMTimeRange]\n    public let phrases: [CMTimeRange]\n}"
        },
        {
          "title": "Analyzing pace",
          "language": "swift",
          "startTimeSeconds": 566,
          "code": "import MusicUnderstanding\n\npublic struct PaceResult: Codable, Sendable {\n    public let ranges: [MusicUnderstandingSession.RangedValue<Double>]\n}"
        },
        {
          "title": "InstrumentActivityResult",
          "language": "swift",
          "startTimeSeconds": 613,
          "code": "import MusicUnderstanding\n\npublic struct InstrumentActivityResult: Codable, Sendable {\n    public let ranges: [Instrument: [CMTimeRange]]\n    public let activity: [Instrument: [MusicUnderstandingSession.TimedValue<Float>]]\n}"
        },
        {
          "title": "LoudnessResult",
          "language": "swift",
          "startTimeSeconds": 705,
          "code": "import MusicUnderstanding\n\npublic struct LoudnessResult: Codable, Sendable {\n    public let integrated: MusicUnderstandingSession.TimedValue<Float>\n    public let momentary: [MusicUnderstandingSession.TimedValue<Float>]\n    public let shortTerm: [MusicUnderstandingSession.TimedValue<Float>]\n    public let peak: MusicUnderstandingSession.TimedValue<Float>\n}"
        },
        {
          "title": "Streaming API for loudness",
          "language": "swift",
          "startTimeSeconds": 768,
          "code": "import MusicUnderstanding\n\npublic var loudnessResults: some AsyncSequence<LoudnessResult, any Error> & Sendable"
        },
        {
          "title": "Streaming API for loudness",
          "language": "swift",
          "startTimeSeconds": 775,
          "code": "import MusicUnderstanding\n\nlet audioProvider = AudioProvider()\nlet session = MusicUnderstandingSession(audioProvider: audioProvider)\nawait withThrowingTaskGroup(of: Void.self) { taskGroup in\n    group.addTask {\n        for try await result in await session.loudnessResults {\n            updateAudioLevel(result.momentary.value)\n        }\n    }\n\n    group.addTask {\n        try await session.analyze(for: [.loudness])\n    }\n}"
        },
        {
          "title": "Audio Provider",
          "language": "swift",
          "startTimeSeconds": 799,
          "code": "import MusicUnderstanding\n\nstruct AudioProvider: AsyncSequence, AsyncIteratorProtocol {\n   func makeAsyncIterator() -> Self {\n        return self\n    }\n\n   mutating func next() async -> AVReadOnlyAudioPCMBuffer? {\n        // Return the next audio buffer, or nil to signal completion\n    }\n}"
        },
        {
          "title": "Encode to JSON",
          "language": "swift",
          "startTimeSeconds": 835,
          "code": "import MusicUnderstanding\n\nlet session = try await MusicUnderstandingSession(asset: asset)\nlet results = try await session.analyze()\n\nlet encoder = JSONEncoder()\ntry encoder.encode(results)"
        },
        {
          "title": "Suggestion for using pace",
          "language": "swift",
          "startTimeSeconds": 887,
          "code": "let timePerClip = 60 / paceValue"
        }
      ],
      "resources": [
        {
          "title": "Creating visuals with Music Understanding analysis results",
          "url": "https://developer.apple.com/documentation/MusicUnderstanding/create-visuals-using-musicunderstanding-analysis-results",
          "type": "samplecode",
          "description": "Create a multiplatform app that presents analysis results from the Music Understanding framework.",
          "sosumiURL": "https://sosumi.ai/documentation/MusicUnderstanding/create-visuals-using-musicunderstanding-analysis-results",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MusicUnderstanding/create-visuals-using-musicunderstanding-analysis-results.json"
        },
        {
          "title": "Music Understanding",
          "url": "https://developer.apple.com/documentation/MusicUnderstanding",
          "type": "documentation",
          "description": "Analyze audio content and extract music information.",
          "sosumiURL": "https://sosumi.ai/documentation/MusicUnderstanding",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MusicUnderstanding.json"
        }
      ],
      "path": "sessions/wwdc2026/253-meet-the-music-understanding-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/253-meet-the-music-understanding-framework/metadata.json",
        "readme": "sessions/wwdc2026/253-meet-the-music-understanding-framework/README.md",
        "transcript": "sessions/wwdc2026/253-meet-the-music-understanding-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/253-meet-the-music-understanding-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-254",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 254,
      "title": "Integrate MusicKit into your app",
      "description": "Bring the power of Apple Music into your app using MusicKit. We’ll cover authorization, subscription-status checks, music selection, playback control, and cross-storefront song sharing. Learn how to use the new Music Picker to let people browse the Apple Music catalog and their personal libraries. We’ll also break down the differences between SystemMusicPlayer and ApplicationMusicPlayer, and show you how to observe playback state.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/254",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/254",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Audio & Video"
      ],
      "primaryTopic": "Audio & Video",
      "duration": 1266,
      "hasTranscript": true,
      "transcriptWordCount": 2562,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/254/5/d4b2c60a-8a2a-41d1-a55a-0fd60d927798/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/254/5/d4b2c60a-8a2a-41d1-a55a-0fd60d927798/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/254/5/d4b2c60a-8a2a-41d1-a55a-0fd60d927798/downloads/wwdc2026-254_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/254/5/d4b2c60a-8a2a-41d1-a55a-0fd60d927798/downloads/wwdc2026-254_hd.mp4",
        "duration": 1266
      },
      "codeSnippets": [
        {
          "title": "Presents the Apple Music subscription offer",
          "language": "swift",
          "startTimeSeconds": 287,
          "code": "@State var showSubscriptionOffer = false\n\nlet options = MusicSubscriptionOffer.Options(\n    messageIdentifier: .playMusic\n)\n\n@ViewBuilder\nvar musicSubsriptionButton: some View {\n    Button(\"Subscribe to Apple Music\", systemImage: \"music.note\") {\n        showSubscriptionOffer = true\n    }\n    .musicSubscriptionOffer(isPresented: $showSubscriptionOffer, options: options)\n}"
        },
        {
          "title": "Adds subscription button to main view",
          "language": "swift",
          "startTimeSeconds": 359,
          "code": "@State var subscription: MusicSubscription?\n\nvar body: some View {\n  \tVStack {\n        // ...\n        if let subscription, subscription.canBecomeSubscriber {\n            musicSubscriptionButton\n        }\n    }\n    .task(id: isAuthorized) {\n\t      self.subscription = try? await MusicSubscription.current\n        for await subscription in MusicSubscription.subscriptionUpdates {\n            self.subscription = subscription\n        }\n    }\n}"
        },
        {
          "title": "Add .musicPicker() modifier",
          "language": "swift",
          "startTimeSeconds": 528,
          "code": "@State var showMusicPicker = false\n@State var selectedSong: Song? = nil\n\n@ViewBuilder\nvar musicPickerButton: some View {\n    Button(\"Pick some Music\", systemImage: \"music.note.list\") {\n        showMusicPicker = true\n    }\n    .musicPicker(isPresented: $showMusicPicker, selection: $selectedSong)\n}\n\nvar body: some View {\n    VStack {\n        if let subscription, subscription.canBecomeSubscriber {\n            musicSubscriptionButton\n        }\n        musicPickerButton\n    }\n}"
        },
        {
          "title": "Artwork",
          "language": "swift",
          "startTimeSeconds": 889,
          "code": "@State var queue = ApplicationMusicPlayer.shared.queue\n\nvar body: some View {\n    VStack {\n        if let artwork = queue.currentEntry?.artwork {\n            ArtworkImage(artwork, width: 200, height: 200)\n        } else {\n            // Placeholder artwork\n            RoundedRectangle(cornerRadius: 16)\n                .fill(.quaternary)\n                .frame(width: 200, height: 200)\n        }\n    }\n}"
        },
        {
          "title": "Current entry info",
          "language": "swift",
          "startTimeSeconds": 906,
          "code": "@State var queue = ApplicationMusicPlayer.shared.queue\n\nvar body: some View {\n    VStack {\n        // ...\n        if let currentSong = queue.currentEntry {\n            Text(currentSong.title)\n                .font(.title3.bold())\n\n            if let subtitle = currentSong.subtitle {\n                Text(subtitle)\n                    .font(.subheadline)\n                    .foregroundStyle(.secondary)\n            }\n        }\n    }\n}"
        },
        {
          "title": "Playback controls (play, pause)",
          "language": "swift",
          "startTimeSeconds": 914,
          "code": "let player = ApplicationMusicPlayer.shared\n@State var state = ApplicationMusicPlayer.shared.state\n\nvar isPlaying: Bool {\n    state.playbackStatus == .playing\n}\n\nvar playPause: some View {\n    Button (\n        isPlaying ? \"Pause\": \"Play\",\n        systemImage: isplaying ? \"pause.fill\" : \"play.fill\"\n    ) {\n        if isPlaying {\n            player.pause()\n        } else {\n            Task {\n                try await player.play()\n            }\n        }\n    }\n}"
        },
        {
          "title": "Playback controls (next, previous)",
          "language": "swift",
          "startTimeSeconds": 938,
          "code": "let player = ApplicationMusicPlayer.shared\n\nvar controls: some View {\n    HStack {\n        Button(\"Back\", systemImage: \"backward.fill\") {\n            Task {\n                try await player.skipToPreviousEntry()\n            }\n        }\n        // ...\n        Button(\"Next\", systemImage: \"forward.fill\") {\n            Task {\n                try await player.skipToNextEntry()\n            }\n        }\n    }\n}"
        },
        {
          "title": "Music catalog resource request",
          "language": "swift",
          "startTimeSeconds": 1138,
          "code": "func fetchSongs(songIDs: [MusicItemID]) async throws -> (featured: Song?, other: [Song]) {\n    var request = MusicCatalogResourceRequest‹Song>(matching: \\.id, memberOf: songIDs)\n    request.options = [.findEquivalents]\n\n    let response = try await request.response()\n\n    let featuredSongID = songIDs[0]\n    let featuredSong = response.item(for: featuredSongID)\n\n    let others: [Song] = songIDs[1...].compactMap { songID in\n        return response.item(for: songID)\n    }\n\n    return (featuredSong, others)\n}"
        }
      ],
      "resources": [
        {
          "title": "Integrating MusicKit into your app",
          "url": "https://developer.apple.com/documentation/MusicKit/integrating-musickit-into-your-app",
          "type": "samplecode",
          "description": "Enhance your workouts with Apple Music playback.",
          "sosumiURL": "https://sosumi.ai/documentation/MusicKit/integrating-musickit-into-your-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MusicKit/integrating-musickit-into-your-app.json"
        },
        {
          "title": "Apple Services Performance Partner Program",
          "url": "https://performance-partners.apple.com/home",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MusicKit",
          "url": "https://developer.apple.com/documentation/musickit",
          "type": "documentation",
          "description": "Integrate your app with Apple Music.",
          "sosumiURL": "https://sosumi.ai/documentation/musickit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/musickit.json"
        }
      ],
      "path": "sessions/wwdc2026/254-integrate-musickit-into-your-app/",
      "files": {
        "metadata": "sessions/wwdc2026/254-integrate-musickit-into-your-app/metadata.json",
        "readme": "sessions/wwdc2026/254-integrate-musickit-into-your-app/README.md",
        "transcript": "sessions/wwdc2026/254-integrate-musickit-into-your-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/254-integrate-musickit-into-your-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-256",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 256,
      "title": "Discover generated subtitles and subtitle styles",
      "description": "Make your video content more accessible with generated subtitles — a powerful new feature that can transcribe spoken audio or translate subtitles from another language, using on-device models. Explore caption style preview, which lets people customize and preview subtitle styles during playback, and dive into implementation details for AVKit, AVPlayerLayer, and the Media Accessibility framework.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/256",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/256",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [],
      "topics": [
        "Accessibility & Inclusion",
        "Audio & Video"
      ],
      "primaryTopic": "Audio & Video",
      "duration": 660,
      "hasTranscript": true,
      "transcriptWordCount": 1378,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/256/4/d28efb5e-5550-468d-b1d1-caec51ce55e6/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/256/4/d28efb5e-5550-468d-b1d1-caec51ce55e6/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/256/4/d28efb5e-5550-468d-b1d1-caec51ce55e6/downloads/wwdc2026-256_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/256/4/d28efb5e-5550-468d-b1d1-caec51ce55e6/downloads/wwdc2026-256_hd.mp4",
        "duration": 660
      },
      "codeSnippets": [
        {
          "title": "Implement subtitle style preview",
          "language": "swift",
          "startTimeSeconds": 463,
          "code": "// Implement subtitle style preview\n\nimport AVFoundation\nimport MediaAccessibility\n\nfunc updateProfileList() {\n    subtitleStyleProfileIDs = MACaptionAppearanceCopyProfileIDs() as? [String] ?? []\n}\n\nfunc showPreviewStyle(subtitleStyleProfileID: String) {\n    playerLayer.setCaptionPreviewProfileID(subtitleStyleProfileID, position: .zero, text: nil)\n}\n\nfunc stopPreviewStyle() {\n    playerLayer.stopShowingCaptionPreview()\n}\n\nfunc setSubtitleStyle(subtitleStyleProfileID: CFString) {\n    MACaptionAppearanceSetActiveProfileID(subtitleStyleProfileID)\n}"
        }
      ],
      "resources": [
        {
          "title": "What's new in HTTP Live Streaming",
          "url": "https://developer.apple.com/streaming/Whats-new-HLS.pdf",
          "type": "documentation",
          "description": "WWDC25 Updates to HTTP Live Streaming (HLS) specification",
          "sosumiURL": "https://sosumi.ai/streaming/Whats-new-HLS.pdf"
        }
      ],
      "path": "sessions/wwdc2026/256-discover-generated-subtitles-and-subtitle-styles/",
      "files": {
        "metadata": "sessions/wwdc2026/256-discover-generated-subtitles-and-subtitle-styles/metadata.json",
        "readme": "sessions/wwdc2026/256-discover-generated-subtitles-and-subtitle-styles/README.md",
        "transcript": "sessions/wwdc2026/256-discover-generated-subtitles-and-subtitle-styles/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/256-discover-generated-subtitles-and-subtitle-styles/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-258",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 258,
      "title": "What’s new in Xcode 27",
      "description": "Discover the latest productivity enhancements in Xcode 27. Accelerate your development workflow through customization, coding agents, and Device Hub. Explore updates in localization, performance, and testing tools to refine your apps further.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/258",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/258",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 1680,
      "hasTranscript": true,
      "transcriptWordCount": 4731,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/258/4/66bc9c90-649b-4a16-a2bb-1e6f16b1ec73/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/258/4/66bc9c90-649b-4a16-a2bb-1e6f16b1ec73/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/258/4/66bc9c90-649b-4a16-a2bb-1e6f16b1ec73/downloads/wwdc2026-258_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/258/4/66bc9c90-649b-4a16-a2bb-1e6f16b1ec73/downloads/wwdc2026-258_hd.mp4",
        "duration": 1680
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Xcode updates",
          "url": "https://developer.apple.com/documentation/Updates/Xcode",
          "type": "documentation",
          "description": "Learn about important changes to Xcode.",
          "sosumiURL": "https://sosumi.ai/documentation/Updates/Xcode",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Updates/Xcode.json"
        }
      ],
      "path": "sessions/wwdc2026/258-what-s-new-in-xcode-27/",
      "files": {
        "metadata": "sessions/wwdc2026/258-what-s-new-in-xcode-27/metadata.json",
        "readme": "sessions/wwdc2026/258-what-s-new-in-xcode-27/README.md",
        "transcript": "sessions/wwdc2026/258-what-s-new-in-xcode-27/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/258-what-s-new-in-xcode-27/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-259",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 259,
      "title": "Xcode, agents, and you",
      "description": "Learn how you can use coding agents in Xcode in your development process. We’ll explore multiple ways of working with agents with tips to take you from creating an initial prototype to polishing a refined app. Discover how Xcode’s coding assistant adapts to help you stay engaged with the creative work that makes coding fun, whether you’re building an app solo or working with a team.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/259",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/259",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 1443,
      "hasTranscript": true,
      "transcriptWordCount": 3982,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/259/4/f4d40bb5-32db-418f-8a6e-396c77044afb/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/259/4/f4d40bb5-32db-418f-8a6e-396c77044afb/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/259/4/f4d40bb5-32db-418f-8a6e-396c77044afb/downloads/wwdc2026-259_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/259/4/f4d40bb5-32db-418f-8a6e-396c77044afb/downloads/wwdc2026-259_hd.mp4",
        "duration": 1443
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Writing code with intelligence in Xcode",
          "url": "https://developer.apple.com/documentation/Xcode/writing-code-with-intelligence-in-xcode",
          "type": "documentation",
          "description": "Start conversations with an agent or model in Xcode to generate code, navigate unfamiliar codebases, and fix or refactor existing code.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/writing-code-with-intelligence-in-xcode",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/writing-code-with-intelligence-in-xcode.json"
        }
      ],
      "path": "sessions/wwdc2026/259-xcode-agents-and-you/",
      "files": {
        "metadata": "sessions/wwdc2026/259-xcode-agents-and-you/metadata.json",
        "readme": "sessions/wwdc2026/259-xcode-agents-and-you/README.md",
        "transcript": "sessions/wwdc2026/259-xcode-agents-and-you/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/259-xcode-agents-and-you/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-260",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 260,
      "title": "Get the most out of Device Hub",
      "description": "Learn how Device Hub can accelerate your development workflows. We’ll take a tour of its features and show you how to diagnose and reproduce issues quickly with devices and simulators.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/260",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/260",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 1029,
      "hasTranscript": true,
      "transcriptWordCount": 2406,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/260/4/87d4b48f-1dfb-413f-a4f8-44d80b0f3432/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/260/4/87d4b48f-1dfb-413f-a4f8-44d80b0f3432/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/260/4/87d4b48f-1dfb-413f-a4f8-44d80b0f3432/downloads/wwdc2026-260_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/260/4/87d4b48f-1dfb-413f-a4f8-44d80b0f3432/downloads/wwdc2026-260_hd.mp4",
        "duration": 1029
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Device Hub",
          "url": "https://developer.apple.com/documentation/Xcode/device-hub",
          "type": "documentation",
          "description": "Manage the simulated and physical devices that you use to test your app.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/device-hub",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/device-hub.json"
        }
      ],
      "path": "sessions/wwdc2026/260-get-the-most-out-of-device-hub/",
      "files": {
        "metadata": "sessions/wwdc2026/260-get-the-most-out-of-device-hub/metadata.json",
        "readme": "sessions/wwdc2026/260-get-the-most-out-of-device-hub/README.md",
        "transcript": "sessions/wwdc2026/260-get-the-most-out-of-device-hub/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/260-get-the-most-out-of-device-hub/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-261",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 261,
      "title": "Build, deliver, and automate with Xcode Cloud",
      "description": "Discover the latest updates to Xcode Cloud that quickly get you started building and delivering your apps. Learn essential Xcode Cloud concepts, set up cloud build and tests simply by connecting your source repository, and configure for app distribution when you’re ready to ship. Find out how webhooks and management tools extends Xcode Cloud’s capabilities, supporting your most advanced workflows.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/261",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/261",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 829,
      "hasTranscript": true,
      "transcriptWordCount": 1778,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/261/7/35c49f2b-3f0a-4956-826b-d54d9fed678e/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/261/7/35c49f2b-3f0a-4956-826b-d54d9fed678e/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/261/7/35c49f2b-3f0a-4956-826b-d54d9fed678e/downloads/wwdc2026-261_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/261/7/35c49f2b-3f0a-4956-826b-d54d9fed678e/downloads/wwdc2026-261_hd.mp4",
        "duration": 829
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/261-build-deliver-and-automate-with-xcode-cloud/",
      "files": {
        "metadata": "sessions/wwdc2026/261-build-deliver-and-automate-with-xcode-cloud/metadata.json",
        "readme": "sessions/wwdc2026/261-build-deliver-and-automate-with-xcode-cloud/README.md",
        "transcript": "sessions/wwdc2026/261-build-deliver-and-automate-with-xcode-cloud/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/261-build-deliver-and-automate-with-xcode-cloud/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-262",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 262,
      "title": "What’s new in Swift",
      "description": "Join us for an update on Swift. Discover the latest language advancements, including updates for everyday ergonomics, improved concurrency, and safer high-performance code. Explore workflow and language interoperability improvements and updates in embedded Swift.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/262",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/262",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Developer Tools",
        "Swift"
      ],
      "primaryTopic": "Swift",
      "duration": 1965,
      "hasTranscript": true,
      "transcriptWordCount": 5593,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/262/5/d430e425-34fc-4ed5-b590-507ac593453a/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/262/5/d430e425-34fc-4ed5-b590-507ac593453a/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/262/5/d430e425-34fc-4ed5-b590-507ac593453a/downloads/wwdc2026-262_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/262/5/d430e425-34fc-4ed5-b590-507ac593453a/downloads/wwdc2026-262_hd.mp4",
        "duration": 1965
      },
      "codeSnippets": [
        {
          "title": "Better Swift Concurrency diagnostics (catching in the task)",
          "language": "swift",
          "startTimeSeconds": 72,
          "code": "Task {\n    do {\n        try lander.fly(to: moon)\n    }\n    catch {\n        lander.abort()\n    }\n}"
        },
        {
          "title": "Better Swift Concurrency diagnostics (saving the task for later)",
          "language": "swift",
          "startTimeSeconds": 81,
          "code": "let landingTask = Task {\n    try lander.fly(to: moon)\n}\n\ndefer {\n    await orbiter.rendezvous(with: lander)\n}\n\ntry await orbiter.justHangOut(waitingFor: landingTask)"
        },
        {
          "title": "Better 'Sendable' conformances",
          "language": "swift",
          "startTimeSeconds": 87,
          "code": "final class Spacecraft: Sendable {\n    ...\n    weak let dockedAt: SpaceStation?\n    ...\n}\n\nclass Mission: ~Sendable { ... }\n\nclass CrewedMission: Mission, @unchecked Sendable { ... }"
        },
        {
          "title": "More accessible memberwise initializers",
          "language": "swift",
          "startTimeSeconds": 108,
          "code": "struct Briefing {\n    internal var topic: String\n    internal var scheduledAt: Date\n    private  var attendees: [Person] = []\n}\n\n// Generated memberwise initializers:\n// extension Briefing {\n//     private init(topic: String, scheduledAt: Date, attendees: [Person] = []) { \n//          self.topic = topic\n//          self.scheduledAt = scheduledAt\n//          self.attendees = attendees\n//     }\n// \n//     internal init(topic: String, scheduledAt: Date) {\n//          self.topic = topic\n//          self.scheduledAt = scheduledAt\n//          self.attendees = []\n//     }\n// }"
        },
        {
          "title": "'anyAppleOS' availability (before)",
          "language": "swift",
          "startTimeSeconds": 123,
          "code": "extension Mission {\n    @available(macOS 27, iOS 27, watchOS 27, tvOS 27, visionOS 27, *)\n    func showStatus() { ... }\n\n    @available(macOS 27, iOS 27, watchOS 27, visionOS 27, *)\n    @available(tvOS, unavailable)\n    func launch() { ... }\n\n    #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) || os(visionOS)\n    func makeLiveActivityWidget() -> some Widget { ... }\n    #endif\n}"
        },
        {
          "title": "'anyAppleOS' availability (after)",
          "language": "swift",
          "startTimeSeconds": 137,
          "code": "extension Mission {\n    @available(anyAppleOS 27, *)\n    func showStatus() { ... }\n\n    @available(anyAppleOS 27, *)\n    @available(tvOS, unavailable)\n    func launch() { ... }\n\n    #if os(anyAppleOS)\n    func makeLiveActivityWidget() -> some Widget { ... }\n    #endif\n}"
        },
        {
          "title": "Controlling warnings with '@diagnose'",
          "language": "swift",
          "startTimeSeconds": 160,
          "code": "@diagnose(DeprecatedDeclaration, as: ignored, reason: \"Flying with surplus hardware\")\nfunc makeApolloSoyuzMission() -> Mission {\n    CrewedMission(\n        rocket: makeSaturnIRocket(),\n        payload: makeApolloCSM(),\n        crew: [.daniellePoole, .nathanMorrison]\n    )\n}\n\n@diagnose(StrictMemorySafety, as: warning)\nfunc uplinkCommand(from receiver: inout Receiver, to computer: inout Computer) {\n    let commandSize = receiver.receiveInt()\n    receiver.withReceivedData(byteCount: commandSize) {\n        computer.receiveUplinkedCommand($0)\n    }\n}\n\n@diagnose(ErrorInFutureSwiftVersion, as: error)\nfunc fetchPosition() -> (x: Double, y: Double, z: Double) {\n    return self.rotation\n}"
        },
        {
          "title": "Clarifying code with module selectors",
          "language": "swift",
          "startTimeSeconds": 227,
          "code": "import Rocket\nimport GiftShopToys\n\nlet rocket1 = SaturnV()            // could mean `Rocket::SaturnV` or `GiftShopToys::SaturnV`\nlet rocket2 = Rocket.SaturnV()     // prefers `Rocket::Rocket.SaturnV`\nlet rocket3 = Rocket::SaturnV()    // correctly finds `Rocket::SaturnV`"
        },
        {
          "title": "Clarifying code with module selectors (module selectors work on members, too)",
          "language": "swift",
          "startTimeSeconds": 300,
          "code": "//\n// Module Chemistry\n//\n\npublic protocol Flammable { ... }\n\nextension Flammable {\n    /// Set `self` on fire.\n    public func fire() { ... }\n}\n\n//\n// Module HumanResources\n//\n\nimport Chemistry\n\npublic protocol Employee { ... }\n\nextension Employee {\n    /// Remove `self` from job.\n    public func fire() { ... }\n}\n\npublic class LaunchPadTechnician: Employee, Flammable { ... }\n\n//\n// Module main\n//\n\nimport HumanResources\nimport Chemistry\n\nlet launchPadTechnician = LaunchPadTechnician(...)\n\nlaunchPadTechnician.HumanResources::fire()"
        },
        {
          "title": "Task cancellation",
          "language": "swift",
          "startTimeSeconds": 386,
          "code": "// Radio for help\n\nextension Radio {\n  func send(_ data: [UInt8] {\n    if Task.isCancelled { return }\n    // ...\n  }\n}\n\nextension EmergencyTransponder {\n  func sendSOS() {\n    radio.send(makeSOSPacket())\n  }\n}"
        },
        {
          "title": "Task cancellation shield",
          "language": "swift",
          "startTimeSeconds": 400,
          "code": "// Radio for help\n\nextension Radio {\n  func send(_ data: [UInt8] {\n    if Task.isCancelled { return }\n    // ...\n  }\n}\n\nextension EmergencyTransponder {\n  func sendSOS() {\n    withTaskCancellationShield {\n    \tradio.send(makeSOSPacket())\n    }\n  }\n}"
        },
        {
          "title": "Constructing a new dictionary",
          "language": "swift",
          "startTimeSeconds": 413,
          "code": "// Map values with keys\n\nfunc makeCalendarDisplayNames(for missions: [Mission: LaunchWindow]) -> [Mission: String] {\n    let new: [Mission: String] = .init(\n        uniqueKeysWithValues: missions.lazy.map { mission, launchWindow in\n            (mission, makeDisplayName(for: mission, in: launchWindow))\n        }\n    )\n    return new\n}"
        },
        {
          "title": "Dictionary.mapKeyedValues",
          "language": "swift",
          "startTimeSeconds": 426,
          "code": "// Map values with keys\n\nfunc makeCalendarDisplayNames(for missions: [Mission: LaunchWindow]) -> [Mission: String] {\n    missions.mapKeyedValues { mission, launchWindow in\n        makeDisplayName(for: mission, in: launchWindow)\n    }\n}"
        },
        {
          "title": "The new FilePath type",
          "language": "swift",
          "startTimeSeconds": 434,
          "code": "// FilePath handling macOS-named resources\n\nvar path: FilePath = \"/var/www/static\"\npath.components.append(\"WWDC\")\nprint(path.components)\n// [ \"var\", \"www\", \"static\", \"WWDC\" ]\n\nvar path: FilePath = \"/var/www/static/..namedresource/rsrc\"\nprint(path.components)\n// [ \"var\", \"www\", \"static\" ]"
        },
        {
          "title": "Issue Severity",
          "language": "swift",
          "startTimeSeconds": 461,
          "code": "// Issue severity\n\n@Test(arguments: allRockets)\nfunc testBurn(rocket: Rocket) throws {\n    rocket.burn(for: .seconds(150))\n    let remaining = rocket.propellantKg / rocket.totalPropellantKg\n\n    if remaining < 0.10 {\n        Issue.record(\n            \"\\(rocket.name) remaining fuel is below 10% reserve target\",\n            severity: .warning\n        )\n    }\n\n    #expect(remaining > 0.02, \"\\(rocket.name) propellant critically low - abort\")\n}"
        },
        {
          "title": "Test Cancellation",
          "language": "swift",
          "startTimeSeconds": 472,
          "code": "// Test Cancellation\n\n@Test(arguments: allRockets)\nfunc testBurn(rocket: Rocket) throws {\n    // solid-fuel rocket engines can't be stopped\n    if rocket.engineType == .solid {\n        try Test.cancel(\"\\(rocket.name) has solid fuel\")\n    }\n\n    rocket.burn(for: .seconds(150))\n    let remaining = rocket.propellantKg / rocket.totalPropellantKg\n\n    if remaining < 0.10 {\n        Issue.record(\n            \"\\(rocket.name) remaining fuel is below 10% reserve target\",\n            severity: .warning\n        )\n    }\n\n    #expect(remaining > 0.02, \"\\(rocket.name) propellant critically low - abort\")\n}"
        },
        {
          "title": "XCTest interoperability: Using XCTest from Swift Testing",
          "language": "swift",
          "startTimeSeconds": 514,
          "code": "// XCTest interoperability: Using XCTest from Swift Testing\n\nfunc checkedTransmitAndReceive(on radio: Radio,\n                               packet: Packet,\n                               expectedByteCount: Int) throws -> [UInt8] {\n    try radio.transmit(bytes: packet.data)\n    let bytes = try radio.receive()\n    XCTAssertEqual(bytes.count, expectedByteCount)\n    return bytes\n}\n\n@Test\nfunc pingTest() throws {\n    let radio = Radio()\n    let bytes = try checkedTransmitAndReceive(on: radio, packet: .ping, expectedByteCount: 8)\n    #expect(bytes == [0x00, 0x00, 0xf0, 0x37, 0x0f, 0xc7, 0x00, 0x01])\n}"
        },
        {
          "title": "XCTest interoperability: Using Swift Testing from XCTest",
          "language": "swift",
          "startTimeSeconds": 528,
          "code": "// XCTest interoperability: Using Swift Testing from XCTest\n\nclass RadioTests: XCTestCase {\n    func testPingPacketTransmission() {\n        let radio = Radio()\n        let bytes = try checkedTransmitAndReceive(on: radio,\n                                                  packet: .ping,\n                                                  expectedByteCount: 8)\n\n        #expect(bytes == [0x00, 0x00, 0xf0, 0x36, 0x0f, 0xc7, 0x00, 0x02])\n    }\n}"
        },
        {
          "title": "Subprocess Output Stream",
          "language": "swift",
          "startTimeSeconds": 601,
          "code": "// Subprocess output streaming\n\nlet result = try await Subprocess.run(.name(\"ls\"),\n                                      input: .none,\n                                      output: .sequence,\n                                      error: .string(limit:4096)) { execution in\n\t\texecution.standardOtput.strings().filter { $0.hasSuffix(\".obj\") }\n}\n\nfor try await objectFiles in result.closureOutput {\n  \tprint(\"Object file: \\(objectFile)\")\n}"
        },
        {
          "title": "Progress Manager - Concurrency",
          "language": "swift",
          "startTimeSeconds": 637,
          "code": "// Progress reporting - Concurrency\n\nlet manager = ProgressManager(totalCount: 100)\ntry await rocket.launch(mission.subprogress(assigningCount: 100))\n\nextension Rocket {\n    func launch(_ progress: consuming Subprogress? = nil) async throws {\n        let stage = progress?.start(totalCount: 3)\n        try await ignite(); stage?.complete(count: 1)\n        try await liftoff(); stage?.complete(count: 1)\n        try await stageSeparation(); stage?.complete(count: 1)\n    }\n}"
        },
        {
          "title": "Progress Manager - progress reporting",
          "language": "swift",
          "startTimeSeconds": 637,
          "code": "// Progress reporting - progress reporting\n\nlet manager = ProgressManager(totalCount: 100)\ntry await rocket.launch(mission.subprogress(assigningCount: 100))\n\nTask {\n    for await update in Observations({ mission.fractionCompleted }) {\n        print(\"🚀 Mission \\(Int(update * 100))%\")\n    }\n}"
        },
        {
          "title": "Progress reporting - metadata",
          "language": "swift",
          "startTimeSeconds": 637,
          "code": "// Progress reporting - metadata\n\nextension Rocket {\n    func ascend(_ progress: consuming Subprogress) async throws {\n        let stage = progress.start(totalCount: 3)\n        stage.detlaV = 3_400; try await burn(); stage.complete(count: 1)\n        stage.detlaV = 2_100; try await stageSeparation(); stage.complete(count: 1)\n        stage.detlaV = 1_800; try await coast(); stage.complete(count: 1)\n    }\n}\n\nprint(\"Δv to orbit: \\(mission.summary(of: \\.deltaV)) m/s\")"
        },
        {
          "title": "Directly control inlining (source code)",
          "language": "swift",
          "startTimeSeconds": 1256,
          "code": "func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {\n    var result = makeInts(randomized: false)\n\n    for value in values {\n        result[Int(value)] += 1\n    }\n\n    return result\n}\n\nfunc makeInts(randomized: Bool) -> [256 of Int] {\n    if randomized {\n        InlineArray { _ in Int.random(in: (.min)...(.max)) }\n    } else {\n        InlineArray(repeating: 0)\n    }\n}"
        },
        {
          "title": "Directly control inlining (inlined, but not optimized)",
          "language": "swift",
          "startTimeSeconds": 1261,
          "code": "func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {\n    var result = if false {                                                  //\n                     InlineArray { _ in Int.random(in: (.min)...(.max)) }    //\n                 } else {                                                    // Inlined code\n                     InlineArray(repeating: 0)                               //\n                 }                                                           //\n\n   for value in values {\n        result[Int(value)] += 1\n    }\n    return result\n}\n\nfunc makeInts(randomized: Bool) -> [256 of Int] {\n    if randomized {\n        InlineArray { _ in Int.random(in: (.min)...(.max)) }\n    } else {\n        InlineArray(repeating: 0)\n    }\n}"
        },
        {
          "title": "Directly control inlining (inlined and optimized)",
          "language": "swift",
          "startTimeSeconds": 1267,
          "code": "func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {\n    var result = InlineArray(repeating: 0)    // Inlined and optimized code\n\n   for value in values {\n        result[Int(value)] += 1\n    }\n    return result\n}\n\nfunc makeInts(randomized: Bool) -> [256 of Int] {\n    if randomized {\n        InlineArray { _ in Int.random(in: (.min)...(.max)) }\n    } else {\n        InlineArray(repeating: 0)\n    }\n}"
        },
        {
          "title": "Directly control inlining (preventing inlining)",
          "language": "swift",
          "startTimeSeconds": 1290,
          "code": "@inline(never)\nfunc makeInts(randomized: Bool) -> [256 of Int] {\n    if randomized {\n        InlineArray { _ in Int.random(in: (.min)...(.max)) }\n    } else {\n        InlineArray(repeating: 0)\n    }\n}"
        },
        {
          "title": "Directly control inlining (forcing inlining)",
          "language": "swift",
          "startTimeSeconds": 1299,
          "code": "@inline(always)\nfunc makeInts(randomized: Bool) -> [256 of Int] {\n    if randomized {\n        InlineArray { _ in Int.random(in: (.min)...(.max)) }\n    } else {\n        InlineArray(repeating: 0)\n    }\n}"
        },
        {
          "title": "Making generic functions faster with '@specialized'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​",
          "language": "swift",
          "startTimeSeconds": 1315,
          "code": "func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {\n    var result = makeInts(randomized: false)\n\n    for value in values {\n        result[Int(value)] += 1\n    }\n\n    return result\n}\n\n// Note: Specialized function doesn't actually have a directly callable name.\nfunc `histogram of [UInt8]`(of values: [UInt8]) -> [256 of Int] {    //\n    var result = makeInts(randomized: false)                         //\n                                                                     //\n    for value in values {                                            //\n        result[Int(value)] += 1                                      // Specialized code\n    }                                                                //\n                                                                     //\n    return result                                                    //\n}                                                                    //"
        },
        {
          "title": "Making generic functions faster with '@specialized'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ (explicitly requesting specialization)",
          "language": "swift",
          "startTimeSeconds": 1337,
          "code": "@specialized(where Values == [UInt8])\nfunc histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {\n    var result = makeInts(randomized: false)\n\n    for value in values {\n        result[Int(value)] += 1\n    }\n\n    return result\n}\n\n// Note: Specialized function doesn't actually have a directly callable name.\nfunc `histogram of [UInt8]`(of values: [UInt8]) -> [256 of Int] {    //\n    var result = makeInts(randomized: false)                         //\n                                                                     //\n    for value in values {                                            //\n        result[Int(value)] += 1                                      // Specialized code\n    }                                                                //\n                                                                     //\n    return result                                                    //\n}                                                                    //"
        },
        {
          "title": "Associated types can be '~Copyable' and '~Escapable'",
          "language": "swift",
          "startTimeSeconds": 1546,
          "code": "protocol Iterable<Element, Failure>: ~Copyable, ~Escapable {\n    associatedtype Element: ~Copyable\n    associatedtype IterableIterator: IterableIteratorProtocol<Element, Failure>, ~Copyable, ~Escapable\n    associatedtype Failure: Error = Never\n\n    func makeIterableIterator() -> IterableIterator\n\n    var underestimatedCount: Int { get }\n}\n\nprotocol IterableIteratorProtocol<Element, Failure>: ~Copyable, ~Escapable {\n    associatedtype Element: ~Copyable\n    associatedtype Failure: Error = Never\n\n    mutating func nextSpan(maximumCount: Int) throws(Failure) -> Span<Element>\n\n    mutating func skip(by maximumOffset: Int) throws(Failure) -> Int\n}"
        },
        {
          "title": "The problem with existing accessors",
          "language": "swift",
          "startTimeSeconds": 1648,
          "code": "@safe public struct UniqueBox<Value>: ~Copyable {\n    private let valuePointer: UnsafeMutablePointer<Value>\n\n    public init(_ value: consuming Value) {\n        valuePointer = UnsafeMutablePointer.allocate(capacity: 1)\n        valuePointer.initialize(to: value)\n    }\n\n    public var value: Value {\n        get { valuePointer.pointee }\n        set { valuePointer.pointee = newValue }\n    }\n\n    deinit {\n        valuePointer.deinitialize(count: 1)\n        valuePointer.deallocate()\n    }\n}"
        },
        {
          "title": "'borrow' and 'mutate' accessors",
          "language": "swift",
          "startTimeSeconds": 1699,
          "code": "@safe public struct UniqueBox<Value: ~Copyable>: ~Copyable {\n    private let valuePointer: UnsafeMutablePointer<Value>\n\n    public init(_ value: consuming Value) {\n        valuePointer = UnsafeMutablePointer.allocate(capacity: 1)\n        valuePointer.initialize(to: value)\n    }\n\n    public var value: Value {\n        borrow { valuePointer.pointee }\n        mutate { &valuePointer.pointee }\n    }\n\n    deinit {\n        valuePointer.deinitialize(count: 1)\n        valuePointer.deallocate()\n    }\n}"
        },
        {
          "title": "Using 'MutableRef' to eliminate repeated accesses (with un-hoisted access)",
          "language": "swift",
          "startTimeSeconds": 1814,
          "code": "func updateCount<Key: Hashable>(\n    for key: Key,\n    from sets: [Set<Key>],\n    in counts: inout [Key: Int]\n) {\n    for set in sets {\n        if set.contains(key) {\n            counts[key, default: 0] += 1\n        }\n    }\n}"
        },
        {
          "title": "Using 'MutableRef' to eliminate repeated accesses (hoisted by 'inout' parameter)",
          "language": "swift",
          "startTimeSeconds": 1834,
          "code": "func updateCount<Key: Hashable>(\n    for key: Key,\n    from sets: [Set<Key>],\n    in counts: inout [Key: Int]\n) {\n    func updateCountImpl(count: inout Int) {\n        for set in sets {\n            if set.contains(key) {\n                count += 1\n            }\n        }\n    }\n\n    updateCountImpl(count: &counts[key, default: 0])\n}"
        },
        {
          "title": "Using 'MutableRef' to eliminate repeated accesses (hoisted by 'MutableRef')",
          "language": "swift",
          "startTimeSeconds": 1841,
          "code": "func updateCount<Key: Hashable>(\n    for key: Key,\n    from sets: [Set<Key>],\n    in counts: inout [Key: Int]\n) {\n    var countRef = MutableRef(&counts[key, default: 0])\n\n    for set in sets {\n        if set.contains(key) {\n            countRef.value += 1\n        }\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Swift Blog",
          "url": "https://www.swift.org/blog/",
          "type": "documentation",
          "description": "The Swift.org blog"
        },
        {
          "title": "Explore documentation on swift.org",
          "url": "https://www.swift.org/documentation/",
          "type": "documentation",
          "description": null
        },
        {
          "title": "Swift Forums",
          "url": "https://forums.swift.org",
          "type": "developerForum",
          "description": "Forums for the Swift open-source project."
        }
      ],
      "path": "sessions/wwdc2026/262-what-s-new-in-swift/",
      "files": {
        "metadata": "sessions/wwdc2026/262-what-s-new-in-swift/metadata.json",
        "readme": "sessions/wwdc2026/262-what-s-new-in-swift/README.md",
        "transcript": "sessions/wwdc2026/262-what-s-new-in-swift/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/262-what-s-new-in-swift/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-265",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 265,
      "title": "Build real-time apps and services with gRPC and Swift",
      "description": "Build engaging live experiences with gRPC in your Swift app and backend. gRPC is an open-source RPC framework designed for high-performance, bidirectional streaming APIs. Explore how the gRPC Swift package provides a modern, safe runtime built with Swift concurrency. Learn how integrated tools streamline your workflow and help you deliver real-time features with ease.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/265",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/265",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Developer Tools",
        "Swift"
      ],
      "primaryTopic": "Swift",
      "duration": 1465,
      "hasTranscript": true,
      "transcriptWordCount": 3389,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/265/4/05249c6d-4136-4164-a8d0-5db0bbb22c7f/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/265/4/05249c6d-4136-4164-a8d0-5db0bbb22c7f/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/265/4/05249c6d-4136-4164-a8d0-5db0bbb22c7f/downloads/wwdc2026-265_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/265/4/05249c6d-4136-4164-a8d0-5db0bbb22c7f/downloads/wwdc2026-265_hd.mp4",
        "duration": 1465
      },
      "codeSnippets": [
        {
          "title": "ListRaces RPC definition",
          "language": "bash",
          "startTimeSeconds": 218,
          "code": "edition = \"2024\";\n\nimport \"google/protobuf/timestamp.proto\";\n\nservice SwiftKartService {\n  rpc ListRaces(ListRacesRequest) returns (ListRacesResponse);\n}\n\nmessage ListRacesRequest {\n  int32 limit = 1 [default = 100];\n}\n\nmessage ListRacesResponse {\n  repeated Race races = 1;\n}\n\nmessage Race {\n  string name = 1;\n  string location = 2;\n  google.protobuf.Timestamp start_time = 3;\n  int32 laps = 4;\n  string championship = 5;\n}"
        },
        {
          "title": "grpc-swift-proto-generator-config.json",
          "language": "json",
          "startTimeSeconds": 355,
          "code": "{\n    \"generate\": {\n        \"clients\": true,\n        \"servers\": false,\n        \"messages\": true\n    }\n}"
        },
        {
          "title": "Add gRPC imports",
          "language": "swift",
          "startTimeSeconds": 384,
          "code": "import GRPCCore\nimport GRPCNIOTransportHTTP2\nimport SwiftProtobuf"
        },
        {
          "title": "Create a gRPC client connected to a local server",
          "language": "swift",
          "startTimeSeconds": 398,
          "code": ".task {\n    do {\n        try await withGRPCClient(\n            transport: .http2NIOTS(\n                address: .ipv4(host: \"127.0.0.1\", port: 8080),\n                transportSecurity: .tls\n            )\n        ) { client in\n            <#code#>\n        }\n    } catch {\n        print(\"gRPC error: \\(error)\")\n    }\n}"
        },
        {
          "title": "Call the ListRaces RPC and update the view",
          "language": "swift",
          "startTimeSeconds": 434,
          "code": ".task {\n    do {\n        try await withGRPCClient(\n            transport: .http2NIOTS(\n                address: .ipv4(host: \"127.0.0.1\", port: 8080),\n                transportSecurity: .tls\n            )\n        ) { client in\n            let kart = SwiftKartService.Client(wrapping: client)\n            let request = ListRacesRequest()\n            let response = try await kart.listRaces(request)\n            self.races = response.races.map { race in\n                RaceInfo(\n                    name: race.name,\n                    location: race.location,\n                    startTime: race.startTime.date,\n                    championship: race.championship,\n                    laps: Int(race.laps),\n                    drivers: race.drivers\n                )\n            }\n        }\n    } catch {\n        print(\"gRPC error: \\(error)\")\n    }\n}"
        },
        {
          "title": "ClientManager.swift",
          "language": "swift",
          "startTimeSeconds": 510,
          "code": "import GRPCCore\nimport GRPCNIOTransportHTTP2\nimport Synchronization\nimport SwiftUI\n\n@Observable\nfinal class ClientManager: Sendable {\n    fileprivate let state = Mutex(State.disconnected)\n\n    static func makeTransport() throws -> HTTP2ClientTransport.TransportServices {\n        try .http2NIOTS(\n            target: .ipv4(address: \"127.0.0.1\", port: 8080),\n            transportSecurity: .plaintext\n        )\n    }\n\n    func withClient(\n        body: (_ client: GRPCClient<HTTP2ClientTransport.TransportServices>) async throws -> Void\n    ) async throws {\n        let client = try connectIfNecessary()\n        try await body(client)\n    }\n\n    private func connectIfNecessary() throws -> GRPCClient<HTTP2ClientTransport.TransportServices> {\n        try self.state.withLock { state in\n            try state.connectIfNecessary()\n        }\n    }\n\n    func disconnect() {\n        let client = self.state.withLock { state in\n            state.disconnect()\n        }\n\n        client?.beginGracefulShutdown()\n    }\n}\n\nextension ClientManager {\n    enum State {\n        case connected(GRPCClient<HTTP2ClientTransport.TransportServices>, Task<Void, any Error>)\n        case disconnected\n    }\n}\n\nextension ClientManager.State {\n    mutating func connectIfNecessary() throws -> GRPCClient<HTTP2ClientTransport.TransportServices> {\n        switch self {\n        case .connected(let client, _):\n            return client\n\n        case .disconnected:\n            let client = try GRPCClient(transport: ClientManager.makeTransport())\n            let task = Task { try await client.runConnections() }\n            self = .connected(client, task)\n            return client\n        }\n    }\n\n    mutating func disconnect() -> GRPCClient<HTTP2ClientTransport.TransportServices>? {\n        switch self {\n        case .connected(let client, _):\n            self = .disconnected\n            return client\n        case .disconnected:\n            return nil\n        }\n    }\n}"
        },
        {
          "title": "Propagate ClientManager to child views",
          "language": "swift",
          "startTimeSeconds": 519,
          "code": "import SwiftUI\n\n@main\nstruct SwiftKartApp: App {\n    let manager = ClientManager()\n\n    var body: some Scene {\n        WindowGroup {\n            RaceScheduleView()\n                .environment(manager)\n        }\n    }\n}"
        },
        {
          "title": "Disconnect ClientManager when the scene enters the background phase",
          "language": "swift",
          "startTimeSeconds": 532,
          "code": "import SwiftUI\n\n@main\nstruct SwiftKartApp: App {\n    let manager = ClientManager()\n    @Environment(\\.scenePhase) private var scenePhase\n\n    var body: some Scene {\n        WindowGroup {\n            RaceScheduleView()\n                .environment(manager)\n        }\n        .onChange(of: scenePhase) { _, newPhase in\n            switch newPhase {\n            case .background :\n                manager.disconnect()\n            case .inactive, .active:\n                break\n            @unknown default:\n                break\n            }\n        }\n    }\n}"
        },
        {
          "title": "Inject ClientManager into the view via @Environment",
          "language": "swift",
          "startTimeSeconds": 552,
          "code": "@Environment(ClientManager.self) var manager"
        },
        {
          "title": "Replace withGRPCClient with manager.withClient",
          "language": "swift",
          "startTimeSeconds": 561,
          "code": ".task {\n    do {\n        try await manager.withClient { client in\n            let kart = SwiftKartService.Client(wrapping: client)\n            let request = ListRacesRequest()\n            let response = try await kart.listRaces(request)\n            self.races = response.races.map { race in\n                RaceInfo(\n                    name: race.name,\n                    location: race.location,\n                    startTime: race.startTime.date,\n                    championship: race.championship,\n                    laps: Int(race.laps),\n                    drivers: race.drivers\n                )\n            }\n        }\n    } catch {\n        print(\"gRPC error: \\(error)\")\n    }\n}"
        },
        {
          "title": "Using SwiftProtobuf",
          "language": "swift",
          "startTimeSeconds": 581,
          "code": "var race = Race()\nrace.name = \"Duck Pond Dash\"\nrace.location = \"Apple Park, Cupertino\"\nrace.startTime = .init(roundingTimeIntervalSince1970: 1_781_198_600)\nrace.laps = 6\nrace.championship = \"Corporate Cup\"\nrace.drivers = [\"Monty\", \"Pepper\", \"Mycroft\", \"Pancakes\", \"Duke\", \"Kiko\", \"Sissi\", \"Bo\"]\n\ntry race.serializedBytes()"
        },
        {
          "title": "Server",
          "language": "swift",
          "startTimeSeconds": 752,
          "code": "let server = GRPCServer(\n    transport: .http2NIOPosix(\n        address: .ipv4(host: \"127.0.0.1\", port: 8080),\n        transportSecurity: .plaintext\n    ),\n    services: [Service()]\n)\ntry await server.serve()"
        },
        {
          "title": "Service",
          "language": "swift",
          "startTimeSeconds": 765,
          "code": "struct Service: SwiftKartService.SimpleServiceProtocol {\n    private let database = RaceDB()\n\n    func listRaces(\n        request: ListRacesRequest,\n        context: ServerContext\n    ) async throws -> ListRacesResponse {\n        var response = ListRacesResponse()\n        response.races = await database.listRaces(atMost: request.limit)\n        return response\n    }\n}"
        },
        {
          "title": "swift_kart_service.proto",
          "language": "bash",
          "startTimeSeconds": 800,
          "code": "edition = \"2024\";\n\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\nservice SwiftKartService {\n  rpc ListRaces(ListRacesRequest) returns (ListRacesResponse);\n  rpc FollowRace(stream FollowRaceRequest) returns (stream FollowRaceResponse);\n}\n\nmessage ListRacesRequest {\n  int32 limit = 1 [default = 100];\n}\n\nmessage ListRacesResponse {\n  repeated Race races = 1;\n}\n\nmessage Race {\n  string name = 1;\n  string location = 2;\n  google.protobuf.Timestamp start_time = 3;\n  int32 laps = 4;\n  string championship = 5;\n  repeated string drivers = 6;\n}\n\nmessage FollowRaceRequest {\n  string race_name = 1;\n  repeated RaceEventType event_types = 2;\n}\n\nenum RaceEventType {\n  RACE_EVENT_TYPE_UNSPECIFIED = 0;\n  RACE_EVENT_TYPE_KART_LOCATIONS = 1;\n  RACE_EVENT_TYPE_STANDINGS = 2;\n}\n\nmessage FollowRaceResponse {\n  oneof event {\n    KartLocations locations = 1;\n    Standings standings = 2;\n  }\n}\n\nmessage KartLocations {\n  message Kart {\n    int32 number = 1;\n    double latitude = 2;\n    double longitude = 3;\n    google.protobuf.Timestamp recorded_at = 4;\n  }\n  repeated Kart karts = 1;\n}\n\nmessage Standings {\n  message Entry {\n    int32 kart_number = 1;\n    google.protobuf.Duration gap_to_leader = 2;\n    int32 position = 3;\n    int32 lap = 4;\n  }\n\n  repeated Entry entries = 1;\n}"
        },
        {
          "title": "FollowRace stub",
          "language": "swift",
          "startTimeSeconds": 856,
          "code": "func followRace(\n    request: RPCAsyncSequence<FollowRaceRequest, any Error>,\n    response: RPCWriter<FollowRaceResponse>,\n    context: ServerContext\n) async throws {\n    throw RPCError(code: .unimplemented, message: \"FollowRace is unimplemented\")\n}"
        },
        {
          "title": "Implement the FollowRace RPC",
          "language": "swift",
          "startTimeSeconds": 878,
          "code": "func followRace(\n    request: RPCAsyncSequence<FollowRaceRequest, any Error>,\n    response: RPCWriter<FollowRaceResponse>,\n    context: ServerContext\n) async throws {\n    try await withThrowingTaskGroup { group in\n        var iterator = request.makeAsyncIterator()\n        guard let first = try await iterator.next() else { return }\n        let eventTypes = Mutex(Set(first.eventTypes))\n\n        group.addTask {\n            let events = tracker.events(forRace: first.raceName).filter { event in\n                eventTypes.withLock { $0.contains(event.type) }\n            }\n\n            for await event in events {\n                var message = FollowRaceResponse()\n                switch event {\n                case .locations(let locations):\n                    message.locations.karts = locations.map { location in\n                        var kart = KartLocations.Kart()\n                        kart.number = Int32(location.number)\n                        kart.latitude = location.latitude\n                        kart.longitude = location.longitude\n                        return kart\n                    }\n                case .standings(let standings):\n                    message.standings.entries = standings.map { standing in\n                        var entry = Standings.Entry()\n                        entry.gapToLeader = .init(rounding: standing.delta, rule: .towardZero)\n                        entry.kartNumber = Int32(standing.kartNumber)\n                        entry.lap = Int32(standing.lap)\n                        entry.position = Int32(standing.position)\n                        return entry\n                    }\n                }\n\n                try await response.write(message)\n            }\n        }\n\n        while let next = try await iterator.next() {\n            eventTypes.withLock { $0 = Set(next.eventTypes) }\n        }\n\n        group.cancelAll()\n    }\n}"
        },
        {
          "title": "swift_kart_service.proto",
          "language": "bash",
          "startTimeSeconds": 999,
          "code": "edition = \"2024\";\n\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\nservice SwiftKartService {\n  rpc ListRaces(ListRacesRequest) returns (ListRacesResponse);\n  rpc FollowRace(stream FollowRaceRequest) returns (stream FollowRaceResponse);\n}\n\nmessage ListRacesRequest {\n  int32 limit = 1 [default = 100];\n}\n\nmessage ListRacesResponse {\n  repeated Race races = 1;\n}\n\nmessage Race {\n  string name = 1;\n  string location = 2;\n  google.protobuf.Timestamp start_time = 3;\n  int32 laps = 4;\n  string championship = 5;\n  repeated string drivers = 6;\n}\n\nmessage FollowRaceRequest {\n  string race_name = 1;\n  repeated RaceEventType event_types = 2;\n}\n\nenum RaceEventType {\n  RACE_EVENT_TYPE_UNSPECIFIED = 0;\n  RACE_EVENT_TYPE_KART_LOCATIONS = 1;\n  RACE_EVENT_TYPE_STANDINGS = 2;\n}\n\nmessage FollowRaceResponse {\n  oneof event {\n    KartLocations locations = 1;\n    Standings standings = 2;\n  }\n}\n\nmessage KartLocations {\n  message Kart {\n    int32 number = 1;\n    double latitude = 2;\n    double longitude = 3;\n    google.protobuf.Timestamp recorded_at = 4;\n  }\n  repeated Kart karts = 1;\n}\n\nmessage Standings {\n  message Entry {\n    int32 kart_number = 1;\n    google.protobuf.Duration gap_to_leader = 2;\n    int32 position = 3;\n    int32 lap = 4;\n  }\n\n  repeated Entry entries = 1;\n}"
        },
        {
          "title": "swift_kart_service.proto",
          "language": "bash",
          "startTimeSeconds": 1000,
          "code": "edition = \"2024\";\n\nimport \"google/protobuf/timestamp.proto\";\n\nservice SwiftKartService {\n  rpc ListRaces(ListRacesRequest) returns (ListRacesResponse);\n}\n\nmessage ListRacesRequest {\n  int32 limit = 1 [default = 100];\n}\n\nmessage ListRacesResponse {\n  repeated Race races = 1;\n}\n\nmessage Race {\n  string name = 1;\n  string location = 2;\n  google.protobuf.Timestamp start_time = 3;\n  int32 laps = 4;\n  string championship = 5;\n  repeated string drivers = 6;\n}"
        },
        {
          "title": "Navigation link to LiveStreamView",
          "language": "swift",
          "startTimeSeconds": 1016,
          "code": "NavigationLink(destination: LiveStreamView(race: race)) {\n    Text(\"Live stream\")\n}"
        },
        {
          "title": "Call the FollowRace RPC in the LiveStreamView",
          "language": "swift",
          "startTimeSeconds": 1052,
          "code": "import SwiftUI\nimport GRPCCore\nimport GRPCNIOTransportHTTP2\nimport SwiftProtobuf\n\nstruct LiveStreamView: View {\n    private let race: RaceInfo\n\n    @Environment(ClientManager.self) var manager\n    @State private var tracking: KartTrackingViewModel\n    @State private var standings: [StandingsEntry] = []\n    @State private var showLeaderboard = false\n    @State private var continuation: AsyncStream<Bool>.Continuation?\n\n    init(race: RaceInfo) {\n        self.race = race\n        self.tracking = KartTrackingViewModel(race: race)\n    }\n\n    var body: some View {\n        VStack {\n            KartTrackingMapView(viewModel: tracking)\n                .ignoresSafeArea()\n                .onAppear { tracking.start() }\n                .onDisappear { tracking.stop() }\n        }\n        .onChange(of: showLeaderboard) { _, newValue in\n            continuation?.yield(newValue)\n        }\n        .sheet(isPresented: $showLeaderboard) {\n            LeaderboardView(race: race, standings: standings)\n                .presentationDetents([.fraction(0.3), .medium, .large])\n                .presentationBackgroundInteraction(.enabled)\n        }\n        .toolbar {\n            Toggle(isOn: $showLeaderboard) {\n                Label(\"Leaderboard\", systemImage: \"list.number\")\n            }\n        }\n        .toolbarBackgroundVisibility(.visible, for: .navigationBar)\n        .task {\n            do {\n                let (stream, continuation) = AsyncStream.makeStream(of: Bool.self)\n                self.continuation = continuation\n                continuation.yield(showLeaderboard)\n\n                try await manager.withClient { client in\n                    let kart = SwiftKartService.Client(wrapping: client)\n                    try await kart.followRace { requestStream in\n                        for await showLeaderboard in stream {\n                            var message = FollowRaceRequest()\n                            message.raceName = race.name\n                            message.eventTypes = [.kartLocations]\n                            if showLeaderboard {\n                                message.eventTypes.append(.standings)\n                            }\n                            try await requestStream.write(message)\n                        }\n                    } onResponse: { responseStream in\n                        for try await message in responseStream.messages {\n                            if let event = message.event {\n                                await handleEvent(event)\n                            }\n                        }\n                    }\n\n                }\n            } catch {\n                print(\"gRPC error: \\(error)\")\n            }\n        }\n    }\n\n    @MainActor\n    private func handleEvent(_ event: FollowRaceResponse.OneOf_Event) {\n        switch event {\n        case .locations(let locations):\n            self.tracking.updateKartCoordinates(\n                locations.karts.map {\n                    TrackedKart(number: $0.number, latitude: $0.latitude, longitude: $0.longitude)\n                }\n            )\n        case .standings(let standings):\n            self.standings = standings.entries.map {\n                StandingsEntry(\n                    kartNumber: $0.kartNumber,\n                    secondsToLeader: $0.gapToLeader.timeInterval,\n                    position: $0.position,\n                    lap: $0.lap\n                )\n            }\n        }\n    }\n}\n\n#Preview {\n    NavigationStack {\n        LiveStreamView(race: .example4)\n            .environment(ClientManager())\n    }\n}"
        },
        {
          "title": "Containerfile",
          "language": "bash",
          "startTimeSeconds": 1255,
          "code": "FROM swift:latest AS builder\n\n# Copy sources into /app\nWORKDIR /app\nCOPY Package.swift Package.resolved .\nCOPY Sources/ Sources/\n\n# Build the server\nRUN swift build -c release --product server\nRUN cp \"$(swift build -c release --show-bin-path)/server\" /usr/bin/server\n\n# Copy the binary from the builder into a smaller runtime image.\nFROM swift:slim\nCOPY --from=builder /usr/bin/server /usr/bin/server\n\nEXPOSE 8080\nENTRYPOINT [\"/usr/bin/server\"]"
        },
        {
          "title": "Deploy service",
          "language": "bash",
          "startTimeSeconds": 1316,
          "code": "gcloud run deploy wwdc-demo-server \\\n  --image us-central1-docker.pkg.dev/wwdc26/wwdc-demo-server/wwdc-demo-server:latest \\\n  --region us-central1 \\\n  --use-http2 \\\n  --allow-unauthenticated"
        },
        {
          "title": "Target deployed service",
          "language": "swift",
          "startTimeSeconds": 1342,
          "code": "static func makeTransport() throws -> HTTP2ClientTransport.TransportServices {\n    try .http2NIOTS(\n        target: .dns(host: \"wwdc-demo-server-863666503339.us-central1.run.app\"),\n        transportSecurity: .tls\n    )\n}"
        }
      ],
      "resources": [
        {
          "title": "About gRPC",
          "url": "https://grpc.io/",
          "type": "documentation",
          "description": null
        },
        {
          "title": "gRPC Swift Extras",
          "url": "https://github.com/grpc/grpc-swift-extras",
          "type": "guide",
          "description": null
        },
        {
          "title": "gRPC Swift Protobuf",
          "url": "https://github.com/grpc/grpc-swift-protobuf",
          "type": "guide",
          "description": null
        },
        {
          "title": "gRPC Swift NIO Transport",
          "url": "https://github.com/grpc/grpc-swift-nio-transport",
          "type": "guide",
          "description": null
        },
        {
          "title": "gRPC Swift",
          "url": "https://github.com/grpc/grpc-swift-2",
          "type": "guide",
          "description": "Swift implementation of grpc."
        },
        {
          "title": "Swift on Server",
          "url": "https://www.swift.org/server/",
          "type": "guide",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/265-build-real-time-apps-and-services-with-grpc-and-swift/",
      "files": {
        "metadata": "sessions/wwdc2026/265-build-real-time-apps-and-services-with-grpc-and-swift/metadata.json",
        "readme": "sessions/wwdc2026/265-build-real-time-apps-and-services-with-grpc-and-swift/README.md",
        "transcript": "sessions/wwdc2026/265-build-real-time-apps-and-services-with-grpc-and-swift/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/265-build-real-time-apps-and-services-with-grpc-and-swift/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-267",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 267,
      "title": "Migrate to Swift Testing",
      "description": "Learn how to fearlessly adopt Swift Testing alongside your XCTests using test framework interoperability. Discover best practices and patterns for incrementally introducing advanced testing features that accelerate development and increase coverage.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/267",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/267",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Developer Tools",
        "Swift"
      ],
      "primaryTopic": "Swift",
      "duration": 1285,
      "hasTranscript": true,
      "transcriptWordCount": 2891,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/267/4/d54e4861-10d9-4d4d-9952-3fe311cd2dc4/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/267/4/d54e4861-10d9-4d4d-9952-3fe311cd2dc4/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/267/4/d54e4861-10d9-4d4d-9952-3fe311cd2dc4/downloads/wwdc2026-267_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/267/4/d54e4861-10d9-4d4d-9952-3fe311cd2dc4/downloads/wwdc2026-267_hd.mp4",
        "duration": 1285
      },
      "codeSnippets": [
        {
          "title": "Name a test using a raw identifier",
          "language": "swift",
          "startTimeSeconds": 72,
          "code": "import Testing\n\n@testable import DemoApp\n\n@Test func `Default climate: tropical`() async throws {\n    let fruit = Fruit(name: \"Coconut\")\n    #expect(fruit.climate == .tropical)\n}"
        },
        {
          "title": "Wrap XCTFail in a test helper function",
          "language": "swift",
          "startTimeSeconds": 303,
          "code": "func testUniqueFruitNames() async throws {\n    assertUnique(Market.fruits + [Fruit.lychee])\n}\n\n// TestHelpers.swift\n\nfunc assertUnique(_ fruits: [Fruit], file: StaticString = #filePath, line: UInt = #line) {\n    var uniqueNames = Set<String>()\n    for name in fruits.map(\\.name) {\n        if !uniqueNames.insert(name).inserted {\n            XCTFail(\"Duplicate name: \\(name)\", file: file, line: line)\n        }\n    }\n}"
        },
        {
          "title": "Replace XCTFail with Issue.record in the test helper",
          "language": "swift",
          "startTimeSeconds": 612,
          "code": "import Testing\n\nfunc assertUnique(_ fruits: [Fruit], sourceLocation: SourceLocation = ...) {\n    var uniqueNames = Set<String>()\n    for name in fruits.map(\\.name) {\n        if !uniqueNames.insert(name).inserted {\n            Issue.record(\"Duplicate name: \\(name)\", sourceLocation: sourceLocation)\n        }\n    }\n}"
        },
        {
          "title": "Run Swift Package tests with the strict interoperability mode from Terminal",
          "language": "bash",
          "startTimeSeconds": 735,
          "code": "> SWIFT_TESTING_XCTEST_INTEROP_MODE=strict swift test"
        },
        {
          "title": "Common migration: skipping tests",
          "language": "swift",
          "startTimeSeconds": 790,
          "code": "let isFall = false\n\n// XCTest\nfunc testSwallowFallMigration() async throws {\n    try XCTSkipIf(!isFall, \"Wrong season for migration\")\n    // ...\n}\n\n// Test.cancel interoperability from Swift Testing\nfunc testSwallowFallMigration() async throws {\n    if !isFall {\n        try Test.cancel(\"Wrong season for migration\")\n    }\n    // ...\n}\n\n// ✅ Prefer test trait in Swift Testing\n@Test(.enabled(if: isFall, \"Wrong season for migration\"))\nfunc `Swallow fall migration`() async throws {\n   // ...\n}"
        },
        {
          "title": "Common migration: halting after test failures",
          "language": "swift",
          "startTimeSeconds": 821,
          "code": "func testExample() async throws {\n    #expect(Fruit.banana.climate == .temperate)\n\n    try #require(Fruit.banana == Fruit.plantain)\n    XCTFail(\"This is never reached\")\n}"
        },
        {
          "title": "Example of nested loops which can be converted into a parameterized @Test function",
          "language": "swift",
          "startTimeSeconds": 957,
          "code": "struct BirdTests {\n\n    @Test func `Birds flap wings successfully`() async throws {\n        for bird in Aviary.birds {\n            for count in (40...100) {\n                try await bird.flapWings(count: count)\n            }\n        }\n    }\n\n}"
        },
        {
          "title": "Refactor nested loops into a parameterized @Test function",
          "language": "swift",
          "startTimeSeconds": 1007,
          "code": "struct BirdTests {\n\n    @Test(arguments: Aviary.birds, 40...100)\n    func `Birds flap wings successfully`(bird: Bird, count: Int) async throws {\n        try await bird.flapWings(count: count)\n    }\n\n}"
        },
        {
          "title": "Precondition check on empty input name in an initializer",
          "language": "swift",
          "startTimeSeconds": 1101,
          "code": "// In `Bird.init(...)`\nif name.isEmpty {\n    preconditionFailure(\"Bird name cannot be empty\")\n}"
        },
        {
          "title": "Add coverage for precondition failure with exit test",
          "language": "swift",
          "startTimeSeconds": 1167,
          "code": "extension BirdTests {\n\n    @Test func `Bird with empty name crashes`() async throws {\n        await #expect(processExitsWith: .failure) {\n            _ = Bird(name: \"\")\n        }\n    }\n\n}"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/267-migrate-to-swift-testing/",
      "files": {
        "metadata": "sessions/wwdc2026/267-migrate-to-swift-testing/metadata.json",
        "readme": "sessions/wwdc2026/267-migrate-to-swift-testing/README.md",
        "transcript": "sessions/wwdc2026/267-migrate-to-swift-testing/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/267-migrate-to-swift-testing/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-268",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 268,
      "title": "Profile, fix, and verify: Improve app responsiveness with Instruments",
      "description": "Tackle app responsiveness issues with a clear workflow. Explore the Swift Concurrency instrument, Time Profiler, and System Trace to pinpoint bottlenecks. Discover how to use top functions and run comparisons to measure your improvements and confirm your fixes. And learn about other enhancements in Instruments which make each iteration of this cycle faster than ever, so you can deliver a smoother user experience in less time.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/268",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/268",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 1603,
      "hasTranscript": true,
      "transcriptWordCount": 3825,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/268/4/7d94575d-e65b-4033-811f-199586ac587a/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/268/4/7d94575d-e65b-4033-811f-199586ac587a/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/268/4/7d94575d-e65b-4033-811f-199586ac587a/downloads/wwdc2026-268_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/268/4/7d94575d-e65b-4033-811f-199586ac587a/downloads/wwdc2026-268_hd.mp4",
        "duration": 1603
      },
      "codeSnippets": [
        {
          "title": "Add signpost interval around Lasso Selection",
          "language": "swift",
          "startTimeSeconds": 341,
          "code": "// Add signpost interval around Lasso Selection\n\nimport os.signpost\n\nlet signposter = OSSignposter(subsystem: “Demo App\", category: .pointsOfInterest)\nvar lassoIntervalState: OSSignpostIntervalState? = nil\n\nfunc lassoSelectionUpdated() {\n    lassoIntervalState = signposter.beginInterval(\"Lasso Selection\")\n    // Update selection in canvas…\n}\n\nfunc lassoSelectionEnded() {\n    // Finalize lasso selection...\n    signposter.endInterval(\"Lasso Selection\", lassoIntervalState!)\n}"
        },
        {
          "title": "Existentials",
          "language": "swift",
          "startTimeSeconds": 731,
          "code": "// Existentials\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar(_ foo: any Foo) {\n\n}"
        },
        {
          "title": "Concrete Types",
          "language": "swift",
          "startTimeSeconds": 759,
          "code": "// Concrete types\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar(_ a: TypeA) {\n\n}\n\nfunc bar(_ b: TypeB) {\n\n}"
        },
        {
          "title": "Concrete Types + Generics",
          "language": "swift",
          "startTimeSeconds": 766,
          "code": "// Concrete types\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar(_ a: TypeA) {\n\n}\n\nfunc bar(_ b: TypeB) {\n\n}\n\n// Generics\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar<T: Foo>(_ generic: T) {\n\n}"
        },
        {
          "title": "Concrete Types + Generics + Enums",
          "language": "swift",
          "startTimeSeconds": 769,
          "code": "// Concrete types\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar(_ a: TypeA) {\n\n}\n\nfunc bar(_ b: TypeB) {\n\n}\n\n// Generics\n\nprotocol Foo { }\n\nstruct TypeA: Foo { }\nstruct TypeB: Foo { }\n\nfunc bar<T: Foo>(_ generic: T) {\n\n}\n\n// Enums\n\nenum Foo {\n    case a(TypeA)\n    case b(TypeB)\n}\n\nstruct TypeA { }\nstruct TypeB { }\n\nfunc bar(_ enum: Foo) {\n\n}"
        },
        {
          "title": "Thumbnail Rendering",
          "language": "swift",
          "startTimeSeconds": 1104,
          "code": "// Thumbnail rendering\n\nlet drawingData = note.drawingData\nlet canvasImages = note.decodeCanvas()\nthumbnail = await Task(name: \"Render Thumbnail\") {\n    await renderThumbnail(drawingData: drawingData, canvasImages: canvasImages, size: CGSize(width: 300, height: 240))\n}.value"
        },
        {
          "title": "Thumbnail Rendering Off Main Actor",
          "language": "swift",
          "startTimeSeconds": 1109,
          "code": "// Thumbnail rendering off Main Actor\n\nlet drawingData = note.drawingData\nlet canvasImages = note.decodeCanvas()\nthumbnail = await Task(name: \"Render Thumbnail\") { @concurrent in\n    await renderThumbnail(drawingData: drawingData, canvasImages: canvasImages, size: CGSize(width: 300, height: 240))\n}.value"
        },
        {
          "title": "File Saving",
          "language": "swift",
          "startTimeSeconds": 1452,
          "code": "// File saving\n\nlet encoder = PropertyListEncoder()\nencoder.outputFormat = .binary\nguard let data = try? encoder.encode(snapshots) else { return }\nlet id = signposter.beginInterval(\"Writing To File\")\ntry? data.write(to: fileURL, options: .atomic)\nsignposter.endInterval(\"Writing To File\", id)"
        },
        {
          "title": "File Saving off Main thread",
          "language": "swift",
          "startTimeSeconds": 1465,
          "code": "// File saving\n\nTask { @concurrent in\n\tlet encoder = PropertyListEncoder()\n\tencoder.outputFormat = .binary\n\tguard let data = try? encoder.encode(snapshots) else { return }\n\tlet id = signposter.beginInterval(\"Writing To File\")\n\ttry? data.write(to: fileURL, options: .atomic)\n\tsignposter.endInterval(\"Writing To File\", id)\n}"
        }
      ],
      "resources": [
        {
          "title": "Analyzing CPU profiles with call tree views",
          "url": "https://developer.apple.com/documentation/Xcode/analyzing-cpu-profiles-with-call-tree-views",
          "type": "documentation",
          "description": "Use call tree visualizations to find performance bottlenecks in Instruments.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/analyzing-cpu-profiles-with-call-tree-views",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/analyzing-cpu-profiles-with-call-tree-views.json"
        }
      ],
      "path": "sessions/wwdc2026/268-profile-fix-and-verify-improve-app-responsiveness-with-instr/",
      "files": {
        "metadata": "sessions/wwdc2026/268-profile-fix-and-verify-improve-app-responsiveness-with-instr/metadata.json",
        "readme": "sessions/wwdc2026/268-profile-fix-and-verify-improve-app-responsiveness-with-instr/README.md",
        "transcript": "sessions/wwdc2026/268-profile-fix-and-verify-improve-app-responsiveness-with-instr/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/268-profile-fix-and-verify-improve-app-responsiveness-with-instr/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-269",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 269,
      "title": "What’s new in SwiftUI",
      "description": "Explore the latest additions to SwiftUI and discover how they can improve your apps. We’ll introduce a new Document protocol with direct disk access and snapshot-based diffing for building high-performance apps; new APIs for reordering content in lists, grids, and sections; and toolbar enhancements including visibility priority and auto-minimizing behavior. We’ll also cover expanded presentation APIs — including swipe actions on any view — plus AsyncImage caching improvements and lazy state initialization for Observable types.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/269",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/269",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "App Services",
        "Design",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1695,
      "hasTranscript": true,
      "transcriptWordCount": 3916,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/269/4/9215cf93-1308-4706-91e8-34d4e40939d1/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/269/4/9215cf93-1308-4706-91e8-34d4e40939d1/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/269/4/9215cf93-1308-4706-91e8-34d4e40939d1/downloads/wwdc2026-269_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/269/4/9215cf93-1308-4706-91e8-34d4e40939d1/downloads/wwdc2026-269_hd.mp4",
        "duration": 1695
      },
      "codeSnippets": [
        {
          "title": "appearsActive environment value",
          "language": "swift",
          "startTimeSeconds": 200,
          "code": "struct SidebarFooterView: View {\n    @Environment(\\.appearsActive) private var appearsActive\n\n    var body: some View {\n        MyAccountView()\n            .opacity(appearsActive ? 1 : 0.5)\n    }\n}"
        },
        {
          "title": "Menu icon visibility",
          "language": "swift",
          "startTimeSeconds": 214,
          "code": "CommandMenu(\"Stickers\") {\n    Button { openStore() } label: {\n        Label(\"Store\", systemImage: \"bag.fill\")\n            .labelStyle(.titleAndIcon)\n        }\n    }\n    // Other menu items\n}"
        },
        {
          "title": "Prominent tab role",
          "language": "swift",
          "startTimeSeconds": 312,
          "code": "TabView {\n    Tab { EventsTab() }\n    Tab { HolidaysTab() }\n    Tab { FunTab() }\n\n    Tab(role: .prominent) {\n        CartTab()\n    }\n}"
        },
        {
          "title": "Toolbar item visibility and overflow menu",
          "language": "swift",
          "startTimeSeconds": 375,
          "code": "// Toolbar item visibility priority\n\nStickerPageView()\n    .toolbar {\n        ToolbarItemGroup {\n            UndoButton()\n            RedoButton()\n        }\n        .visibilityPriority(.high)\n        ToolbarOverflowMenu {\n            ChoosePhotoButton()\n            ExportAsImageButton()\n            ClearAllStickersButton()\n        }\n        ToolbarItem(placement: .topBarPinnedTrailing) {\n            ShareButton()\n        }\n    }"
        },
        {
          "title": "Minimize toolbar on scroll with toolbarMinimizeBehavior",
          "language": "swift",
          "startTimeSeconds": 457,
          "code": "// Minimize toolbar when scrolling\n\nScrollView {\n    StickerListView()\n}\n.toolbarMinimizeBehavior(.onScrollDown, for: .navigationBar)"
        },
        {
          "title": "Document creation sources with context parameter",
          "language": "swift",
          "startTimeSeconds": 587,
          "code": "// Use the context to create a document\n\n@main\nstruct Stickers: App {\n    var body: some Scene {\n        DocumentGroupLaunchScene(\"Create a Sticker Page\") {\n            NewDocumentButton(\"New Sticker Page\", source: .blank)\n            NewDocumentButton(\"Sticker Page from Photo…\", source: .photo)\n        }\n\n        DocumentGroup { /* ... */ }\n    }\n}\n\nextension DocumentCreationSource {\n    static let blank = Self(id: \"blank\")\n    static let photo = Self(id: \"photo\")\n}"
        },
        {
          "title": "Use the context to create a document",
          "language": "swift",
          "startTimeSeconds": 601,
          "code": "@main\nstruct Stickers: App {\n    var body: some Scene {\n        DocumentGroupLaunchScene(\"Create a Sticker Page\") {\n            NewDocumentButton(\"New Sticker Page\", source: .blank)\n            NewDocumentButton(\"Sticker Page from Photo…\", source: .photo)\n        }\n\n        DocumentGroup { document in\n            StickerPageDocumentView(document)\n        } { configuration, context in\n            StickerPageDocument(configuration: configuration, context: context)\n        }\n    }\n}"
        },
        {
          "title": "Document app declaration",
          "language": "swift",
          "startTimeSeconds": 643,
          "code": "@main\nstruct Stickers: App {\n    var body: some Scene {\n        DocumentGroup { /* ... */ }\n        WindowGroup { /* ... */ }\n    }\n}"
        },
        {
          "title": "Implement document writing",
          "language": "swift",
          "startTimeSeconds": 685,
          "code": "@Observable\nfinal class StickerDocument {\n    // ...\n}"
        },
        {
          "title": "Implement document writing: list writable formats",
          "language": "swift",
          "startTimeSeconds": 694,
          "code": "@Observable\nfinal class StickerDocument {\n\n    static let writableDocumentTypes: [UTType] = [.stickerDocument]\n\n    // ...\n}\n\nimport UniformTypeIdentifiers\n\nextension UTType {\n    static let stickerDocument = UTType(exportedAs: \"stickerdocument\")\n}"
        },
        {
          "title": "Implement document writing: provide snapshot",
          "language": "swift",
          "startTimeSeconds": 705,
          "code": "@Observable\nfinal class StickerDocument {\n\n    static let writableDocumentTypes: [UTType] = [.stickerDocument]\n\n    @MainActor\n    func snapshot(contentType: UTType) async throws -> sending PageSnapshot { /* ... */ }\n\n    // ...\n}"
        },
        {
          "title": "Implement document writing: represent the snapshot",
          "language": "swift",
          "startTimeSeconds": 714,
          "code": "struct PageSnapshot {\n    var background: Image\n    var metadata: StickerPlacements\n    var stickers: [Image]\n}\n\nstruct StickerPlacements { /* ... */ }"
        },
        {
          "title": "Implement document writing: provide a DocumentWriter",
          "language": "swift",
          "startTimeSeconds": 733,
          "code": "@Observable\nfinal class StickerDocument {\n\n    static let writableDocumentTypes: [UTType] = [.stickerDocument]\n\n    @MainActor\n    func snapshot(contentType: UTType) async throws -> sending PageSnapshot {\n        makeSnapshot()\n    }\n\n    func writer(configuration: sending WriteConfiguration) -> sending Writer {\n        Writer(contentType: configuration.contentType)\n    }\n}"
        },
        {
          "title": "DocumentWriter: Snapshot",
          "language": "swift",
          "startTimeSeconds": 753,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    // ...\n}"
        },
        {
          "title": "DocumentWriter: PageSnapshot as Snapshot",
          "language": "swift",
          "startTimeSeconds": 756,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    let contentType: UTType\n\n    // ...\n}"
        },
        {
          "title": "DocumentWriter protocol implementation",
          "language": "swift",
          "startTimeSeconds": 762,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    let contentType: UTType\n\n    nonisolated func write(\n        snapshot: sending PageSnapshot, to destination: URL,\n        previous: sending PageSnapshot?, progress: consuming Subprogress\n    ) async throws {\n        // write .stickerDocument\n    }\n}"
        },
        {
          "title": "Progress reporting during writing",
          "language": "swift",
          "startTimeSeconds": 798,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    let contentType: UTType\n\n    nonisolated func write(\n        snapshot: sending PageSnapshot, to destination: URL,\n        previous: sending PageSnapshot?, progress: consuming Subprogress\n    ) async throws {\n        // report progress…\n        // write .stickerDocument\n    }\n}"
        },
        {
          "title": "Implement document reading with ReadableDocument protocol",
          "language": "swift",
          "startTimeSeconds": 807,
          "code": "extension StickerDocument: ReadableDocument {\n\n}"
        },
        {
          "title": "Add PNG to supported formats list",
          "language": "swift",
          "startTimeSeconds": 875,
          "code": "@Observable\nfinal class StickerDocument: WritableDocument {\n\n    static let writableContentTypes: [UTType] = [.stickerDocument, .png]\n}"
        },
        {
          "title": "Add content type checks",
          "language": "swift",
          "startTimeSeconds": 888,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    let contentType: UTType\n\n    nonisolated func write(\n        snapshot: sending PageSnapshot, to destination: URL,\n        previous: sending PageSnapshot?, progress: consuming Subprogress\n    ) async throws {\n        if contentType.conforms(to: .stickerDocument) {\n            // write .stickerDocument\n        } else if contentType.conforms(to: .png)\n\n    }\n}"
        },
        {
          "title": "Writing multiple formats including PNG",
          "language": "swift",
          "startTimeSeconds": 896,
          "code": "struct Writer<Snapshot>: DocumentWriter {\n    typealias Snapshot = PageSnapshot\n\n    let contentType: UTType\n\n    nonisolated func write(\n        snapshot: sending PageSnapshot, to destination: URL, \n        previous: sending PageSnapshot?, progress: consuming Subprogress\n    ) async throws {\n        if contentType.conforms(to: .stickerDocument) {  \n            // write .stickerDocument\n        } else if contentType.conforms(to: .png) {\n            let context = CGContext(/* ... */) \n            context.draw(/* ... */)\n        }\n    }\n}"
        },
        {
          "title": "Reorderable list with reorderContainer",
          "language": "swift",
          "startTimeSeconds": 958,
          "code": "List {\n    ForEach(stickers) { sticker in\n        StickerListItemView(sticker: sticker)\n    }\n    .reorderable()\n}\n.reorderContainer(for: Sticker.self) { difference in\n    difference.apply(to: &stickers)\n}"
        },
        {
          "title": "Apply changes to a reorderable list's data source",
          "language": "swift",
          "startTimeSeconds": 974,
          "code": "import OrderedCollections // from https://github.com/apple/swift-collections\n\nextension ReorderDifference where CollectionID == ReorderableSingleCollectionIdentifier {\n    func apply(to values: inout [some Identifiable<ItemID>]) {\n        var dictionary = OrderedDictionary(uniqueKeys: values.map { $0.id }, values: values)\n        let destinationOffset: Int? = switch destination.position {\n        case .before(let destination):\n            dictionary.keys.firstIndex(of: destination)\n        case .end:\n            nil\n        }\n        dictionary.move(keys: sources, to: destinationOffset ?? values.endIndex)\n        values = dictionary.values.elements\n    }\n}"
        },
        {
          "title": "Reorderable grid with LazyVGrid",
          "language": "swift",
          "startTimeSeconds": 1008,
          "code": "LazyVGrid {\n    ForEach(stickers) { sticker in\n        StickerListItemView(sticker: sticker)\n    }\n    .reorderable()\n}\n.reorderContainer(for: Sticker.self) { difference in\n    difference.apply(to: &stickers)\n}"
        },
        {
          "title": "Swipe actions on List",
          "language": "swift",
          "startTimeSeconds": 1092,
          "code": "List {\n    ForEach(stickers) { sticker in\n        StickerListItemView(sticker: sticker)\n            .swipeActions {\n                DeleteButton(sticker: sticker)\n            }\n    }\n}"
        },
        {
          "title": "Swipe actions on any view",
          "language": "swift",
          "startTimeSeconds": 1095,
          "code": "ScrollView {\n    LazyVStack {\n        ForEach(stickers) { sticker in\n            StickerListItemView(sticker: sticker)\n                .swipeActions {\n                    DeleteButton(sticker: sticker)\n                }\n        }\n    }\n}\n.swipeActionsContainer()"
        },
        {
          "title": "Confirmation dialog with item binding",
          "language": "swift",
          "startTimeSeconds": 1134,
          "code": "struct StickerCanvasView: View {\n    var stickers: [Sticker]\n    @State private var stickerToDelete: Sticker?\n\n    var body: some View {\n        ZStack {\n            ForEach(stickers) { sticker in\n                PlacedStickerView(sticker: sticker)\n                    .contextMenu {\n                        // ...\n                    }\n            }\n        }\n        .confirmationDialog(\n            \"Delete?\", item: $stickerToDelete\n        ) { sticker in\n            DeleteStickerButton(sticker)\n        }   \n    }\n}"
        },
        {
          "title": "Alert with item binding",
          "language": "swift",
          "startTimeSeconds": 1175,
          "code": "struct StickerCanvasView: View {\n    var stickers: [Sticker]\n    @State private var stickerToDelete: Sticker?\n\n    var body: some View {\n        ZStack {\n            ForEach(stickers) { sticker in\n                PlacedStickerView(sticker: sticker)\n                    .contextMenu {\n                        // ...\n                    }\n            }\n        }\n        .alert(\n            \"Delete?\", item: $stickerToDelete\n        ) { sticker in\n            DeleteStickerButton(sticker)\n        }   \n    }\n}"
        },
        {
          "title": "AsyncImage with URLRequest and custom URLSession",
          "language": "swift",
          "startTimeSeconds": 1278,
          "code": "@Observable class StickerStore {\n    static let imageSession: URLSession = {\n        let config = URLSessionConfiguration.default\n        config.urlCache = URLCache(\n            memoryCapacity: 64 * 1024 * 1024,\n            diskCapacity: 256 * 1024 * 1024)\n        return URLSession(configuration: config)\n    }()\n}\n\nForEach(pets) { pet in\n    AsyncImage(request: URLRequest(\n        url: pet.imageURL,\n        cachePolicy: .returnCacheDataElseLoad)\n    )\n}\n.asyncImageURLSession(StickerStore.imageSession)"
        },
        {
          "title": "@State converted to macro for lazy initialization",
          "language": "swift",
          "startTimeSeconds": 1388,
          "code": "@Observable class StickerStore { }\n\nstruct StickerStoreView: View {\n    // store is now lazily initialized, only\n    // created once for the lifetime of the view\n    @State private var store = StickerStore()\n\n    var body: some View {\n        // ...\n    }\n}"
        },
        {
          "title": "@State macro init assignment error",
          "language": "swift",
          "startTimeSeconds": 1428,
          "code": "struct StickerPageView: View {\n    @State private var page = StickerPage()\n    let title: String\n\n    init(title: String) {\n        self.page = StickerPage(title: title) // Variable 'self.title' used before being initialized\n        self.title = title\n    }\n\n    var body: some View {\n        // ...\n    }\n}"
        },
        {
          "title": "Fixed @State macro init assignment error",
          "language": "swift",
          "startTimeSeconds": 1442,
          "code": "struct StickerPageView: View {\n    @State private var page: StickerPage // Removed default value to fix error\n    let title: String\n\n    init(title: String) {\n        self.page = StickerPage(title: title)\n        self.title = title\n    }\n\n    var body: some View {\n        // ...\n    }\n}"
        },
        {
          "title": "@ContentBuilder",
          "language": "swift",
          "startTimeSeconds": 1567,
          "code": "@ContentBuilder\nfunc stickerLibraryView() -> some View {\n  // ...\n}"
        }
      ],
      "resources": [
        {
          "title": "TN3211: Resolving SwiftUI source incompatibilities for State and ContentBuilder",
          "url": "https://developer.apple.com/documentation/Technotes/tn3211-resolving-swiftUI-source-incompatibilities-for-state-and-contentbuilder",
          "type": "documentation",
          "description": "Update existing code for two foundational changes in SwiftUI built with Xcode 27.",
          "sosumiURL": "https://sosumi.ai/documentation/Technotes/tn3211-resolving-swiftUI-source-incompatibilities-for-state-and-contentbuilder",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Technotes/tn3211-resolving-swiftUI-source-incompatibilities-for-state-and-contentbuilder.json"
        },
        {
          "title": "State()",
          "url": "https://developer.apple.com/documentation/SwiftUI/State()",
          "type": "documentation",
          "description": "Creates a property that can read and write a value managed by SwiftUI.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/State()",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/State().json"
        },
        {
          "title": "ContentBuilder",
          "url": "https://developer.apple.com/documentation/SwiftUI/ContentBuilder",
          "type": "documentation",
          "description": "A custom parameter attribute that constructs views and other content types",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/ContentBuilder",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/ContentBuilder.json"
        },
        {
          "title": "Swift Collections on GitHub",
          "url": "https://github.com/apple/swift-collections",
          "type": "documentation",
          "description": "GitHub repository for the Swift Collections package."
        }
      ],
      "path": "sessions/wwdc2026/269-what-s-new-in-swiftui/",
      "files": {
        "metadata": "sessions/wwdc2026/269-what-s-new-in-swiftui/metadata.json",
        "readme": "sessions/wwdc2026/269-what-s-new-in-swiftui/README.md",
        "transcript": "sessions/wwdc2026/269-what-s-new-in-swiftui/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/269-what-s-new-in-swiftui/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-271",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 271,
      "title": "Code-along: Build powerful drag and drop in SwiftUI",
      "description": "Follow along as we build a game of Solitaire to explore the latest drag-and-drop capabilities in SwiftUI. We’ll show you how to use the new reordering API to let people arrange content, implement drag containers to move multiple items at once, and customize the drag-and-drop lifecycle to fit your app’s rules. To get the most out of this session, watch “Meet Transferable” from WWDC22.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/271",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/271",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "App Services",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 921,
      "hasTranscript": true,
      "transcriptWordCount": 2288,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/271/5/07f08d32-e28e-476f-8ebe-a3600b2e917c/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/271/5/07f08d32-e28e-476f-8ebe-a3600b2e917c/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/271/5/07f08d32-e28e-476f-8ebe-a3600b2e917c/downloads/wwdc2026-271_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/271/5/07f08d32-e28e-476f-8ebe-a3600b2e917c/downloads/wwdc2026-271_hd.mp4",
        "duration": 921
      },
      "codeSnippets": [
        {
          "title": "Add reorderable to the preview",
          "language": "swift",
          "startTimeSeconds": 220,
          "code": "#Preview {\n    @Previewable @State var cards = [\n        CardValue(rank: .ace, suit: .clubs),\n        CardValue(rank: .ace, suit: .diamonds),\n        CardValue(rank: .ace, suit: .hearts),\n        CardValue(rank: .ace, suit: .spades)\n    ]\n\n    HStack {\n        ForEach(cards) { card in\n            CardFaceView(card: card)\n        }\n        .reorderable()\n    }\n    .frame(maxWidth: .infinity, maxHeight: .infinity)\n    .reorderContainer(for: CardValue.self) { difference in\n        cards.apply(difference: difference)\n    }\n    .padding()\n    .background(.green.gradient)\n}"
        },
        {
          "title": "Add reorder container to the GameView",
          "language": "swift",
          "startTimeSeconds": 280,
          "code": "struct GameView: View {\n    var game: Game\n\n    var body: some View {\n        GeometryReader { proxy in\n            let spacing: CGFloat = 10\n            let cardWidth = (proxy.size.width - 6 * spacing) / 7\n            VStack {\n                HStack(alignment: .top, spacing: spacing) {\n                    Group {\n                        RemainderView(game: game)\n                        CardBackView()\n                            .hidden()\n                        ForEach(CardValue.Suit.allCases) { suit in\n                            DestinationView(game: game, suit: suit)\n                        }\n                    }\n                    .frame(width: cardWidth)\n                }\n                .padding(.bottom, 20)\n                HStack(alignment: .top, spacing: spacing) {\n                    ForEach(0..<7) { index in\n                        PileView(game: game, index: index)\n                            .frame(width: cardWidth)\n                    }\n                }\n                .frame(maxHeight: .infinity, alignment: .top)\n              \t// Add the reorder container modifier.\n                .reorderContainer(for: CardValue.self, in: Card.Group.self) { difference in\n                    game.moveCards(difference: difference)\n                }\n            }\n        }\n        .padding()\n    }\n}"
        },
        {
          "title": "Add reorderable to PileView",
          "language": "swift",
          "startTimeSeconds": 358,
          "code": "struct PileView: View {\n    var game: Game\n    var index: Int\n    @Query var cards: [Card]\n\n    var body: some View {\n        ZStack(alignment: .topLeading) {\n            CardPlaceholderView()\n            PileLayout {\n                let index = firstFaceUpIndex\n              \t// Iterates over the face down cards.\n                ForEach(cards[..<index]) { card in\n                    CardView(card: card)\n                }\n                // Iterates over the face up cards.\n                ForEach(cards[index...], id: \\.value) { card in\n                    CardView(card: card)\n                }\n                .reorderable(collectionID: Card.Group.pile(index))\n            }\n        }\n    }\n\n    var firstFaceUpIndex: Int {\n        cards.firstIndex { !$0.isFaceDown } ?? cards.endIndex\n    }\n}"
        },
        {
          "title": "Add dragContainer to customize the reorderContainer modifier.",
          "language": "swift",
          "startTimeSeconds": 470,
          "code": "struct GameView: View {\n    var game: Game\n\n    var body: some View {\n        GeometryReader { proxy in\n            let spacing: CGFloat = 10\n            let cardWidth = (proxy.size.width - 6 * spacing) / 7\n            VStack {\n                HStack(alignment: .top, spacing: spacing) {\n                    Group {\n                        RemainderView(game: game)\n                        CardBackView()\n                            .hidden()\n                        ForEach(CardValue.Suit.allCases) { suit in\n                            DestinationView(game: game, suit: suit)\n                        }\n                    }\n                    .frame(width: cardWidth)\n                }\n                .padding(.bottom, 20)\n                HStack(alignment: .top, spacing: spacing) {\n                    ForEach(0..<7) { index in\n                        PileView(game: game, index: index)\n                            .frame(width: cardWidth)\n                    }\n                }\n                .frame(maxHeight: .infinity, alignment: .top)\n                .reorderContainer(for: CardValue.self, in: Card.Group.self) { difference in\n                    game.moveCards(difference: difference)\n                }\n                // Add dragContainer to customize reorderContainer.\n                .dragContainer(for: CardValue.self) { cardID in\n                    game.cardStack(startingAt: cardID)\n                }\n            }\n        }\n        .padding()\n    }\n}"
        },
        {
          "title": "Add dragPreviewsFormation to customize how the dragged cards appear",
          "language": "swift",
          "startTimeSeconds": 525,
          "code": "struct GameView: View {\n    var game: Game\n\n    var body: some View {\n        GeometryReader { proxy in\n            let spacing: CGFloat = 10\n            let cardWidth = (proxy.size.width - 6 * spacing) / 7\n            VStack {\n                HStack(alignment: .top, spacing: spacing) {\n                    Group {\n                        RemainderView(game: game)\n                        CardBackView()\n                            .hidden()\n                        ForEach(CardValue.Suit.allCases) { suit in\n                            DestinationView(game: game, suit: suit)\n                        }\n                    }\n                    .frame(width: cardWidth)\n                }\n                .padding(.bottom, 20)\n                HStack(alignment: .top, spacing: spacing) {\n                    ForEach(0..<7) { index in\n                        PileView(game: game, index: index)\n                            .frame(width: cardWidth)\n                    }\n                }\n                .frame(maxHeight: .infinity, alignment: .top)\n                .reorderContainer(for: CardValue.self, in: Card.Group.self) { difference in\n                    game.moveCards(difference: difference)\n                }\n                .dragContainer(for: CardValue.self) { cardID in\n                    game.cardStack(startingAt: cardID)\n                }\n              \t// Have dragged cards appear as a stack.\n                .dragPreviewsFormation(.stack)\n            }\n        }\n        .padding()\n    }\n}"
        },
        {
          "title": "Add dropPreviewsFormation to customize how dragged cards appear over a destination",
          "language": "swift",
          "startTimeSeconds": 554,
          "code": "struct GameView: View {\n    var game: Game\n\n    var body: some View {\n        GeometryReader { proxy in\n            let spacing: CGFloat = 10\n            let cardWidth = (proxy.size.width - 6 * spacing) / 7\n            VStack {\n                HStack(alignment: .top, spacing: spacing) {\n                    Group {\n                        RemainderView(game: game)\n                        CardBackView()\n                            .hidden()\n                        ForEach(CardValue.Suit.allCases) { suit in\n                            DestinationView(game: game, suit: suit)\n                        }\n                    }\n                    .frame(width: cardWidth)\n                }\n                .padding(.bottom, 20)\n                HStack(alignment: .top, spacing: spacing) {\n                    ForEach(0..<7) { index in\n                        PileView(game: game, index: index)\n                            .frame(width: cardWidth)\n                    }\n                }\n                .frame(maxHeight: .infinity, alignment: .top)\n                .reorderContainer(for: CardValue.self, in: Card.Group.self) { difference in\n                    game.moveCards(difference: difference)\n                }\n                .dragContainer(for: CardValue.self) { cardID in\n                    game.cardStack(startingAt: cardID)\n                }\n                .dragPreviewsFormation(.stack)\n            }\n            // Have a consistent appearance over drop destinations.\n            .dropPreviewsFormation(.stack)\n        }\n        .padding()\n    }\n}"
        },
        {
          "title": "Add a drag configuration to allow move.",
          "language": "swift",
          "startTimeSeconds": 700,
          "code": "struct RemainderView: View {\n    @Query var cards: [Card]\n    var game: Game\n\n    var body: some View {\n        Button {\n            incrementCardIndex()\n        } label: {\n            ZStack {\n                CardPlaceholderView()\n                CardBackView()\n                    .opacity(cards.isEmpty ? 0 : 1)\n            }\n        }\n        .buttonStyle(.plain)\n        .disabled(cards.isEmpty)\n        ZStack {\n            CardPlaceholderView()\n            if let currentCard {\n                CardFaceView(card: currentCard.value)\n                    .draggable(containerItemID: currentCard.value)\n                    .opacity(currentCard.value == hiddenCard ? 0 : 1)\n            }\n        }\n        .dragContainer(for: CardValue.self) { cardID in\n            [cardID]\n        }\n        // Add the drag configuration to allow me.\n        .dragConfiguration(DragConfiguration(allowMove: true))\n    }\n}"
        },
        {
          "title": "Add a drop destination modifier and configure it",
          "language": "swift",
          "startTimeSeconds": 725,
          "code": "struct GameView: View {\n    var game: Game\n\n    var body: some View {\n        GeometryReader { proxy in\n            let spacing: CGFloat = 10\n            let cardWidth = (proxy.size.width - 6 * spacing) / 7\n            VStack {\n                HStack(alignment: .top, spacing: spacing) {\n                    Group {\n                        RemainderView(game: game)\n                        CardBackView()\n                            .hidden()\n                        ForEach(CardValue.Suit.allCases) { suit in\n                            DestinationView(game: game, suit: suit)\n                        }\n                    }\n                    .frame(width: cardWidth)\n                }\n                .padding(.bottom, 20)\n                HStack(alignment: .top, spacing: spacing) {\n                    ForEach(0..<7) { index in\n                        PileView(game: game, index: index)\n                            .frame(width: cardWidth)\n                    }\n                }\n                .frame(maxHeight: .infinity, alignment: .top)\n                .reorderContainer(for: CardValue.self, in: Card.Group.self) { difference in\n                    game.moveCards(difference: difference)\n                }\n                .dragContainer(for: CardValue.self) { cardID in\n                    game.cardStack(startingAt: cardID)\n                }\n                .dragPreviewsFormation(.stack)\n                .dragConfiguration(DragConfiguration(allowMove: true))\n                // Add a drop destination to accept inserts\n                .dropDestination(for: CardValue.self) { newCards, session in\n                    if let destination = session.reorderDestination(\n                        for: CardValue.self, in: Card.Group.self) {\n                        game.insertCards(newCards, to: destination)\n                    }\n                }\n                // Configure where cards will go when reordering,\n                // and accept them by move.\n                .dropConfiguration { session in\n                    // Calculate which pile is being dragged over.\n                    let alignedX = session.location.x - 0.5 * spacing\n                    let pile = Int(alignedX / (cardWidth + spacing))\n                    let destination = ReorderDifference<CardValue, Card.Group>\n                        .Destination(position: .end, collectionID: .pile(pile))\n                    // Check if the move is allowed.\n                    let allowed = session.suggestedOperations.contains(.move)\n                    && game.validateMove(session: session, destination: destination)\n                    let operation: DropOperation = allowed ? .move : .forbidden\n                    return DropConfiguration(operation: operation, destination: destination)\n                }\n            }\n            .dropPreviewsFormation(.stack)\n        }\n        .padding()\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Making a card game with drag, drop, and reordering in SwiftUI",
          "url": "https://developer.apple.com/documentation/SwiftUI/Making-a-card-game-with-drag-drop-and-reordering-in-swiftui",
          "type": "samplecode",
          "description": "Move cards between positions in a card game using drag, drop, and reordering modifiers.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Making-a-card-game-with-drag-drop-and-reordering-in-swiftui",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Making-a-card-game-with-drag-drop-and-reordering-in-swiftui.json"
        },
        {
          "title": "Drag and drop",
          "url": "https://developer.apple.com/documentation/UIKit/drag-and-drop",
          "type": "documentation",
          "description": "Bring drag and drop to your app by using interaction APIs with your views.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/drag-and-drop",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/drag-and-drop.json"
        }
      ],
      "path": "sessions/wwdc2026/271-code-along-build-powerful-drag-and-drop-in-swiftui/",
      "files": {
        "metadata": "sessions/wwdc2026/271-code-along-build-powerful-drag-and-drop-in-swiftui/metadata.json",
        "readme": "sessions/wwdc2026/271-code-along-build-powerful-drag-and-drop-in-swiftui/README.md",
        "transcript": "sessions/wwdc2026/271-code-along-build-powerful-drag-and-drop-in-swiftui/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/271-code-along-build-powerful-drag-and-drop-in-swiftui/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-272",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 272,
      "title": "Use SwiftUI with AppKit and UIKit",
      "description": "Discover how to incrementally adopt SwiftUI in your existing AppKit or UIKit app. We’ll show you how to use the Observation framework to automatically update your views, integrate SwiftUI components into an existing view hierarchy, and bring gesture recognizers into SwiftUI. We’ll also explore how to add complete SwiftUI scenes to your app without changing your overall architecture.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/272",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/272",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "App Services",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 843,
      "hasTranscript": true,
      "transcriptWordCount": 1893,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/272/5/e1e4aa9a-cbe2-4f83-9cea-3dcaae19afd6/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/272/5/e1e4aa9a-cbe2-4f83-9cea-3dcaae19afd6/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/272/5/e1e4aa9a-cbe2-4f83-9cea-3dcaae19afd6/downloads/wwdc2026-272_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/272/5/e1e4aa9a-cbe2-4f83-9cea-3dcaae19afd6/downloads/wwdc2026-272_hd.mp4",
        "duration": 843
      },
      "codeSnippets": [
        {
          "title": "Observation in AppKit",
          "language": "swift",
          "startTimeSeconds": 219,
          "code": "// Observation in AppKit\n\nimport Observation\n\n@Observable @MainActor\nfinal class ColorModel {\n    var hue: Double = 0.6\n    var saturation: Double = 1.0\n    var brightness: Double = 1.0\n}"
        },
        {
          "title": "Circular color picker",
          "language": "swift",
          "startTimeSeconds": 388,
          "code": "// Circular color picker\n\nimport SwiftUI\nimport Observation\n\n@Observable @MainActor\nfinal class ColorModel {\n    var hue: Double = 0.6\n    var saturation: Double = 1.0\n    var brightness: Double = 1.0\n}\n\n// MARK: - Picker View\n\n@Animatable\nstruct HSBColorPicker: View {\n    var hue: Double\n    var saturation: Double\n    var brightness: Double\n    @AnimatableIgnored var model: ColorModel\n\n    init(model: ColorModel) {\n        self.model = model\n        self.hue = model.hue\n        self.saturation = model.saturation\n        self.brightness = model.brightness\n    }\n\n    var body: some View {\n        Canvas { context, size in\n            let metrics = PickerMetrics(size: size)\n            drawPicker(in: &context, metrics: metrics, hue: hue, saturation: saturation, brightness: brightness)\n        }\n        .contentShape(Circle())\n        .modifier(ColorPickerDragGesture(model: model))\n        .aspectRatio(1, contentMode: .fit)\n    }\n}\n\n// MARK: - Drag Gesture\n\nprivate struct ColorPickerDragGesture: ViewModifier {\n    var model: ColorModel\n\n    private enum Ring { case hue, saturation, brightness }\n    @State private var draggedRing: Ring?\n\n    func body(content: Content) -> some View {\n        GeometryReader { proxy in\n            content.gesture(\n                DragGesture(minimumDistance: 0, coordinateSpace: .local)\n                    .onChanged { onDrag(to: $0.location, size: proxy.size) }\n                    .onEnded { _ in draggedRing = nil }\n            )\n        }\n    }\n\n    private func onDrag(to location: CGPoint, size: CGSize) {\n        let metrics = PickerMetrics(size: size)\n        let point = CGPoint(x: location.x - metrics.mid.x, y: location.y - metrics.mid.y)\n        if draggedRing == nil {\n            let distance = hypot(point.x, point.y)\n            if distance >= metrics.radius - metrics.ringWidth - metrics.gap / 2 {\n                draggedRing = .hue\n            } else if distance >= metrics.radius - metrics.ringWidth * 2 - metrics.gap {\n                draggedRing = point.x > 0 ? .brightness : .saturation\n            }\n        }\n        switch draggedRing {\n        case .hue: model.hue = (angle0To2Pi(point) / (2 * .pi) + 0.25).truncatingRemainder(dividingBy: 1)\n        case .saturation: model.saturation = leftSemicircleValue(point)\n        case .brightness: model.brightness = 1 - rightSemicircleValue(point)\n        case nil: break\n        }\n    }\n}\n\n// MARK: - Metrics\n\nstruct PickerMetrics {\n    let mid: CGPoint\n    let radius: CGFloat\n    let ringWidth: CGFloat\n    let gap: CGFloat = 8\n\n    init(size: CGSize) {\n        let border: CGFloat = 1 // reserve room so the outer ring's stroke isn't clipped\n        mid = CGPoint(x: size.width / 2, y: size.height / 2)\n        radius = (min(size.width, size.height) - 2 * border) / 2\n        ringWidth = radius / 3\n    }\n\n    var diameter: CGFloat { radius * 2 }\n    var innerRadius: CGFloat { (diameter - 2 * ringWidth - gap) / 2 }\n    var centerRadius: CGFloat { radius - 2 * ringWidth - gap }\n}\n\n// MARK: - Geometry Helpers\n\nfunc angle0To2Pi(_ point: CGPoint) -> CGFloat {\n    let a = atan2(point.y, point.x)\n    return a >= 0 ? a : a + 2 * .pi\n}\n\nfunc rightSemicircleValue(_ point: CGPoint) -> CGFloat {\n    let angle = atan2(point.y, point.x)\n    return point.x >= 0 ? (angle + .pi / 2) / .pi : (point.y >= 0 ? 1 : 0)\n}\n\nfunc leftSemicircleValue(_ point: CGPoint) -> CGFloat {\n    guard point.x <= 0 else { return point.y >= 0 ? 1 : 0 }\n    return (atan2(point.y, -point.x) + .pi / 2) / .pi\n}\n\nprivate extension Path {\n    /// A circle whose stroke of `lineWidth` lands inside `radius`.\n    init(ring radius: CGFloat, center: CGPoint, lineWidth: CGFloat) {\n        let inset = radius - lineWidth / 2\n        self.init(ellipseIn: CGRect(x: center.x - inset, y: center.y - inset, width: inset * 2, height: inset * 2))\n    }\n}\n\n// MARK: - Drawing\n\nprivate func drawPicker(in context: inout GraphicsContext, metrics: PickerMetrics, hue: Double, saturation: Double, brightness: Double) {\n    drawHueRing(in: &context, metrics: metrics, hue: hue, saturation: saturation, brightness: brightness)\n    drawValueRings(in: &context, metrics: metrics, hue: hue, saturation: saturation, brightness: brightness)\n    drawCenter(in: &context, metrics: metrics, hue: hue, saturation: saturation, brightness: brightness)\n}\n\nprivate func drawHueRing(in context: inout GraphicsContext, metrics: PickerMetrics, hue: Double, saturation: Double, brightness: Double) {\n    let ring = Path(ring: metrics.radius, center: metrics.mid, lineWidth: metrics.ringWidth)\n    // A custom metal shader would be work great here as well\n    let colors = stride(from: 0.0, through: 1, by: 1.0 / 64).map { Color(hue: $0, saturation: saturation, brightness: brightness) }\n    context.stroke(ring, with: .conicGradient(Gradient(colors: colors), center: metrics.mid, angle: .degrees(-90)), lineWidth: metrics.ringWidth)\n    context.stroke(ring.strokedPath(StrokeStyle(lineWidth: metrics.ringWidth)), with: .color(.black), lineWidth: 1)\n    // Tick marks are left as a fun exercise for the reader.\n    drawKnob(in: &context, metrics: metrics, radius: metrics.radius, rotation: 2 * .pi * hue + .pi)\n}\n\nprivate func drawValueRings(in context: inout GraphicsContext, metrics: PickerMetrics, hue: Double, saturation: Double, brightness: Double) {\n    drawSemicircle(in: &context, metrics: metrics, start: .degrees(90), conicAngle: .degrees(0), stops: (0...1).map {\n        Gradient.Stop(color: Color(hue: hue, saturation: 1 - Double($0), brightness: brightness), location: 0.25 + Double($0) * 0.5)\n    })\n    drawSemicircle(in: &context, metrics: metrics, start: .degrees(270), conicAngle: .degrees(180), stops: (0...1).map {\n        Gradient.Stop(color: Color(hue: hue, saturation: saturation, brightness: 1 - Double($0)), location: 0.25 + Double($0) * 0.5)\n    })\n    drawKnob(in: &context, metrics: metrics, radius: metrics.innerRadius, rotation: .pi * (1 - saturation))\n    drawKnob(in: &context, metrics: metrics, radius: metrics.innerRadius, rotation: .pi * (1 - brightness) + .pi)\n}\n\nprivate func drawSemicircle(in context: inout GraphicsContext, metrics: PickerMetrics, start: Angle, conicAngle: Angle, stops: [Gradient.Stop]) {\n    var path = Path()\n    path.addArc(center: metrics.mid, radius: metrics.innerRadius - metrics.ringWidth / 2, startAngle: start, endAngle: start + .degrees(180), clockwise: false)\n    let band = path.strokedPath(StrokeStyle(lineWidth: metrics.ringWidth))\n    context.fill(band, with: .conicGradient(Gradient(stops: stops), center: metrics.mid, angle: conicAngle))\n    context.stroke(band, with: .color(.black), lineWidth: 1)\n    // Tick marks are left as a fun exercise for the reader.\n}\n\nprivate func drawCenter(in context: inout GraphicsContext, metrics: PickerMetrics, hue: Double, saturation: Double, brightness: Double) {\n    let r = metrics.centerRadius\n    let disc = Path(ellipseIn: CGRect(x: metrics.mid.x - r, y: metrics.mid.y - r, width: r * 2, height: r * 2))\n    context.fill(disc, with: .color(Color(hue: hue, saturation: saturation, brightness: brightness)))\n    context.stroke(disc, with: .color(.black))\n}\n\nprivate func drawKnob(in context: inout GraphicsContext, metrics: PickerMetrics, radius: CGFloat, rotation: CGFloat) {\n    let lineWidth: CGFloat = 5\n    let inset: CGFloat = 3 + lineWidth / 2\n    var path = Path()\n    path.move(to: CGPoint(x: 0, y: radius - metrics.ringWidth + inset))\n    path.addLine(to: CGPoint(x: 0, y: radius - inset))\n    path = path.applying(CGAffineTransform(rotationAngle: rotation))\n    path = path.applying(CGAffineTransform(translationX: metrics.mid.x, y: metrics.mid.y))\n    context.stroke(path, with: .color(.black.opacity(0.8)), style: StrokeStyle(lineWidth: lineWidth + 1, lineCap: .round))\n    context.stroke(path, with: .color(.white), style: StrokeStyle(lineWidth: lineWidth, lineCap: .round))\n}\n\n#Preview {\n    @Previewable @State var model = ColorModel()\n    HSBColorPicker(model: model)\n        .frame(width: 320, height: 320)\n        .padding()\n}"
        },
        {
          "title": "Hosting SwiftUI in AppKit",
          "language": "swift",
          "startTimeSeconds": 441,
          "code": "// Hosting SwiftUI in AppKit\n\nNSHostingView(\n    rootView: HSBColorPicker(model: model)\n)"
        },
        {
          "title": "Mix NSGestureRecognizer with SwiftUI",
          "language": "swift",
          "startTimeSeconds": 494,
          "code": "// Mix NSGestureRecognizer with SwiftUI\n\nimport SwiftUI\nimport AppKit\n\n@Observable @MainActor\nfinal class ColorModel {\n    var hue: Double = 0.6\n    var saturation: Double = 1.0\n    var brightness: Double = 1.0\n}\n\nstruct ForceClickReset: NSGestureRecognizerRepresentable {\n    var model: ColorModel\n\n    func makeNSGestureRecognizer(context: Context) -> ForceClickGestureRecognizer {\n        ForceClickGestureRecognizer()\n    }\n\n    func handleNSGestureRecognizerAction(_ recognizer: ForceClickGestureRecognizer, context: Context) {\n        withAnimation {\n            model.saturation = 1\n            model.brightness = 1\n        }\n    }\n}\n\nfinal class ForceClickGestureRecognizer: NSGestureRecognizer {\n    private var didActivate = false\n\n    override func pressureChange(with event: NSEvent) {\n        if event.stage >= 2 && !didActivate {\n            didActivate = true\n            state = .ended\n        }\n    }\n\n    override func mouseDown(with event: NSEvent) {\n        didActivate = false\n        state = .possible\n    }\n\n    override func mouseUp(with event: NSEvent) {\n        didActivate = false\n        state = .possible\n    }\n}"
        },
        {
          "title": "Adding ColorMenu to the Main Menu",
          "language": "swift",
          "startTimeSeconds": 582,
          "code": "// Adding ColorMenu to the Main Menu\n\nimport AppKit\nimport SwiftUI\nimport Observation\n\n@Observable @MainActor\nfinal class ColorModel {\n    var hue: Double = 0.6\n    var saturation: Double = 1.0\n    var brightness: Double = 1.0\n}\n\n// Menu definition in SwiftUI.\nstruct ColorMenu: View {\n    var model: ColorModel\n\n    private static let hues: [(name: String, hue: Double)] = [\n        (\"Red\", 0), (\"Yellow\", 0.17), (\"Green\", 0.33), (\"Cyan\", 0.5), (\"Blue\", 0.67), (\"Purple\", 0.83),\n    ]\n\n    var body: some View {\n        Button(\"Full Intensity\") {\n            withAnimation {\n                model.saturation = 1\n                model.brightness = 1\n            }\n        }\n        .keyboardShortcut(.upArrow, modifiers: [.command, .shift])\n\n        Button(\"Blackout\") {\n            withAnimation {\n                model.brightness = 0\n            }\n        }\n        .keyboardShortcut(.downArrow, modifiers: [.command, .shift])\n\n        Divider()\n\n        Button(\"Brighten\") {\n            withAnimation {\n                model.brightness = min(1, model.brightness + 0.1)\n            }\n        }\n        .keyboardShortcut(.upArrow, modifiers: .command)\n\n        Button(\"Dim\") {\n            withAnimation {\n                model.brightness = max(0, model.brightness - 0.1)\n            }\n        }\n        .keyboardShortcut(.downArrow, modifiers: .command)\n\n        Divider()\n\n        Picker(\"Color\", selection: Bindable(model).hue) {\n            ForEach(Self.hues, id: \\.hue) { entry in\n                Label(entry.name, systemImage: \"circle.fill\")\n                    .tint(Color(hue: entry.hue, saturation: 1, brightness: 1))\n                    .tag(entry.hue)\n            }\n        }\n        .pickerStyle(.palette)\n    }\n}\n\n@MainActor\nclass AppDelegate: NSObject, NSApplicationDelegate {\n    let colorModel = ColorModel()\n\n    func setupMainMenu() {\n        let mainMenu = NSMenu()\n\n        let colorMenu = NSHostingMenu(rootView: ColorMenu(model: colorModel))\n        colorMenu.title = \"Color\"\n\n        let colorMenuItem = NSMenuItem()\n        colorMenuItem.submenu = colorMenu\n        mainMenu.addItem(colorMenuItem)\n    }\n}\n\n#Preview {\n    Menu(\"Color\") {\n        ColorMenu(model: ColorModel())\n\n    }.padding()\n}"
        },
        {
          "title": "Adding SwiftUI scenes dynamically",
          "language": "swift",
          "startTimeSeconds": 696,
          "code": "// Adding SwiftUI scenes dynamically\n\nimport AppKit\nimport SwiftUI\nimport Observation\n\n@MainActor\nclass AppDelegate: NSObject, NSApplicationDelegate {\n    let model = AppModel()\n    var openSettingsAction: (() -> Void)?\n\n    func applicationWillFinishLaunching(_ notification: Notification) {\n        let scenes = NSHostingSceneRepresentation {\n            LightMenuBarExtra(appModel: model)\n            LightSettings(appModel: model)\n        }\n        NSApplication.shared.addSceneRepresentation(scenes)\n        openSettingsAction = {\n            scenes.environment.openSettings()\n        }\n    }\n\n    @IBAction func openSettings(_ sender: Any?) {\n        openSettingsAction?()\n    }\n}\n\n@Observable @MainActor\nfinal class ColorModel {\n    var hue: Double = 0.6\n    var saturation: Double = 1.0\n    var brightness: Double = 1.0\n\n    var color: Color {\n        Color(hue: hue, saturation: saturation, brightness: brightness)\n    }\n}\n\n@Observable @MainActor\nfinal class AppModel {\n    var showMenuBarExtra: Bool = true\n\n    var colorModel = ColorModel()\n\n    var startUniverse: Int = 1\n    var numberOfPixels: Int = 50\n\n    var maxBrightness: Double = 1.0\n    var isConnected: Bool = false\n}\n\nstruct LightMenuBarExtra: Scene {\n    var appModel: AppModel\n\n    var body: some Scene {\n        MenuBarExtra(\"Light Mix\", systemImage: \"lightbulb.fill\", isInserted: Bindable(appModel).showMenuBarExtra) {\n            MenuBarContent(appModel: appModel)\n        }\n        .menuBarExtraStyle(.window)\n    }\n}\n\n\nstruct MenuBarContent: View {\n    @Bindable var appModel: AppModel\n\n    var body: some View {\n        // TODO: Use HSBColorPicker\n        VStack {\n            RoundedRectangle(cornerRadius: 10)\n                .fill(appModel.colorModel.color)\n                .frame(height: 80)\n                .overlay(RoundedRectangle(cornerRadius: 10).stroke(.black.opacity(0.1)))\n\n            LabeledContent(\"Brightness\") {\n                Slider(value: $appModel.colorModel.brightness)\n                    .frame(width: 140)\n            }\n        }\n        .padding()\n        .frame(width: 280)\n    }\n}\n\nstruct LightSettings: Scene {\n    var appModel: AppModel\n\n    var body: some Scene {\n        Settings {\n            SettingsView(appModel: appModel)\n        }\n    }\n}\n\nstruct SettingsView: View {\n    var appModel: AppModel\n\n    var body: some View {\n        TabView {\n            Tab(\"General\", systemImage: \"gearshape\") {\n                GeneralTab(appModel: appModel)\n            }\n            Tab(\"Output\", systemImage: \"antenna.radiowaves.left.and.right\") {\n                OutputTab(appModel: appModel)\n            }\n            Tab(\"About\", systemImage: \"info.circle\") {\n                AboutTab()\n            }\n        }\n        .formStyle(.grouped)\n        .scrollDisabled(true)\n        .frame(width: 460)\n        .fixedSize(horizontal: false, vertical: true)\n    }\n}\n\nstruct GeneralTab: View {\n    @Bindable var appModel: AppModel\n\n    var body: some View {\n        Form {\n            Section(\"Appearance\") {\n                Toggle(\"Show in Menu Bar\", isOn: $appModel.showMenuBarExtra)\n            }\n            Section(\"DMX Configuration\") {\n                LabeledContent(\"Start Universe\") {\n                    TextField(\"\", value: $appModel.startUniverse, format: .number)\n                        .textFieldStyle(.roundedBorder)\n                        .frame(width: 80)\n                }\n                LabeledContent(\"Number of Pixels\") {\n                    TextField(\"\", value: $appModel.numberOfPixels, format: .number)\n                        .textFieldStyle(.roundedBorder)\n                        .frame(width: 80)\n                }\n            }\n        }\n    }\n}\n\nstruct OutputTab: View {\n    @Bindable var appModel: AppModel\n\n    var body: some View {\n        Form {\n            Section(\"Output\") {\n                LabeledContent(\"Max Brightness\") {\n                    HStack {\n                        Slider(value: $appModel.maxBrightness, in: 0...1)\n                        Text(\"\\(Int((appModel.maxBrightness * 100).rounded()))%\")\n                            .monospacedDigit()\n                            .foregroundStyle(.secondary)\n                            .frame(width: 40, alignment: .trailing)\n                    }\n                }\n            }\n        }\n    }\n}\n\nstruct AboutTab: View {\n    var body: some View {\n        VStack(spacing: 16) {\n            Image(systemName: \"lightbulb.fill\")\n                .font(.system(size: 48))\n                .foregroundStyle(.yellow.gradient)\n\n            Text(\"Light Mix\")\n                .font(.title2.bold())\n\n            Text(\"WWDC26 — Bring SwiftUI to your AppKit and UIKit App\")\n                .multilineTextAlignment(.center)\n                .foregroundStyle(.secondary)\n        }\n    }\n}\n\n#Preview(\"Menu Bar\") {\n    MenuBarContent(appModel: AppModel())\n}\n\n#Preview(\"Settings\") {\n    SettingsView(appModel: AppModel())\n}"
        }
      ],
      "resources": [
        {
          "title": "Updating views automatically with observation tracking",
          "url": "https://developer.apple.com/documentation/UIKit/updating-views-automatically-with-observation-tracking",
          "type": "documentation",
          "description": "Use Swift Observation and UIKit’s automatic tracking to update your views in response to model data updates.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/updating-views-automatically-with-observation-tracking",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/updating-views-automatically-with-observation-tracking.json"
        },
        {
          "title": "Updating views automatically with observation tracking",
          "url": "https://developer.apple.com/documentation/AppKit/updating-views-automatically-with-observation-tracking",
          "type": "documentation",
          "description": "Use Swift Observation and AppKit’s automatic tracking to update your views in response to model data updates.",
          "sosumiURL": "https://sosumi.ai/documentation/AppKit/updating-views-automatically-with-observation-tracking",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppKit/updating-views-automatically-with-observation-tracking.json"
        }
      ],
      "path": "sessions/wwdc2026/272-use-swiftui-with-appkit-and-uikit/",
      "files": {
        "metadata": "sessions/wwdc2026/272-use-swiftui-with-appkit-and-uikit/metadata.json",
        "readme": "sessions/wwdc2026/272-use-swiftui-with-appkit-and-uikit/README.md",
        "transcript": "sessions/wwdc2026/272-use-swiftui-with-appkit-and-uikit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/272-use-swiftui-with-appkit-and-uikit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-274",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 274,
      "title": "What’s new in SwiftData",
      "description": "Discover the latest enhancements to SwiftData. We’ll show you how to persist custom and third-party types using Codable, and group fetched data into sections in your SwiftUI app. We’ll also explore how to observe data store changes anywhere else using ResultsObserver and HistoryObserver, giving you the flexibility to drive powerful state objects and react precisely to model updates.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/274",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/274",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "Swift",
        "SwiftUI & UI Frameworks",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 773,
      "hasTranscript": true,
      "transcriptWordCount": 1933,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/274/4/87fb1efb-9956-414e-8c99-f2579fe86da2/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/274/4/87fb1efb-9956-414e-8c99-f2579fe86da2/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/274/4/87fb1efb-9956-414e-8c99-f2579fe86da2/downloads/wwdc2026-274_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/274/4/87fb1efb-9956-414e-8c99-f2579fe86da2/downloads/wwdc2026-274_hd.mp4",
        "duration": 773
      },
      "codeSnippets": [
        {
          "title": "Sectioned fetching",
          "language": "swift",
          "startTimeSeconds": 1,
          "code": "// Sectioned fetching\n\nstruct TripListView: View {   \n    @Query(sort: \\Trip.startDate,\n           sectionBy: \\.destination)\n    var trips: [Trip]\n\n    var body: some View: {\n        List(selection: $selection) {\n            ForEach(_trips.sections) {section in\n                Section(section.id) {\n                    ForEach(trips) {trip in\n                        TripListItem(trip: trip)\n                    }\n               }\n            }\n        }\n    }\n}"
        },
        {
          "title": "Using Codable",
          "language": "swift",
          "startTimeSeconds": 299,
          "code": "// Using Codable\n\nimport SwiftData\n\n@Model class Trip {\n\n    struct Location: Codable {\n        var latitude: Double\n        var longitude: Double\n    }\n\n    var name: String\n    var destination: String\n\n    var startDate: Date\n    var endDate: Date\n\n    var location: Location?\n    @Attribute(.codable) var mapItemIdentifier: MKMapItem.Identifier?\n}"
        },
        {
          "title": "// Use observation to update map bounds",
          "language": "swift",
          "startTimeSeconds": 500,
          "code": "// Use observation to update map bounds\n\n@Observable @MainActor final class MapCameraController {\n    private let resultsObserver: ResultsObserver<Trip, Never>\n    var bounds: MapCameraBounds?\n    private var token: ObservationTracking.Token?\n\n    init(modelContext: ModelContext) throws {\n        resultsObserver = try ResultsObserver<Trip, Never>(modelContext: modelContext)\n\n        token = withContinuousObservation(options: [.didSet]) {[weak self], event in\n            self?.bounds = self?.calculateBounds(trips: resultsObserver.results)\n       }\n    }\n\n    private func calculateBounds(trips: [Trip]) -> MapCameraBounds? { / * */ }\n}"
        },
        {
          "title": "// Using HistoryObserver to sync with a server",
          "language": "swift",
          "startTimeSeconds": 501,
          "code": "// Using HistoryObserver to sync with a server\n\n@SyncActor final class ServerSync {\n    private let observer: HistoryObserver\n    private var token: ObservationTracking.Token?\n\n    func start() throws {\n        self.observer = try HistoryObserver(authors: [\"App\"], modelContainer: modelContainer)\n        token = withContinuousObservation(options: .didSet) {[weak self] _ in\n            _ = self?.observer.eventCounter\n            self?.processChanges()\n        }\n    }\n\n    private func processChanges() {\n        // Fetch and process history transactions\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "SwiftData",
          "url": "https://developer.apple.com/documentation/SwiftData",
          "type": "documentation",
          "description": "Write your model code declaratively to add managed persistence and efficient",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftData",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftData.json"
        },
        {
          "title": "Adopting SwiftData for a Core Data app",
          "url": "https://developer.apple.com/documentation/CoreData/adopting-swiftdata-for-a-core-data-app",
          "type": "samplecode",
          "description": "Persist data in your app intuitively with the Swift native persistence framework.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreData/adopting-swiftdata-for-a-core-data-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreData/adopting-swiftdata-for-a-core-data-app.json"
        }
      ],
      "path": "sessions/wwdc2026/274-what-s-new-in-swiftdata/",
      "files": {
        "metadata": "sessions/wwdc2026/274-what-s-new-in-swiftdata/metadata.json",
        "readme": "sessions/wwdc2026/274-what-s-new-in-swiftdata/README.md",
        "transcript": "sessions/wwdc2026/274-what-s-new-in-swiftdata/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/274-what-s-new-in-swiftdata/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-275",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 275,
      "title": "Code-along: Add persistence with SwiftData",
      "description": "Experience SwiftData in action as we add persistence to an existing app. We’ll show you how to define your data models and seamlessly integrate persistent data with SwiftUI. You’ll also learn foundational skills for managing your app’s state using this expressive, declarative API.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/275",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/275",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "Swift",
        "SwiftUI & UI Frameworks",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 1355,
      "hasTranscript": true,
      "transcriptWordCount": 3133,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/275/4/7c64f887-3c3c-4bdf-8472-72d6b96f8e3d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/275/4/7c64f887-3c3c-4bdf-8472-72d6b96f8e3d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/275/4/7c64f887-3c3c-4bdf-8472-72d6b96f8e3d/downloads/wwdc2026-275_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/275/4/7c64f887-3c3c-4bdf-8472-72d6b96f8e3d/downloads/wwdc2026-275_hd.mp4",
        "duration": 1355
      },
      "codeSnippets": [
        {
          "title": "Convert Activity to a persistent model with @Model",
          "language": "swift",
          "startTimeSeconds": 219,
          "code": "import Foundation\nimport SwiftData\n\n// SwiftData automatically generates Observable conformance\n@Model\nclass Activity {\n    var name: String\n    var isComplete: Bool = false\n    var dateCreated = Date.now\n    var dateEdited = Date.now\n}"
        },
        {
          "title": "Add Codable conformance to TripCollection",
          "language": "swift",
          "startTimeSeconds": 366,
          "code": "enum TripCollection: String, CaseIterable, RawRepresentable, Codable {\n    case springEscapes\n    case summerVibes\n    case fallGetaways\n    case winterRetreats\n}"
        },
        {
          "title": "Set up model relationships between Trip, TripImage, and Activity",
          "language": "swift",
          "startTimeSeconds": 632,
          "code": "import Foundation\nimport SwiftData\n\n@Model\nclass Trip {\n    var name: String\n    var collection: TripCollection\n\n    var photo: TripImage\n    var thumbnailData: Data?\n\n    @Relationship(deleteRule: .cascade, inverse: \\Activity.trip)\n    var activities: [Activity] = []\n\n    private(set) var creationDate = Date.now\n    var subtitle: String?\n    var isComplete: Bool = false\n}"
        },
        {
          "title": "Enable interoperability between your schema and SwiftUI views",
          "language": "swift",
          "startTimeSeconds": 801,
          "code": "import SwiftUI\nimport SwiftData\n\n@main\nstruct WishlistApp: App {\n    let container: ModelContainer = {\n        do {\n            let modelContainer = try ModelContainer(for: Trip.self, Activity.self, TripImage.self, Goal.self, TripGoal.self, ActivityGoal.self)\n            try SampleData.seedIfNeeded(in: modelContainer.mainContext)\n            return modelContainer\n        } catch {\n            fatalError(\"Could not create model container: \\(error)\")\n        }\n    }()\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .preferredColorScheme(.dark)\n        }\n        .modelContainer(container)\n    }\n}"
        },
        {
          "title": "Fetch achieved and upcoming goals",
          "language": "swift",
          "startTimeSeconds": 987,
          "code": "@Query(filter: #Predicate<Goal> { $0.isAchieved }, sort: \\Goal.dateAchieved, order: .reverse)\nprivate var achievedGoals: [Goal]\n\n@Query(filter: #Predicate<Goal> { !$0.isAchieved }, sort: \\Goal.sortOrder)\nprivate var upcomingGoals: [Goal]"
        },
        {
          "title": "Fetch recent trips",
          "language": "swift",
          "startTimeSeconds": 1009,
          "code": "import SwiftUI\nimport SwiftData\n\nstruct RecentTripsPageView: View {\n    // Fetch most recent trips in reverse chronological order\n    @Query(FetchDescriptor<Trip>(sortBy: [SortDescriptor(\\Trip.creationDate, order: .reverse)], fetchLimit: 5))\n    private var trips: [Trip]\n\n    @Namespace private var namespace\n\n    var body: some View {\n        TabView {\n            ForEach(trips) { trip in\n                NavigationLink {\n                    TripDetailView(trip: trip)\n                        .navigationTransition(\n                            .zoom(sourceID: trip.id, in: namespace))\n                } label: {\n                    TripImageView(trip: trip)\n                        .overlay(alignment: .bottomLeading) {\n                            VStack(alignment: .leading) {\n                                Text(\"RECENTLY ADDED\")\n                                    .font(.subheadline)\n                                    .fontWeight(.bold)\n                                    .foregroundStyle(.limeGreen)\n\n                                Text(trip.name)\n                                    .font(.title)\n                                    .fontWidth(.expanded)\n                                    .fontWeight(.medium)\n                                    .foregroundStyle(.primary)\n                            }\n                            .padding(.horizontal)\n                            .padding(.bottom, 54)\n                        }\n                        .matchedTransitionSource(id: trip.id, in: namespace)\n                }\n                .buttonStyle(.plain)\n            }\n        }\n        .tabViewStyle(.page)\n        .containerRelativeFrame([.horizontal, .vertical]) { length, axis in\n            if axis == .vertical {\n                return length / 1.3\n            } else {\n                return length\n            }\n        }\n    }\n}"
        },
        {
          "title": "Dynamically construct a query in the initializer of TripCollectionView",
          "language": "swift",
          "startTimeSeconds": 1046,
          "code": "init(tripCollection: TripCollection, cardSize: TripCard.Size, namespace: Namespace.ID) {\n    _trips = Query(filter: #Predicate<Trip> { $0.collection == tripCollection }, sort: \\Trip.name)\n    self.tripCollection = tripCollection\n    self.cardSize = cardSize\n    self.namespace = namespace\n}"
        },
        {
          "title": "Search for trips and activities by name",
          "language": "swift",
          "startTimeSeconds": 1093,
          "code": "import SwiftUI\nimport SwiftData\n\nprivate struct SearchResultsListView: View {\n    @Query(sort: \\Trip.name) private var trips: [Trip]\n    @Query(sort: \\Activity.name) private var activities: [Activity]\n\n    var searchText: String\n    var namespace: Namespace.ID\n\n    init(searchText: String, namespace: Namespace.ID) {\n        self.searchText = searchText\n        self.namespace = namespace\n\n        if searchText.isEmpty {\n            _trips = Query(FetchDescriptor(sortBy: [SortDescriptor(\\Trip.creationDate, order: .reverse)], fetchLimit: 3))\n            _activities = Query(filter: #Predicate<Activity> { _ in false })\n        } else {\n            // All trips whose name matches searchText, sorted lexicographically\n            let tripSearchPredicate = #Predicate<Trip> { $0.name.localizedStandardContains(searchText) }\n            _trips = Query(filter: tripSearchPredicate, sort: \\Trip.name)\n            // All matching activities that belong to a trip\n            let activitySearchPredicate = #Predicate<Activity> { $0.trip != nil && $0.name.localizedStandardContains(searchText) }\n            _activities = Query(filter: activitySearchPredicate, sort: \\Activity.name)\n        }\n    }\n\n    var body: some View {\n        List {\n            if !trips.isEmpty {\n                TripSearchSectionView(trips: trips, namespace: namespace, title: searchText.isEmpty ? \"Recent Trips\" : \"Trips\")\n            }\n\n            if !activities.isEmpty {\n                ActivitySearchSectionView(activities: activities)\n            }\n        }\n        .overlay {\n            if trips.isEmpty && activities.isEmpty {\n                ContentUnavailableView(\n                    \"No results for “\\(searchText)”\",\n                    systemImage: \"magnifyingglass\",\n                    description: Text(\"Check spelling or try a new search.\")\n                )\n            }\n        }\n        .listStyle(.plain)\n    }\n}"
        },
        {
          "title": "Capture and report errors from ActivityItemView",
          "language": "swift",
          "startTimeSeconds": 1182,
          "code": "var body: some View {\n    HStack(alignment: .firstTextBaseline, spacing: 17) {\n        Group {\n            if isEditing {\n                rowContentWhenEditing\n            } else {\n                rowContentWhenNotEditing\n            }\n        }\n        .transition(.opacity.animation(.snappy))\n        .animation(.snappy, value: isEditing)\n    }\n    .onDisappear {\n        do {\n            try updateGoalAchievements()\n        } catch {\n            updateError = error\n            reportError(error)\n        }\n    }\n    .alert(error: $updateError) {\n        // Customize the presentation of the error\n    }\n}"
        },
        {
          "title": "Update dateEdited and propagate side effects on property changes",
          "language": "swift",
          "startTimeSeconds": 1264,
          "code": "init(activity: Activity, isLast: Bool, isEditing: Bool) {\n    activity.token = withContinuousObservation(options: .didSet) { event in\n        _ = activity.name\n        _ = activity.isComplete\n\n        if event.matches(\\Activity.name) {\n            activity.dateEdited = .now\n        }\n\n        if event.matches(\\Activity.isComplete) {\n            activity.dateEdited = .now\n            activity.trip?.isComplete = activity.trip?.activities.isEmpty == false\n            && activity.trip?.activities.allSatisfy { $0.isComplete } == true\n        }\n    }\n    self.activity = activity\n    self.isLast = isLast\n    self.isEditing = isEditing\n}"
        }
      ],
      "resources": [
        {
          "title": "Wishlist: Planning travel in a SwiftUI app",
          "url": "https://developer.apple.com/documentation/SwiftUI/wishlist-planning-travel-in-a-swiftui-app",
          "type": "documentation",
          "description": "Build a travel planning app that organizes trips into collections",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/wishlist-planning-travel-in-a-swiftui-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/wishlist-planning-travel-in-a-swiftui-app.json"
        },
        {
          "title": "SwiftData",
          "url": "https://developer.apple.com/documentation/SwiftData",
          "type": "documentation",
          "description": "Write your model code declaratively to add managed persistence and efficient",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftData",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftData.json"
        }
      ],
      "path": "sessions/wwdc2026/275-code-along-add-persistence-with-swiftdata/",
      "files": {
        "metadata": "sessions/wwdc2026/275-code-along-add-persistence-with-swiftdata/metadata.json",
        "readme": "sessions/wwdc2026/275-code-along-add-persistence-with-swiftdata/README.md",
        "transcript": "sessions/wwdc2026/275-code-along-add-persistence-with-swiftdata/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/275-code-along-add-persistence-with-swiftdata/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-277",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 277,
      "title": "WidgetKit foundations",
      "description": "Widgets highlight your app’s most important content across the system, providing people with another opportunity to engage. Discover the different types of widgets and explore the qualities that make them memorable. Learn how to create widgets, keep them up to date, and offer ways for people to customize them through App Intents and dynamic styling.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/277",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/277",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1220,
      "hasTranscript": true,
      "transcriptWordCount": 3271,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/277/4/e9dd0c7d-3a2e-4cf3-9e65-c9cba19d3616/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/277/4/e9dd0c7d-3a2e-4cf3-9e65-c9cba19d3616/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/277/4/e9dd0c7d-3a2e-4cf3-9e65-c9cba19d3616/downloads/wwdc2026-277_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/277/4/e9dd0c7d-3a2e-4cf3-9e65-c9cba19d3616/downloads/wwdc2026-277_hd.mp4",
        "duration": 1220
      },
      "codeSnippets": [
        {
          "title": "DailyReadingGoalWidget",
          "language": "swift",
          "startTimeSeconds": 230,
          "code": "struct DailyReadingGoalWidget: Widget {\n    let kind = \"DailyReadingGoalWidget\"\n\n    var body: some WidgetConfiguration {\n        StaticConfiguration(\n            kind: kind,\n            provider: DailyReadingGoalProvider()\n        ) { entry in\n            DailyReadingGoalView(book: entry.book,\n                                 message: entry.message,\n                                 timeOfDay: entry.timeOfDay)\n            .environment(\\.colorScheme, .dark)\n            .containerBackground(for: .widget) {\n                Background()\n            }\n        }\n    }\n}"
        },
        {
          "title": "Supported Families",
          "language": "swift",
          "startTimeSeconds": 745,
          "code": "struct DailyReadingGoalWidget: Widget {\n    let kind = \"DailyReadingGoalWidget\"\n\n    var body: some WidgetConfiguration {\n        StaticConfiguration(\n            kind: kind,\n            provider: DailyReadingGoalProvider()\n        ) { entry in\n            DailyReadingGoalView(book: entry.book,\n                                 message: entry.message,\n                                 timeOfDay: entry.timeOfDay)\n            .environment(\\.colorScheme, .dark)\n            .containerBackground(for: .widget) {\n                Background()\n            }\n        }\n        .supportedFamilies([.systemMedium])\n    }\n}"
        },
        {
          "title": "Adding deep links",
          "language": "swift",
          "startTimeSeconds": 843,
          "code": "struct DailyReadingGoalWidget: Widget {\n    let kind = \"DailyReadingGoalWidget\"\n\n    var body: some WidgetConfiguration {\n        StaticConfiguration(\n            kind: kind,\n            provider: DailyReadingGoalProvider()\n        ) { entry in\n            DailyReadingGoalView(book: entry.book,\n                                 message: entry.message,\n                                 timeOfDay: entry.timeOfDay)\n            .environment(\\.colorScheme, .dark)\n            .containerBackground(for: .widget) {\n                Background()\n            }\n            .widgetURL(URL(string: \"bookclub://reading/\\(book.bookID)\"))\n        }\n        .supportedFamilies([.systemMedium])\n    }\n}"
        },
        {
          "title": "Accented rendering mode",
          "language": "swift",
          "startTimeSeconds": 1097,
          "code": "struct BookCoverImage: View {\n    let imageName: String\n\n    var body: some View {\n        Image(imageName: bundle: .main)\n            .widgetAccentedRenderingMode(.fullColor)\n    }\n}"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/277-widgetkit-foundations/",
      "files": {
        "metadata": "sessions/wwdc2026/277-widgetkit-foundations/metadata.json",
        "readme": "sessions/wwdc2026/277-widgetkit-foundations/README.md",
        "transcript": "sessions/wwdc2026/277-widgetkit-foundations/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/277-widgetkit-foundations/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-278",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 278,
      "title": "Modernize your UIKit app",
      "description": "Discover the latest updates to UIKit. Learn how to update your iPhone app layouts to work great when resized with iPhone Mirroring and on iPad. Explore new APIs for tab and navigation bars, find out how to prepare your app for new Apple Intelligence capabilities, and get introduced to a skill for your coding agent of choice that helps modernize your codebase.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/278",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/278",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "⚡️"
      ],
      "topics": [
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 963,
      "hasTranscript": true,
      "transcriptWordCount": 2429,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/278/4/8c3f2e61-52d3-4915-9543-96e2f13adc8b/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/278/4/8c3f2e61-52d3-4915-9543-96e2f13adc8b/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/278/4/8c3f2e61-52d3-4915-9543-96e2f13adc8b/downloads/wwdc2026-278_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/278/4/8c3f2e61-52d3-4915-9543-96e2f13adc8b/downloads/wwdc2026-278_hd.mp4",
        "duration": 963
      },
      "codeSnippets": [
        {
          "title": "Use local screen references",
          "language": "swift",
          "startTimeSeconds": 204,
          "code": "// Use local screen references\n// Access the correct screen through a windowScene\nlet screen = window?.windowScene?.screen\n\n// Pass in local screen references\nfunc generateThumbnail(_ image: UIImage, screen: UIScreen) -> UIImage {\n    // existing code, replacing main screen with local screen reference\n    // ...\n}"
        },
        {
          "title": "Replace screen scale with displayScale",
          "language": "swift",
          "startTimeSeconds": 229,
          "code": "// Replace the screen's scale with trait collection's displayScale\noverride func layoutSubviews() {\n    super.layoutSubviews()\n\n    // layoutSubviews will be called again automatically when displayScale changes\n    let displayScale = traitCollection.displayScale\n    // ...\n}"
        },
        {
          "title": "Register for trait changes",
          "language": "swift",
          "startTimeSeconds": 276,
          "code": "// Manually register for trait changes\nlet displayScaleTrait: [UITrait] = [UITraitDisplayScale.self]\nregisterForTraitChanges(displayScaleTrait) {\n    (view: GalleryView, previousTraitCollection: UITraitCollection) in\n    view.cache.invalidate()\n}"
        },
        {
          "title": "Monitor effective geometry changes",
          "language": "swift",
          "startTimeSeconds": 319,
          "code": "// UIWindowSceneDelegate\nfunc windowScene(\n    _ windowScene: UIWindowScene,\n    didUpdateEffectiveGeometry previousEffectiveGeometry: UIWindowScene.Geometry\n) {\n    let geometry = windowScene.effectiveGeometry\n    let availableSpace = geometry.coordinateSpace.bounds\n    // ...\n}"
        },
        {
          "title": "Check available space using view bounds",
          "language": "swift",
          "startTimeSeconds": 335,
          "code": "// Checking available space\noverride func viewDidLayoutSubviews() {\n    super.viewDidLayoutSubviews()\n\n    let availableSpace = view.bounds.size\n    // ...\n}"
        },
        {
          "title": "Configure motion and location body",
          "language": "swift",
          "startTimeSeconds": 492,
          "code": "// Configure motion and heading bodies\noverride func viewDidLoad() {\n    super.viewDidLoad()\n\n    motionManager.deviceMotionBody = view\n    locationManager.headingBody = view\n}"
        },
        {
          "title": "Opt into sidebar layout",
          "language": "swift",
          "startTimeSeconds": 591,
          "code": "tabBarController.sidebar.preferredPlacement = .sidebar"
        },
        {
          "title": "Check sidebar availability",
          "language": "swift",
          "startTimeSeconds": 622,
          "code": "tabBarController.sidebar.isAvailable"
        },
        {
          "title": "Set prominent tab identifier",
          "language": "swift",
          "startTimeSeconds": 653,
          "code": "// Set the prominent tab\nlet tabs = [\n    // ...\n]\nlet tabBarController = UITabBarController(tabs: tabs)\ntabBarController.prominentTabIdentifier = \"cart\""
        },
        {
          "title": "Customize bar minimization behavior",
          "language": "swift",
          "startTimeSeconds": 690,
          "code": "// Customize bar minimization behavior\noverride init(\n    nibName nibNameOrNil: String?,\n    bundle nibBundleOrNil: Bundle?\n) {\n    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)\n\n    navigationItem.barMinimizationBehavior = .always\n    navigationItem.barMinimizationSafeAreaAdjustment = .never\n}"
        },
        {
          "title": "Export Xcode skills for use in other tools",
          "language": "bash",
          "startTimeSeconds": 905,
          "code": "xcrun agent skills export"
        }
      ],
      "resources": [
        {
          "title": "TN3208: Preparing your app’s launch screen to meet App Store requirements",
          "url": "https://developer.apple.com/documentation/Technotes/tn3208-preparing-your-apps-launch-screen-to-meet-app-store-requirements",
          "type": "documentation",
          "description": "Understand the launch screen requirement for App Store submission starting in iOS 27 and iPadOS 27.",
          "sosumiURL": "https://sosumi.ai/documentation/Technotes/tn3208-preparing-your-apps-launch-screen-to-meet-app-store-requirements",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Technotes/tn3208-preparing-your-apps-launch-screen-to-meet-app-store-requirements.json"
        },
        {
          "title": "TN3210: Optimizing your app for iPhone Mirroring",
          "url": "https://developer.apple.com/documentation/Technotes/tn3210-optimizing-your-app-for-iphone-mirroring",
          "type": "documentation",
          "description": "Test your app and improve compatibility with iPhone Mirroring.",
          "sosumiURL": "https://sosumi.ai/documentation/Technotes/tn3210-optimizing-your-app-for-iphone-mirroring",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Technotes/tn3210-optimizing-your-app-for-iphone-mirroring.json"
        },
        {
          "title": "Make your UIKit app more flexible",
          "url": "https://developer.apple.com/videos/play/wwdc2025/282/",
          "type": "guide",
          "description": "Find out how your UIKit app can become more flexible on iPhone, iPad, Mac, and Apple Vision Pro by using scenes and container view controllers. Learn to unlock your app's full potential by transitioning from an app-centric to a scene-based lifecycle, including enhanced window resizing and improved multitasking. Explore enhancements to UISplitViewController, such as interactive column resizing and first-class support for inspector columns. And make your views and controls more adaptive by adopting new layout APIs.",
          "sosumiURL": "https://sosumi.ai/videos/play/wwdc2025/282/"
        },
        {
          "title": "Adapting your app when traits change",
          "url": "https://developer.apple.com/documentation/UIKit/adapting-your-app-when-traits-change",
          "type": "documentation",
          "description": "Find out when system changes happen that affect your app, then update your app efficiently.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/adapting-your-app-when-traits-change",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/adapting-your-app-when-traits-change.json"
        },
        {
          "title": "Transitioning to the UIKit scene-based life cycle",
          "url": "https://developer.apple.com/documentation/UIKit/transitioning-to-the-uikit-scene-based-life-cycle",
          "type": "documentation",
          "description": "Adopt the scene-based life cycle to replace the app delegate life cycle in UIKit.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/transitioning-to-the-uikit-scene-based-life-cycle",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/transitioning-to-the-uikit-scene-based-life-cycle.json"
        },
        {
          "title": "Automatic trait tracking",
          "url": "https://developer.apple.com/documentation/UIKit/automatic-trait-tracking",
          "type": "documentation",
          "description": "Reduce the need to manually register for trait changes when you use traits within a method or closure that supports automatic trait tracking.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/automatic-trait-tracking",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/automatic-trait-tracking.json"
        },
        {
          "title": "Human Interface Guidelines: Menus",
          "url": "https://developer.apple.com/design/human-interface-guidelines/menus",
          "type": "documentation",
          "description": "HIG",
          "sosumiURL": "https://sosumi.ai/design/human-interface-guidelines/menus"
        }
      ],
      "path": "sessions/wwdc2026/278-modernize-your-uikit-app/",
      "files": {
        "metadata": "sessions/wwdc2026/278-modernize-your-uikit-app/metadata.json",
        "readme": "sessions/wwdc2026/278-modernize-your-uikit-app/README.md",
        "transcript": "sessions/wwdc2026/278-modernize-your-uikit-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/278-modernize-your-uikit-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-279",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 279,
      "title": "Explore advances in RealityKit",
      "description": "Discover the latest advancements in RealityKit designed to make your apps and games more immersive and realistic than ever. Explore powerful new capabilities including interactive cloth simulations, NavMesh pathfinding, mixed reality lighting, and customizable reverb meshes for enhanced spatial audio. Elevate your visual fidelity with improved shadows, character rendering enhancements, and support for Gaussian splatting.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/279",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/279",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "3d content",
        "games",
        "gaussian splatting",
        "reality composer pro",
        "realitykit",
        "realitykit audio",
        "spatial computing",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1431,
      "hasTranscript": true,
      "transcriptWordCount": 3896,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/279/4/ab575725-be7d-4348-a3ae-6595ef4070c4/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/279/4/ab575725-be7d-4348-a3ae-6595ef4070c4/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/279/4/ab575725-be7d-4348-a3ae-6595ef4070c4/downloads/wwdc2026-279_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/279/4/ab575725-be7d-4348-a3ae-6595ef4070c4/downloads/wwdc2026-279_hd.mp4",
        "duration": 1431
      },
      "codeSnippets": [
        {
          "title": "Soft shadows",
          "language": "swift",
          "startTimeSeconds": 242,
          "code": "// Enable soft shadows for the hearth spotlight\n\nguard var shadow = hearthSpotlight.components[SpotLightComponent.Shadow.self] else {\n    // handle error\n}\nshadow.lightSize = 0.7 // meters\n\nshadow.quality = .medium // or .high\n// shadow.quality = .low // will result in hard shadows\n\nhearthSpotlight.components.set(shadow)"
        },
        {
          "title": "Projective textures",
          "language": "swift",
          "startTimeSeconds": 373,
          "code": "// Create one of the planetarium spotlights\n\nlet spotLightEntity = Entity()\nspotLightEntity.components.set(SpotLightComponent(\n    color: .white,\n    intensity: intensity,\n    innerAngleInDegrees: innerAngle,\n    outerAngleInDegrees: outerAngle,\n    attenuationRadius: attenuationRadius,\n))\n\nlet projectiveTexture: TextureResource = generateStarsAndNebulaeTexture()\nspotLightEntity.components.set(SpotLightComponent.ProjectiveTexture(\n    texture: projectiveTexture\n))"
        },
        {
          "title": "Physical space lighting",
          "language": "swift",
          "startTimeSeconds": 433,
          "code": "// Enable physical space lighting\n\nspotLightEntity.components.set(SpotLightComponent.SurroundingsLight())"
        },
        {
          "title": "Querying the navigation mesh",
          "language": "swift",
          "startTimeSeconds": 586,
          "code": "// Querying the navigation mesh in Chaparral Village\n\nextension Entity {\n    public func navigate(/* ... */) async {\n        let navigator = try! NavigationController(entity: self)\n        guard let result = await navigator.computePath(from: fromPosition, to: toPosition) \n        else {\n            return\n        }\n        if result.isEmpty {\n            return\n        }\n        for node in result {\n            switch node.category {\n                case .meshPoint:\n                    finalPath.append(node.position)\n                case .offMeshConnection:\n                    // handle ladders\n            }\n        }\n    }\n}"
        },
        {
          "title": "Pinning cloth to anchor points",
          "language": "swift",
          "startTimeSeconds": 771,
          "code": "// Pin the curtains to the Alchemist's lab\n\nfor (pin, pinComponent) in pins {\n        let position = pin.position(relativeTo: event.entity)\n        let selectionSphere = ClothSphereShape(radius: pinComponent.radius)\n\n        let vertices = clothMesh.vertices(in: .sphere(selectionSphere),\n                                    center: position)\n        clothBody.motionTypes.set(vertexIndices: vertices, value: .kinematic)\n}"
        },
        {
          "title": "LOD by camera distance",
          "language": "swift",
          "startTimeSeconds": 882,
          "code": "// Create entity with LODs\n\nlet lod0 = [ModelEntity(mesh: lodMesh0)]\nlet lod1 = [ModelEntity(mesh: lodMesh1)]\nlet lod2 = [ModelEntity(mesh: lodMesh2)]\n\nlet entity = Entity()\n\nLevelOfDetailComponent.addByCameraDistance(to: entity, levels: [\n    (entities: lod0, maxDistance: 1.0 /* meters */), // highest detail\n    (entities: lod1, maxDistance: 5.0),              // medium detail\n    (entities: lod2, maxDistance: .infinity),        // lowest detail\n])"
        },
        {
          "title": "LOD by screen area",
          "language": "swift",
          "startTimeSeconds": 958,
          "code": "// Create entity with LODs\n\nlet lod0 = [ModelEntity(mesh: lodMesh0)]\nlet lod1 = [ModelEntity(mesh: lodMesh1)]\nlet lod2 = [ModelEntity(mesh: lodMesh2)]\n\nlet entity = Entity()\n\nLevelOfDetailComponent.addByScreenArea(to: entity, levels: [\n    (entities: lod0, minArea: 0.2 /* fraction of screen area */),  // highest detail\n    (entities: lod1, minArea: 0.1),                                // medium detail\n    (entities: lod2, minArea: 0.01),                               // lowest detail\n])"
        },
        {
          "title": "Responding to thermal state changes",
          "language": "swift",
          "startTimeSeconds": 986,
          "code": "// Respond to changes in device thermal state\n\nNotificationCenter.default.addObserver(of: ProcessInfo.self,\n                                       for: .thermalStateDidChange) {_ in\n    switch ProcessInfo.processInfo.thermalState {\n        case .nominal, .fair:\n            // Stay the course\n        case .serious, .critical:\n            // Improve performance by:\n            // More aggressive LOD switching\n            // Lower shadow quality\n    }\n}"
        },
        {
          "title": "Creating a Gaussian splat",
          "language": "swift",
          "startTimeSeconds": 1124,
          "code": "// Create Gaussian splat resource and component\n\nlet resource = try GaussianSplatResource.BufferResource(count: splatCount,\n                                                        position: positionBuffer,\n                                                        scale: scaleBuffer,\n                                                        rotation: rotationBuffer,\n                                                        opacity: opacityBuffer,\n                                                        sphericalHarmonics:\n                                                                                                                    (sphericalHarmonicsBuffer, degree))\n\nlet splatResource = GaussianSplatResource(resource)\n\nlet splatComponent = GaussianSplatComponent(splatResource)\n\nsplatEntity.components.set(splatComponent)"
        },
        {
          "title": "Creating a custom reverb mesh",
          "language": "swift",
          "startTimeSeconds": 1249,
          "code": "// Create and use custom reverb mesh\n\nlet mesh: ReverbMeshResource = .shoebox(size: [5, 4, 6])\n\nlet reverb: Reverb = .simulated(mesh: mesh, materials: [.dryWall])\n\nentity.components.set(ReverbComponent(reverb: reverb))"
        },
        {
          "title": "Creating custom reverb materials",
          "language": "swift",
          "startTimeSeconds": 1293,
          "code": "// Create custom materials for custom reverb mesh\n\nlet thickCarpet: Audio.Material = .carpet.scalingAbsorption {freq in 0.1 }\n\nlet bookshelf: Audio.Material\n\n// Absorption coefficients by center frequency:\n// 31.5Hz, 63Hz, 125Hz, 250Hz, 500Hz, 1kHz, 2kHz, 4kHz, 8kHz, 16kHz\nlet bookshelfAbsorption = Audio.Absorption(\n    [0.10, 0.15, 0.28, 0.20, 0.15, 0.10, 0.10, 0.07, 0.07, 0.05])\n\n// Scattering coefficients for: 500Hz, 1000Hz, 4000Hz\nlet bookshelfScattering = Audio.Scattering([500: 0.5, 1000: 0.6, 4000: 0.7])\n\nbookshelf = .init(absorption: bookshelfAbsorption,\n              scattering: bookshelfScattering)"
        }
      ],
      "resources": [
        {
          "title": "Gaussian splats on visionOS",
          "url": "https://developer.apple.com/documentation/visionOS/gaussian-splats-on-visionos",
          "type": "documentation",
          "description": "Use the new Gaussian splat APIs available in RealityKit in visionOS 27.",
          "sosumiURL": "https://sosumi.ai/documentation/visionOS/gaussian-splats-on-visionos",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/visionOS/gaussian-splats-on-visionos.json"
        }
      ],
      "path": "sessions/wwdc2026/279-explore-advances-in-realitykit/",
      "files": {
        "metadata": "sessions/wwdc2026/279-explore-advances-in-realitykit/metadata.json",
        "readme": "sessions/wwdc2026/279-explore-advances-in-realitykit/README.md",
        "transcript": "sessions/wwdc2026/279-explore-advances-in-realitykit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/279-explore-advances-in-realitykit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-280",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 280,
      "title": "Iterate your spatial scenes faster with Reality Composer Pro 3",
      "description": "Unlock powerful new features in Reality Composer Pro 3 for building spatial experiences. Learn how you can add content, visual effects, lighting, and interactivity to your immersive scenes — all without leaving the editor. Discover how to iterate quickly using AI-assisted features right within the editor.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/280",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/280",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "3d",
        "environment",
        "game",
        "reality",
        "reality composer pro",
        "realitykit",
        "scene",
        "spatial computing",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1004,
      "hasTranscript": true,
      "transcriptWordCount": 2013,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/280/4/0f02d465-7874-4ac3-aac3-b1b792efecd3/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/280/4/0f02d465-7874-4ac3-aac3-b1b792efecd3/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/280/4/0f02d465-7874-4ac3-aac3-b1b792efecd3/downloads/wwdc2026-280_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/280/4/0f02d465-7874-4ac3-aac3-b1b792efecd3/downloads/wwdc2026-280_hd.mp4",
        "duration": 1004
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/280-iterate-your-spatial-scenes-faster-with-reality-composer-pro/",
      "files": {
        "metadata": "sessions/wwdc2026/280-iterate-your-spatial-scenes-faster-with-reality-composer-pro/metadata.json",
        "readme": "sessions/wwdc2026/280-iterate-your-spatial-scenes-faster-with-reality-composer-pro/README.md",
        "transcript": "sessions/wwdc2026/280-iterate-your-spatial-scenes-faster-with-reality-composer-pro/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/280-iterate-your-spatial-scenes-faster-with-reality-composer-pro/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-281",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 281,
      "title": "Extend Reality Composer Pro 3 functionality with Xcode",
      "description": "Discover how Reality Composer Pro 3 empowers you to build bigger, more ambitious spatial projects. Learn about creating project-specific plugins that let you edit custom components, run custom systems, and build your own ScriptGraph nodes—giving you complete control over your spatial authoring workflow.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/281",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/281",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [
        "3d",
        "game",
        "plugin",
        "reality composer pro",
        "realitykit",
        "scene",
        "scripting",
        "spatial computing",
        "swift",
        "visionos",
        "xcode"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1322,
      "hasTranscript": true,
      "transcriptWordCount": 3056,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/281/6/1aef704f-ccc6-4c1d-b7b7-94da42d29609/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/281/6/1aef704f-ccc6-4c1d-b7b7-94da42d29609/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/281/6/1aef704f-ccc6-4c1d-b7b7-94da42d29609/downloads/wwdc2026-281_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/281/6/1aef704f-ccc6-4c1d-b7b7-94da42d29609/downloads/wwdc2026-281_hd.mp4",
        "duration": 1322
      },
      "codeSnippets": [
        {
          "title": "Cauldron component",
          "language": "swift",
          "startTimeSeconds": 368,
          "code": "// Add a component to represent the water level\n\nimport RealityKit\n\npublic struct Cauldron: Component, Codable {\n    public var waterLevel: Float\n\n    enum CodingKeys: CodingKey {\n        case waterLevel\n    }\n}"
        },
        {
          "title": "CauldronSystem",
          "language": "swift",
          "startTimeSeconds": 402,
          "code": "// Add a system to control the water level\n\nimport RealityKit\n\npublic struct CauldronSystem: System {\n    let query = EntityComponentQuery(Cauldron.self)\n    public init(scene: Scene) {}\n\n    public func update(context: SceneUpdateContext) {\n        for (entity, cauldron) in context.entities(matching: query) {\n            guard let water = entity.findEntity(named: \"Cauldron_Water_mesh\")\n                else { continue }\n            water.setPosition(SIMD3<Float>(0, 1, 0) * cauldron.waterLevel, relativeTo: entity)\n        }\n    }\n}"
        },
        {
          "title": "RCPCustomComponentsPlugin",
          "language": "swift",
          "startTimeSeconds": 420,
          "code": "// Make sure that Reality Composer Pro 3 knows about the Cauldron and CauldronSystem\n\nimport RealityComposerPro\n\nfinal class RCPCustomComponentsPlugin: RealityComposerProPlugin {\n    public func setup(context: any RealityComposerProContext) {\n        context.registerComponent(Cauldron.self)\n        context.registerSystem(CauldronSystem.self)\n    }\n}\n\n@_cdecl(\"createRealityComposerProPlugin\")\npublic func createRealityComposerProPlugin() -> UnsafeMutableRawPointer {\n    return RCPCustomComponentsPlugin().passRetained()\n}"
        },
        {
          "title": "Cauldron component with vortex properties",
          "language": "swift",
          "startTimeSeconds": 649,
          "code": "// Properties to control water surface\n\nimport RealityKit\n\npublic struct Cauldron: Component, Codable {\n    public var waterLevel: Float\n    public var rotationSpeed: Float\n    public var minWaterLevel: Float\n    public var maxWaterLevel: Float\n    public var vortexCoeff: Float\n}"
        },
        {
          "title": "CauldronSystem update with ShaderGraph",
          "language": "swift",
          "startTimeSeconds": 665,
          "code": "public func update(context: SceneUpdateContext) {\n    for (entity, cauldron) in context.entities(matching: query) {\n        guard let water = entity.findEntity(named: \"Cauldron_Water_mesh\") else { continue }\n        water.setPosition(SIMD3<Float>(0, 1, 0) * cauldron.waterLevel, relativeTo: entity)\n\n        guard var model = water.components[ModelComponent.self] else { continue }\n        guard var mat = model.materials.first as? ShaderGraphMaterial else { continue }\n        let surface = computeSurface(cauldron: cauldron)\n        try? mat.setParameter(name: \"Level Radius\", value: .float(surface.levelRadius))\n        try? mat.setParameter(name: \"Lowest Point\",\n            value: .float(cauldron.waterLevel - surface.lowestPoint))\n        try? mat.setParameter(name: \"Height Change\", value: .float(surface.heightChange))\n        try? mat.setParameter(name: \"Level Coeff\", value: .float(surface.levelCoeff))\n        try? mat.setParameter(name: \"Is Level\", value: .bool(surface.isLevel))\n        model.materials[0] = mat\n        water.components.set(model)\n    }\n}"
        },
        {
          "title": "SetWaterLevelAction",
          "language": "swift",
          "startTimeSeconds": 805,
          "code": "// Custom action for setting the water level of the Cauldron\n\nimport RealityKit\n\npublic struct SetWaterLevelAction: EntityAction, Codable {\n    // Parameters for the action\n    public let startWaterLevel: Float\n    public let endWaterLevel: Float\n\n    // Required by EntityAction protocol\n    public var animatedValueType: (any AnimatableData.Type)? { Transform.self }\n}"
        },
        {
          "title": "SetWaterLevelAction subscribe",
          "language": "swift",
          "startTimeSeconds": 845,
          "code": "extension SetWaterLevelAction {\n    static func subscribe() {\n        Task { @MainActor in\n            SetWaterLevelAction.subscribe(to: .updated) { event in\n                let normalizedTime = (event.playbackController.time - event.startTime) /\n                    event.duration\n                let action = event.action\n                let currentLevel = action.startWaterLevel +\n                    Float(normalizedTime) * (action.endWaterLevel - action.startWaterLevel)\n                guard let entity = event.targetEntity else { return }\n                guard var cauldron = entity.components[Cauldron.self] else { return }\n                cauldron.waterLevel = currentLevel\n                entity.components.set(cauldron)\n            }\n        }\n    }\n}"
        },
        {
          "title": "RCPCustomComponentsPlugin with action",
          "language": "swift",
          "startTimeSeconds": 896,
          "code": "// Make sure that Reality Composer Pro 3 knows about the SetWaterLevelAction\n\nimport RealityComposerPro\n\nfinal class RCPCustomComponentsPlugin: RealityComposerProPlugin {\n    public func setup(context: any RealityComposerProContext) {\n        context.registerComponent(Cauldron.self)\n        context.registerSystem(CauldronSystem.self)\n\n        context.registerAction(SetWaterLevelAction.self)\n        SetWaterLevelAction.subscribe()\n    }\n}\n\n@_cdecl(\"createRealityComposerProPlugin\")\npublic func createRealityComposerProPlugin() -> UnsafeMutableRawPointer {\n    return RCPCustomComponentsPlugin().passRetained()\n}"
        },
        {
          "title": "Cauldron with @Scriptable macro",
          "language": "swift",
          "startTimeSeconds": 1052,
          "code": "// Expose Cauldron to Script Graphs\n\nimport RealityKit\nimport RealityKitScripting\nimport RealityKitScriptingMacros\n\n@Scriptable\npublic struct Cauldron: Component, Codable {\n    public var waterLevel: Float\n    public var rotationSpeed: Float\n    public var minWaterLevel: Float\n    public var maxWaterLevel: Float\n    public var vortexCoeff: Float\n}"
        },
        {
          "title": "Register scripting module",
          "language": "swift",
          "startTimeSeconds": 1088,
          "code": "// Register scripting module\n\npublic func setup(context: any RealityComposerProContext) {\n    context.registerComponent(Cauldron.self)\n    context.registerSystem(CauldronSystem.self)\n\n    context.registerAction(SetWaterLevelAction.self)\n    SetWaterLevelAction.subscribe()\n\n    Task { @MainActor in\n        let config = RKS.Configuration(id: \"ChaparralVillage\")\n            .onInitialize { _ in\n            [\n                Module(\"ChaparralVillage\") {\n                    Cauldron.SchemaProvider.schema\n                }\n            ]\n        }\n        try! RKS.addConfiguration(config)\n    }\n}"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/281-extend-reality-composer-pro-3-functionality-with-xcode/",
      "files": {
        "metadata": "sessions/wwdc2026/281-extend-reality-composer-pro-3-functionality-with-xcode/metadata.json",
        "readme": "sessions/wwdc2026/281-extend-reality-composer-pro-3-functionality-with-xcode/README.md",
        "transcript": "sessions/wwdc2026/281-extend-reality-composer-pro-3-functionality-with-xcode/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/281-extend-reality-composer-pro-3-functionality-with-xcode/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-282",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 282,
      "title": "Discover the Spatial Preview framework",
      "description": "Check out how the new Spatial Preview framework brings content from your Mac directly into visionOS. Discover how to build dynamic workflows with live-syncing and bidirectional editing across both platforms. Learn about the SpatialPreview API, device discovery, 2D and 3D session integration, and new Quick Look capabilities to elevate your Mac apps spatially.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/282",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/282",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "document preview",
        "mac virtual display",
        "quick look",
        "shareplay",
        "spatial computing",
        "spatial preview",
        "usd",
        "usdkit",
        "usdz",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 885,
      "hasTranscript": true,
      "transcriptWordCount": 2409,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/282/5/958c34c9-f20e-4c6d-826a-eeed7ce7ba9e/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/282/5/958c34c9-f20e-4c6d-826a-eeed7ce7ba9e/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/282/5/958c34c9-f20e-4c6d-826a-eeed7ce7ba9e/downloads/wwdc2026-282_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/282/5/958c34c9-f20e-4c6d-826a-eeed7ce7ba9e/downloads/wwdc2026-282_hd.mp4",
        "duration": 885
      },
      "codeSnippets": [
        {
          "title": "Document Preview Session with Device Picker",
          "language": "swift",
          "startTimeSeconds": 238,
          "code": "// Send and update documents using the Spatial Preview framework\n\nimport SwiftUI\nimport SpatialPreview\nlet deviceObserver = ConnectedSpatialEndpointObserver()\n\nlet previewSession = DocumentPreviewSession(name: \"Immersive.aivu\", contentType: .aivu)\n\nfunc startPreview(contentURL: URL, endpoint: SpatialPreviewEndpoint) async throws {\n    let endpoint = try await deviceObserver.endpoint\n    try await previewSession.start(endpoint: endpoint)\n    try await previewSession.updateContents(url: contentURL)\n}\n\n@State var showDevicePicker: Bool = false\n\nvar body: some View {\n    ...\n    .sheet(isPresented: $showDevicePicker) {\n        SpatialPreviewDevicePicker(isPresented: $showDevicePicker) { endpoint in\n            showDevicePicker = false\n            Task {\n                try await startPreview(filename: filename, endpoint: endpoint)\n            }\n        }\n    }\n}"
        },
        {
          "title": "Update Document Contents",
          "language": "swift",
          "startTimeSeconds": 320,
          "code": "// Send and update documents using the Spatial Preview framework\n\nimport SwiftUI\nimport SpatialPreview\n\nForEach(contentURLs, id: \\.self) { url in\n    Button {\n        Task { try await previewSession?.updateContents(url: url) }\n    }\n}\n.task(id: previewSession.map { ObjectIdentifier($0) }) {\n    for await state in Observations({ session.state }) {\n        if state.isInvalidated {\n            previewSession = nil\n            break\n        }\n    }\n}\n\ntry await previewSession?.close()"
        },
        {
          "title": "Edit USD Live",
          "language": "swift",
          "startTimeSeconds": 456,
          "code": "// Edit USD live using USDKit and Spatial Preview\n\nimport SpatialPreview\nimport USDKit\n\nlet deviceObserver = ConnectedSpatialEndpointObserver()\n\nvar usdSession: USDPreviewSession?\n\nfunc shareStage(to endpoint: SpatialPreviewEndpoint) async throws -> USDPreviewSession {\n    let endpoint = try await deviceObserver.endpoint\n\n    let stageURL = Bundle.main.url(forResource: \"sampleScene\", withExtension: \"usdz\")\n    let stage = try USDStage.open(stageURL)\n    usdSession = USDPreviewSession(stage: stage)\n\n    try await usdSession?.start(endpoint: endpoint)\n}"
        },
        {
          "title": "Opt out of optimization",
          "language": "swift",
          "startTimeSeconds": 536,
          "code": "// Optimization\n\nimport SpatialPreview\n\n\n\n\nlet endpoint = try await deviceObserver.endpoint\ndo {\n    try await usdSession.start(endpoint: endpoint, parameters: .unmodified)\n} catch USDPreviewSession.Error.assetUnshareable {\n    // Handle Asset Unshareable error\n}"
        },
        {
          "title": "USD Layout Variants",
          "language": "swift",
          "startTimeSeconds": 610,
          "code": "// LayoutVariants.usda\n#usda 1.0\nover \"furniture\" (\n    variantSets = \"Layout\"\n    variants = { string Layout = \"LayoutA\" }\n)\n{\n    variantSet \"Layout\" = {\n        \"LayoutA\" {\n            // Default furniture position and rotation\n        }\n        \"LayoutB\" {\n            // Moves furniture prims to a different position and rotation\n        }\n        ...\n    }\n}"
        },
        {
          "title": "Edit USD live using USDKit and Spatial Preview",
          "language": "swift",
          "startTimeSeconds": 617,
          "code": "// Edit USD live using USDKit and Spatial Preview\n\nimport SpatialPreview\nimport USDKit\n\nfunc applyLayoutVariant(named layoutVariantName: String) throws {\n    let prim = stage.prim(at: SdfPath(\"/root/furniture\"))\n    try prim.variantSets?.setSelection(\"Layout\", variantName: layoutVariantName)\n}"
        },
        {
          "title": "USD Stage Observations",
          "language": "swift",
          "startTimeSeconds": 649,
          "code": "// Edit USD live using Spatial Preview\n\nimport SpatialPreview\nimport USDKit\n\nlet observerToken: ObservationToken\n\nobserverToken = stage.addObserver(for: UsdStage.ObjectsDidChange.self) { notice in\n    for path in notice.resyncedPaths {\n        let prim = notice.stage.prim(at: path)\n        guard prim.isValid else { continue }\n        if prim.isAnnotation {\n            // Handle annotation change\n            break\n        }\n    }\n}"
        },
        {
          "title": "Annotation Spec",
          "language": "swift",
          "startTimeSeconds": 673,
          "code": "// Annotation spec example\n\nAppleTextAnnotation {\n    // The textual representation of this annotation\n    string text\n\n    // The identifier for this specific author\n    uniform string author\n\n    // An identifier that is unique to your data tracking system\n    uniform string identifier\n}\n\n/__documentAnnotationGroup__"
        },
        {
          "title": "Metadata for Object Manipulation",
          "language": "swift",
          "startTimeSeconds": 693,
          "code": "// Metadata required for object manipulation in Quick Look\n\ncustomData = {\n    dictionary apple = {\n        bool spatialEditable = 1\n    }\n}"
        },
        {
          "title": "Session Options and Events",
          "language": "swift",
          "startTimeSeconds": 736,
          "code": "// Spatial Preview session options and events\n\nimport SpatialPreview\nimport USDKit\n\nsession.start(endpoint: endpoint, options: [.annotations, .perObjectManipulation, .export])\n\nfunc listenForEvents(session: USDPreviewSession) async {\n    for await event in session.events {\n        if case .timeChanged(let time) = event {\n            playbackModel.timeCode = time\n        } else if case .playbackStateChanged(let isPlaying) = event {\n            playbackModel.playbackStateChanged(isPlaying)\n        }\n    }\n}"
        },
        {
          "title": "Observe Session Progress",
          "language": "swift",
          "startTimeSeconds": 758,
          "code": "// Observe Spatial Preview session progress\n\nimport SpatialPreview\nimport USDKit\n\n@State private var sessionProgress: Double = 0\n\nvar body: some View {\n    ...\n    .task(id: usdSession.map { ObjectIdentifier($0) }) {\n        guard let session = usdSession else { return }\n        for await fraction in Observations({ session.progress.fractionCompleted }) {\n            sessionProgress = fraction\n        }\n    }\n    .overlay(alignment: .bottom) {\n        ProgressView(value: sessionProgress)\n            .padding()\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Bridging an application’s custom USD runtime to Spatial Preview",
          "url": "https://developer.apple.com/documentation/SpatialPreview/bridging-an-external-usd-runtime-to-spatial-preview",
          "type": "documentation",
          "description": "Sync edits between an application with its own OpenUSD runtime and a Spatial Preview session using a shared",
          "sosumiURL": "https://sosumi.ai/documentation/SpatialPreview/bridging-an-external-usd-runtime-to-spatial-preview",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SpatialPreview/bridging-an-external-usd-runtime-to-spatial-preview.json"
        },
        {
          "title": "Working with content from your Mac app using Spatial Preview",
          "url": "https://developer.apple.com/documentation/SpatialPreview/working-with-content-from-your-mac-app-using-spatial-preview",
          "type": "documentation",
          "description": "Send and update documents, and work with 3D content live from your macOS app to a visionOS device through the Spatial Preview framework.",
          "sosumiURL": "https://sosumi.ai/documentation/SpatialPreview/working-with-content-from-your-mac-app-using-spatial-preview",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SpatialPreview/working-with-content-from-your-mac-app-using-spatial-preview.json"
        },
        {
          "title": "Reducing the rendering cost of RealityKit content on visionOS",
          "url": "https://developer.apple.com/documentation/visionOS/reducing-the-rendering-cost-of-RealityKit-content-on-visionOS",
          "type": "documentation",
          "description": "Optimize your app’s 3D augmented reality content to render efficiently on visionOS.",
          "sosumiURL": "https://sosumi.ai/documentation/visionOS/reducing-the-rendering-cost-of-RealityKit-content-on-visionOS",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/visionOS/reducing-the-rendering-cost-of-RealityKit-content-on-visionOS.json"
        },
        {
          "title": "Spatial Preview",
          "url": "https://developer.apple.com/documentation/SpatialPreview",
          "type": "documentation",
          "description": "Preview spatial content from a macOS app on a connected visionOS device.",
          "sosumiURL": "https://sosumi.ai/documentation/SpatialPreview",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SpatialPreview.json"
        }
      ],
      "path": "sessions/wwdc2026/282-discover-the-spatial-preview-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/282-discover-the-spatial-preview-framework/metadata.json",
        "readme": "sessions/wwdc2026/282-discover-the-spatial-preview-framework/README.md",
        "transcript": "sessions/wwdc2026/282-discover-the-spatial-preview-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/282-discover-the-spatial-preview-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-283",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 283,
      "title": "Explore enhancements to visionOS object tracking",
      "description": "Find out how visionOS is advancing object tracking and spatial accessory input. Discover new ways to track moving and handheld objects, allowing you to bridge the physical and digital worlds. Learn about new supported classes of spatial accessories and what is needed to build your own custom accessories to enable unique interaction models in your apps.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/283",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/283",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "anchor entity",
        "object",
        "object tracking",
        "spatial accessories",
        "spatial computing",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 845,
      "hasTranscript": true,
      "transcriptWordCount": 2405,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/283/4/22b92960-c65b-450f-b42c-6d6bff64a9b4/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/283/4/22b92960-c65b-450f-b42c-6d6bff64a9b4/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/283/4/22b92960-c65b-450f-b42c-6d6bff64a9b4/downloads/wwdc2026-283_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/283/4/22b92960-c65b-450f-b42c-6d6bff64a9b4/downloads/wwdc2026-283_hd.mp4",
        "duration": 845
      },
      "codeSnippets": [
        {
          "title": "Enable high frame rate tracking",
          "language": "swift",
          "startTimeSeconds": 230,
          "code": "// Enable high frame rate tracking\n\n// Create reference object configuration\nvar configuration = ReferenceObject.Configuration()\nconfiguration.highFrameRateTrackingEnabled = true\n\n// Load the reference object with ARKit API\nlet refObjURL = Bundle.main.url(forResource: \"flashlight\", withExtension: \".referenceobject\")\nlet refObject = try? await ReferenceObject(from: refObjURL!, configuration: configuration)"
        },
        {
          "title": "Extended training mode via command-line",
          "language": "bash",
          "startTimeSeconds": 290,
          "code": "// Extended training mode on Mac using command-line interface\n\n% xrun createml objecttracker --source flashlight.usdz --output flashlight.referenceobject --training-mode extended --all-angles"
        },
        {
          "title": "Object pose coordinate spaces",
          "language": "swift",
          "startTimeSeconds": 325,
          "code": "// Different object pose spaces\n\n// Obtain anchor transform with display corrections\n\nlet renderingPose = myObjectAnchor.coordinateSpace(correction: .rendered)\n\n// Obtain anchor transform in metric space\n\nlet metricPose = myObjectAnchor.coordinateSpace(correction: .none)"
        },
        {
          "title": "Implement object tracking in iOS",
          "language": "swift",
          "startTimeSeconds": 382,
          "code": "// Implement object tracking in iOS\n\nimport ARKit\nimport RealityKit\n\nclass ObjectTrackingARSessionDelegate: NSObject, ARSessionDelegate {\n        let arView = ARView(frame: .zero)\n        var entities: [UUID: AnchorEntity] = [:]\n\n        func start() throws {\n                let stationaryObject = try ARReferenceObject(archiveURL:\n                        Bundle.main.url(forResource: \"stationary\", withExtension: \"referenceobject\")!)\n                let movingObject = try ARReferenceObject(archiveURL:\n                        Bundle.main.url(forResource: \"moving\", withExtension: \"referenceobject\")!)\n\n                let configuration = ARWorldTrackingConfiguration()\n                configuration.detectionObjects = [stationaryObject]   // Low frame rate\n                configuration.trackingObjects = [movingObject]        // High frame rate\n\n                arView.session.delegate = self\n                arView.session.run(configuration)\n        }\n\n\t\t\t\tfunc session(_ session: ARSession, didAdd anchors: [ARAnchor]) {\n                for case let anchor as ARObjectAnchor in anchors {\n                        let entity = AnchorEntity(anchor: anchor)\n                        entities[anchor.identifier] = entity\n                        arView.scene.addAnchor(entity)\n                }\n        }\n\n        func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {\n                for case let anchor as ARObjectAnchor in anchors {\n                        entities[anchor.identifier]?.isEnabled = anchor.isTracked\n                }\n        }\n\n        func session(_ session: ARSession, didRemove anchors: [ARAnchor]) {\n                for case let anchor as ARObjectAnchor in anchors {\n                        if let entity = entities.removeValue(forKey: anchor.identifier) {\n                                arView.scene.removeAnchor(entity)\n                        }\n                }\n        }\n}"
        },
        {
          "title": "Discover and connect a spatial accessory",
          "language": "swift",
          "startTimeSeconds": 746,
          "code": "import ARKit\nimport GameController\n\n// Generic accessory discovery\n\nif let device = GCSpatialAccessory.spatialAccessories.first {\n\n        // Resolves the .referenceaccessory bundle automatically\n\n        let accessory = try await Accessory(device: device)\n        let provider = AccessoryTrackingProvider(accessories: [accessory])\n        try await arkitSession.run([provider])\n}\n\n// Update tracked accessories without restarting the session                             \n\ntry await provider.updateAccessories([newAccessory])"
        }
      ],
      "resources": [
        {
          "title": "Implementing object tracking in your app",
          "url": "https://developer.apple.com/documentation/visionOS/implementing-object-tracking-in-your-app",
          "type": "documentation",
          "description": "Create engaging interactions by training models to recognize and track real-world objects in people’s surroundings.",
          "sosumiURL": "https://sosumi.ai/documentation/visionOS/implementing-object-tracking-in-your-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/visionOS/implementing-object-tracking-in-your-app.json"
        },
        {
          "title": "Working with generic spatial accessories",
          "url": "https://developer.apple.com/documentation/visionOS/working-with-generic-spatial-accessories",
          "type": "documentation",
          "description": "Use generic spatial accessories to track purpose-built devices in your visionOS app.",
          "sosumiURL": "https://sosumi.ai/documentation/visionOS/working-with-generic-spatial-accessories",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/visionOS/working-with-generic-spatial-accessories.json"
        },
        {
          "title": "Preparing spatial accessories for tracking in your visionOS app",
          "url": "https://developer.apple.com/documentation/ARKit/preparing-spatial-accessories-for-tracking-in-your-visionos-app",
          "type": "documentation",
          "description": "Prepare a spatial accessory for tracking by training a reference accessory file and integrating it into your visionOS app.",
          "sosumiURL": "https://sosumi.ai/documentation/ARKit/preparing-spatial-accessories-for-tracking-in-your-visionos-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/ARKit/preparing-spatial-accessories-for-tracking-in-your-visionos-app.json"
        },
        {
          "title": "Spatial accessory design guidelines for Apple devices (check section 20)",
          "url": "https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf#page=135",
          "type": "documentation",
          "description": null,
          "sosumiURL": "https://sosumi.ai/accessories/Accessory-Design-Guidelines.pdf#page=135"
        },
        {
          "title": "Exploring object tracking with ARKit",
          "url": "https://developer.apple.com/documentation/visionOS/exploring_object_tracking_with_arkit",
          "type": "samplecode",
          "description": "Find and track real-world objects in visionOS using reference objects you train with Create ML.",
          "sosumiURL": "https://sosumi.ai/documentation/visionOS/exploring_object_tracking_with_arkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/visionOS/exploring_object_tracking_with_arkit.json"
        }
      ],
      "path": "sessions/wwdc2026/283-explore-enhancements-to-visionos-object-tracking/",
      "files": {
        "metadata": "sessions/wwdc2026/283-explore-enhancements-to-visionos-object-tracking/metadata.json",
        "readme": "sessions/wwdc2026/283-explore-enhancements-to-visionos-object-tracking/README.md",
        "transcript": "sessions/wwdc2026/283-explore-enhancements-to-visionos-object-tracking/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/283-explore-enhancements-to-visionos-object-tracking/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-284",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 284,
      "title": "Collaborate on structured 3D models in visionOS",
      "description": "Learn how to bring structured 3D models to life in visionOS. We’ll cover USDZ preparation, show you how to manipulate individual entities within hierarchical assemblies, and inspect the internal components within a model with a cross-sectional plane. Create stunning exploded-view animations for design review and collaboration experiences on Apple Vision Pro.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/284",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/284",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "3d model",
        "design",
        "hierarchical",
        "hierarchy",
        "review",
        "shareplay",
        "spatial computing",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1516,
      "hasTranscript": true,
      "transcriptWordCount": 4040,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/284/4/fa1d15b1-3f28-415a-907a-8ae1bb344494/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/284/4/fa1d15b1-3f28-415a-907a-8ae1bb344494/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/284/4/fa1d15b1-3f28-415a-907a-8ae1bb344494/downloads/wwdc2026-284_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/284/4/fa1d15b1-3f28-415a-907a-8ae1bb344494/downloads/wwdc2026-284_hd.mp4",
        "duration": 1516
      },
      "codeSnippets": [
        {
          "title": "Opening an assembly",
          "language": "swift",
          "startTimeSeconds": 430,
          "code": "func openAssembly() {\n    components[ManipulationComponent.self] = nil\n    components[InputTargetComponent.self] = nil\n\n    for child in assemblyChildren {\n        child.components.set(InputTargetComponent())\n\n        var manipulation = ManipulationComponent()\n        manipulation.releaseBehavior = .stay\n        child.manipulationComponent = manipulation\n    }\n}"
        },
        {
          "title": "Closing an assembly",
          "language": "swift",
          "startTimeSeconds": 431,
          "code": "func closeAssembly() {\n    for child in assemblyChildren {\n        child.manipulationComponent = nil\n        child.components[InputTargetComponent.self] = nil\n    }\n\n    components.set(InputTargetComponent())\n    var manipulation = ManipulationComponent()\n    manipulation.releaseBehavior = .stay\n    manipulationComponent = manipulation\n}"
        }
      ],
      "resources": [
        {
          "title": "Manipulating models with RealityKit",
          "url": "https://developer.apple.com/documentation/RealityKit/manipulating-models-with-realitykit",
          "type": "documentation",
          "description": "Interact with detailed 3D models using manipulation and clipping controls.",
          "sosumiURL": "https://sosumi.ai/documentation/RealityKit/manipulating-models-with-realitykit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/RealityKit/manipulating-models-with-realitykit.json"
        }
      ],
      "path": "sessions/wwdc2026/284-collaborate-on-structured-3d-models-in-visionos/",
      "files": {
        "metadata": "sessions/wwdc2026/284-collaborate-on-structured-3d-models-in-visionos/metadata.json",
        "readme": "sessions/wwdc2026/284-collaborate-on-structured-3d-models-in-visionos/README.md",
        "transcript": "sessions/wwdc2026/284-collaborate-on-structured-3d-models-in-visionos/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/284-collaborate-on-structured-3d-models-in-visionos/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-285",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 285,
      "title": "Discover USDKit and what’s new in OpenUSD",
      "description": "Dive into the latest advances in Universal Scene Description (USD) support on Apple platforms, including Swift-based USDKit, the new spatial preview API, and enhanced spatial web capabilities. Discover how the latest updates to the OpenUSD standard add support for accessibility, Gaussian splats, and compressed geometry. We’ll also walk through the expanded USD editing and rendering tools in Preview for Mac, showing you how to leverage these capabilities in your own apps.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/285",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/285",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "3d model",
        "augmented reality",
        "spatial computing",
        "usd",
        "usda",
        "usdc",
        "usdz",
        "visionos"
      ],
      "topics": [
        "Spatial Computing",
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 873,
      "hasTranscript": true,
      "transcriptWordCount": 2248,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/285/4/335150b6-c2b8-4711-a632-45a34d449eac/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/285/4/335150b6-c2b8-4711-a632-45a34d449eac/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/285/4/335150b6-c2b8-4711-a632-45a34d449eac/downloads/wwdc2026-285_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/285/4/335150b6-c2b8-4711-a632-45a34d449eac/downloads/wwdc2026-285_hd.mp4",
        "duration": 873
      },
      "codeSnippets": [
        {
          "title": "Opening a USD Stage",
          "language": "swift",
          "startTimeSeconds": 492,
          "code": "import USDKit\n\n// Create a new empty in-memory stage\n\nlet stage = USDStage()\n\n// Open a stage from a file on disk\n\nlet url = URL(fileURLWithPath: \"/ALab/entry.usda\")\nlet stage = try USDStage.open(url)"
        },
        {
          "title": "Traversing the Stage Hierarchy",
          "language": "swift",
          "startTimeSeconds": 524,
          "code": "// Traverse all prims looking for the oscilloscope\nfor prim in stage.descendants {\n    if prim.name == \"scope\" {\n        // There it is! 🔬\n    }\n}\n\n// It wasn't there — define a new Xform prim for it\n\nlet scope = stage.definePrim(at: \"/World/scope\", type: “Xform\"))\n\n// Add a file reference to the prim\n\ntry scope.references.add(“/ALab/assets/scope.usda”)"
        },
        {
          "title": "Moving a Prim with a Transform Operation",
          "language": "swift",
          "startTimeSeconds": 576,
          "code": "// Creates xformOp:translate and updates xformOpOrder automatically\n\nscope.addTransformOperation(type: .translate)\nscope[\"xformOp:translate\", as: USDValue.Vec3d.self] = [2.5, 0.0, -1.0]"
        },
        {
          "title": "Applying Accessibility Metadata",
          "language": "swift",
          "startTimeSeconds": 642,
          "code": "// Apply the multi-apply AccessibilityAPI schema with instance name \"default\"\n\ntry scope.applyAPISchema(\"AccessibilityAPI\", instanceName:\"default\")\n\n// Create the label and description attributes\n\nscope.makeAttribute(named: \"accessibility:default:label\", as: .string)\nscope.makeAttribute(named: \"accessibility:default:description\", as: .string)\n\n// Set their values\n\nscope[\"accessibility:default:label\", as: String.self] = \"Oscilloscope\"\nscope[\"accessibility:default:description\", as: String.self] = \n    \"Vintage signal analyzer with a 3D wireframe display, topped by a color bar test monitor\""
        },
        {
          "title": "Exporting with Mesh and Texture Compression",
          "language": "swift",
          "startTimeSeconds": 725,
          "code": "let output = URL(fileURLWithPath: \"/ALab/alab_compressed.usdz\")\n\n// Export the stage as a USDZ package\n\ntry stage.exportPackage(\n    to: output,\n    options: [\n        .preferSmallTextureFiles(quality: .standard),   // compress textures\n        .preferSmallMeshFiles                           // compress mesh geometry\n    ]\n)"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/285-discover-usdkit-and-what-s-new-in-openusd/",
      "files": {
        "metadata": "sessions/wwdc2026/285-discover-usdkit-and-what-s-new-in-openusd/metadata.json",
        "readme": "sessions/wwdc2026/285-discover-usdkit-and-what-s-new-in-openusd/README.md",
        "transcript": "sessions/wwdc2026/285-discover-usdkit-and-what-s-new-in-openusd/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/285-discover-usdkit-and-what-s-new-in-openusd/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-286",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 286,
      "title": "Use foveated streaming to bring immersive content to visionOS",
      "description": "Find out how foveated streaming delivers remotely rendered scenes to Apple Vision Pro in full fidelity. Explore how this framework combines native visionOS capabilities with third-party streaming technologies completely wirelessly, demonstrated using an OpenXR scene and NVIDIA CloudXR. Learn about the FoveatedStreaming framework, integration with the NVIDIA CloudXR SDK, and how dynamically foveated streaming provides benefits while still preserving privacy.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/286",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/286",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [
        "3d content",
        "enterprise",
        "spatial",
        "spatial accessories",
        "spatial computing",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 862,
      "hasTranscript": true,
      "transcriptWordCount": 1960,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/286/4/fa302edd-f95a-49f4-b51c-3899d49c6dec/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/286/4/fa302edd-f95a-49f4-b51c-3899d49c6dec/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/286/4/fa302edd-f95a-49f4-b51c-3899d49c6dec/downloads/wwdc2026-286_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/286/4/fa302edd-f95a-49f4-b51c-3899d49c6dec/downloads/wwdc2026-286_hd.mp4",
        "duration": 862
      },
      "codeSnippets": [
        {
          "title": "Connect to a streaming endpoint",
          "language": "swift",
          "startTimeSeconds": 363,
          "code": "// Connect to a streaming endpoint\n\nimport SwiftUI\nimport FoveatedStreaming\n\nstruct ConnectView: View {\n    let session: FoveatedStreamingSession\n\n    var body: some View {\n        Button(\"Connect\") {\n            Task {\n                try await session.connect()\n            }\n        }\n    }\n}"
        },
        {
          "title": "Display a Foveated Streaming session in your immersive space",
          "language": "swift",
          "startTimeSeconds": 404,
          "code": "// Display a Foveated Streaming session in your immersive space\n\nimport SwiftUI\nimport FoveatedStreaming\n\n@main struct FoveatedStreamingSampleApp: App {\n    private let session = FoveatedStreamingSession()\n\n    var body: some SwiftUI.Scene {\n        ImmersiveSpace(foveatedStreaming: session)\n    }\n}"
        },
        {
          "title": "Compose SwiftUI content with Foveated Streaming",
          "language": "swift",
          "startTimeSeconds": 415,
          "code": "// Compose SwiftUI content with Foveated Streaming\n\nimport SwiftUI\nimport FoveatedStreaming\n\n@main struct FoveatedStreamingSampleApp: App {\n    private let session = FoveatedStreamingSession()\n    private let appModel = AppModel()\n\n    var body: some SwiftUI.Scene {\n        Window(\"Main\", id: appModel.mainWindowId) {\n            ContentView(session: session)\n                .environment(appModel)\n                .environment(session)\n                // ...\n        }\n\n        ImmersiveSpace(foveatedStreaming: session) {\n            SpatialContainer {\n                ReopenMainWindowView().environment(appModel)\n                TransformStreamWidgetView().environment(session)\n            }\n        }\n\n    }\n}"
        },
        {
          "title": "Compose RealityKit content with Foveated Streaming",
          "language": "swift",
          "startTimeSeconds": 822,
          "code": "// Compose RealityKit content with Foveated Streaming\n\nimport SwiftUI\nimport RealityKit\nimport FoveatedStreaming\n\n@main struct FoveatedStreamingSampleApp: App {\n    private let session = FoveatedStreamingSession()\n    private let appModel = AppModel()\n\n    var body: some SwiftUI.Scene {\n        ImmersiveSpace(foveatedStreaming: session) {\n            RealityView { content in\n                // ...\n            }\n        }\n\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Analyzing the performance of a foveated streaming session",
          "url": "https://developer.apple.com/documentation/FoveatedStreaming/analyzing-the-performance-of-a-foveated-streaming-session",
          "type": "documentation",
          "description": "Use the Foveated Streaming Statistics instrument to evaluate the performance of your visionOS streaming client app.",
          "sosumiURL": "https://sosumi.ai/documentation/FoveatedStreaming/analyzing-the-performance-of-a-foveated-streaming-session",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoveatedStreaming/analyzing-the-performance-of-a-foveated-streaming-session.json"
        },
        {
          "title": "Establishing foveated streaming sessions with Apple Vision Pro",
          "url": "https://developer.apple.com/documentation/FoveatedStreaming/establishing-foveated-streaming-sessions-with-apple-vision-pro",
          "type": "documentation",
          "description": "Discover, pair, and manage streaming sessions between Apple Vision Pro and local streaming endpoints by implementing the session management connection protocol.",
          "sosumiURL": "https://sosumi.ai/documentation/FoveatedStreaming/establishing-foveated-streaming-sessions-with-apple-vision-pro",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoveatedStreaming/establishing-foveated-streaming-sessions-with-apple-vision-pro.json"
        },
        {
          "title": "Streaming a CloudXR application to Apple Vision Pro with foveation",
          "url": "https://developer.apple.com/documentation/FoveatedStreaming/streaming-a-cloudxr-application-to-apple-vision-pro-with-foveation",
          "type": "documentation",
          "description": "Integrate NVIDIA CloudXR™ and the session management connection protocol into your desktop or cloud application to stream high-fidelity spatial content to Apple Vision Pro.",
          "sosumiURL": "https://sosumi.ai/documentation/FoveatedStreaming/streaming-a-cloudxr-application-to-apple-vision-pro-with-foveation",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoveatedStreaming/streaming-a-cloudxr-application-to-apple-vision-pro-with-foveation.json"
        },
        {
          "title": "Creating a foveated streaming client on visionOS",
          "url": "https://developer.apple.com/documentation/FoveatedStreaming/creating-a-foveated-streaming-client-on-visionos",
          "type": "documentation",
          "description": "Build a visionOS app that streams high-fidelity immersive content from a computer or the cloud using the Foveated Streaming framework.",
          "sosumiURL": "https://sosumi.ai/documentation/FoveatedStreaming/creating-a-foveated-streaming-client-on-visionos",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoveatedStreaming/creating-a-foveated-streaming-client-on-visionos.json"
        },
        {
          "title": "Foveated Streaming",
          "url": "https://developer.apple.com/documentation/FoveatedStreaming",
          "type": "documentation",
          "description": "Foveated Streaming enables visionOS apps to display high-resolution, low-latency immersive content from streaming endpoints.",
          "sosumiURL": "https://sosumi.ai/documentation/FoveatedStreaming",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoveatedStreaming.json"
        },
        {
          "title": "StreamingSession: Streaming immersive content from a CloudXR™ application to visionOS and iOS",
          "url": "https://github.com/apple/StreamingSession",
          "type": "documentation",
          "description": "This repository contains the supplementary materials necessary to support a streaming session, allowing you to connect, pair, and stream an OpenXR experience to a visionOS or iOS device."
        }
      ],
      "path": "sessions/wwdc2026/286-use-foveated-streaming-to-bring-immersive-content-to-visiono/",
      "files": {
        "metadata": "sessions/wwdc2026/286-use-foveated-streaming-to-bring-immersive-content-to-visiono/metadata.json",
        "readme": "sessions/wwdc2026/286-use-foveated-streaming-to-bring-immersive-content-to-visiono/README.md",
        "transcript": "sessions/wwdc2026/286-use-foveated-streaming-to-bring-immersive-content-to-visiono/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/286-use-foveated-streaming-to-bring-immersive-content-to-visiono/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-287",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 287,
      "title": "Build next-generation experiences with visionOS 27",
      "description": "Build next-generation apps, games, and spatial experiences using new capabilities in visionOS 27. Explore the different pathways you can use to build experiences on visionOS — from using native Apple tools and frameworks, to streaming immersive content from a Mac or PC, leveraging third-party engines, or porting existing iOS apps. Discover how to elevate your spatial computing projects with the latest advances in 3D content creation, immersive media, and object tracking.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/287",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/287",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "apple immersive video",
        "apple vision pro",
        "arkit",
        "cloth simulation",
        "compositor services",
        "foveated streaming",
        "game engine",
        "gaussian splatting",
        "godot",
        "immersive media",
        "immersive space",
        "object tracking",
        "phase audio",
        "reality composer pro",
        "realitykit",
        "scene",
        "spatial accessories",
        "spatial computing",
        "spatial preview",
        "swiftui",
        "unity",
        "unreal engine",
        "visionos",
        "volume",
        "window"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1955,
      "hasTranscript": true,
      "transcriptWordCount": 4338,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/287/4/979d9278-8250-46f9-ac82-79669ba7b479/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/287/4/979d9278-8250-46f9-ac82-79669ba7b479/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/287/4/979d9278-8250-46f9-ac82-79669ba7b479/downloads/wwdc2026-287_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/287/4/979d9278-8250-46f9-ac82-79669ba7b479/downloads/wwdc2026-287_hd.mp4",
        "duration": 1955
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/287-build-next-generation-experiences-with-visionos-27/",
      "files": {
        "metadata": "sessions/wwdc2026/287-build-next-generation-experiences-with-visionos-27/metadata.json",
        "readme": "sessions/wwdc2026/287-build-next-generation-experiences-with-visionos-27/README.md",
        "transcript": "sessions/wwdc2026/287-build-next-generation-experiences-with-visionos-27/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/287-build-next-generation-experiences-with-visionos-27/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-289",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 289,
      "title": "Modernize your AppKit app",
      "description": "Bring your AppKit app up to date with modern macOS conventions. Dive into handling input with control events and gesture recognizers, moving beyond traditional tracking loops. Enhance keyboard navigation in your app, implement graceful state restoration after restarts, and take advantage of new corner concentricity APIs that let your interface blend seamlessly with the macOS aesthetic.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/289",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/289",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [
        "⚡️"
      ],
      "topics": [
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1081,
      "hasTranscript": true,
      "transcriptWordCount": 2486,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/289/5/6a2a7cfa-56a1-4cbb-ae54-1f229e1708ae/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/289/5/6a2a7cfa-56a1-4cbb-ae54-1f229e1708ae/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/289/5/6a2a7cfa-56a1-4cbb-ae54-1f229e1708ae/downloads/wwdc2026-289_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/289/5/6a2a7cfa-56a1-4cbb-ae54-1f229e1708ae/downloads/wwdc2026-289_hd.mp4",
        "duration": 1081
      },
      "codeSnippets": [
        {
          "title": "Modern dragging delegate",
          "language": "swift",
          "startTimeSeconds": 215,
          "code": "// Modern dragging delegate methods\nfunc tableView(_ tableView: NSTableView,\n        pasteboardWriterForRow row: Int) -> (any NSPasteboardWriting)? {\n    let pasteboardItem = NSPasteboardItem()\n    pasteboardItem.setString(..., forType: .string)\n    return pasteboardItem\n}"
        },
        {
          "title": "Control events",
          "language": "swift",
          "startTimeSeconds": 295,
          "code": "// Use control events\nlet button = NSButton()\nbutton.addTarget(\n    self,\n    action: #selector(trackingEndedOutsideHandler),\n    for: .trackingEndedOutside\n)"
        },
        {
          "title": "hitTest override",
          "language": "swift",
          "startTimeSeconds": 344,
          "code": "override func hitTest(_ point: NSPoint) -> NSView? {\n    return nil\n}"
        },
        {
          "title": "autorecalculatesKeyViewLoop",
          "language": "swift",
          "startTimeSeconds": 384,
          "code": "window.autorecalculatesKeyViewLoop = true"
        },
        {
          "title": "Expanded interface delegate — setup",
          "language": "swift",
          "startTimeSeconds": 457,
          "code": "// Set the expanded interface delegate\n@main class LightAppDelegate: NSObject, NSApplicationDelegate {\n    lazy var lightStatusItem: NSStatusItem = { ... }()\n\n    func applicationDidFinishLaunching(_ notification: Notification) {\n        // ...\n        lightStatusItem.expandedInterfaceDelegate = self\n    }\n}"
        },
        {
          "title": "Expanded interface delegate — methods",
          "language": "swift",
          "startTimeSeconds": 472,
          "code": "// Implement the delegate methods\nextension LightAppDelegate: NSStatusItemExpandedInterfaceDelegate {\n    // ...\n    func statusItem(_ statusItem: NSStatusItem, didBegin session:\n                    NSStatusItemExpandedInterfaceSession) {\n        // Show window\n    }\n    func statusItemDidEndExpandedInterfaceSession(\n        _ statusItem: NSStatusItem, animated: Bool) {\n        // Hide window\n    }\n    func selectedAction() {\n        // Take the action\n        // Cancel session to request window dismissal\n        lightStatusItem.expandedInterfaceSession?.cancel()\n    }\n}"
        },
        {
          "title": "Expanded interface delegate — cancel",
          "language": "swift",
          "startTimeSeconds": 496,
          "code": "// Cancel the session when dismissing\nextension LightAppDelegate: NSStatusItemExpandedInterfaceDelegate {\n    // ...\n    func statusItem(_ statusItem: NSStatusItem, didBegin session:\n                    NSStatusItemExpandedInterfaceSession) {\n        // Show window\n    }\n    func statusItemDidEndExpandedInterfaceSession(\n        _ statusItem: NSStatusItem, animated: Bool) {\n        // Hide window\n    }\n    func selectedAction() {\n        // Take the action\n        // Cancel session to request window dismissal\n        lightStatusItem.expandedInterfaceSession?.cancel()\n    }\n}"
        },
        {
          "title": "preventsApplicationTerminationWhenModal",
          "language": "swift",
          "startTimeSeconds": 585,
          "code": "window.preventsApplicationTerminationWhenModal = false"
        },
        {
          "title": "Set window identifiers for state restoration",
          "language": "swift",
          "startTimeSeconds": 618,
          "code": "// Set window identifiers for state restoration\n@MainActor class MainWindowController: NSWindowController, NSWindowDelegate {\n    // ...\n    convenience init() {\n        let window = NSWindow( ... )\n        // ...\n        window.identifier = NSUserInterfaceItemIdentifier(WindowIdentifiers.mainWindow)\n        window.setFrameAutosaveName(WindowIdentifiers.mainWindow)\n        window.isRestorable = true\n        window.restorationClass = WindowRestorationHandler.self\n        // ...\n    }\n}"
        },
        {
          "title": "encodeRestorableState",
          "language": "swift",
          "startTimeSeconds": 664,
          "code": "// Preserve state to recreate the UI\n@MainActor class MainWindowController: NSWindowController, NSWindowDelegate {\n    // ...\n    override func encodeRestorableState(with coder: NSCoder) {\n        super.encodeRestorableState(with: coder)\n        // ...\n        coder.encode(selectedProduct?.identifier.uuid,\n                    forKey: RestorationKeys.productIdentifier)\n        // ...\n    }\n    // ...\n}"
        },
        {
          "title": "invalidateRestorableState",
          "language": "swift",
          "startTimeSeconds": 710,
          "code": "// Invalidate restorable state when the view hierarchy changes\n@MainActor class MainWindowController: NSWindowController, NSWindowDelegate {\n    // ...\n    convenience init() {\n        // ...\n        splitViewController.onProductSelected = { [weak self] product in\n            self?.invalidateRestorableState()\n        }\n    }\n}"
        },
        {
          "title": "restoreWindow(withIdentifier:)",
          "language": "swift",
          "startTimeSeconds": 746,
          "code": "// Restore windows\nclass WindowRestorationHandler: NSObject, NSWindowRestoration {\n    static func restoreWindow(\n        withIdentifier identifier: NSUserInterfaceItemIdentifier,\n        state: NSCoder,\n        completionHandler: @escaping (NSWindow?, Error?) -> Void\n    ) {\n        //...\n        if identifier == .mainWindow, let window = appDelegate.mainWindowController?.window {\n            completionHandler(window, nil)\n        } else if identifier == .imageWindow {\n            let controller = ImageWindowController()\n            appDelegate.imageWindowControllers.append(controller)\n            completionHandler(controller.window, nil)\n        } else {\n            completionHandler(nil, error)\n        }\n    }\n}"
        },
        {
          "title": "restoreState",
          "language": "swift",
          "startTimeSeconds": 809,
          "code": "// Restore window UI\n@MainActor class MainWindowController: NSWindowController, NSWindowDelegate {\n    //...\n    override func restoreState(with coder: NSCoder) {\n        super.restoreState(with: coder)\n        if let productId = coder.decodeObject(\n            of: [NSString.self],\n            forKey: RestorationKeys.productIdentifier) as? String {\n            splitViewController?.selectedProductId = productId\n        }\n        //...\n    }\n}"
        },
        {
          "title": "cornerConfiguration",
          "language": "swift",
          "startTimeSeconds": 971,
          "code": "// Subclass NSView to override cornerConfiguration\nclass LocalWeatherView: NSView {\n    // ...\n    override var cornerConfiguration: NSViewCornerConfiguration? {\n        let radius: NSViewCornerRadius = .containerConcentric(minimumCornerRadius)\n        return .uniformCorners(radius: radius)\n    }\n    // ...\n}"
        }
      ],
      "resources": [
        {
          "title": "Use SwiftUI with AppKit",
          "url": "https://developer.apple.com/videos/play/wwdc2022/10075/",
          "type": "guide",
          "description": "Discover how the Shortcuts app uses both SwiftUI and AppKit to create a top-tier experience on macOS. Follow along with the Shortcuts team as we explore how you can host SwiftUI views in AppKit code, handle layout and sizing, participate in the responder chain, enable navigational focus, and more. We'll also show you how to host AppKit views, helping you migrate existing code into a SwiftUI layout within your app.",
          "sosumiURL": "https://sosumi.ai/videos/play/wwdc2022/10075/"
        },
        {
          "title": "Restoring your app’s state with AppKit",
          "url": "https://developer.apple.com/documentation/AppKit/restoring-your-app-s-state-with-appkit",
          "type": "documentation",
          "description": "Provide continuity for people using your app by preserving current activities on macOS.",
          "sosumiURL": "https://sosumi.ai/documentation/AppKit/restoring-your-app-s-state-with-appkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppKit/restoring-your-app-s-state-with-appkit.json"
        },
        {
          "title": "Gestures",
          "url": "https://developer.apple.com/documentation/AppKit/gestures",
          "type": "documentation",
          "description": "Encapsulate your app’s event-handling logic in gesture recognizers so that you can reuse that code throughout your app.",
          "sosumiURL": "https://sosumi.ai/documentation/AppKit/gestures",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppKit/gestures.json"
        },
        {
          "title": "TN3212: Adopting gesture recognizers for Sidecar touch support",
          "url": "https://developer.apple.com/documentation/Technotes/tn3212-adopting-gesture-recognizers-for-sidecar-touch-support",
          "type": "documentation",
          "description": "Use gesture recognizers to handle Sidecar touch input and update your event-handling code for macOS 27.",
          "sosumiURL": "https://sosumi.ai/documentation/Technotes/tn3212-adopting-gesture-recognizers-for-sidecar-touch-support",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Technotes/tn3212-adopting-gesture-recognizers-for-sidecar-touch-support.json"
        },
        {
          "title": "NSControl.Events",
          "url": "https://developer.apple.com/documentation/AppKit/NSControl/Events",
          "type": "documentation",
          "description": "A set of events that a control can report to its target.",
          "sosumiURL": "https://sosumi.ai/documentation/AppKit/NSControl/Events",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppKit/NSControl/Events.json"
        }
      ],
      "path": "sessions/wwdc2026/289-modernize-your-appkit-app/",
      "files": {
        "metadata": "sessions/wwdc2026/289-modernize-your-appkit-app/metadata.json",
        "readme": "sessions/wwdc2026/289-modernize-your-appkit-app/README.md",
        "transcript": "sessions/wwdc2026/289-modernize-your-appkit-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/289-modernize-your-appkit-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-290",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 290,
      "title": "Craft clear names for features and labels in your app",
      "description": "The names of your products, features, and labels can determine how people understand and navigate your app. Explore the principles behind thoughtful naming in app design, examine the patterns used across Apple apps, and learn how to make naming decisions with intention.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/290",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/290",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 904,
      "hasTranscript": true,
      "transcriptWordCount": 2181,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/290/4/6a4ef6cd-2a95-432c-aac9-315cb3cb7ff6/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/290/4/6a4ef6cd-2a95-432c-aac9-315cb3cb7ff6/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/290/4/6a4ef6cd-2a95-432c-aac9-315cb3cb7ff6/downloads/wwdc2026-290_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/290/4/6a4ef6cd-2a95-432c-aac9-315cb3cb7ff6/downloads/wwdc2026-290_hd.mp4",
        "duration": 904
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Human Interface Guidelines: Writing",
          "url": "https://developer.apple.com/design/human-interface-guidelines/writing",
          "type": "documentation",
          "description": "HIG",
          "sosumiURL": "https://sosumi.ai/design/human-interface-guidelines/writing"
        }
      ],
      "path": "sessions/wwdc2026/290-craft-clear-names-for-features-and-labels-in-your-app/",
      "files": {
        "metadata": "sessions/wwdc2026/290-craft-clear-names-for-features-and-labels-in-your-app/metadata.json",
        "readme": "sessions/wwdc2026/290-craft-clear-names-for-features-and-labels-in-your-app/README.md",
        "transcript": "sessions/wwdc2026/290-craft-clear-names-for-features-and-labels-in-your-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/290-craft-clear-names-for-features-and-labels-in-your-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-292",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 292,
      "title": "Design intuitive search experiences",
      "description": "Explore new patterns and best practices when implementing search in your app. Discover how search plays a key role in helping people find and navigate content, and find out how to integrate search across different navigation models and Apple platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/292",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/292",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "design",
        "liquid glass",
        "navigation",
        "search",
        "sidebar",
        "tab bar",
        "toolbar"
      ],
      "topics": [
        "Essentials",
        "Design"
      ],
      "primaryTopic": "Design",
      "duration": 977,
      "hasTranscript": true,
      "transcriptWordCount": 2514,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/292/5/05adbfdf-d9ba-4a6d-8d2f-f43593907f55/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/292/5/05adbfdf-d9ba-4a6d-8d2f-f43593907f55/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/292/5/05adbfdf-d9ba-4a6d-8d2f-f43593907f55/downloads/wwdc2026-292_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/292/5/05adbfdf-d9ba-4a6d-8d2f-f43593907f55/downloads/wwdc2026-292_hd.mp4",
        "duration": 977
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/292-design-intuitive-search-experiences/",
      "files": {
        "metadata": "sessions/wwdc2026/292-design-intuitive-search-experiences/metadata.json",
        "readme": "sessions/wwdc2026/292-design-intuitive-search-experiences/README.md",
        "transcript": "sessions/wwdc2026/292-design-intuitive-search-experiences/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/292-design-intuitive-search-experiences/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-295",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 295,
      "title": "Validate your App Intents adoption with AppIntentsTesting",
      "description": "Meet AppIntentsTesting, a new framework for validating your App Intents through the same infrastructure used by Siri, Shortcuts, and Spotlight. Discover how to execute intents, inspect results, and test entities and queries — all without requiring UI automation. Find out how to verify integrations like View annotations and Spotlight indexing, helping you catch bugs early in your development workflow.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/295",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/295",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [
        "ai",
        "app intents",
        "machine learning",
        "testing",
        "xcode",
        "xctest"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1557,
      "hasTranscript": true,
      "transcriptWordCount": 3137,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/295/4/cdcee6d3-e3e9-4201-b1ef-cd33e2d10e6f/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/295/4/cdcee6d3-e3e9-4201-b1ef-cd33e2d10e6f/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/295/4/cdcee6d3-e3e9-4201-b1ef-cd33e2d10e6f/downloads/wwdc2026-295_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/295/4/cdcee6d3-e3e9-4201-b1ef-cd33e2d10e6f/downloads/wwdc2026-295_hd.mp4",
        "duration": 1557
      },
      "codeSnippets": [
        {
          "title": "Your first test: execute an intent",
          "language": "swift",
          "startTimeSeconds": 408,
          "code": "import AppIntentsTesting\n\nfunc testCreateCalendar() async throws {\n    let definitions = IntentDefinitions(bundleIdentifier: \"com.example.apple-samplecode.CometCal\")\n    let createCalendar = definitions.intents[\"CreateCalendarIntent\"]\n    let result = try await createCalendar.makeIntent(\n        name: \"Occupy Saturn\",\n        color: \"red\"\n    ).run()\n    XCTAssertEqual(try result.value.title, \"Occupy Saturn\")\n}"
        },
        {
          "title": "Test an entity string query",
          "language": "swift",
          "startTimeSeconds": 745,
          "code": "// Testing Entity string queries\nfunc testEventStringQuery() async throws {\n    let results = try await eventEntityDefinition\n        .entities(matching: \"Cosmic Ray\")\n\n    XCTAssertEqual(results.count, 1)\n    XCTAssertEqual(try results[0].title, \"Cosmic Ray Calibration\")\n}"
        },
        {
          "title": "Implement the EntityStringQuery under test",
          "language": "swift",
          "startTimeSeconds": 780,
          "code": "// Updated query implementation\nstruct EventEntityQuery: EntityStringQuery {\n    func entities(for identifiers: [EventEntity.ID]) async throws -> [EventEntity] {\n\n    }\n\n    func suggestedEntities() async throws -> [EventEntity] {\n\n    }\n\n    func entities(matching string: String) async throws -> [EventEntity] {\n        try calendarManager.fetchEvents()\n            .filter { $0.title.localizedCaseInsensitiveContains(string) }\n            .map(\\.entity)\n    }\n}"
        },
        {
          "title": "Chain multiple intents in one test",
          "language": "swift",
          "startTimeSeconds": 942,
          "code": "// Test event creation followed by update\nfunc testCreateAndUpdateEvent() async throws {\n    let createResult = try await createEventDefinition.makeIntent(\n        title: \"Asteroid Dodgeball Practice\",\n        startDate: Date(),\n        isAllDay: false,\n        calendar: \"Deep Space\"\n    ).run()\n\n    XCTAssertEqual(try createResult.value.title, \"Asteroid Dodgeball Practice\")\n\n    let updateResult = try await updateEventDefinition.makeIntent(\n        title: \"Asteroid Dodgeball Rules Overview\",\n        event: createResult.value\n    ).run()\n\n    XCTAssertEqual(try updateResult.value.title, \"Asteroid Dodgeball Rules Overview\")\n}"
        },
        {
          "title": "Make an intent test-only",
          "language": "swift",
          "startTimeSeconds": 1065,
          "code": "// Test-only intent: SeedSampleEventsIntent\n#if DEBUG\nstruct SeedSampleEventsIntent: AppIntent {\n    static let isDiscoverable = false\n\n    func perform() async throws -> some IntentResult {\n        // Create known list of events\n        return .result()\n    }\n}\n#endif"
        },
        {
          "title": "Test Spotlight indexing",
          "language": "swift",
          "startTimeSeconds": 1227,
          "code": "// Testing Spotlight indexing\nfunc testNewEventIndexedInSpotlight() async throws {\n\n    let before = try await eventEntityDefinition.spotlightQuery(\"Supernova Viewing Party\")\n    XCTAssertTrue(before.isEmpty, \"Event should not exist in Spotlight yet\")\n\n    // ... Create \"Supernova Viewing Party\" Event\n\n    let after = try await eventEntityDefinition.spotlightQuery(\"Supernova Viewing Party\")\n    XCTAssertEqual(after.count, 1)\n    XCTAssertEqual(try after[0].title, \"Supernova Viewing Party\")\n}"
        },
        {
          "title": "Test view annotations",
          "language": "swift",
          "startTimeSeconds": 1353,
          "code": "/ Testing view annotations\nfunc testEventViewAnnotation() async throws {\n    try await openEventDefinition.makeIntent(target: \"Morning Launch Briefing\").run()\n\n    // Confirm correct event page\n    let app = XCUIApplication()\n    let title = app.staticTexts[\"Morning Launch Briefing\"]\n    XCTAssertTrue(title.waitForExistence(timeout: 5))\n\n    let annotations = try await eventEntityDefinition.viewAnnotations()\n\n    XCTAssertEqual(annotations.count, 1, \"Expected exactly one view annotation\")\n    XCTAssertEqual(try annotations[0].entity.title, \"Morning Launch Briefing\")\n}"
        }
      ],
      "resources": [
        {
          "title": "Testing your App Intents code",
          "url": "https://developer.apple.com/documentation/AppIntentsTesting/testing-your-app-intents-code",
          "type": "documentation",
          "description": "Evaluate intents, entities, and queries, and verify your integration with system features like Spotlight and Siri.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntentsTesting/testing-your-app-intents-code",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntentsTesting/testing-your-app-intents-code.json"
        },
        {
          "title": "App Intents Testing",
          "url": "https://developer.apple.com/documentation/AppIntentsTesting",
          "type": "documentation",
          "description": "Test your app intents, entities, queries, and integration with system features like Siri or Spotlight.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntentsTesting",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntentsTesting.json"
        }
      ],
      "path": "sessions/wwdc2026/295-validate-your-app-intents-adoption-with-appintentstesting/",
      "files": {
        "metadata": "sessions/wwdc2026/295-validate-your-app-intents-adoption-with-appintentstesting/metadata.json",
        "readme": "sessions/wwdc2026/295-validate-your-app-intents-adoption-with-appintentstesting/README.md",
        "transcript": "sessions/wwdc2026/295-validate-your-app-intents-adoption-with-appintentstesting/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/295-validate-your-app-intents-adoption-with-appintentstesting/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-297",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 297,
      "title": "Best practices for integrating visual intelligence in your app",
      "description": "Gain insight on how visual intelligence can transform content discovery in your app. Explore how to define entities, process images, and handle multiple result types effectively. Learn best practices for optimizing speed and relevance, and discover how intents enable direct actions like opening or playing content with a single tap.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/297",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/297",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "ai",
        "intelligence",
        "machine learning",
        "visual",
        "xcode"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1065,
      "hasTranscript": true,
      "transcriptWordCount": 2316,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/297/5/25343020-b502-4808-967a-6f6460789dc2/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/297/5/25343020-b502-4808-967a-6f6460789dc2/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/297/5/25343020-b502-4808-967a-6f6460789dc2/downloads/wwdc2026-297_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/297/5/25343020-b502-4808-967a-6f6460789dc2/downloads/wwdc2026-297_hd.mp4",
        "duration": 1065
      },
      "codeSnippets": [
        {
          "title": "Define the content you want to return as an App Entity",
          "language": "swift",
          "startTimeSeconds": 201,
          "code": "// Define the content you want to return as an App Entity\n  import AppIntents\n\n  struct AlbumEntity: AppEntity {\n      var id: String\n      @Property var name: String\n      @Property var artistName: String\n      var coverArtData: Data\n\n      var displayRepresentation: DisplayRepresentation {\n          DisplayRepresentation( \n              title: \"\\(name)\",\n              subtitle: \"\\(artistName)\",\n              image: .init(data: coverArtData)\n          )   \n      }   \n\n      static let defaultQuery = AlbumEntityQuery()\n\n      static var typeDisplayRepresentation: TypeDisplayRepresentation { \"Album\" }\n  }   \n\n  struct AlbumEntityQuery: EntityQuery {\n      @Dependency var catalog: AlbumCatalog\n      func entities(for identifiers: [String]) async throws -> [AlbumEntity] {\n          catalog.albums(for: identifiers)\n      }\n  }"
        },
        {
          "title": "Adopt IntentValueQuery to return results",
          "language": "swift",
          "startTimeSeconds": 339,
          "code": "// Adopt IntentValueQuery to return visual search results\n  import AppIntents\n  import VisualIntelligence\n\n  struct SearchHandler: IntentValueQuery {\n      @Dependency var catalog: AlbumCatalog\n      @Dependency var concertFinder: ConcertFinder\n\n      func values(for input: SemanticContentDescriptor) async throws -> [VisualSearchResult] {\n          guard let pixelBuffer = input.pixelBuffer else {\n              return []\n          }   \n\n          let albums = try await catalog.search(matching: pixelBuffer)\n\n          return albums.map { VisualSearchResult.album($0) }\n      }\n  }"
        },
        {
          "title": "Build a catalog of albums with precomputed feature prints",
          "language": "swift",
          "startTimeSeconds": 384,
          "code": "// Build a catalog of albums with precomputed feature prints\n  import Vision\n\n  @Observable\n  class AlbumCatalog {\n      static let shared = AlbumCatalog()\n\n      struct CatalogEntry: Sendable {\n          let album: AlbumEntity\n          let featurePrint: FeaturePrintObservation\n      }   \n\n      private(set) var entries: [CatalogEntry] = []\n\n      private func generateFeaturePrint(\n          for image: CGImage\n      ) async throws -> FeaturePrintObservation {\n          let request = GenerateImageFeaturePrintRequest()\n          let result = try await request.perform(on: image)\n          return result\n      }\n  }"
        },
        {
          "title": "Search the catalog for albums matching the captured image",
          "language": "swift",
          "startTimeSeconds": 405,
          "code": "// Search the catalog for albums matching the captured image\n  func search(matching pixelBuffer: CVReadOnlyPixelBuffer, limit: Int = 10, maxDistance: Double = 1.0) async throws ->\n  [AlbumEntity] {\n      var cgImage: CGImage?\n      _ = pixelBuffer.withUnsafeBuffer { VTCreateCGImageFromCVPixelBuffer($0, options: nil, imageOut: &cgImage) }\n      guard let cgImage else { return [] }\n\n      let queryPrint = try await generateFeaturePrint(for: cgImage)\n\n      return try entries.compactMap { entry -> (album: AlbumEntity, distance: Double)? in\n          let distance = try queryPrint.distance(to: entry.featurePrint)\n          guard distance <= maxDistance else { return nil }\n          return (entry.album, distance)\n      }   \n      .sorted { $0.distance < $1.distance }\n      .prefix(limit)\n      .map { $0.album }\n  }"
        },
        {
          "title": "Create an open intent to land users on the right screen",
          "language": "swift",
          "startTimeSeconds": 507,
          "code": "// Create an open intent to land users on the right screen\n  import AppIntents\n\n  struct OpenAlbumIntent: OpenIntent {\n      static let title: LocalizedStringResource = \"Open Album\"\n\n      @Parameter(title: \"Album\")\n      var target: AlbumEntity\n\n      @Dependency var appState: AppState\n\n      func perform() async throws -> some IntentResult {\n          await appState.openAlbum(id: target.id)\n          return .result()\n      }\n  }"
        },
        {
          "title": "Use UnionValue to return multiple visual search result types",
          "language": "swift",
          "startTimeSeconds": 725,
          "code": "// Use UnionValue to return multiple visual search result types\n  @UnionValue\n  enum VisualSearchResult {\n      case album(AlbumEntity)\n      case concert(ConcertEntity)\n  }   \n\n  struct OpenConcertIntent: OpenIntent {\n      static let title: LocalizedStringResource = \"Open Concert\"\n\n      @Parameter(title: \"Concert\")\n      var target: ConcertEntity\n\n      @Dependency var appState: AppState\n\n      func perform() async throws -> some IntentResult {\n          await appState.openConcert(id: target.id)\n          return .result()\n      }\n  }"
        },
        {
          "title": "Expand the IntentValueQuery to return the UnionValue",
          "language": "swift",
          "startTimeSeconds": 738,
          "code": "// Expand the IntentValueQuery to return the UnionValue\n  struct SearchHandler: IntentValueQuery {\n      @Dependency var catalog: AlbumCatalog\n      @Dependency var concertFinder: ConcertFinder\n\n      func values(for input: SemanticContentDescriptor) async throws -> [VisualSearchResult] {\n          guard let pixelBuffer = input.pixelBuffer else {\n              return []\n          }   \n\n          let albums = try await catalog.search(matching: pixelBuffer)\n\n          let artists = albums.map { $0.artistName }\n\n          let concerts = await concertFinder.findNearby(byArtists: artists)\n\n          return albums.map { VisualSearchResult.album($0) }\n              + concerts.map { VisualSearchResult.concert($0) }\n      }\n  }"
        },
        {
          "title": "Provide a link to in-app search",
          "language": "swift",
          "startTimeSeconds": 793,
          "code": "// Provide a link to in-app search\n  @AppIntent(schema: .visualIntelligence.semanticContentSearch)\n  struct SemanticContentSearchIntent: AppIntent {\n      static let title: LocalizedStringResource = \"Search in app\"\n      static let openAppWhenRun: Bool = true\n\n      var semanticContent: SemanticContentDescriptor\n      @Dependency var catalog: AlbumCatalog\n      @Dependency var concertFinder: ConcertFinder\n      @Dependency var appState: AppState\n\n      func perform() async throws -> some IntentResult {\n          guard let pixelBuffer = semanticContent.pixelBuffer else { return .result() }\n          let albums = try await catalog.search(matching: pixelBuffer)\n          let artists = albums.map { $0.artistName }\n          let concerts = await concertFinder.findNearby(byArtists: artists)\n          await appState.openSearch(albums: albums, concerts: concerts)\n          return .result()\n      }   \n  }"
        },
        {
          "title": "Request calendar access and fetch upcoming concerts",
          "language": "swift",
          "startTimeSeconds": 924,
          "code": "// Request calendar access and fetch upcoming concerts\n  import EventKit\n\n  @Observable\n  class UpcomingConcertManager {\n      private let eventStore = EKEventStore()\n      var upcomingConcerts: [EKEvent] = []\n      var authorizationStatus: EKAuthorizationStatus = .notDetermined\n\n      func requestAccessAndFetch() async throws {\n          let granted = try await eventStore.requestFullAccessToEvents()\n          guard granted else {\n              authorizationStatus = .denied\n              return\n          }   \n          authorizationStatus = .fullAccess\n          await fetchUpcomingConcerts()\n\n          // ...\n      }\n  }"
        },
        {
          "title": "Filter for upcoming events that match known artists in our catalog",
          "language": "swift",
          "startTimeSeconds": 942,
          "code": "// Filter for upcoming events that match known artists in our catalog\n  class UpcomingConcertManager {\n      func fetchUpcomingConcerts() async {\n          let predicate = eventStore.predicateForEvents(\n              withStart: .now,\n              end: .now.addingTimeInterval(90 * 24 * 60 * 60),\n              calendars: nil\n          )   \n\n          let events = eventStore.events(matching: predicate)\n\n          upcomingConcerts = events.filter { event in\n              AlbumCatalog.shared.entries.contains { entry in\n                  event.title?.localizedCaseInsensitiveContains(entry.album.artistName) == true\n              }\n          }\n      }\n  }"
        },
        {
          "title": "Observe newly created events",
          "language": "swift",
          "startTimeSeconds": 944,
          "code": "// Observe newly created events\n  @Observable\n  class UpcomingConcertManager {\n      // ...\n\n      func requestAccessAndFetch() async throws {\n          // ...\n\n          for await _ in NotificationCenter.default\n              .notifications(\n                  named: .EKEventStoreChanged\n              ) {\n              await fetchUpcomingConcerts()\n          }\n      }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Integrating your app with visual intelligence",
          "url": "https://developer.apple.com/documentation/VisualIntelligence/integrating-your-app-with-visual-intelligence",
          "type": "documentation",
          "description": "Enable people to find app content that matches their surroundings or objects onscreen with visual intelligence.",
          "sosumiURL": "https://sosumi.ai/documentation/VisualIntelligence/integrating-your-app-with-visual-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/VisualIntelligence/integrating-your-app-with-visual-intelligence.json"
        },
        {
          "title": "Visual Intelligence",
          "url": "https://developer.apple.com/documentation/VisualIntelligence",
          "type": "documentation",
          "description": "Include your app’s content in search results that visual intelligence provides.",
          "sosumiURL": "https://sosumi.ai/documentation/VisualIntelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/VisualIntelligence.json"
        }
      ],
      "path": "sessions/wwdc2026/297-best-practices-for-integrating-visual-intelligence-in-your-a/",
      "files": {
        "metadata": "sessions/wwdc2026/297-best-practices-for-integrating-visual-intelligence-in-your-a/metadata.json",
        "readme": "sessions/wwdc2026/297-best-practices-for-integrating-visual-intelligence-in-your-a/README.md",
        "transcript": "sessions/wwdc2026/297-best-practices-for-integrating-visual-intelligence-in-your-a/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/297-best-practices-for-integrating-visual-intelligence-in-your-a/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-298",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 298,
      "title": "Meet the Evaluations framework",
      "description": "Learn how to evaluate model-driven experiences using the Evaluations framework. In a probabilistic world, unit tests alone won’t suffice. Discover how to define metrics, automatically grade outputs, and aggregate statistics to ensure your AI-powered features perform reliably across Apple’s platforms.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/298",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/298",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "testing",
        "xcode",
        "xctest"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1546,
      "hasTranscript": true,
      "transcriptWordCount": 3703,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/298/5/0ffb7161-1edb-4e6f-872d-55be82c4402d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/298/5/0ffb7161-1edb-4e6f-872d-55be82c4402d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/298/5/0ffb7161-1edb-4e6f-872d-55be82c4402d/downloads/wwdc2026-298_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/298/5/0ffb7161-1edb-4e6f-872d-55be82c4402d/downloads/wwdc2026-298_hd.mp4",
        "duration": 1546
      },
      "codeSnippets": [
        {
          "title": "Define an Evaluation",
          "language": "swift",
          "startTimeSeconds": 294,
          "code": "// Evaluations\n  import Evaluations\n\n  struct BookTaggingEvaluation: Evaluation {\n\n  }"
        },
        {
          "title": "Run with Swift Testing and an optimization target",
          "language": "swift",
          "startTimeSeconds": 482,
          "code": "// Optimization Target\n  @Test(\"Book Tag Evaluations\", .evaluates(evaluation, info: evaluationInfo))\n  func evaluateBookTagging() async throws {\n      let result = EvaluationContext.current.result\n\n      let rangeMetric = BookTagEvaluationTests.evaluation.tagCount\n      #expect(result.aggregateValue(.mean(of: rangeMetric)) >= 0.8)\n  }"
        },
        {
          "title": "Constrain output with a Generable @Guide",
          "language": "swift",
          "startTimeSeconds": 609,
          "code": "// BookTags.swift\n  @Generable\n  struct BookTags: Codable {\n      @Guide(description: \"Descriptive tags capturing themes, genres, moods, and topics from the summary\", .count(3...8))\n      var tags: [String]\n  } snippet."
        },
        {
          "title": "Define the dataset with ModelSample",
          "language": "swift",
          "startTimeSeconds": 675,
          "code": "// BookTaggingEvaluation\n  var dataset = ArrayLoader(samples: [\n      ModelSample(prompt: \"okay I am OBSESSED and I need everyone to read this RIGHT NOW...\",\n                  expected: BookTags(tags: [\"classic\", \"romance\", \"wit\", \"regency\"])),\n\n      ModelSample(prompt: \"Read this in one sitting between midnight and 4am and I cannot...\",\n                  expected: BookTags(tags: [\"classic\", \"gothic\", \"horror\", \"vampire\", \"suspense\"])),\n  ])\n\n  // Or load your whole library:\n  var dataset = ArrayLoader(samples:\n      Book.sampleBooks.map { book in\n          ModelSample(prompt: book.review, expected: BookTags(tags: book.tags))\n      }\n  )"
        },
        {
          "title": "Synthesize more samples with a SampleGenerator",
          "language": "swift",
          "startTimeSeconds": 773,
          "code": "// Synthesizing more inputs\n  let samples: [ModelSample<String>] = [\n      ModelSample(prompt: \"The largest planet in our solar system...\", expected: \"Jupiter.\"),\n      ModelSample(prompt: \"The capital of Thailand...\", expected: \"Bangkok.\"),\n      ModelSample(prompt: \"Swift is...\", expected: \"a powerful programming language.\"),\n      ModelSample(prompt: \"All those moments will be lost in time...\", expected: \"Like tears in rain.\")\n  ]\n\n  for try await sample in samples.makeSamples(\n      \"\"\"\n      Generate diverse sentence completions about the listed topics:\n        - The Solar System\n        - World Capitals \n      \"\"\",\n      targetCount: 1000) {\n          samples.append(sample)\n  }"
        },
        {
          "title": "More evaluators: word count and genre",
          "language": "swift",
          "startTimeSeconds": 842,
          "code": "let wordCount = Metric(\"WordCount\")\n\n  Evaluator { _, subject in\n      for tag in subject.value.tags {\n          if tag.contains(\" \") {\n              return wordCount.failing(rationale: \"Tag \\(tag) contains multiple words\")\n          }\n      }\n      return wordCount.passing()\n  }\n\n  let hasGenreTag = Metric(\"HasGenreTag\")\n\n  Evaluator { _, subject in\n      let tags = subject.value.tags.map { $0.lowercased() }\n      let knownGenres = await BookTaggingService.knownGenres\n      for tag in tags {\n          if knownGenres.contains(tag) {\n              return hasGenreTag.passing(rationale: \"Matched \\(tag)\")\n          }\n      }\n      return hasGenreTag.failing() \n  }"
        },
        {
          "title": "Define a Metric and Evaluator",
          "language": "swift",
          "startTimeSeconds": 843,
          "code": "let tagCount = Metric(\"TagCount\")\n\n  var evaluators: Evaluators {\n\n      // Tag count is within the required 3–8 range\n      Evaluator { _, subject in \n          let count = subject.value.tags.count\n          if (count >= 3 && count <= 8) {\n              return tagCount.passing(rationale: \"\\(count) tags\")\n          } \n          return tagCount.failing(rationale: \"Got \\(count) tags, expected 3–8\")\n      }\n  }"
        },
        {
          "title": "Aggregate metrics across samples",
          "language": "swift",
          "startTimeSeconds": 867,
          "code": "let tagCount = Metric(\"TagCount\")\n  let tagTotal = Metric(\"TagTotal\")\n\n  func aggregateMetrics(using aggregator: inout MetricsAggregator) {\n      aggregator.computeMean(of: tagCount)\n      aggregator.group(\"Distribution of Tag Totals\") { aggregator in\n          aggregator.computeStandardDeviation(of: tagTotal)\n          aggregator.computeMean(of: tagTotal)\n          aggregator.computeVariance(of: tagTotal)\n      }\n  }"
        },
        {
          "title": "Iterate the feature's instructions (hill-climbing)",
          "language": "swift",
          "startTimeSeconds": 933,
          "code": "// BookTaggingService.swift\n  let instructions = Instructions {\n      \"\"\"\n      You are a librarian and literary analyst. Given a reader's\n      freeform summary of a book they read — describing their\n      thoughts, feelings, and what stood out — generate a set of\n      descriptive tags reflected in the summary.\n\n      Rules:\n       - Return between 3 and 8 tags.\n       - Tags should be lowercase, concise (single word or hyphenated), and descriptive.\n       - Tags should include the book's genre, chosen from the included list of known genres.\n\n      Known Genres:\n       - \\(Self.knownGenres.joined(separator: \", \"))\n      \"\"\"\n  }"
        },
        {
          "title": "Build a model judge",
          "language": "swift",
          "startTimeSeconds": 1133,
          "code": "ModelJudgeEvaluator(\n      \"TagQuality\",\n      scale: .numeric([\n          4: \"Tags are relevant and helpful for browsing\",\n          3: \"Mostly relevant, one tag too vague or generic\",\n          2: \"Several tags are wrong or generic\",\n          1: \"Unhelpful or irrelevant\"\n      ]),   \n      judge: PrivateCloudComputeLanguageModel()\n  )"
        },
        {
          "title": "Split into score dimensions",
          "language": "swift",
          "startTimeSeconds": 1337,
          "code": "// BookTaggingEvaluation.swift\n  ScoreDimension(\n      \"Relevance\",\n      description: \"\"\"\n          Whether each tag describes a quality, theme, or tone\n          of the book itself rather than incidental details or\n          the reader's personal reactions.\n          \"\"\",\n      scale: .numeric([\n          4: \"Every tag describes the book itself\",\n          3: \"Most tags describe the book\",\n          2: \"Some tags describe personal reactions\",\n          1: \"Tags don't meaningfully describe the book\"\n      ])    \n  )\n  // Define `usefulness` the same way as a second ScoreDimension."
        },
        {
          "title": "Add dimensions to the judge",
          "language": "swift",
          "startTimeSeconds": 1352,
          "code": "// BookTaggingEvaluation.swift\n  var evaluators: Evaluators {\n\n      Evaluator {  }  \n\n      Evaluator {  }\n\n      Evaluator {  }\n\n      ModelJudgeEvaluator(\n          judge: PrivateCloudComputeLanguageModel(),\n          dimensions: [relevance, usefulness]\n      )\n  }"
        },
        {
          "title": "Add app context with a ModelJudgePrompt",
          "language": "swift",
          "startTimeSeconds": 1397,
          "code": "// BookTaggingEvaluation.swift\n  ModelJudgeEvaluator(\n      judge: PrivateCloudComputeLanguageModel(),\n      dimensions: [relevance, usefulness],\n      prompt: ModelJudgePrompt( \n          instructions: \"\"\"\n              You are evaluating tags generated for a personal book-tracking app where users\n              organize their library by browsing and filtering tags.\n              \"\"\",\n          evaluationTarget: { value in\n              \"\\(value.tags.count) Generated tags: \" + value.tags.joined(separator: \", \")\n          },\n          reference: { input, _ in \n              let expectedTags = input.expected?.tags.joined(separator: \", \")\n              return [\"Expected Tags\": expectedTags ?? \"No expected tags defined\"]\n          }\n      )\n  )"
        }
      ],
      "resources": [
        {
          "title": "Book Tracker: Using Evaluations to evaluate an intelligent feature",
          "url": "https://developer.apple.com/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "type": "samplecode",
          "description": "Measure and improve the quality of your app’s intelligence-powered features using the Evaluations framework.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature.json"
        },
        {
          "title": "Designing datasets to test your feature",
          "url": "https://developer.apple.com/documentation/Evaluations/designing-evaluation-datasets",
          "type": "documentation",
          "description": "Build categorized test datasets that reflect the full range of real-world",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/designing-evaluation-datasets",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/designing-evaluation-datasets.json"
        },
        {
          "title": "Designing effective evaluations",
          "url": "https://developer.apple.com/documentation/Evaluations/designing-effective-evaluations",
          "type": "documentation",
          "description": "Design evaluations that tell you how well your feature works,",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/designing-effective-evaluations",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/designing-effective-evaluations.json"
        },
        {
          "title": "Evaluating language model responses",
          "url": "https://developer.apple.com/documentation/Evaluations/evaluating-language-model-responses",
          "type": "documentation",
          "description": "Build an evaluation that runs your intelligence-powered feature against samples and scores each response.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/evaluating-language-model-responses",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/evaluating-language-model-responses.json"
        }
      ],
      "path": "sessions/wwdc2026/298-meet-the-evaluations-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/298-meet-the-evaluations-framework/metadata.json",
        "readme": "sessions/wwdc2026/298-meet-the-evaluations-framework/README.md",
        "transcript": "sessions/wwdc2026/298-meet-the-evaluations-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/298-meet-the-evaluations-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-299",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 299,
      "title": "Create robust evaluations for agentic apps",
      "description": "Learn how to leverage advanced features of the Evaluations framework to build robust evaluations for your app. Explore evaluating flows with tool calling and dynamic conditions, and how to define what correct behavior means for your use case. Discover how to generate synthetic data, use judges effectively, and validate your datasets for reliable results.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/299",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/299",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "testing",
        "xcode",
        "xctest"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1288,
      "hasTranscript": true,
      "transcriptWordCount": 3385,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/299/4/ef9fbc06-fc78-4896-9848-0f0fe2e75fb9/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/299/4/ef9fbc06-fc78-4896-9848-0f0fe2e75fb9/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/299/4/ef9fbc06-fc78-4896-9848-0f0fe2e75fb9/downloads/wwdc2026-299_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/299/4/ef9fbc06-fc78-4896-9848-0f0fe2e75fb9/downloads/wwdc2026-299_hd.mp4",
        "duration": 1288
      },
      "codeSnippets": [
        {
          "title": "Generate synthetic data with makeSamples",
          "language": "swift",
          "startTimeSeconds": 316,
          "code": "// Synthetic data\n  let prompt = Prompt(\"\"\"\n      Generate diverse range of book reviews and corresponding tags.\n      Cover a wide range of genres, time periods, cultures, and\n      reader personas. Do not repeat books already in the dataset.\n      \"\"\")\n\n  let dataset = Book.sampleBooks.map { book in\n      ModelSample(prompt: book.review, expected: BookTags(tags: book.tags))\n  }\n\n  let targetCount = 100\n  var expandedDataset = dataset\n\n  for try await sample in dataset.makeSamples(prompt, targetCount: targetCount) {\n      expandedDataset.append(sample)\n      print(\"Generated \\(expandedDataset.count) samples so far.\")\n  }\n\n  2. Configure a custom SampleGenerator — slides 30–43\n\n  // Define your own configuration\n  let generator = SampleGenerator<ModelSample<BookTags>>(\n      prompt,\n      samples: dataset,\n      targetCount: targetCount,\n      sessionProvider: {\n          LanguageModelSession( \n              model: PrivateCloudComputeLanguageModel(),\n              instructions: \"\"\"\n                  You are a synthetic data generator for a book-tracking app's evaluation suite.\n                  Your job is to produce realistic, diverse book entries that will stress-test\n                  a tagging system.\n\n                  Rules:\n                  - Review must be at least 100 characters long.\n                  - Review should cover a mix of genre, mood/tone, and themes.\n                  - Reviews should vary in length.\n                  - Create between 3 and 8 tags.\n                  - Tags must be lowercase.\n                  \"\"\" \n          )\n      }\n  )"
        },
        {
          "title": "Configure a custom SampleGenerator",
          "language": "swift",
          "startTimeSeconds": 353,
          "code": "// Define your own configuration\n  let generator = SampleGenerator<ModelSample<BookTags>>(\n      prompt,\n      samples: dataset,\n      targetCount: targetCount,\n      sessionProvider: {\n          LanguageModelSession( \n              model: PrivateCloudComputeLanguageModel(),\n              instructions: \"\"\"\n                  You are a synthetic data generator for a book-tracking app's evaluation suite.\n                  Your job is to produce realistic, diverse book entries that will stress-test\n                  a tagging system.\n\n                  Rules:\n                  - Review must be at least 100 characters long.\n                  - Review should cover a mix of genre, mood/tone, and themes.\n                  - Reviews should vary in length.\n                  - Create between 3 and 8 tags.\n                  - Tags must be lowercase.\n                  \"\"\" \n          )\n      }\n  )"
        },
        {
          "title": "Validate generated samples",
          "language": "swift",
          "startTimeSeconds": 637,
          "code": "// Define validation metrics\n  validator: { sample in\n      guard let book = sample.expected else { return false }\n\n      // Review must be at least 100 characters\n      guard sample.promptDescription.count >= 100 else { return false }\n\n      // Must have between 3 and 8 tags\n      guard (3...8).contains(book.tags.count) else { return false }\n\n      // All tags must be lowercase\n      guard book.tags.allSatisfy({ $0 == $0.lowercased() }) else { return false }\n\n      return true\n  }"
        },
        {
          "title": "Access valid and invalid results",
          "language": "swift",
          "startTimeSeconds": 658,
          "code": "// Accessing results\n  for try await sample in generator.run() {\n      // During iteration\n      expandedDataset.append(sample)\n  }\n\n  // After iteration\n  let allSamples = await generator.samples\n  let invalidSamples = await generator.invalidSamples\n\n  print(\"Generated \\(allSamples.count) new samples. Total: \\(expandedDataset.count)\")"
        },
        {
          "title": "Define a tool's Generable argument",
          "language": "swift",
          "startTimeSeconds": 930,
          "code": "@Generable\n  struct SearchBooksArguments {\n      @Guide(description: \"A freeform search term to match against titles, reviews, or tags\")\n      var query: String?\n\n      @Guide(description: \"Filter results to books with this specific tag\")\n      var tag: String?\n\n      @Guide(description: \"Filter results by mood\")\n      var mood: String?\n\n      @Guide(description: \"Filter results by genre\")\n      var genre: String?\n\n      @Guide(description: \"Maximum number of results to return. Defaults to 5.\")\n      var limit: Int? \n  }"
        },
        {
          "title": "A basic trajectory expectation",
          "language": "swift",
          "startTimeSeconds": 997,
          "code": "// \"Find books tagged gothic\"\n  TrajectoryExpectation(\n      unordered: [\n          ToolExpectation(\n              \"searchBooks\",\n              arguments: [\n                  .exact(argumentName: \"tag\", value: .string(\"gothic\"))\n              ]\n          )\n      ]\n  )"
        },
        {
          "title": "Match arguments by intent (naturalLanguage)",
          "language": "swift",
          "startTimeSeconds": 1027,
          "code": "// \"Find something cheerful\"\n  TrajectoryExpectation(\n      \"searchBooks\",\n      arguments: [\n          .naturalLanguage(\n              argumentName: \"mood\",\n              criteria: \"Should relate to uplifting, hopeful, or positive feelings\"\n          )\n      ]\n  )\n  Other matchers available: .contains, .oneOf, .pattern, .range, and more."
        },
        {
          "title": "Expect tool calls in order",
          "language": "swift",
          "startTimeSeconds": 1054,
          "code": "// \"Find gothic books and show details on the first\"\n  TrajectoryExpectation(\n      ordered: [\n          ToolExpectation(\n              \"searchBooks\",\n              arguments: [\n                  .exact(argumentName: \"tag\", value: .string(\"gothic\"))\n              ]\n          ),\n          ToolExpectation(\n              \"getBookDetails\",\n              arguments: [\n                  .keyOnly(argumentName: \"bookId\")\n              ]\n          )\n      ]\n  )"
        },
        {
          "title": "Disallow specific tool calls",
          "language": "swift",
          "startTimeSeconds": 1075,
          "code": "// \"Show only sci-fi books. Don't look for similar ones.\"\n  TrajectoryExpectation(\n      unordered: [\n          ToolExpectation(\n              \"searchBooks\",\n              arguments: [\n                  .naturalLanguage(\n                      argumentName: \"genre\",\n                      criteria: \"Should refer to science fiction\")\n              ]\n          )\n      ],\n      disallowed: [\n          ToolExpectation(\"findSimilarBooks\")\n      ]\n  )"
        },
        {
          "title": "Build a tool call evaluation",
          "language": "swift",
          "startTimeSeconds": 1094,
          "code": "// Tool call evaluations\n  let samples = SampleArrayLoader(samples: [\n      ModelSample(\n          prompt: \"Find all the books tagged with 'gothic'.\",\n          instructions: \"Help the user explore their book collection.\",\n          expectations: TrajectoryExpectation(  )\n      )\n  ])\n\n  struct BookLibraryToolCallEval: Evaluation {\n      var dataset = samples\n\n      let pass = Metric(\"All Passed\")\n      let percent = Metric(\"Percentage Passed\")\n\n      var evaluators: Evaluators { \n          ToolCallEvaluator(allPass: pass, percentagePass: percent)\n      }\n  }"
        },
        {
          "title": "Synthesize tool-evaluation samples",
          "language": "swift",
          "startTimeSeconds": 1160,
          "code": "// Tool call evaluations\n  let prompt = Prompt(\"\"\"\n      Generate diverse user queries for a personal book library assistant.\n      Each sample needs a prompt (what the user says), and a trajectory\n      expectation describing which tools should be called and in what order.\n      \"\"\")\n\n  let instructions = \"\"\"\n      AVAILABLE TOOLS:\n      - searchBooks(query?, tag?, mood?, genre?, limit?): search the library\n      - getBookDetails(bookId): full details for one book\n      - findSimilarBooks(bookId, maxResults?): find books sharing tags\n      ORDER REQUIREMENTS:\n      - searchBooks must comes before getBookDetails or findSimilarBooks\n      - Use TrajectoryExpectation(ordered:) when sequence matters, else (unordered:)\n      USE THESE ARGUMENT MATCHERS:\n      - .exact for precise values, .naturalLanguage for fuzzy matching\n      - .keyOnly when any value is acceptable, .range for numeric constraints\n      - .contains/.hasPrefix/.hasSuffix for partial string matching\n      \"\"\""
        },
        {
          "title": "Validate tool-evaluation samples",
          "language": "swift",
          "startTimeSeconds": 1191,
          "code": "// Tool call evaluations\n  validator: { sample in\n      // Must have expectations defined\n      guard sample.output.expectations != nil else { return false }\n\n      let expectations = sample.output.expectations!\n\n      // Must reference at least one tool\n      let totalExpectations = expectations.ordered.count + expectations.unordered.count\n      guard totalExpectations > 0 else { return false }\n\n      // All tool names must be from the valid set\n      let validTools: Set<String> = [\"searchBooks\", \"getBookDetails\", \"findSimilarBooks\"]\n      let allExpectations = expectations.ordered + expectations.unordered + expectations.disallowed\n      for expectation in allExpectations {\n          guard validTools.contains(expectation.name) else { return false }\n      }\n\n      return true\n  }\n\n  ---"
        }
      ],
      "resources": [
        {
          "title": "Book Tracker: Using Evaluations to evaluate an intelligent feature",
          "url": "https://developer.apple.com/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "type": "samplecode",
          "description": "Measure and improve the quality of your app’s intelligence-powered features using the Evaluations framework.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature.json"
        },
        {
          "title": "Generating synthetic datasets",
          "url": "https://developer.apple.com/documentation/Evaluations/generating-synthetic-evaluation-datasets",
          "type": "documentation",
          "description": "Expand a small set of manually written evaluation samples into a larger dataset.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/generating-synthetic-evaluation-datasets",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/generating-synthetic-evaluation-datasets.json"
        },
        {
          "title": "Evaluating tool-calling behavior",
          "url": "https://developer.apple.com/documentation/Evaluations/evaluating-tool-calling-behavior",
          "type": "documentation",
          "description": "Analyze your model’s tool calls against expected trajectories, argument values, and call ordering.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/evaluating-tool-calling-behavior",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/evaluating-tool-calling-behavior.json"
        },
        {
          "title": "Scoring with model-as-judge evaluators",
          "url": "https://developer.apple.com/documentation/Evaluations/scoring-with-model-as-judge-evaluators",
          "type": "documentation",
          "description": "Score subjective qualities like tone, accuracy, and relevance that programmatic checks cannot measure.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/scoring-with-model-as-judge-evaluators",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/scoring-with-model-as-judge-evaluators.json"
        }
      ],
      "path": "sessions/wwdc2026/299-create-robust-evaluations-for-agentic-apps/",
      "files": {
        "metadata": "sessions/wwdc2026/299-create-robust-evaluations-for-agentic-apps/metadata.json",
        "readme": "sessions/wwdc2026/299-create-robust-evaluations-for-agentic-apps/README.md",
        "transcript": "sessions/wwdc2026/299-create-robust-evaluations-for-agentic-apps/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/299-create-robust-evaluations-for-agentic-apps/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-303",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 303,
      "title": "Build a responsive camera app that launches quickly",
      "description": "Discover how to build a camera app that launches instantly so people never miss the perfect shot. Explore how to optimize the entire camera launch sequence — from app startup to first preview frame. Ensure your app has a polished camera experience by learning about new API’s that deliver faster launches, and best practices for smooth preview rendering and maintaining sustainable performance.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/303",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/303",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [],
      "topics": [
        "Audio & Video",
        "Photos & Camera"
      ],
      "primaryTopic": "Photos & Camera",
      "duration": 1520,
      "hasTranscript": true,
      "transcriptWordCount": 2965,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/303/5/fb6dc55a-c026-4ce1-9902-7a744fef4c99/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/303/5/fb6dc55a-c026-4ce1-9902-7a744fef4c99/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/303/5/fb6dc55a-c026-4ce1-9902-7a744fef4c99/downloads/wwdc2026-303_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/303/5/fb6dc55a-c026-4ce1-9902-7a744fef4c99/downloads/wwdc2026-303_hd.mp4",
        "duration": 1520
      },
      "codeSnippets": [
        {
          "title": "Automatic deferred start delegate",
          "language": "swift",
          "startTimeSeconds": 554,
          "code": "import AVFoundation\n\nclass DeferredStartDelegate: NSObject, AVCaptureSessionDeferredStartDelegate {\n    func sessionWillRunDeferredStart(_ session: AVCaptureSession)\n    {\n        // This is called before deferred start begins for the deferred outputs\n    }\n\n    func sessionDidRunDeferredStart(_ session: AVCaptureSession)\n    {\n        // This is called after deferred start completes for all outputs\n    }\n}"
        },
        {
          "title": "Adopt automatic deferred start",
          "language": "swift",
          "startTimeSeconds": 586,
          "code": "import AVFoundation\n\nlet captureSession = AVCaptureSession()\ncaptureSession.beginConfiguration()\ncaptureSession.automaticallyRunsDeferredStart = true\n\nlet videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)\nvideoPreviewLayer.isDeferredStartEnabled = false\n\nlet photoOutput = AVCapturePhotoOutput()\nphotoOutput.isDeferredStartEnabled = true\ncaptureSession.addOutput(photoOutput)\n\ncaptureSession.setDeferredStartDelegate(deferredStartDelegate, deferredStartDelegateCallbackQueue: sessionQueue)\n\ncaptureSession.commitConfiguration()\ncaptureSession.startRunning()"
        },
        {
          "title": "Adopt manual deferred start",
          "language": "swift",
          "startTimeSeconds": 690,
          "code": "import AVFoundation\n\nlet captureSession = AVCaptureSession()\ncaptureSession.beginConfiguration()\ncaptureSession.automaticallyRunsDeferredStart = false\n\nlet videoOutput = AVCaptureVideoDataOutput()\ncaptureSession.addOutput(videoOutput)\nvideoOutput.isDeferredStartEnabled = false\n\nlet photoOutput = AVCapturePhotoOutput()\nphotoOutput.isDeferredStartEnabled = true\ncaptureSession.addOutput(photoOutput)\n\ncaptureSession.setDeferredStartDelegate(deferredStartDelegate, deferredStartDelegateCallbackQueue: sessionQueue)\n\ncaptureSession.commitConfiguration()\ncaptureSession.startRunning()"
        },
        {
          "title": "Manage runDeferredStartWhenNeeded",
          "language": "swift",
          "startTimeSeconds": 713,
          "code": "import AVFoundation\nimport QuartzCore\n\nprivate var firstFramePresented = false\nguard let drawable = layer.nextDrawable()\nif (!firstFramePresented) {\n    drawable.addPresentedHandler({ drawable in\n        // Set up postponed UI elements\n        captureSession.runDeferredStartWhenNeeded()\n    })\n    firstFramePresented = true\n}"
        },
        {
          "title": "Enable responsive capture",
          "language": "swift",
          "startTimeSeconds": 847,
          "code": "import AVFoundation\n\nfunc configurePhotoOutput(for session: AVCaptureSession, device: AVCaptureDevice) {\n    let photoOutput = AVCapturePhotoOutput()\n\n    guard session.canAddOutput(photoOutput) else { return }\n    session.addOutput(photoOutput)\n\n    photoOutput.maxPhotoQualityPrioritization = .quality\n    // Responsive capture lets the photo output capture immediately\n    photoOutput.isResponsiveCaptureEnabled = photoOutput.isResponsiveCaptureSupported\n}"
        },
        {
          "title": "Monitor for system pressure",
          "language": "swift",
          "startTimeSeconds": 1216,
          "code": "import AVFoundation\n\nlet captureSession = AVCaptureSession()\nlet device = activeVideoInput?.device\ncaptureSession.beginConfiguration()\n// ...\ncaptureSession.commitConfiguration()\n\nguard captureSession.hardwareCost <= 1.0 else {\n    print(\"hardwareCost \\(captureSession.hardwareCost) — cannot start session. Reconfiguring.\")\n    setupLowCostConfiguration()\n}\n\ncaptureSession.startRunning()\nlet systemPressureObserver = device?.observe(\\.systemPressureState,\n                                               options: [.initial, .new],\n                                               changeHandler: { /* Handle state change */ })"
        },
        {
          "title": "Manage pro video storage",
          "language": "swift",
          "startTimeSeconds": 1337,
          "code": "import AVFoundation\n\nfunc configureProVideoStorage() {\n    guard AVProVideoStorage.isSupported else { return }\n    let storage = AVProVideoStorage.shared\n    guard storage.remainingCapacity != 0 else {\n        storage.openSettings()\n        return\n    }\n}"
        },
        {
          "title": "Adopt AVProVideoStorage for deterministic file write speeds",
          "language": "swift",
          "startTimeSeconds": 1363,
          "code": "import AVFoundation\n\nguard AVProVideoStorage.isSupported else { return }\nguard let pvs = AVProVideoStorage.shared else { return }\n\n// Configure and set up AVCaptureSession, AVCaptureConnections and format\n// ...\nlet movieOutput = AVCaptureMovieFileOutput()\n\nguard movieOutput.isProVideoStorageSupported else { return }\nguard !pvs.isBusy else { return }\n\nlet movieFileURL = FileManager.default.temporaryDirectory\n            .appendingPathComponent(UUID().uuidString)\n            .appendingPathExtension(\"mov\")\n\nmovieOutput.usesProVideoStorage = true // Also available with AVAssetWriter\nmovieOutput.startRecording(to: movieFileURL, recordingDelegate: delegate)"
        }
      ],
      "resources": [
        {
          "title": "Build a responsive camera app that launches quickly",
          "url": "https://developer.apple.com/documentation/AVFoundation/build-a-responsive-camera-app-that-launches-quickly",
          "type": "samplecode",
          "description": "Build a fast camera launch experience for your iOS and iPadOS apps.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/build-a-responsive-camera-app-that-launches-quickly",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/build-a-responsive-camera-app-that-launches-quickly.json"
        },
        {
          "title": "Performance and metrics",
          "url": "https://developer.apple.com/documentation/Xcode/performance-and-metrics",
          "type": "documentation",
          "description": "Measure, investigate, and address the use of system resources and issues impacting performance using Instruments and Xcode Organizer.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/performance-and-metrics",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/performance-and-metrics.json"
        },
        {
          "title": "AVCam: Building a camera app",
          "url": "https://developer.apple.com/documentation/AVFoundation/avcam-building-a-camera-app",
          "type": "samplecode",
          "description": "Capture photos and record video using the front and rear iPhone and iPad cameras.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/avcam-building-a-camera-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/avcam-building-a-camera-app.json"
        }
      ],
      "path": "sessions/wwdc2026/303-build-a-responsive-camera-app-that-launches-quickly/",
      "files": {
        "metadata": "sessions/wwdc2026/303-build-a-responsive-camera-app-that-launches-quickly/metadata.json",
        "readme": "sessions/wwdc2026/303-build-a-responsive-camera-app-that-launches-quickly/README.md",
        "transcript": "sessions/wwdc2026/303-build-a-responsive-camera-app-that-launches-quickly/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/303-build-a-responsive-camera-app-that-launches-quickly/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-304",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 304,
      "title": "Implement high resolution photo capture",
      "description": "Capture super high resolution photos in your app using AVFoundation. Learn when to use the three different options to capture images — RAW, exposure-bracketed, and fully processed. Walk through configuring photo capture for 24MP and 48MP images across the Main, Tele, and Ultra Wide cameras. And discover how deferred photo processing keeps your app responsive as more photos are taken.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/304",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/304",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS"
      ],
      "keywords": [],
      "topics": [
        "Photos & Camera"
      ],
      "primaryTopic": "Photos & Camera",
      "duration": 1078,
      "hasTranscript": true,
      "transcriptWordCount": 2117,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/304/4/7a18d6ee-a63d-4402-bfb6-85a21dfac7dd/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/304/4/7a18d6ee-a63d-4402-bfb6-85a21dfac7dd/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/304/4/7a18d6ee-a63d-4402-bfb6-85a21dfac7dd/downloads/wwdc2026-304_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/304/4/7a18d6ee-a63d-4402-bfb6-85a21dfac7dd/downloads/wwdc2026-304_hd.mp4",
        "duration": 1078
      },
      "codeSnippets": [
        {
          "title": "Configure the AVCaptureSession",
          "language": "swift",
          "startTimeSeconds": 326,
          "code": "import AVFoundation\n\nprivate let session = AVCaptureSession()\nprivate func configureSession() {\n    session.beginConfiguration()\n    session.sessionPreset = .photo\n}"
        },
        {
          "title": "Configure AVCapturePhotoOutput",
          "language": "swift",
          "startTimeSeconds": 371,
          "code": "import AVFoundation\n\nprivate let photoOutput = AVCapturePhotoOutput()\nprivate let configurePhotoOutput: () -> Void = {\n    photoOutput.maxPhotoQualityPrioritization = .quality // or .balanced\n}"
        },
        {
          "title": "Add maxPhotoDimensions to AVCapturePhotoOutput",
          "language": "swift",
          "startTimeSeconds": 398,
          "code": "import AVFoundation\n\nlet supportedMaxPhotoDimensions = device?.activeFormat.supportedMaxPhotoDimensions ?? []\nif let largestDimension = supportedMaxPhotoDimensions.max(by: { lhs, rhs in\n    Int(lhs.width) * Int(lhs.height) < Int(rhs.width) * Int(rhs.height)\n} ) {\n    photoOutput?.maxPhotoDimensions = largestDimension\n}\n\nsession?.commitConfiguration()\nsession?.startRunning()"
        },
        {
          "title": "Update AVCapturePhotoSettings",
          "language": "swift",
          "startTimeSeconds": 441,
          "code": "import AVFoundation\n\nlet settings = AVCapturePhotoSettings()\nsettings.maxPhotoDimensions = dimension.cmVideoDimensionsValue\nsettings.photoQualityPrioritization = .quality\n\nvar delegate: AVCapturePhotoCaptureDelegate?\n\n// Configure photo request delegate\n\nif let delegate {\n photoOutput?.capturePhoto(with: settings, delegate: delegate)\n}"
        },
        {
          "title": "Prepare resources for the capture",
          "language": "swift",
          "startTimeSeconds": 539,
          "code": "import AVFoundation\n\nlet prepareSettings = AVCapturePhotoSettings()\nprepareSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions\nprepareSettings.photoQualityPrioritization = .quality\n\nphotoOutput.setPreparedPhotoSettingsArray([prepareSettings]) { prepared, error in\n  if let error = error {\n    print(\"Failed to prepare: \\(error)\")\n      return\n  }\n  print(\"Pipeline prepared: \\(prepared)\")\n}\n\n// Later, when ready to capture — create NEW settings\nlet captureSettings = AVCapturePhotoSettings()\ncaptureSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions\ncaptureSettings.photoQualityPrioritization = quality\nphotoOutput.capturePhoto(with: captureSettings, delegate: self)"
        }
      ],
      "resources": [
        {
          "title": "Capturing photos in RAW and Apple ProRAW formats",
          "url": "https://developer.apple.com/documentation/AVFoundation/capturing-photos-in-raw-and-apple-proraw-formats",
          "type": "documentation",
          "description": "Support professional photography workflows by enabling minimally processed image capture in your camera app.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/capturing-photos-in-raw-and-apple-proraw-formats",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/capturing-photos-in-raw-and-apple-proraw-formats.json"
        },
        {
          "title": "AVCam: Building a camera app",
          "url": "https://developer.apple.com/documentation/AVFoundation/avcam-building-a-camera-app",
          "type": "samplecode",
          "description": "Capture photos and record video using the front and rear iPhone and iPad cameras.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/avcam-building-a-camera-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/avcam-building-a-camera-app.json"
        }
      ],
      "path": "sessions/wwdc2026/304-implement-high-resolution-photo-capture/",
      "files": {
        "metadata": "sessions/wwdc2026/304-implement-high-resolution-photo-capture/metadata.json",
        "readme": "sessions/wwdc2026/304-implement-high-resolution-photo-capture/README.md",
        "transcript": "sessions/wwdc2026/304-implement-high-resolution-photo-capture/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/304-implement-high-resolution-photo-capture/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-305",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 305,
      "title": "Enhance RAW image processing with Core Image",
      "description": "Harness the power of version 9 of the Core Image RAW processing APIs to dramatically improve image quality in your apps, with improved sharpness and more defined color, while using the Apple Neural Engine for optimal performance. Take advantage of the CIRAWFilter API to let your users edit RAW photos by changing exposure, noise reduction, sharpness, contrast and more. And explore new CIImageProcessor APIs that optimize performance by giving you precise control over tile sizing and buffer management.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/305",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/305",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [],
      "topics": [
        "Photos & Camera"
      ],
      "primaryTopic": "Photos & Camera",
      "duration": 988,
      "hasTranscript": true,
      "transcriptWordCount": 2051,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/downloads/wwdc2026-305_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/305/5/d8d5f3ce-0ff1-45a3-a630-436743477c62/downloads/wwdc2026-305_hd.mp4",
        "duration": 988
      },
      "codeSnippets": [
        {
          "title": "Contact for exports",
          "language": "swift",
          "startTimeSeconds": 668,
          "code": "let exportCtx = CIContext(options : [\n  .cacheIntermediate : false,\n  .memoryLimit : 512 ])"
        },
        {
          "title": "CIImageProcessor with explicit output tile sizes",
          "language": "swift",
          "startTimeSeconds": 743,
          "code": "import CoreImage\n\nclass MyProcessor: CIImageProcessorKernel {\n    override class func roi(forInput input: Int32,\n                            arguments: [String : Any]?,\n                            outputRect: CGRect) -> CGRect { return outputRect }\n\n    override class func process(with inputs: [CIImageProcessorInput]?,\n                                arguments: [String : Any]?,\n                                output: CIImageProcessorOutput) throws {\n        guard let input = inputs?.first,\n              let iBuffer = input.pixelBuffer,\n              let oBuffer = output.pixelBuffer else { return }\n\n        let iRegion = input.region\n        let oRegion = output.region // controlled by Core Image\n\n        // MyCopyBuffer(iBuffer,iRegion, oBuffer,oRegion)\n    }\n}\n\nlet extent = inImg.extent\nlet tileSize = 512.0 // whatever tile size you want\nvar tiles: [CIVector] = []\nfor y in stride(from: extent.minY, to: extent.maxY, by: tileSize) {\n    for x in stride(from: extent.minX, to: extent.maxX, by: tileSize) {\n        let tile = CGRect(x: x, y: y,\n                          width: min(tileSize, extent.maxX - x),\n                          height: min(tileSize, extent.maxY - y))\n        tiles.append(CIVector(cgRect: tile))\n    }\n}\n\nlet result = try MyProcessor.apply(withTiledExtent: tiles, inputs: [inImg], arguments: [:])"
        },
        {
          "title": "CIImageProcessor using temporary PixelBuffer",
          "language": "swift",
          "startTimeSeconds": 864,
          "code": "import CoreImage\n\nclass MyProcessor: CIImageProcessorKernel {\n    override class func process(with inputs: [CIImageProcessorInput]?,\n                                arguments: [String: Any]?,\n                                output: CIImageProcessorOutput) throws {\n        guard let input = inputs?.first,\n              let srcPixelBuffer = input.pixelBuffer,\n              let dstPixelBuffer = output.pixelBuffer else { return }\n\n        // Get a scratch buffer from Core Image's cache\n        guard let scratch = output.temporaryPixelBuffer(identifier : \"myScratch\",\n                   format: kCVPixelFormatType_64RGBAHalf,\n                   width: Int(output.region.width),\n                   height: Int(output.region.height),\n                   pixelBufferAttributes: nil) else { return }\n\n        // Step 1: copy input CVPixelBuffer → scratch\n        // Step 2: process pixels in scratch\n        // Step 3: copy scratch → output CVPixelBuffer\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Extended Virtual Addressing Entitlement",
          "url": "https://developer.apple.com/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing",
          "type": "documentation",
          "description": "A Boolean value that indicates whether the app may access an extended address space.",
          "sosumiURL": "https://sosumi.ai/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/BundleResources/Entitlements/com.apple.developer.kernel.extended-virtual-addressing.json"
        }
      ],
      "path": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/",
      "files": {
        "metadata": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/metadata.json",
        "readme": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/README.md",
        "transcript": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/305-enhance-raw-image-processing-with-core-image/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-309",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 309,
      "title": "Explore Retention Messaging in App Store Connect",
      "description": "Discover how you can use the power of Retention Messaging to reach subscribers before they cancel. Learn how to configure this feature in App Store Connect and add subscription offers, as well as leverage the Retention Messaging API to deliver real-time messaging and alternative options that encourage people to stay subscribed to your app or game.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/309",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/309",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [],
      "topics": [
        "App Services",
        "App Store, Distribution & Marketing"
      ],
      "primaryTopic": "App Store, Distribution & Marketing",
      "duration": 910,
      "hasTranscript": true,
      "transcriptWordCount": 2314,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/309/4/afa0aec8-f216-43ed-bcb1-1a3742e49dac/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/309/4/afa0aec8-f216-43ed-bcb1-1a3742e49dac/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/309/4/afa0aec8-f216-43ed-bcb1-1a3742e49dac/downloads/wwdc2026-309_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/309/4/afa0aec8-f216-43ed-bcb1-1a3742e49dac/downloads/wwdc2026-309_hd.mp4",
        "duration": 910
      },
      "codeSnippets": [
        {
          "title": "Signed transaction updates",
          "language": "json",
          "startTimeSeconds": 368,
          "code": "// Signed transaction updates\n\n{\n    \"bundleId\": \"com.example.app\",\n    \"productId\": \"Yoga_summer_2026\",\n    \"type\": \"Auto-Renewable Subscription\",\n    \"transactionReason\": \"RENEWAL\",\n    \"inAppOwnershipType\": \"PURCHASED\",\n    \"quantity\": 1,\n    \"price\": 0,\n    \"currency\": \"USD\",\n    \"offerType\": 5, // retention offer\n    \"offerIdentifier\": \"Yoga_2026_cancel_free_3m\",\n    \"offerDiscountType\": \"FREE_TRIAL\",\n    \"offerPeriod\": \"P3M\", \n    \"transactionId\": \"1000098916194\"\n    \"originalTransactionId\": \"1000011859217\",\n    \"appAccountToken\": \"23a91ca7-06f3-425f-bff6-820904b510a9\",\n    ...\n}"
        },
        {
          "title": "Retention Messaging API",
          "language": "markdown",
          "startTimeSeconds": 470,
          "code": "// Retention Messaging API: https://api.storekit.apple.com/inApps/v1/messaging\n\n// URL configuration\nPUT /realtime/url\nGET /realtime/url\nDELETE /realtime/url\n\n// Message configuration\nPUT /message/{messageIdentifier}\nDELETE /message/{messageIdentifier}\nGET /message/list\nPUT /default/{productId}/{locale}\nDELETE /default/{productId}/{locale}\nGET /default/{productId}/{locale}\n\n// Image configuration\nPUT /image/{imageIdentifier}\nDELETE /image/{imageIdentifier}\nGET /image/list\n\n// Performance testing - Sandbox only\nPOST /performanceTest // initiate test\nGET /performanceTest/result/{requestId} // get results"
        },
        {
          "title": "Real-time requests",
          "language": "json",
          "startTimeSeconds": 514,
          "code": "// Real-time requests\n\n// Request from the App Store\n{\n    \"originalTransactionId\": \"123456789\",\n    \"appAppleId\": 6745974591,\n    \"productId\": \"Yoga_summer_2026\",\n    \"userLocale\": \"en-US\",\n    \"requestIdentifier\": \"c03248af-dd76-4e9b-9c1e-4489cd19a768\",\n    \"environment\": \"Production\", // or Sandbox\n    \"signedDate\": 1780920000000\n}"
        },
        {
          "title": "Real-time requests with message",
          "language": "json",
          "startTimeSeconds": 537,
          "code": "// Real-time requests\n\n// Request from the App Store\n{\n    \"originalTransactionId\": \"123456789\",\n    \"appAppleId\": 6745974591,\n    \"productId\": \"Yoga_summer_2026\",\n    \"userLocale\": \"en-US\",\n    \"requestIdentifier\": \n        \"c03248af-dd76-4e9b-9c1e-4489cd19a768\",\n    \"environment\": \"Production\", // or Sandbox\n    \"signedDate\": 1780920000000\n}\n\n// Your response\n{\n    \"message\": {\n        \"messageIdentifier\": \n            \"551ee7c0-c097-418e-9dd5-2a98533a7390\"\n    }\n}"
        },
        {
          "title": "Real-time request with alternate product",
          "language": "json",
          "startTimeSeconds": 551,
          "code": "// Real-time requests\n\n// Request from the App Store\n{\n    \"originalTransactionId\": \"123456789\",\n    \"appAppleId\": 6745974591,\n    \"productId\": \"Yoga_summer_2026\",\n    \"userLocale\": \"en-US\",\n    \"requestIdentifier\": \n        \"c03248af-dd76-4e9b-9c1e-4489cd19a768\",\n    \"environment\": \"Production\", // or Sandbox\n    \"signedDate\": 1780920000000\n}\n\n// Your response\n{\n    \"alternateProduct\": {\n        \"messageIdentifier\":\n            \"ed7f25fc-5741-46a3-8502-062e0fb8afd0\",\n        \"productId\": \"Yoga_summer_2026_annual\"\n    }\n}"
        },
        {
          "title": "Real-time request with promotional offer",
          "language": "json",
          "startTimeSeconds": 564,
          "code": "// Real-time requests\n\n// Request from the App Store\n{\n    \"originalTransactionId\": \"123456789\",\n    \"appAppleId\": 6745974591,\n    \"productId\": \"Yoga_summer_2026\",\n    \"userLocale\": \"en-US\",\n    \"requestIdentifier\":          \"c03248af-dd76-4e9b-9c1e-4489cd19a768\",\n    \"environment\": \"Production\", // or Sandbox\n    \"signedDate\": 1780920000000\n}\n\n// Your response\n{\n    \"promotionalOffer\": {\n        \"messageIdentifier\": \n            \"80135e2b-ae15-4ec4-8c5c-9ecc8045c0dc\",\n        \"promotionalOfferSignatureV2\": \"eyJhbGciOiJFUzI…\"\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Interest form: Real-time Retention Messaging",
          "url": "https://developer.apple.com/contact/request/retention-messaging-api/",
          "type": "guide",
          "description": "Interest form",
          "sosumiURL": "https://sosumi.ai/contact/request/retention-messaging-api/"
        },
        {
          "title": "Supporting monthly subscriptions with a 12-month commitment",
          "url": "https://developer.apple.com/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment",
          "type": "documentation",
          "description": "Configure, merchandise, and grant access to a monthly subscription with a 12-month commitment.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit/supporting-monthly-subscriptions-with-a-12-month-commitment.json"
        },
        {
          "title": "Retention Messaging API",
          "url": "https://developer.apple.com/documentation/RetentionMessaging",
          "type": "documentation",
          "description": "Provide a reason for customers to stay subscribed with a preconfigured message that you can choose in real time, appropriate to the product and locale.",
          "sosumiURL": "https://sosumi.ai/documentation/RetentionMessaging",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/RetentionMessaging.json"
        }
      ],
      "path": "sessions/wwdc2026/309-explore-retention-messaging-in-app-store-connect/",
      "files": {
        "metadata": "sessions/wwdc2026/309-explore-retention-messaging-in-app-store-connect/metadata.json",
        "readme": "sessions/wwdc2026/309-explore-retention-messaging-in-app-store-connect/README.md",
        "transcript": "sessions/wwdc2026/309-explore-retention-messaging-in-app-store-connect/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/309-explore-retention-messaging-in-app-store-connect/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-310",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 310,
      "title": "What’s new in Shortcuts",
      "description": "Explore techniques to build powerful shortcuts using your app’s content. New automations unlock additional ways to integrate your app with the system. Refine how your App Entity is presented to LLMs using the new “Use Model” transcript feature. Store rich information from your app inside shortcuts that is synced across devices. Learn how to combine these features to create intelligent, powerful automations that integrate seamlessly with content and features from your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/310",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/310",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "System Services"
      ],
      "primaryTopic": "System Services",
      "duration": 662,
      "hasTranscript": true,
      "transcriptWordCount": 1704,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/310/4/50ce70ab-88da-49ff-8c57-d9136d231e76/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/310/4/50ce70ab-88da-49ff-8c57-d9136d231e76/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/310/4/50ce70ab-88da-49ff-8c57-d9136d231e76/downloads/wwdc2026-310_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/310/4/50ce70ab-88da-49ff-8c57-d9136d231e76/downloads/wwdc2026-310_hd.mp4",
        "duration": 662
      },
      "codeSnippets": [
        {
          "title": "Soup Entity Example",
          "language": "swift",
          "startTimeSeconds": 372,
          "code": "// MARK: - Soup Entity\n\nimport AppIntents\n\nstruct SoupEntity: AppEntity, Identifiable {\n    static var typeDisplayRepresentation = TypeDisplayRepresentation(\n        name: \"Soup\",\n        numericFormat: \"\\(placeholder: .int) soups\"\n    )\n    static var defaultQuery = SoupEntityQuery()\n\n    var id: Soup.ID\n\n    @Property var name: String\n\n    @Property(title: \"Available Today\")\n    var isAvailableToday: Bool\n\n    @Property(title: \"Ingredients\")\n    var ingredients: String\n\n    var displayRepresentation: DisplayRepresentation {\n        DisplayRepresentation(title: \"\\(name)\", subtitle: SoupStore.description(for: id))\n    }\n}"
        },
        {
          "title": "Soup Entity Example",
          "language": "swift",
          "startTimeSeconds": 605,
          "code": "// MARK: - Soup Entity\n\nimport AppIntents\n\nstruct SoupEntity: AppEntity, Identifiable {\n    static var typeDisplayRepresentation = TypeDisplayRepresentation(\n        name: \"Soup\",\n        numericFormat: \"\\(placeholder: .int) soups\"\n    )\n    static var defaultQuery = SoupEntityQuery()\n\n    var id: Soup.ID\n\n    @Property var name: String\n\n    @Property(title: \"Available Today\")\n    var isAvailableToday: Bool\n\n    @Property(title: \"Ingredients\")\n    var ingredients: String\n\n    var displayRepresentation: DisplayRepresentation {\n        DisplayRepresentation(title: \"\\(name)\", subtitle: SoupStore.description(for: id))\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Shortcuts",
          "url": "https://developer.apple.com/shortcuts/",
          "type": "documentation",
          "description": null,
          "sosumiURL": "https://sosumi.ai/shortcuts/"
        },
        {
          "title": "Notifications",
          "url": "https://developer.apple.com/design/Human-Interface-Guidelines/notifications",
          "type": "documentation",
          "description": "A notification gives people timely, high-value information they can understand at a glance.",
          "sosumiURL": "https://sosumi.ai/design/Human-Interface-Guidelines/notifications"
        }
      ],
      "path": "sessions/wwdc2026/310-what-s-new-in-shortcuts/",
      "files": {
        "metadata": "sessions/wwdc2026/310-what-s-new-in-shortcuts/metadata.json",
        "readme": "sessions/wwdc2026/310-what-s-new-in-shortcuts/README.md",
        "transcript": "sessions/wwdc2026/310-what-s-new-in-shortcuts/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/310-what-s-new-in-shortcuts/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-312",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 312,
      "title": "Meet the Now Playing framework",
      "description": "Get a first look at Now Playing — a Swift framework that connects your app’s media playback to system surfaces like the Lock Screen, Control Center, Dynamic Island, and CarPlay. Discover how to publish playback state and respond to commands using its observable API. Explore remote playback sessions, a new capability that lets your app represent media playing on external devices and bring full playback controls to those same system surfaces.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/312",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/312",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "🧀"
      ],
      "topics": [
        "Audio & Video"
      ],
      "primaryTopic": "Audio & Video",
      "duration": 756,
      "hasTranscript": true,
      "transcriptWordCount": 1735,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/312/5/3f128d25-f1c6-49d3-a9c0-0bdc22af5f95/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/312/5/3f128d25-f1c6-49d3-a9c0-0bdc22af5f95/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/312/5/3f128d25-f1c6-49d3-a9c0-0bdc22af5f95/downloads/wwdc2026-312_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/312/5/3f128d25-f1c6-49d3-a9c0-0bdc22af5f95/downloads/wwdc2026-312_hd.mp4",
        "duration": 756
      },
      "codeSnippets": [
        {
          "title": "Existing PlayerModel implementation",
          "language": "swift",
          "startTimeSeconds": 117,
          "code": "import Observation\n\n@Observable\nfinal class PlayerModel {\n    let player: SoundPlayer\n    var sound: Sound { player.currentSound }\n\n    init(player: SoundPlayer) {\n        self.player = player\n    }\n}"
        },
        {
          "title": "Adopt MediaSessionRepresentable",
          "language": "swift",
          "startTimeSeconds": 126,
          "code": "import NowPlaying\n\nextension PlayerModel: MediaSessionRepresentable {\n    var id: String { \"ambient-sound-session\" }\n\n    var content: (any MediaContentRepresentable)? {\n        return GenericContent(\n            id: sound.id,\n            title: sound.name,\n            subtitle: sound.description,\n            type: .audio,\n            duration: .live,\n            artwork: Artwork(id: sound.id) { size in\n                let data = try await self.artworkData(size: size)\n                return try ArtworkRepresentation(data: data)\n            }\n        )\n    }\n\n    var playbackSnapshot: MediaPlaybackSnapshot? {\n        MediaPlaybackSnapshot(\n            state: player.isPlaying ? .playing() : .paused\n        )\n    }\n\n    var commands: [MediaCommand] {[\n        .play { self.player.play() },\n        .pause { self.player.pause() },\n        .previous { self.player.previous() },\n        .next { self.player.next() }\n    ]}\n}"
        },
        {
          "title": "MediaSession initialization",
          "language": "swift",
          "startTimeSeconds": 271,
          "code": "import NowPlaying\n\nstruct PlayerController {\n    let player: SoundPlayer\n    let model: PlayerModel\n    let session: MediaSession<PlayerModel>\n\n    init() {\n        self.player = SoundPlayer()\n        self.model = PlayerModel(player: player)\n        self.session = MediaSession(model)\n    }\n}"
        },
        {
          "title": "App extension entry point",
          "language": "swift",
          "startTimeSeconds": 402,
          "code": "import ExtensionFoundation\nimport NowPlaying\n\n@main\nfinal class SampleAppExtension: @MainActor RemoteMediaSessionExtension {\n    var configuration: some AppExtensionConfiguration {\n        RemoteMediaSessionExtensionConfiguration(extension: self)\n    }\n\n    var extensionPoint: AppExtensionPoint {\n        AppExtensionPoint.Identifier(host: \"com.apple.nowplaying\", name: \"remote-media\")\n    }\n\n    func session(_ state: RemotePlayerState) async throws -> RemotePlayerModel {\n        RemotePlayerModel(state: state)\n    }\n}"
        },
        {
          "title": "Existing RemotePlayerModel implementation",
          "language": "swift",
          "startTimeSeconds": 443,
          "code": "import Observation\n\n@Observable\n@MainActor\nfinal class RemotePlayerModel {\n    let client: ServerClient\n    var state: RemotePlayerState\n\n    init(state: RemotePlayerState) {\n        self.client = ServerClient(sessionID: state.sessionID)\n        self.state = state\n    }\n}"
        },
        {
          "title": "Adopt RemoteMediaSessionRepresentable in app extension",
          "language": "swift",
          "startTimeSeconds": 460,
          "code": "import NowPlaying\n\nextension RemotePlayerModel: @MainActor RemoteMediaSessionRepresentable {\n    var id: String { state.sessionID }\n\n    var content: (any MediaContentRepresentable)? {\n        GenericContent(\n            id: state.sound.id,\n            title: state.sound.name,\n            subtitle: state.sound.description,\n            type: .audio,\n            duration: .live,\n            artwork: Artwork(id: state.sound.id) { size in\n                let data = try await self.artworkData(size: size)\n                return try ArtworkRepresentation(data: data)\n            }\n        )\n    }\n\n    var playbackSnapshot: MediaPlaybackSnapshot? {\n        MediaPlaybackSnapshot(\n            state: state.isPlaying ? .playing() : .paused\n        )\n    }\n\n    var commands: [MediaCommand] {[\n        .play { try await self.client.send(.play) },\n        .pause { try await self.client.send(.pause) },\n        .previous { try await self.client.send(.previous) },\n        .next { try await self.client.send(.next) }\n    ]}\n\n    var devices: [MediaDevice] {\n        state.devices.map { device in\n            MediaDevice(\n                id: device.id,\n                name: device.name,\n                type: .speaker,\n                capabilities: [\n                    .absoluteVolume(device.volume) { volume in\n                        // send volume change to server\n                    }\n                ]\n            )\n        }\n    }\n\n    func update(_ state: RemotePlayerState) {\n        self.state = state\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Routing media to third-party devices",
          "url": "https://developer.apple.com/documentation/AVSystemRouting/routing-media-to-third-party-devices",
          "type": "documentation",
          "description": "Respond to routing events and control playback on a TV, speaker, or other media device.",
          "sosumiURL": "https://sosumi.ai/documentation/AVSystemRouting/routing-media-to-third-party-devices",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVSystemRouting/routing-media-to-third-party-devices.json"
        },
        {
          "title": "Publishing remote media sessions",
          "url": "https://developer.apple.com/documentation/NowPlaying/publishing-remote-media-sessions",
          "type": "documentation",
          "description": "Show media from an external device on the Lock Screen and Control Center.",
          "sosumiURL": "https://sosumi.ai/documentation/NowPlaying/publishing-remote-media-sessions",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/NowPlaying/publishing-remote-media-sessions.json"
        },
        {
          "title": "Publishing media sessions",
          "url": "https://developer.apple.com/documentation/NowPlaying/publishing-media-sessions",
          "type": "documentation",
          "description": "Show your app’s media on the Lock Screen and Control Center.",
          "sosumiURL": "https://sosumi.ai/documentation/NowPlaying/publishing-media-sessions",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/NowPlaying/publishing-media-sessions.json"
        },
        {
          "title": "Setting up a remote notification server",
          "url": "https://developer.apple.com/documentation/UserNotifications/setting-up-a-remote-notification-server",
          "type": "documentation",
          "description": "Generate notifications and push them to user devices.",
          "sosumiURL": "https://sosumi.ai/documentation/UserNotifications/setting-up-a-remote-notification-server",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UserNotifications/setting-up-a-remote-notification-server.json"
        }
      ],
      "path": "sessions/wwdc2026/312-meet-the-now-playing-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/312-meet-the-now-playing-framework/metadata.json",
        "readme": "sessions/wwdc2026/312-meet-the-now-playing-framework/README.md",
        "transcript": "sessions/wwdc2026/312-meet-the-now-playing-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/312-meet-the-now-playing-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-314",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 314,
      "title": "Learn CSS Grid Lanes",
      "description": "Build adaptive web layouts that embrace content of all shapes and sizes. Explore how Grid Lanes lets you arrange differently-shaped elements into clean, flexible designs with simple CSS. And find out how flow-tolerance helps you refine accessibility while keeping your layouts malleable.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/314",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/314",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Design",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 625,
      "hasTranscript": true,
      "transcriptWordCount": 1589,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/314/4/72928edd-5728-4010-b8f0-27f1a7bdec8c/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/314/4/72928edd-5728-4010-b8f0-27f1a7bdec8c/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/314/4/72928edd-5728-4010-b8f0-27f1a7bdec8c/downloads/wwdc2026-314_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/314/4/72928edd-5728-4010-b8f0-27f1a7bdec8c/downloads/wwdc2026-314_hd.mp4",
        "duration": 625
      },
      "codeSnippets": [
        {
          "title": "Create a Grid Lanes Container",
          "language": "javascript",
          "startTimeSeconds": 238,
          "code": ".container {\n\tdisplay: grid-lanes;\n}"
        },
        {
          "title": "Create a Grid Lanes Container",
          "language": "javascript",
          "startTimeSeconds": 242,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: repeat(3, 1fr);\n}"
        },
        {
          "title": "Create a Grid Lanes Container",
          "language": "javascript",
          "startTimeSeconds": 266,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 10px;\n}"
        },
        {
          "title": "Implement a Brick Variation",
          "language": "javascript",
          "startTimeSeconds": 273,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 10px;\n}"
        },
        {
          "title": "Implement a Brick Variation",
          "language": "javascript",
          "startTimeSeconds": 276,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-rows: repeat(3, 1fr);\n  gap: 10px;\n}"
        },
        {
          "title": "Experiment with different layouts",
          "language": "javascript",
          "startTimeSeconds": 298,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}"
        },
        {
          "title": "Experiment with different layouts",
          "language": "javascript",
          "startTimeSeconds": 302,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 2fr 1fr;\n  gap: 10px;\n}"
        },
        {
          "title": "Experiment with different layouts",
          "language": "javascript",
          "startTimeSeconds": 310,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns:\n    repeat(auto-fill,\n      minmax(200px, 1fr));\n  gap: 10px;\n}"
        },
        {
          "title": "Experiment with different layouts",
          "language": "javascript",
          "startTimeSeconds": 324,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns:\n    repeat(auto-fill,\n      minmax(8rem, 1fr)\n      minmax(14rem, 2fr);\n  gap: 10px;\n}"
        },
        {
          "title": "Control Individual Items",
          "language": "javascript",
          "startTimeSeconds": 345,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}"
        },
        {
          "title": "Control Individual Items",
          "language": "javascript",
          "startTimeSeconds": 359,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}\n\n.item {\n  grid-column: span 2;\n}"
        },
        {
          "title": "Control Individual Items",
          "language": "javascript",
          "startTimeSeconds": 367,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}\n\n.item {\n  grid-column: 2 / span 2;\n}"
        },
        {
          "title": "Integrate Subgrid",
          "language": "javascript",
          "startTimeSeconds": 382,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}\n\n.item {\n  grid-column: span 2;\n}"
        },
        {
          "title": "Integrate Subgrid",
          "language": "javascript",
          "startTimeSeconds": 394,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}\n\n.item {\n  display: grid-lanes;\n  grid-template-columns: subgrid;\n  grid-column: span 2;\n}"
        },
        {
          "title": "Integrate Subgrid",
          "language": "javascript",
          "startTimeSeconds": 408,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n}\n\n.item {\n  display: grid;\n  grid-template-columns: subgrid;\n  grid-column: span 2;\n}"
        },
        {
          "title": "Improve item positioning",
          "language": "javascript",
          "startTimeSeconds": 517,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr;\n  gap: 10px;\n  flow-tolerance: normal;\n}"
        },
        {
          "title": "Improve item positioning",
          "language": "javascript",
          "startTimeSeconds": 521,
          "code": ".container {\n\tdisplay: grid-lanes;\n  grid-template-columns: 1fr 1fr;\n  gap: 10px;\n  flow-tolerance: 2.1em;\n}"
        }
      ],
      "resources": [
        {
          "title": "WebKit.org - CSS Grid Lanes Field Guide",
          "url": "https://gridlanes.webkit.org",
          "type": "documentation",
          "description": "The field guide to CSS Grid Lanes — masonry layouts in pure CSS, no JavaScript required. Syntax reference, property guide, and interactive demos."
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/314-learn-css-grid-lanes/",
      "files": {
        "metadata": "sessions/wwdc2026/314-learn-css-grid-lanes/metadata.json",
        "readme": "sessions/wwdc2026/314-learn-css-grid-lanes/README.md",
        "transcript": "sessions/wwdc2026/314-learn-css-grid-lanes/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/314-learn-css-grid-lanes/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-315",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 315,
      "title": "Rediscover the HTML select element",
      "description": "Learn how to unlock full control of styling select menus on the web. The HTML select element is getting a major upgrade with a new CSS appearance value, and new pseudo-elements. Discover how the select options can contain rich content with new possibilities in HTML. Build selects that match your design system, while keeping all the accessibility and robustness of the default element.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/315",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/315",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Design",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 570,
      "hasTranscript": true,
      "transcriptWordCount": 1523,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/315/4/f3bd9835-9ced-4f6a-a0f1-655000972674/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/315/4/f3bd9835-9ced-4f6a-a0f1-655000972674/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/315/4/f3bd9835-9ced-4f6a-a0f1-655000972674/downloads/wwdc2026-315_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/315/4/f3bd9835-9ced-4f6a-a0f1-655000972674/downloads/wwdc2026-315_hd.mp4",
        "duration": 570
      },
      "codeSnippets": [
        {
          "title": "Basic markup",
          "language": "xml",
          "startTimeSeconds": 71,
          "code": "<label for=\"sort-select\">Sort by</label>\n<select id=\"sort-select\">\n    <option>Newest</option>\n    <option>Oldest</option>\n</select>"
        },
        {
          "title": "Native form control",
          "language": "yaml",
          "startTimeSeconds": 157,
          "code": "select {\n\n}"
        },
        {
          "title": "appearance: base-select",
          "language": "yaml",
          "startTimeSeconds": 170,
          "code": "body {\n    font-family: Gill Sans, sans-serif;\n}\n\nselect {\n    appearance: base-select;\n}"
        },
        {
          "title": "Style the select button",
          "language": "yaml",
          "startTimeSeconds": 187,
          "code": "select {\n    appearance: base-select;\n    background-color: var(--green-10);\n    border: none;\n    padding: 0.6em 1em;\n}"
        },
        {
          "title": "Picker icon",
          "language": "yaml",
          "startTimeSeconds": 188,
          "code": "select:open {\n    background-color: var(--green-100);\n    color: white;\n}"
        },
        {
          "title": "Picker icon open state",
          "language": "yaml",
          "startTimeSeconds": 209,
          "code": "select:open {\n    background-color: var(--green-100);\n    color: white;\n}\n\nselect:open::picker-icon {\n    content: url(icons/arrow-white.svg);\n}"
        },
        {
          "title": "Picker select",
          "language": "yaml",
          "startTimeSeconds": 248,
          "code": "::picker(select) {\n\n}"
        },
        {
          "title": "Picker select spacing",
          "language": "yaml",
          "startTimeSeconds": 261,
          "code": "::picker(select) {\n    appearance: base-select;\n    padding: 4px;\n    margin-top: 0.5em;\n}"
        },
        {
          "title": "Picker select border and shadow",
          "language": "yaml",
          "startTimeSeconds": 268,
          "code": "::picker(select) {\n    appearance: base-select;\n    padding: 4px;\n    margin-top: 0.5em;\n    border: 1px solid rgba(0,0,0,0.2);\n    border-radius: 9px;\n    box-shadow: 0 4px 20px rgba(0,0,0,0.2);\n}"
        },
        {
          "title": "Custom option styles",
          "language": "yaml",
          "startTimeSeconds": 276,
          "code": "option:checked {\n    font-weight: 600;\n}\n\noption:not(:checked) {\n    color: #777;\n}"
        },
        {
          "title": "Picker option checkmark",
          "language": "yaml",
          "startTimeSeconds": 282,
          "code": "option::checkmark {\n    content: url(checkmark.svg);\n    width: 0.65em;\n}"
        },
        {
          "title": "Images in option",
          "language": "xml",
          "startTimeSeconds": 331,
          "code": "<option value=\"flower\">\n    <img src=\"flowers.svg\" alt=\"\">\n    <span class=\"text\">Flowers</span>\n</option>"
        },
        {
          "title": "Custom option highlight",
          "language": "yaml",
          "startTimeSeconds": 352,
          "code": "option::checkmark {\n    display: none;\n}\n\noption:checked {\n    background: #00857e;\n    color: white;\n}"
        },
        {
          "title": "Grid layout in drop downs",
          "language": "yaml",
          "startTimeSeconds": 380,
          "code": "::picker(select) {\n    display: grid;\n    grid-template: \n       1fr 1fr / 1fr 1fr 1fr;\n    gap: 1rem;\n}"
        },
        {
          "title": "Select with image options",
          "language": "xml",
          "startTimeSeconds": 403,
          "code": "<select>\n    <option value=\"anywhere\">\n        <img src=\"icons/all.svg\" alt=\"\">\n        <span class=\"text\">Everything</span>\n    </option>\n    <option value=\"buildings\">\n        <img src=\"icons/buildings.svg\" alt=\"\">\n        <span class=\"text\">Buildings</span>\n    </option>\n    <option value=\"flowers\">\n        <img src=\"icons/flower.svg\" alt=\"\">\n        <span class=\"text\">Flowers</span>\n    </option>\n\n</select>"
        },
        {
          "title": "Select menu",
          "language": "xml",
          "startTimeSeconds": 431,
          "code": "<select>\n\n\n\n    <option>    </option>\n    <option>    </option>\n    <option>    </option>\n</select>"
        },
        {
          "title": "Select menu button",
          "language": "xml",
          "startTimeSeconds": 433,
          "code": "<select>\n    <button>\n\n    </button>\n    <option>    </option>\n    <option>    </option>\n    <option>    </option>\n</select>"
        },
        {
          "title": "SelectedContent Element",
          "language": "xml",
          "startTimeSeconds": 449,
          "code": "<select>\n    <button>\n        <selectedcontent></selectedcontent>\n    </button>\n    <option>     </option>\n    <option>     </option>\n    <option>     </option>\n</select>"
        }
      ],
      "resources": [
        {
          "title": "WebKit.org - The golden rule of Customizable Select",
          "url": "https://webkit.org/blog/18117/the-golden-rule-of-customizable-select/",
          "type": "documentation",
          "description": "Learn about how to make the most of Customizable Select to make it a useful, delightful experience to the most amount of people on the web and in web content in your apps."
        },
        {
          "title": "WebKit.org - Example website demonstrating Customizable Select",
          "url": "https://webkit.org/demos/customizable-select/",
          "type": "documentation",
          "description": "An example website demonstrating several customizable select menus. Use Web Inspector to explore the source code to see the markup and CSS style sheets that bring these menus to life."
        },
        {
          "title": "WebKit.org - CSS Grid Lanes Field Guide",
          "url": "https://gridlanes.webkit.org",
          "type": "documentation",
          "description": "The field guide to CSS Grid Lanes — masonry layouts in pure CSS, no JavaScript required. Syntax reference, property guide, and interactive demos."
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/315-rediscover-the-html-select-element/",
      "files": {
        "metadata": "sessions/wwdc2026/315-rediscover-the-html-select-element/metadata.json",
        "readme": "sessions/wwdc2026/315-rediscover-the-html-select-element/README.md",
        "transcript": "sessions/wwdc2026/315-rediscover-the-html-select-element/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/315-rediscover-the-html-select-element/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-319",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 319,
      "title": "Build with the new Apple Foundation Model on Private Cloud Compute",
      "description": "Private Cloud Compute lets you access powerful, frontier-class models while protecting user privacy. Explore how it works and how to access it using the Foundation Models framework. Discover best practices for checking availability and handling graceful fallbacks in your apps.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/319",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/319",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "xcode"
      ],
      "topics": [
        "System Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 658,
      "hasTranscript": true,
      "transcriptWordCount": 1527,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/319/4/1a3ac4f6-73d2-4a24-9e5d-0cfd56564f42/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/319/4/1a3ac4f6-73d2-4a24-9e5d-0cfd56564f42/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/319/4/1a3ac4f6-73d2-4a24-9e5d-0cfd56564f42/downloads/wwdc2026-319_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/319/4/1a3ac4f6-73d2-4a24-9e5d-0cfd56564f42/downloads/wwdc2026-319_hd.mp4",
        "duration": 658
      },
      "codeSnippets": [
        {
          "title": "Prompt the on-device model",
          "language": "swift",
          "startTimeSeconds": 169,
          "code": "import FoundationModels\n\n  let session = LanguageModelSession()\n  let response = try await session.respond(to: \"Summarize this article: \\(article)\")"
        },
        {
          "title": "Switch to the PCC server model (one-line change)",
          "language": "swift",
          "startTimeSeconds": 182,
          "code": "import FoundationModels\n\n  let session = LanguageModelSession(\n      model: PrivateCloudComputeLanguageModel()\n  )\n  let response = try await session.respond(to: \"Summarize this article: \\(article)\")"
        },
        {
          "title": "Structured output and tools work the same",
          "language": "swift",
          "startTimeSeconds": 205,
          "code": "import FoundationModels\n\n  @Generable\n  struct ArticleSummary {\n      let oneLineSummary: String\n      let keyPoints: [String]\n  }\n\n  struct FindRelatedArticlesTool: Tool {\n\n  }\n\n  let session = LanguageModelSession(\n      model: PrivateCloudComputeLanguageModel(),\n      tools: [FindRelatedArticlesTool.self]\n  )\n\n  let response = try await session.respond(\n      to: \"Summarize this article: \\(article)\",\n      generating: ArticleSummary.self\n  )"
        },
        {
          "title": "Check availability",
          "language": "swift",
          "startTimeSeconds": 231,
          "code": "import FoundationModels\n\n  struct ArticleSummarizationView: View {\n      private var model = PrivateCloudComputeLanguageModel()\n\n      var body: some View {\n          if model.isAvailable {\n              // Show UI for making request\n          } else {\n              // Fall back\n          }\n      }\n  }"
        },
        {
          "title": "Set a reasoning level",
          "language": "swift",
          "startTimeSeconds": 326,
          "code": "let response = try await session.respond(\n      to: prompt,\n      contextOptions: ContextOptions(reasoningLevel: .light)\n  )\n  // Reasoning levels: .light, .moderate, .deep"
        },
        {
          "title": "Read the context size",
          "language": "swift",
          "startTimeSeconds": 358,
          "code": "SystemLanguageModel().contextSize\n  // 4096 on 26.0\n  // 8192 on 27.0 (newer devices)\n\n  PrivateCloudComputeLanguageModel().contextSize\n  // 32768"
        },
        {
          "title": "Handle usage limits",
          "language": "swift",
          "startTimeSeconds": 581,
          "code": "struct ArticleSummarizationView: View {\n      private var model = PrivateCloudComputeLanguageModel()\n\n      var body: some View {\n          if case .belowLimit(let info) = model.quotaUsage.status {\n              if info.isApproachingLimit {\n                  Text(\"Nearing usage limit.\")\n                      .foregroundStyle(Color.orange)\n              }\n          }\n          if model.quotaUsage.isLimitReached {\n              Text(\"Usage limit exceeded.\")\n                  .foregroundStyle(Color.red)\n          }\n          if let suggestion = model.quotaUsage.limitIncreaseSuggestion {\n              Button(\"Show options\") {\n                  suggestion.show()\n              }\n          }\n      }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Adding server-side intelligence with Private Cloud Compute",
          "url": "https://developer.apple.com/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute",
          "type": "documentation",
          "description": "Access a larger context window and stronger reasoning by routing session requests",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels/adding-server-side-intelligence-with-private-cloud-compute.json"
        }
      ],
      "path": "sessions/wwdc2026/319-build-with-the-new-apple-foundation-model-on-private-cloud-c/",
      "files": {
        "metadata": "sessions/wwdc2026/319-build-with-the-new-apple-foundation-model-on-private-cloud-c/metadata.json",
        "readme": "sessions/wwdc2026/319-build-with-the-new-apple-foundation-model-on-private-cloud-c/README.md",
        "transcript": "sessions/wwdc2026/319-build-with-the-new-apple-foundation-model-on-private-cloud-c/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/319-build-with-the-new-apple-foundation-model-on-private-cloud-c/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-320",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 320,
      "title": "Explore immersive website environments in visionOS",
      "description": "Transport your website’s visitors into virtual environments in Apple Vision Pro using the new Immersive API in JavaScript. Explore how to request immersive transitions from an inline model element, create compelling immersive experiences using features like video docking, and optimize performance for rich, real-world-scale experiences — all with just a few lines of code running on your website.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/320",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/320",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "visionOS"
      ],
      "keywords": [],
      "topics": [
        "Spatial Computing",
        "Safari & Web"
      ],
      "primaryTopic": "Safari & Web",
      "duration": 1149,
      "hasTranscript": true,
      "transcriptWordCount": 2966,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/320/4/e1844891-477b-4612-ad8d-10e55bf395ba/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/320/4/e1844891-477b-4612-ad8d-10e55bf395ba/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/320/4/e1844891-477b-4612-ad8d-10e55bf395ba/downloads/wwdc2026-320_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/320/4/e1844891-477b-4612-ad8d-10e55bf395ba/downloads/wwdc2026-320_hd.mp4",
        "duration": 1149
      },
      "codeSnippets": [
        {
          "title": "Basic model element",
          "language": "xml",
          "startTimeSeconds": 111,
          "code": "<model src=\"teapot.usdz\">\n</model>"
        },
        {
          "title": "Model element with environment map",
          "language": "xml",
          "startTimeSeconds": 126,
          "code": "<model src=\"teapot.usdz\"\n\tenvironmentmap=\"kitchen.hdr\">\n</model>"
        },
        {
          "title": "Adding the environment model on the page for inline preview",
          "language": "xml",
          "startTimeSeconds": 280,
          "code": "<div class=\"seat-preview\">\n\t<model id=\"theater\"\n\t\t   src=\"theater-model.usdz\"\n\t\t   environmentmap=\"theater-lighting.hdr\">\n\t</model>\n</div>"
        },
        {
          "title": "Reset the model entity transform",
          "language": "javascript",
          "startTimeSeconds": 314,
          "code": "const theater = document.getElementById(\"theater\");\n\nasync function updateModelTransform() {\n\t// Make sure the model is loaded\n\tawait theater.ready;\n\t// Create a transform matrix\n\tconst identity = new DOMMatrix();\n\t// Apply the transform matrix to the model\n\ttheater.entityTransform = identity;\n}\n\nupdateModelTransform();"
        },
        {
          "title": "Translate the model down",
          "language": "javascript",
          "startTimeSeconds": 342,
          "code": "const theater = document.getElementById(\"theater\");\n\nasync function updateModelTransform() {\n\t// Make sure the model is loaded\n\tawait theater.ready;\n\t// Create a transform matrix\n\tconst transform = new DOMMatrix();\n\t// Translate model down, for eye level preview\n\ttransform.translateSelf(\n\t\t0, \t\t\t// x\n\t\t-1.0, \t// y\n\t\t0 \t\t\t// z\n\t);\n\t// Apply the transform matrix to the model\n\ttheater.entityTransform = transform;\n}\n\nupdateModelTransform();"
        },
        {
          "title": "Build the seat transform",
          "language": "javascript",
          "startTimeSeconds": 400,
          "code": "function buildTransform(seat) {\n\tconst transform = new DOMMatrix();\n\tconst { x, y, z, ry } = seat;\n\t// Rotate and translate the model to match \n  // the seat's origin and orientation\n\ttransform.rotateSelf(0, -ry, 0);\n\ttransform.translateSelf(-x, -y, -z);\n\t// Translate the model down, for eye level preview\n\ttransform.translateSelf(0, -1.0, 0);\n\treturn transform;\n}"
        },
        {
          "title": "Detect feature availability",
          "language": "javascript",
          "startTimeSeconds": 436,
          "code": "if (document.immersiveEnabled) {\n\timmersiveButton.hidden = false;\n}"
        },
        {
          "title": "Request the immersive transition on the model",
          "language": "javascript",
          "startTimeSeconds": 454,
          "code": "immersiveButton.addEventListener(\"click\", async () => {\n\tawait model.requestImmersive();\n});"
        },
        {
          "title": "Build immersive transform",
          "language": "javascript",
          "startTimeSeconds": 504,
          "code": "function buildTransform(seat, immersive) {\n\tconst transform = new DOMMatrix();\n\t// [...] Seat transform logic\n\tif (immersive) {\n\t\t// Rotate to the left\n\t\ttransform.rotateSelf(\n\t\t\t0,\t\t// x\n\t\t\t45,\t\t// y\n\t\t\t0\t\t\t// z\n\t\t);\n\t} else {\n\t\t// [...] Eye level translation\n\t}\n\treturn transform;\n}"
        },
        {
          "title": "Update the entity transform and the layout on immersive state updates",
          "language": "javascript",
          "startTimeSeconds": 541,
          "code": "theater.addEventListener(\"immersivechange\", () => {\n\tconst isImmersive = !!document.immersiveElement;\n\tconst transform = buildTransform(isImmersive, currentSeat);\n\ttheater.entityTransform = transform;\n  document.body.classList.toggle(\"immersive\", isImmersive);\n});"
        },
        {
          "title": "Hide the inline preview",
          "language": "xml",
          "startTimeSeconds": 653,
          "code": "<model id=\"escapeRoom\"\n\t   src=\"escape-room.usdz\"\n\t   environmentmap=\"room-lighting.hdr\"\n\t   style=\"display: none\">\n</model>"
        },
        {
          "title": "Request an immersive transition on the escape room model",
          "language": "javascript",
          "startTimeSeconds": 685,
          "code": "const enterButton = document.getElementById(\"enterButton\");\nconst escapeRoom = document.getElementById(\"escapeRoom\");\n\nenterButton.addEventListener(\"click\", () => {\n    await escapeRoom.requestImmersive();\n});"
        },
        {
          "title": "Handle the request result and show a loading animation",
          "language": "javascript",
          "startTimeSeconds": 712,
          "code": "enterButton.addEventListener(\"click\", async () => {\n\tshowLoadingAnimation();            \n\ttry {\n\t\tawait escapeRoom.requestImmersive();\n\t} catch (error) {\n\t\tconsole.log(error);\n\t} finally {\n\t\thideLoadingAnimation();\n\t}\n});"
        },
        {
          "title": "Dock the video in the environment with the fullscreen API",
          "language": "javascript",
          "startTimeSeconds": 796,
          "code": "const trailerVideo = document.getElementById(\"trailerVideo\");\nconst demoButton = document.getElementById(\"demoButton\");\n\ndemoButton.addEventListener(\"click\", async () => {\n\tawait trailerVideo.requestFullscreen();\n});"
        },
        {
          "title": "Play the model animation",
          "language": "javascript",
          "startTimeSeconds": 841,
          "code": "const trailerVideo = document.getElementById(\"trailerVideo\");\nconst escapeRoom = document.getElementById(\"escapeRoom\");\n\ntrailerVideo.addEventListener(\"ended\", async () => {\n\tawait document.exitFullscreen();\n\tescapeRoom.play();\n});"
        },
        {
          "title": "Compress your USDZ with usdcrush",
          "language": "bash",
          "startTimeSeconds": 998,
          "code": "usdcrush model.usdz -o optimized.usdz"
        }
      ],
      "resources": [
        {
          "title": "Download - Immersive model add-on for Blender",
          "url": "https://developer.apple.com/download/files/web-env-blender-plugin.zip",
          "type": "download",
          "description": "Use this Blender extension to help you create your own 3D environment and add video docking, lightspill and other visionOS features.",
          "sosumiURL": "https://sosumi.ai/download/files/web-env-blender-plugin.zip"
        },
        {
          "title": "WebKit.org - Theater Ticket Sales immersive website environment demo for Apple Vision Pro",
          "url": "https://webkit.org/demos/model-demos/ticket-sales.html",
          "type": "documentation",
          "description": "Test drive an example ticket sales website where you can explore the view of the stage from any seat you choose. Then, on Apple Vision Pro explore the view from inside the theater with the immersive website experience. Use Web Inspector to explore the code that makes this experience possible with Safari 27.0 in visionOS."
        },
        {
          "title": "WebKit.org - Escape Game immersive website demo for Apple Vision Pro",
          "url": "https://webkit.org/demos/model-demos/escape-room.html",
          "type": "documentation",
          "description": "An immersive website environment demo featuring an example marketing website for an escape game app. Explore the demo in Apple Vision Pro and use Web Inspector to see how the Immersive API is used to create the experience."
        },
        {
          "title": "GitHub: Spatial Backdrop explainer",
          "url": "https://github.com/WebKit/explainers/tree/main/spatial-backdrop",
          "type": "documentation",
          "description": "Operating systems on virtual reality devices have the capability of displaying virtual environments behind the windows and volumes of the various applications running on the device including its web browsers. This new link type enables Websites to change this virtual environment to one that is specified by the web page."
        },
        {
          "title": "WebKit.org – Report issues to the WebKit open-source project",
          "url": "https://bugs.webkit.org",
          "type": "documentation",
          "description": "Bug tracking for WebKit open source project"
        },
        {
          "title": "Submit feedback",
          "url": "http://feedbackassistant.apple.com",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/320-explore-immersive-website-environments-in-visionos/",
      "files": {
        "metadata": "sessions/wwdc2026/320-explore-immersive-website-environments-in-visionos/metadata.json",
        "readme": "sessions/wwdc2026/320-explore-immersive-website-environments-in-visionos/README.md",
        "transcript": "sessions/wwdc2026/320-explore-immersive-website-environments-in-visionos/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/320-explore-immersive-website-environments-in-visionos/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-321",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 321,
      "title": "Dive into lazy stacks and scrolling with SwiftUI",
      "description": "Discover the inner workings of lazy stacks in SwiftUI. We’ll explore how LazyVStack and LazyHStack estimate sizes, lazily load subviews, and prefetch content to deliver smooth scrolling experiences. We’ll also cover advanced performance optimizations, state management best practices, and tips for precise programmatic scrolling. To get the most out of this session, we recommend basic familiarity with SwiftUI layout using stacks.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/321",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/321",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "Design",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1270,
      "hasTranscript": true,
      "transcriptWordCount": 3326,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/321/5/78830752-d07d-4d89-aeab-94405c084de9/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/321/5/78830752-d07d-4d89-aeab-94405c084de9/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/321/5/78830752-d07d-4d89-aeab-94405c084de9/downloads/wwdc2026-321_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/321/5/78830752-d07d-4d89-aeab-94405c084de9/downloads/wwdc2026-321_hd.mp4",
        "duration": 1270
      },
      "codeSnippets": [
        {
          "title": "Origami app",
          "language": "swift",
          "startTimeSeconds": 83,
          "code": "// Origami app\n\nstruct ContentView: View {\n    var body: some View {\n        ScrollView {\n            LazyVStack {\n                ForEach(steps) { step in\n                    StepView(step: step)\n                }\n            }\n        }\n    }\n}\n\nstruct StepView: View { /* ... */ }"
        },
        {
          "title": "Horizontally scrolling showcase",
          "language": "swift",
          "startTimeSeconds": 311,
          "code": "// Horizontally scrolling showcase\n\nstruct ContentView: View {\n    var body: some View {\n        ScrollView {\n            LazyVStack {\n                ForEach(steps) { step in\n                    StepView(step: step)\n                }\n                Showcase()\n            }\n        }\n    }\n}\n\nstruct StepView: View { /* ... */ }\n\nstruct Showcase: View {\n    var body: some View {\n        ScrollView(.horizontal) {\n            LazyHStack {\n                ForEach(photos) { photo in\n                    PhotoView(photo: photo)\n                }\n            }\n        }\n    }\n}"
        },
        {
          "title": "Showcase section",
          "language": "swift",
          "startTimeSeconds": 390,
          "code": "// Showcase section\n\nstruct ContentView: View {\n    var body: some View {\n        ScrollView {\n            LazyVStack(pinnedViews: [.sectionHeaders]) {\n                ForEach(steps) { step in\n                    StepView(step: step)\n                }\n                Showcase()\n            }\n        }\n    }\n}\n\nstruct StepView: View { /* ... */ }\n\nstruct Showcase: View {\n    var body: some View {\n        Section {\n            ForEach(photos) { photo in\n                PhotoView(photo: photo)\n            }\n        } header: { /* ... */ }\n    }\n}"
        },
        {
          "title": "Scroll effect",
          "language": "swift",
          "startTimeSeconds": 424,
          "code": "// Scroll effect\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View { /* ... */ }\n\nstruct Showcase: View {\n    var body: some View {\n        Section {\n            ForEach(photos) { photo in\n                PhotoView(photo: photo)\n                    .scrollTransition { effect, phase in\n                        effect\n                            .rotationEffect(.degrees(phase.value * 20))\n                            .scaleEffect(1 + phase.value * 0.2)\n                    }\n            }\n        } header: { /* ... */ }\n    }\n}"
        },
        {
          "title": "Scroll effect",
          "language": "swift",
          "startTimeSeconds": 456,
          "code": "// Scroll effect\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View { /* ... */ }\n\nstruct Showcase: View {\n    var body: some View {\n        Section {\n            ForEach(photos) { photo in\n                PhotoView(photo: photo)\n                    .scrollTransition { effect, phase in\n                        effect\n                            .scaleEffect(1 - abs(phase.value) * 0.1)\n                    }\n            }\n        } header: { /* ... */ }\n    }\n}"
        },
        {
          "title": "Scroll to Showcase button",
          "language": "swift",
          "startTimeSeconds": 500,
          "code": "// Absolute offset\n\nstruct ContentView: View {\n    @State var isScrollToShowcaseVisible = false\n\n    var body: some View {\n        ScrollView { /* ... */ }\n            .overlay(alignment: .bottom) { /* ... */ }\n            .onScrollGeometryChange(for: Bool.self) { geo in\n                geo.contentOffset.y <= 100\n            } action: { _, newValue in\n                self.isScrollToShowcaseVisible = newValue\n            }\n    }\n}"
        },
        {
          "title": "Scroll to Showcase button",
          "language": "swift",
          "startTimeSeconds": 531,
          "code": "// Absolute offset\n\nstruct ContentView: View {\n    @State var isScrollToShowcaseVisible = false\n\n    var body: some View {\n        ScrollView { /* ... */ }\n            .overlay(alignment: .bottom) { /* ... */ }\n            .onScrollTargetVisibilityChange(\n                idType: Step.ID.self,\n                threshold: 0.8\n            ) { visibleIDs in\n                isScrollToShowcaseVisible = shouldShowScrollButton(visibleIDs: visibleIDs)\n            }\n    }\n}"
        },
        {
          "title": "One resolved subview",
          "language": "swift",
          "startTimeSeconds": 569,
          "code": "// Origami\n\nstruct ContentView: View {\n    var body: some View {\n        ScrollView {\n            LazyVStack {\n                ForEach(steps) { step in\n                    StepView(step: step)\n                }\n            }\n        }\n    }\n}\n\nstruct StepView: View { /* ... */ }"
        },
        {
          "title": "Multiple resolved subviews",
          "language": "swift",
          "startTimeSeconds": 603,
          "code": "// Multiple subviews\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    var body: some View {\n        StepDiagram(/* ... */)\n        StepInstructions(/* ... */)\n    }\n}"
        },
        {
          "title": "Dynamic number of subviews",
          "language": "swift",
          "startTimeSeconds": 652,
          "code": "// Dynamic number of views\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    @Environment(\\.detailLevel) var detailLevel\n\n    var body: some View {\n        if step.isVisible(in: detailLevel) {\n            VStack { /* ... */ }\n        }\n    }\n}"
        },
        {
          "title": "Filtering on the view level",
          "language": "swift",
          "startTimeSeconds": 706,
          "code": "// Dynamic number of views\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    @Environment(\\.detailLevel) var detailLevel\n    @Environment(\\.writingStyle) var writingStyle\n\n    var body: some View {\n        if step.isVisible(in: detailLevel) { /* ... */ }\n    }\n}"
        },
        {
          "title": "Filtering on the data level",
          "language": "swift",
          "startTimeSeconds": 735,
          "code": "// Filter at the data level\n\nstruct ContentView: View {\n    @Query var steps: [Step]\n\n    init(detailLevel: DetailLevel) {\n        _steps = Query(filter: #Predicate<Step> { step in\n            step.detailLevel >= detailLevel\n        })\n    }\n\n    var body: some View { /* ... */ }\n}\n\nstruct StepView: View { /* ... */ }"
        },
        {
          "title": "Optional unwrapping",
          "language": "swift",
          "startTimeSeconds": 755,
          "code": "// Optional unwrapping\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    @Environment(\\.apiToken) var token\n\n    var body: some View {\n        if let token { /* ... */ }\n    }\n}"
        },
        {
          "title": "Optional unwrapping",
          "language": "swift",
          "startTimeSeconds": 768,
          "code": "// Optional unwrapping\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    @Environment(NetworkClient.self) var networkClient\n\n    var body: some View { /* ... */ }\n}"
        },
        {
          "title": "Loading more content",
          "language": "swift",
          "startTimeSeconds": 928,
          "code": "// Loading more content\n\nstruct Showcase: View {\n    @State var pager = ShowcasePager()\n\n    var body: some View {\n        ForEach(pager.pages) { page in\n            PageView(page: page)\n        }\n        if !pager.atEnd {\n            ProgressView()\n                .progressViewStyle(.circular)\n                .onAppear {\n                    pager.fetchPage()\n                }\n        }\n    }\n}"
        },
        {
          "title": "Setting up lazy stack subview in onAppear",
          "language": "swift",
          "startTimeSeconds": 953,
          "code": "// onAppear\n\nstruct StepView: View {\n    let id: Step.ID\n    @State var viewModel = StepViewModel()\n\n    var body: some View {\n        VStack {\n            if let content = viewModel.content { /* ... */ }\n        }\n        .onAppear {\n            viewModel.configure(with: id)\n        }\n    }\n}"
        },
        {
          "title": "Lazy stack subview ready before onAppear",
          "language": "swift",
          "startTimeSeconds": 974,
          "code": "// onAppear\n\nstruct StepView: View {\n    @State var viewModel: StepViewModel\n\n    init(id: Step.ID) {\n        _viewModel = State(initialValue: StepViewModel(id: id))\n    }\n\n    var body: some View { /* ... */ }\n}"
        },
        {
          "title": "Loading diagram with task modifier",
          "language": "swift",
          "startTimeSeconds": 983,
          "code": "// Diagram loading\n\nstruct StepView: View {\n    let step: Step\n    @State var diagramLoader = DiagramLoader()\n\n    @State var diagram: Diagram?\n\n    var body: some View {\n        VStack { /* ... */ }\n            .task {\n                diagram = await diagramLoader.loadDiagram(id: step.id)\n            }\n    }\n}"
        },
        {
          "title": "Loading diagram in initializer",
          "language": "swift",
          "startTimeSeconds": 1000,
          "code": "// Diagram loading\n\nstruct StepView: View {\n    let step: Step\n    @State var diagramLoader: DiagramLoader\n\n    init(step: Step) {\n        self.step = step\n        _diagramLoader = State(initialValue: DiagramLoader(id: step.id))\n    }\n\n    var body: some View { /* ... */ }\n}\n\n@Observable\nclass DiagramLoader { /* ... */ }"
        },
        {
          "title": "Highlight @State variable",
          "language": "swift",
          "startTimeSeconds": 1036,
          "code": "// Highlighting\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n    @State var isHighlighted = false\n\n    var body: some View { /* ... */ }\n}"
        },
        {
          "title": "Highlight @Binding",
          "language": "swift",
          "startTimeSeconds": 1053,
          "code": "// Highlighting\n\nstruct ContentView: View {\n    @State var highlighted: Set<Step.ID> = []\n\n    var body: some View { /* ... */ }\n}\n\nstruct StepView: View {\n    let step: Step\n    @Binding var highlighted: Set<Step.ID>\n\n    var body: some View { /* ... */ }\n}"
        },
        {
          "title": "Programmatically scroll to showcase",
          "language": "swift",
          "startTimeSeconds": 1078,
          "code": "// Programmatically scroll to showcase\n\nstruct ContentView: View {\n    @State var scrollPosition = ScrollPosition()\n\n    var body: some View {\n        ScrollView { /* ... */ }\n            .scrollPosition($scrollPosition)\n            .overlay(alignment: .bottom) {\n                Button {\n                    scrollToShowcase()\n                } label: { /* ... */ }\n            }\n    }\n\n    func scrollToShowcase() {\n        withAnimation {\n            scrollPosition.scrollTo(id: \"showcase-header\")\n        }\n    }\n}"
        },
        {
          "title": "Dynamic number of views",
          "language": "swift",
          "startTimeSeconds": 1104,
          "code": "// Dynamic number of views\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    @Environment(\\.detailLevel) var detailLevel\n\n    var body: some View {\n        if step.isVisible(in: detailLevel) { /* ... */ }\n    }\n}"
        },
        {
          "title": "Filter at the data level",
          "language": "swift",
          "startTimeSeconds": 1133,
          "code": "// Filter at the data level\n\nstruct ContentView: View {\n    @Query var steps: [Step]\n\n    init(detailLevel: DetailLevel) {\n        _steps = Query(filter: #Predicate<Step> { step in\n            step.detailLevel >= detailLevel\n        })\n    }\n\n    var body: some View { /* ... */ }\n}\n\nstruct StepView: View { /* ... */ }"
        },
        {
          "title": "Using onGeometryChange in lazy stack subview",
          "language": "swift",
          "startTimeSeconds": 1156,
          "code": "// Don't change layout after views appear\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n    @State var subtitleHeight: CGFloat?\n\n    var body: some View {\n        VStack {\n            StepDiagram(diagram: step.diagram)\n                .frame(height: diagramHeight(subtitleHeight: subtitleHeight))\n            Title(step.title)\n            Subtitle(step.subtitle)\n                .onGeometryChange(for: CGFloat.self, of: \\.size.height) { _, value in\n                    subtitleHeight = value\n                }\n        }\n    }\n}"
        },
        {
          "title": "Using custom layout in lazy stack subview",
          "language": "swift",
          "startTimeSeconds": 1157,
          "code": "// Don't change layout after views appear\n\nstruct ContentView: View { /* ... */ }\n\nstruct StepView: View {\n    let step: Step\n\n    var body: some View {\n        StepLayout {\n            StepDiagram(diagram: step.diagram)\n            Title(step.title)\n            Subtitle(step.subtitle)\n        }\n    }\n}\n\nstruct StepLayout: Layout { /* ... */ }"
        }
      ],
      "resources": [
        {
          "title": "Grouping data with lazy stack views",
          "url": "https://developer.apple.com/documentation/SwiftUI/Grouping-Data-with-Lazy-Stack-Views",
          "type": "documentation",
          "description": "Split content into logical sections inside lazy stack views.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Grouping-Data-with-Lazy-Stack-Views",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Grouping-Data-with-Lazy-Stack-Views.json"
        }
      ],
      "path": "sessions/wwdc2026/321-dive-into-lazy-stacks-and-scrolling-with-swiftui/",
      "files": {
        "metadata": "sessions/wwdc2026/321-dive-into-lazy-stacks-and-scrolling-with-swiftui/metadata.json",
        "readme": "sessions/wwdc2026/321-dive-into-lazy-stacks-and-scrolling-with-swiftui/README.md",
        "transcript": "sessions/wwdc2026/321-dive-into-lazy-stacks-and-scrolling-with-swiftui/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/321-dive-into-lazy-stacks-and-scrolling-with-swiftui/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-322",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 322,
      "title": "Compose advanced graphics effects with SwiftUI",
      "description": "Discover how to craft rich, custom experiences by creatively composing SwiftUI layout and graphics APIs. We’ll show you how to break down complex designs and use a creative pipeline to chain simple building blocks together. Learn how to draw with layer shaders, animate with timelines, and anchor views with alignment guides.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/322",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/322",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "Design",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1075,
      "hasTranscript": true,
      "transcriptWordCount": 2095,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/322/4/db4c622a-2091-45ef-a024-df317a5b55a5/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/322/4/db4c622a-2091-45ef-a024-df317a5b55a5/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/322/4/db4c622a-2091-45ef-a024-df317a5b55a5/downloads/wwdc2026-322_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/322/4/db4c622a-2091-45ef-a024-df317a5b55a5/downloads/wwdc2026-322_hd.mp4",
        "duration": 1075
      },
      "codeSnippets": [
        {
          "title": "Cover art image",
          "language": "swift",
          "startTimeSeconds": 258,
          "code": "Image(\"CoverArt\")"
        },
        {
          "title": "Blurred cover art image",
          "language": "swift",
          "startTimeSeconds": 264,
          "code": "Image(\"CoverArt\")\n    .blur(radius: 30)"
        },
        {
          "title": "Applying layer effect in SwiftUI",
          "language": "swift",
          "startTimeSeconds": 429,
          "code": "GeometryReader { proxy in\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(),\n            maxSampleOffset: .zero\n        )\n}\n.ignoresSafeArea()"
        },
        {
          "title": "Writing layer effect shader in Metal",
          "language": "cpp",
          "startTimeSeconds": 441,
          "code": "[[stitchable]] half4 backgroundWarp(\n    float2 position, SwiftUI::Layer layer\n) {\n    return layer.sample(position);\n}"
        },
        {
          "title": "Metal shader with offset parameter",
          "language": "cpp",
          "startTimeSeconds": 459,
          "code": "[[stitchable]] half4 backgroundWarp(\n    float2 position, SwiftUI::Layer layer,\n    float2 offset\n) {\n    return layer.sample(position + offset);\n}"
        },
        {
          "title": "SwiftUI layer effect with offset parameter",
          "language": "swift",
          "startTimeSeconds": 475,
          "code": "GeometryReader { proxy in\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(\n               .float2(.init(x: 0, y: 0))\n            ),\n            maxSampleOffset: .zero\n        )\n}\n.ignoresSafeArea()"
        },
        {
          "title": "SwiftUI layer effect with full-width offset",
          "language": "swift",
          "startTimeSeconds": 484,
          "code": "GeometryReader { proxy in\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(\n               .float2(.init(x: proxy.size.width, y: 0))\n            ),\n            maxSampleOffset: .zero\n        )\n}\n.ignoresSafeArea()"
        },
        {
          "title": "SwiftUI layer effect with noise sampling",
          "language": "swift",
          "startTimeSeconds": 517,
          "code": "GeometryReader { proxy in\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(\n                .float2(proxy.size),\n                .image(Image(\"NoiseTexture\"))\n            ),\n            maxSampleOffset: .zero\n        )\n}\n.ignoresSafeArea()"
        },
        {
          "title": "Metal shader with noise sampling",
          "language": "cpp",
          "startTimeSeconds": 535,
          "code": "[[stitchable]] half4 backgroundWarp(\n    float2 position, SwiftUI::Layer layer,\n    float2 size, texture2d<half> noiseTex\n) {\n    constexpr sampler s(address::repeat, filter::linear);\n    float2 uv = position / size;\n\n    half4 n = noiseTex.sample(s, uv);\n    float2 offset = (float2(n.r, n.g) - 0.5) * 200.0;\n\n    return layer.sample(position + offset);\n}"
        },
        {
          "title": "Metal shader with domain warping",
          "language": "cpp",
          "startTimeSeconds": 622,
          "code": "[[stitchable]] half4 backgroundWarp(\n    float2 position, SwiftUI::Layer layer,\n    float2 size, texture2d<half> noiseTex\n) {\n    constexpr sampler s(address::repeat, filter::linear);\n    float2 uv = position / size;\n\n    half4 n = noiseTex.sample(s, uv);\n\n    float2 q = float2(n.r, n.g);\n    n = noiseTex.sample(s, uv + q);\n\n    float2 offset = (float2(n.r, n.g) - 0.5) * 200.0;\n\n    return layer.sample(position + offset);\n}"
        },
        {
          "title": "SwiftUI layer effect with static visual",
          "language": "swift",
          "startTimeSeconds": 676,
          "code": "GeometryReader { proxy in\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(\n                .float2(proxy.size),\n                .image(Image(\"NoiseTexture\"))\n            ),\n            maxSampleOffset: .zero\n        )\n}\n.ignoresSafeArea()"
        },
        {
          "title": "SwiftUI layer effect with animated visual",
          "language": "swift",
          "startTimeSeconds": 697,
          "code": "@State private var startDate = Date.now\n\nTimelineView(.animation) { timeline in\n    let elapsed = timeline.date.timeIntervalSince(\n        startDate\n    )\n    CoverArtView()\n        .layerEffect(\n            ShaderLibrary.backgroundWarp(\n                .float2(proxy.size),\n                .image(Image(\"NoiseTexture\")),\n                .float(elapsed)\n            ),\n            maxSampleOffset: .zero\n        )\n}"
        },
        {
          "title": "Basic transcript view",
          "language": "swift",
          "startTimeSeconds": 735,
          "code": "ScrollView {\n    LazyVStack(alignment: .leading, spacing: 12) {\n        ForEach(sampleTranscript) { line in\n                .font(.title)\n                .fontWeight(.bold)\n        }\n    }\n}"
        },
        {
          "title": "Time-synced transcript view",
          "language": "swift",
          "startTimeSeconds": 753,
          "code": "@State private var playback = PlaybackState()\n\nScrollViewReader { scrollProxy in\n    ScrollView {\n        LazyVStack(alignment: .leading, spacing: 12) {\n            ForEach(sampleTranscript) { line in\n                Text(line.text)\n                    .transcriptLineStyle(isCurrent: \n                        line.id == playback.currentLineIndex\n                    )\n            }\n        }\n    }\n    .onChange(of: playback.currentLineIndex, { _, i in\n        scrollProxy.scrollTo(i, anchor: .center)\n    })\n}"
        },
        {
          "title": "Overlay with center alignment",
          "language": "swift",
          "startTimeSeconds": 833,
          "code": "Text(line.text)\n     .overlay {\n          Text(line.formattedTimestamp)\n     }"
        },
        {
          "title": "Overlay with bottom leading alignment",
          "language": "swift",
          "startTimeSeconds": 846,
          "code": "Text(line.text)\n     .overlay(alignment: .bottomLeading) {\n          Text(line.formattedTimestamp)\n     }"
        },
        {
          "title": "Overlay with alignment guide override",
          "language": "swift",
          "startTimeSeconds": 872,
          "code": "Text(line.text)\n     .overlay(alignment: .bottomLeading) {\n          Text(line.formattedTimestamp)\n              .alignmentGuide(.bottom) { $0[.top] }\n     }"
        }
      ],
      "resources": [
        {
          "title": "Alignment",
          "url": "https://developer.apple.com/documentation/SwiftUI/Alignment",
          "type": "documentation",
          "description": "An alignment in both axes.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Alignment",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Alignment.json"
        },
        {
          "title": "Composing advanced graphics effects with SwiftUI",
          "url": "https://developer.apple.com/documentation/SwiftUI/Composing-advanced-graphics-effects-with-SwiftUI",
          "type": "samplecode",
          "description": "Create compelling visuals in your app by combining graphical effects.",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Composing-advanced-graphics-effects-with-SwiftUI",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Composing-advanced-graphics-effects-with-SwiftUI.json"
        },
        {
          "title": "Shader",
          "url": "https://developer.apple.com/documentation/SwiftUI/Shader",
          "type": "documentation",
          "description": "A reference to a function in a Metal shader library, along with its",
          "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Shader",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Shader.json"
        }
      ],
      "path": "sessions/wwdc2026/322-compose-advanced-graphics-effects-with-swiftui/",
      "files": {
        "metadata": "sessions/wwdc2026/322-compose-advanced-graphics-effects-with-swiftui/metadata.json",
        "readme": "sessions/wwdc2026/322-compose-advanced-graphics-effects-with-swiftui/README.md",
        "transcript": "sessions/wwdc2026/322-compose-advanced-graphics-effects-with-swiftui/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/322-compose-advanced-graphics-effects-with-swiftui/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-324",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 324,
      "title": "Meet Core AI",
      "description": "Discover Core AI, Apple’s new framework for on-device AI model deployment. Tour the ecosystem, from Python libraries for converting, authoring, and optimizing models, to a Swift API for simple plug-and-play inference and advanced use cases with strict latency and memory requirements. Explore the new Core AI models repository with ready-to-run examples for popular architectures. See how deep Xcode integration, including ahead-of-time model compilation, streamlines the workflow so you can deliver smarter, more responsive app experiences.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/324",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/324",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1243,
      "hasTranscript": true,
      "transcriptWordCount": 3348,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/324/4/3b67b624-4060-495f-9ba7-659805ee6b88/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/324/4/3b67b624-4060-495f-9ba7-659805ee6b88/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/324/4/3b67b624-4060-495f-9ba7-659805ee6b88/downloads/wwdc2026-324_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/324/4/3b67b624-4060-495f-9ba7-659805ee6b88/downloads/wwdc2026-324_hd.mp4",
        "duration": 1243
      },
      "codeSnippets": [
        {
          "title": "Convert a PyTorch model to Core AI",
          "language": "python",
          "startTimeSeconds": 308,
          "code": "import torch\nimport coreai_torch\n# Load trained snake model and sample input for tracing\npt_model = SnakeTransformer().load_checkpoint(\"snake.pt\")\nexample  = torch.randn(1, 5, 16)\n\n# Export the torch program including dynamic shape for input sequence\nseq_len  = torch.export.Dim(\"seq_len\", min=1, max=256)\nexported = torch.export.export(\n    pt_model, args=(example,), \n    dynamic_shapes={\"features\": {1: seq_len}},\n)\nexported = exported.run_decompositions(coreai_torch.get_decomp_table())\n\n# Convert torch graph → Core AI graph\nai_program = coreai_torch.TorchConverter().add_exported_program(\n    exported, input_names=[\"features\"], output_names=[\"logits\"],\n).to_coreai()\n\n# Save as a .aimodel asset the runtime can load\nai_program.save_asset(\"SnakeTransformer.aimodel\")"
        },
        {
          "title": "Verify converted model numerics",
          "language": "python",
          "startTimeSeconds": 344,
          "code": "import torch\nimport numpy as np\nfrom coreai. runtime import AIModel, NDArray\n# Load models\npt_model = SnakeTransformer().load_checkpoint(\"snake.pt\")\nai_model = await AIModel.load(\"SnakeTransformer.aimodel\")\nfunction = ai_model.load_function(\"main\")\n# Assemble input sample - 10 frames of 16-dim game features, shape (1, 10, 16)\nfeatures = np.array(lextract_features(game) for - in range (10)],\ndtype=np.float32)[np.newaxis]\n# PyTorch reference\nwith torch.no_grad():\n\tpytorch_logits = pt_model(torch.from_numpy(features)) . numpy )[0, -1]\n# Core AI inference\nresult = await function({ \"features\": NDArray(data=features)} )\ncoreai_logits = result[\"logits\"]. numpy()[0, -1]\n# Validate\nmax_diff = np.max(np.abs(pytorch_logits - coreai_logits))\n\tassert max_diff < 0.01"
        },
        {
          "title": "Core AI framework core types",
          "language": "swift",
          "startTimeSeconds": 461,
          "code": "// Core types within Core AI\nimport CoreAI\n\n// Load the '.aimodel' file\nlet model = try await AIModel(contentsOf: modelURL)\n\n// Load the main inference function\nlet mainFunction: InferenceFunction = try model.loadFunction(named: \"main\")!\n\n// Construct the n-dimensional input data\nlet inputNDArray: NDArray = nextInput()\n\n// Run inference\nvar outputs = try await mainFunction.run(inputs: [\"input\": inputNDArray])\n\nguard let outputNDArray = outputs.remove(\"output\")?.ndArray else {\n  // Handle unexpected missing output\n}"
        },
        {
          "title": "Initialize ModelPlayer with AIModel",
          "language": "swift",
          "startTimeSeconds": 513,
          "code": "// Initialize the player by loading the AIModel and InferenceFunction\nstruct ModelPlayer {\n  let nextActionFunction: InferenceFunction\n\n  init(modelURL: URL) async throws {\n    let model = try await AIModel(contentsOf: modelURL)\n    self.nextActionFunction = try model.loadFunction(named: \"main\")!\n  }\n}"
        },
        {
          "title": "Run inference with NDArray inputs",
          "language": "swift",
          "startTimeSeconds": 529,
          "code": "extension ModelPlayer: SnakePlayer {\n\n  mutating func chooseAction(game: SnakeGame) async throws -> Direction {\n\n    // Create an NDArray for the next input and write board features into it\n    var inputFeatures = NDArray(shape: [game.stepCount, hiddenDim], scalarType: .float32)\n    writeFeatures(of: game, into: inputFeatures.mutableView())\n\n    // Run inference and extract the expected logits output NDArray\n    var outputs = try await nextActionFunction.run(inputs: [\"features\": inputFeatures])\n    guard let logits = outputs.remove(\"logits\")?.ndArray else {\n      throw ModelError.missingOutput\n    }\n\n    return predictedDirection(from: logits.view())\n  }\n\n  func writeFeatures(of game: SnakeGame, into view: consuming NDArray.MutableView<Float>) { … }\n  func predictedDirection(from logits: NDArray.View<Float>) -> Direction { … }\n}"
        },
        {
          "title": "Input features for the snake model",
          "language": "swift",
          "startTimeSeconds": 610,
          "code": "// Features at each time step\nvar features = [Float]()\n\n// Distance to wall in all directions, normalized between [0, 1]\nfeatures += [dWallUp, dWallDown, dWallLeft, dWallRight]\n\n// Distance to nearest food, normalized between [-1, 1]\nfeatures += [dFoodX, dFoodY]\n\n// Direction encoded as one-hot: [1,0,0,0]=up, [0,1,0,0]=down, etc.\nfeatures += dir.oneHotEncoding\n\n// Distance to the other snake, normalized to [-1, 1]\nfeatures += [dUserX, dUserY]\n\n// Direction of the opponent snake\nfeatures += dirU.oneHotEncoding"
        },
        {
          "title": "Add KV cache buffers to PyTorch module",
          "language": "python",
          "startTimeSeconds": 738,
          "code": "# Update torch module to include key and value caches\n# Use register_buffer to later make the exported torch program treat them as mutable\n\nclass SnakeTransformerStateful(nn.Module):\n    def __init__(self, ...):\n        super().__init__()\n        self.register_buffer(\n            \"k_cache\", torch.zeros(N_LAYERS, 1, MAX_SEQ_LEN, D_MODEL))\n        self.register_buffer(\n            \"v_cache\", torch.zeros(N_LAYERS, 1, MAX_SEQ_LEN, D_MODEL))\n        # …"
        },
        {
          "title": "Update forward pass to read/write KV caches",
          "language": "python",
          "startTimeSeconds": 770,
          "code": "# During forward pass, read/write KV caches\n\nclass SnakeTransformerStateful(nn.Module):\n\n    def forward(self, features, position_ids):\n        new_k, new_v = [], []\n        for i, block in enumerate(self.blocks):\n            # read previous keys/values from caches\n            k_prev = self.k_cache[i]\n            v_prev = self.v_cache[i]\n            # ... compute q/k/v for the new token, attend over valid prefix ...\n            new_k.append(k_updated)\n            new_v.append(v_updated)\n\n        # Update key/value caches\n        self.k_cache.copy_(torch.stack(new_k))\n        self.v_cache.copy_(torch.stack(new_v))\n\n        return self.action_head(self.ln_final(x))"
        },
        {
          "title": "Re-convert model with state names",
          "language": "python",
          "startTimeSeconds": 779,
          "code": "# Updated coreai-torch conversion code using key/value cache states\nimport torch\nimport coreai_torch\n\nexported = torch.export.export(\n    stateful_model,\n    args=(example_features, example_position_ids),\n    dynamic_shapes={\"position_ids\": {1: seq_len}},\n)\nexported = exported.run_decompositions(coreai_torch.get_decomp_table())\n\nai_program = coreai_torch.TorchConverter().add_exported_program(\n    exported,\n    input_names=[\"features\", \"position_ids\"],\n    state_names=[\"keyCache\", \"valueCache\"],\n    output_names=[\"logits\"],\n).to_coreai()\n\nai_program.save_asset(\"SnakeTransformer.aimodel\")"
        },
        {
          "title": "Store KV cache NDArrays in ModelPlayer",
          "language": "swift",
          "startTimeSeconds": 797,
          "code": "// Add stored properties for the key and value caches\nstruct ModelPlayer {\n    let nextActionFunction: InferenceFunction\n\n    var keyCache: NDArray\n    var valueCache: NDArray\n\n    init(modelURL: URL) async throws {\n        let model = try await AIModel(contentsOf: modelURL)\n        self.nextActionFunction = try model.loadFunction(named: \"main\")!\n\n        self.keyCache = NDArray(shape: [layers, maxContext, hiddenDim], scalarType: .float32)\n        self.valueCache = NDArray(shape: [layers, maxContext, hiddenDim], scalarType: .float32)\n    }\n}"
        },
        {
          "title": "Pass state views to inference function",
          "language": "swift",
          "startTimeSeconds": 825,
          "code": "extension ModelPlayer: SnakePlayer {\n    mutating func chooseAction(game: SnakeGame, snakeID: Int) async throws -> Direction {\n        // …\n\n        var stateViews = InferenceFunction.MutableViews()\n        stateViews.insert(&keyCache, for: \"keyCache\")\n        stateViews.insert(&valueCache, for: \"valueCache\")\n\n        // Run inference and extract the expected logits output NDArray\n        var outputs = try await nextActionFunction.run(\n            inputs: [\"features\": inputFeatures],\n            states: stateViews)\n        // …\n    }\n}"
        },
        {
          "title": "Check model cache before loading",
          "language": "swift",
          "startTimeSeconds": 982,
          "code": "// Check if your model can be loaded from the cache\nlet cache = AIModelCache.default\n\nguard let model = try cache.model(for: modelURL, options: .default) else {\n    Task { @MainActor in\n        informUser(\"Preparing AI features. This may take a while…\")\n    }\n}"
        },
        {
          "title": "Request model specialization",
          "language": "swift",
          "startTimeSeconds": 1002,
          "code": "// Explicitly request specialization\ntry await AIModel.specialize(contentsOf: modelURL)"
        }
      ],
      "resources": [
        {
          "title": "Core AI PyTorch Extensions",
          "url": "https://apple.github.io/coreai-torch",
          "type": "documentation",
          "description": "Bring PyTorch models to Core AI for on-device execution."
        },
        {
          "title": "Core AI Python",
          "url": "https://apple.github.io/coreai-torch/main/coreai-core",
          "type": "documentation",
          "description": "Python package for building and running AI Models on Apple hardware."
        },
        {
          "title": "Core AI Optimization",
          "url": "https://apple.github.io/coreai-optimization",
          "type": "documentation",
          "description": "A library for model compression, quantization and related optimizations."
        },
        {
          "title": "Core AI",
          "url": "https://developer.apple.com/documentation/CoreAI",
          "type": "documentation",
          "description": "Run AI models in your app on Apple silicon.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI.json"
        },
        {
          "title": "Compiling Core AI models ahead of time",
          "url": "https://developer.apple.com/documentation/CoreAI/compiling-core-ai-models-ahead-of-time",
          "type": "documentation",
          "description": "Reduce on-device specialization time by compiling Core AI models at build time.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI/compiling-core-ai-models-ahead-of-time",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI/compiling-core-ai-models-ahead-of-time.json"
        },
        {
          "title": "Managing model specialization and caching",
          "url": "https://developer.apple.com/documentation/CoreAI/managing-model-specialization-and-caching",
          "type": "documentation",
          "description": "Configure model specialization, manage cached assets, and reduce your app’s storage footprint.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI/managing-model-specialization-and-caching",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI/managing-model-specialization-and-caching.json"
        }
      ],
      "path": "sessions/wwdc2026/324-meet-core-ai/",
      "files": {
        "metadata": "sessions/wwdc2026/324-meet-core-ai/metadata.json",
        "readme": "sessions/wwdc2026/324-meet-core-ai/README.md",
        "transcript": "sessions/wwdc2026/324-meet-core-ai/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/324-meet-core-ai/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-325",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 325,
      "title": "Dive into Core AI model authoring and optimization",
      "description": "Dive into the complete custom model deployment workflow for Apple silicon with the new Core AI framework. Discover powerful techniques for authoring models using custom Metal kernels, alongside platform-aware compression strategies. The new Core AI Debugger offers deep intrinsic analysis, and AI-assisted workflows guide you from initial concept to optimized on-device execution.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/325",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/325",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1761,
      "hasTranscript": true,
      "transcriptWordCount": 3892,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/325/5/8d08c9d4-3c64-49e1-8590-8b76bd9ad4cb/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/325/5/8d08c9d4-3c64-49e1-8590-8b76bd9ad4cb/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/325/5/8d08c9d4-3c64-49e1-8590-8b76bd9ad4cb/downloads/wwdc2026-325_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/325/5/8d08c9d4-3c64-49e1-8590-8b76bd9ad4cb/downloads/wwdc2026-325_hd.mp4",
        "duration": 1761
      },
      "codeSnippets": [
        {
          "title": "Define and export a PyTorch model",
          "language": "python",
          "startTimeSeconds": 207,
          "code": "import torch\nimport torch.nn as nn\n\n# Define a simple model\nclass MLP(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.fc1 = nn.Linear(256, 512)\n        self.fc2 = nn.Linear(512, 10)\n\n    def forward(self, x):\n        return self.fc2(torch.relu(self.fc1(x)))\n\n# Export with torch.export\nmodel = MLP().eval()\nexample_input = (torch.randn(1, 256),)\nexported_program = torch.export.export(model, example_input)"
        },
        {
          "title": "Convert, optimize and run inference with Core AI",
          "language": "python",
          "startTimeSeconds": 242,
          "code": "import coreai\nimport coreai_torch\nfrom coreai.runtime import NDArray\n\n# Convert to Core AI\nconverter = coreai_torch.TorchConverter()\nconverter.add_exported_program(\n    exported_program,\n    input_names=[\"features\"], output_names=[\"logits\"])\ncore_ai_program = converter.to_coreai()\n\n# Optimize and save to .aimodel\ncore_ai_program.optimize()\nasset = core_ai_program.save_asset(\"mlp.aimodel\")\n\n# Run inference\nspecialized_model = await AIModel.load(\"mlp.aimodel\")\nspecialized_function = specialized_model.load_function(\"main\")\nresult = await specialized_function({\"features\": NDArray(example[0].numpy())})"
        },
        {
          "title": "Define a SiLU Metal kernel with PyTorch reference",
          "language": "python",
          "startTimeSeconds": 1272,
          "code": "import torch\nfrom coreai_torch.dsl import TorchMetalKernel, MetalParameter\n\ndef silu_torch(x):\n    return x * torch.sigmoid(x)\n\nSILU_MSL = \"\"\"\nfloat val = float(x[gid]);\nfloat sig = 1.0f / (1.0f + exp(-val));\ny[gid] = TYPE(val * sig);\n\"\"\"\n\nsilu_kernel = TorchMetalKernel(\n    name=\"fused_silu\",\n    input_names=[\"x\"],\n    result_names=[\"y\"],\n    src=SILU_MSL,\n    torch_defn=silu_torch,\n    metal_params=[MetalParameter(\"gid\", \"uint\", \"thread_position_in_grid\")],\n    template_dtypes={\"x\": \"TYPE\"},\n)"
        },
        {
          "title": "Use a custom Metal kernel and convert with TorchConverter",
          "language": "python",
          "startTimeSeconds": 1329,
          "code": "class MyModel(torch.nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.linear = torch.nn.Linear(256, 256)\n\n    def forward(self, x):\n        h = self.linear(x)\n        n = h.numel()\n        return silu_kernel(\n            h,\n            threads_per_grid_size=(n, 1, 1),\n            threads_per_thread_group=(min(n, 256), 1, 1),\n            result_shapes=[h.shape],\n        )\n\nexported_program = torch.export.export(MyModel(), (torch.randn(1, 256),))\n\nconverter = coreai_torch.TorchConverter()\nconverter.register_custom_kernels([silu_kernel])\nconverter.add_exported_program(exported_program,\n                               input_names=[\"x\"], output_names=[\"y\"])\ndeployable = converter.to_coreai()  # MSL integrated into asset"
        }
      ],
      "resources": [
        {
          "title": "Core AI PyTorch Extensions",
          "url": "https://apple.github.io/coreai-torch",
          "type": "documentation",
          "description": "Bring PyTorch models to Core AI for on-device execution."
        },
        {
          "title": "Core AI Python",
          "url": "https://apple.github.io/coreai-torch/main/coreai-core",
          "type": "documentation",
          "description": "Python package for building and running AI Models on Apple hardware."
        },
        {
          "title": "Core AI Optimization",
          "url": "https://apple.github.io/coreai-optimization",
          "type": "documentation",
          "description": "A library for model compression, quantization and related optimizations."
        },
        {
          "title": "Inspecting, debugging, and profiling Core AI models",
          "url": "https://developer.apple.com/documentation/CoreAI/inspecting-debugging-and-profiling-core-ai-models",
          "type": "documentation",
          "description": "Investigate model behavior, monitor activity, and profile performance using the Core AI tools across Xcode and the Core AI Debugger app.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI/inspecting-debugging-and-profiling-core-ai-models",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI/inspecting-debugging-and-profiling-core-ai-models.json"
        },
        {
          "title": "Inspecting Core AI models with Core AI Debugger",
          "url": "https://developer.apple.com/documentation/CoreAI/inspecting-core-ai-models-with-core-ai-debugger",
          "type": "documentation",
          "description": "Verify model correctness by inspecting the operations and comparing tensor outputs.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI/inspecting-core-ai-models-with-core-ai-debugger",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI/inspecting-core-ai-models-with-core-ai-debugger.json"
        },
        {
          "title": "Core AI",
          "url": "https://developer.apple.com/documentation/CoreAI",
          "type": "documentation",
          "description": "Run AI models in your app on Apple silicon.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI.json"
        }
      ],
      "path": "sessions/wwdc2026/325-dive-into-core-ai-model-authoring-and-optimization/",
      "files": {
        "metadata": "sessions/wwdc2026/325-dive-into-core-ai-model-authoring-and-optimization/metadata.json",
        "readme": "sessions/wwdc2026/325-dive-into-core-ai-model-authoring-and-optimization/README.md",
        "transcript": "sessions/wwdc2026/325-dive-into-core-ai-model-authoring-and-optimization/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/325-dive-into-core-ai-model-authoring-and-optimization/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-326",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 326,
      "title": "Integrate on-device AI models into your app using Core AI",
      "description": "Discover a curated collection of popular open-source models — including Qwen, Mistral, SAM3, and more — optimized for Apple silicon using the new Core AI Framework. Learn how to download, run, and benchmark models on your Mac, and integrate them into your app with just a few lines of code. Explore a new workflow for model compilation and on-device specialization to speed up first-time model load. Find out how to profile and optimize runtime performance with Core AI tools in Xcode.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/326",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/326",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1424,
      "hasTranscript": true,
      "transcriptWordCount": 2946,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/326/5/7ff038e2-12cb-4b92-9f49-1d051db7ce5d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/326/5/7ff038e2-12cb-4b92-9f49-1d051db7ce5d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/326/5/7ff038e2-12cb-4b92-9f49-1d051db7ce5d/downloads/wwdc2026-326_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/326/5/7ff038e2-12cb-4b92-9f49-1d051db7ce5d/downloads/wwdc2026-326_hd.mp4",
        "duration": 1424
      },
      "codeSnippets": [
        {
          "title": "Load and run SAM3 image segmentation",
          "language": "swift",
          "startTimeSeconds": 661,
          "code": "import CoreAIImageSegmenter\n\n// Load\nlet segmenter = try await ImageSegmenter(resourcesAt: sam3ModelURL)\n\n// Use\nlet response = try await segmenter.segment(image: inputImage, prompt: \"flower\")\nlet mask = response.segments.first?.mask"
        },
        {
          "title": "Load a language model and create a session",
          "language": "swift",
          "startTimeSeconds": 688,
          "code": "import FoundationModels\nimport CoreAILanguageModels\n\n// Create model instance\nlet model = try await CoreAILanguageModel(resourcesAt: qwen3ModelURL)\n\n// Create session using the model\nlet session = LanguageModelSession(model: model)\n\n// Generate response\nlet response = try await session.respond(to: \"...\")"
        },
        {
          "title": "Generate structured output with @Generable",
          "language": "swift",
          "startTimeSeconds": 749,
          "code": "import FoundationModels\nimport CoreAILanguageModels\n\n@Generable\nstruct VocabCard {\n    let chineseWord: String\n    let englishMeaning: String\n    let exampleSentence: String\n}\n\nlet model = try await CoreAILanguageModel(resourcesAt: modelURL)\nlet session = LanguageModelSession(model: model)\nlet response = try await session.respond(\n    to: \"Create a vocab card for flower\",\n    generating: VocabCard.self\n)\nlet card: VocabCard = response.content"
        },
        {
          "title": "Compile a Core AI model ahead of time",
          "language": "bash",
          "startTimeSeconds": 1042,
          "code": "$ xcrun coreai-build compile MyModel.aimodel --platform iOS"
        }
      ],
      "resources": [
        {
          "title": "Core AI PyTorch Extensions",
          "url": "https://apple.github.io/coreai-torch",
          "type": "documentation",
          "description": "Bring PyTorch models to Core AI for on-device execution."
        },
        {
          "title": "Core AI Python",
          "url": "https://apple.github.io/coreai-torch/main/coreai-core",
          "type": "documentation",
          "description": "Python package for building and running AI Models on Apple hardware."
        },
        {
          "title": "Core AI Optimization",
          "url": "https://apple.github.io/coreai-optimization",
          "type": "documentation",
          "description": "A library for model compression, quantization and related optimizations."
        },
        {
          "title": "Core AI",
          "url": "https://developer.apple.com/documentation/CoreAI",
          "type": "documentation",
          "description": "Run AI models in your app on Apple silicon.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI.json"
        },
        {
          "title": "Compiling Core AI models ahead of time",
          "url": "https://developer.apple.com/documentation/CoreAI/compiling-core-ai-models-ahead-of-time",
          "type": "documentation",
          "description": "Reduce on-device specialization time by compiling Core AI models at build time.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI/compiling-core-ai-models-ahead-of-time",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI/compiling-core-ai-models-ahead-of-time.json"
        }
      ],
      "path": "sessions/wwdc2026/326-integrate-on-device-ai-models-into-your-app-using-core-ai/",
      "files": {
        "metadata": "sessions/wwdc2026/326-integrate-on-device-ai-models-into-your-app-using-core-ai/metadata.json",
        "readme": "sessions/wwdc2026/326-integrate-on-device-ai-models-into-your-app-using-core-ai/README.md",
        "transcript": "sessions/wwdc2026/326-integrate-on-device-ai-models-into-your-app-using-core-ai/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/326-integrate-on-device-ai-models-into-your-app-using-core-ai/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-328",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 328,
      "title": "Explore numerical computing in Swift with MLX",
      "description": "Bring NumPy-style computing natively to Swift with MLX Swift. Discover how to eliminate cross-language friction in your machine learning workflows by handling image processing, tensor operations, and neural network training in a single, type-safe environment. Explore the APIs that let you leverage GPU acceleration while enjoying the compiler, tooling, and debugging experience you already know.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/328",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/328",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Swift"
      ],
      "primaryTopic": "Swift",
      "duration": 871,
      "hasTranscript": true,
      "transcriptWordCount": 2168,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/328/5/51d0ab0a-f401-4514-9f04-6b211897d3e8/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/328/5/51d0ab0a-f401-4514-9f04-6b211897d3e8/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/328/5/51d0ab0a-f401-4514-9f04-6b211897d3e8/downloads/wwdc2026-328_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/328/5/51d0ab0a-f401-4514-9f04-6b211897d3e8/downloads/wwdc2026-328_hd.mp4",
        "duration": 871
      },
      "codeSnippets": [
        {
          "title": "Power iteration with MLX Swift arrays",
          "language": "swift",
          "startTimeSeconds": 184,
          "code": "import MLX\nlet n = 100\nlet steps = 10\nlet B = MLXRandom.normal([n, n])\nvar v = MLXRandom.normal([n])\n\n// get symmetric matrix A = Bᵀ + B\nlet A = B.T + B\n\n// Power iteration → top eigenvector of A.\n//   v ← A v / ‖A v‖\nfor _ in 0 ..< steps {\n    let Av = matmul(A, v)\n    v = Av / norm(Av)\n    eval(v)\n}\n\n// recover the eigenvalue.\n//   λ = vᵀ A v\nlet lambda = matmul(matmul(v.T, A), v)\n\nprint(lambda)"
        },
        {
          "title": "Mandelbrot set in plain Swift (scalar)",
          "language": "swift",
          "startTimeSeconds": 309,
          "code": "// Plain Swift, scalar-at-a-time\nvar counts = Array2D<Int>(width: w, height: h)\n\nfor y in 0 ..< h {\n    for x in 0 ..< w {\n        let c = Complex(xMin + Float(x) * xStep, yMin + Float(y) * yStep)\n        var z = Complex<Float>.zero\n        var limit = maxIterations\n        for i in 0 ..< maxIterations {\n            z = z * z + c\n            if z.lengthSquared > radiusSquared {\n                limit = i\n                break\n            }\n        }\n        counts[x, y] = limit\n    }\n}"
        },
        {
          "title": "Mandelbrot set in MLX Swift (array)",
          "language": "swift",
          "startTimeSeconds": 327,
          "code": "// Compute the Mandelbrot set on a grid of complex numbers\nimport MLX\n\nlet x = linspace(Float(-2.0), 0.5, count: w)\nlet y = linspace(Float(-1.25), 1.25, count: h).reshaped(h, 1)\nlet c = x + y.asImaginary()\n\nvar z = MLXArray.zeros(like: c)\nvar counts = MLXArray.zeros(c.shape, dtype: .int16)\n\nfor _ in 0 ..< maxIterations {\n    z = z * z + c                       // iterate z ← z² + c\n    counts = counts + (abs(z) .< 2)     // count bounded iterations\n}"
        },
        {
          "title": "Jacobi iteration with conv2d",
          "language": "swift",
          "startTimeSeconds": 447,
          "code": "// Jacobi iteration: average the four neighbors\n\n// Convolution weights\nlet kernel = MLXArray(converting: [\n    0,    0.25, 0,\n    0.25, 0,    0.25,\n    0,    0.25, 0,\n]).reshaped(1, 3, 3, 1)\n\n// Initial value\nvar temperature = heatSources\n\n// Run this in a loop until convergence\nlet next = conv2d(temperature, kernel, padding: 1)\ntemperature = which(heatMask, heatSources, next)"
        },
        {
          "title": "Successive Over-Relaxation (SOR)",
          "language": "swift",
          "startTimeSeconds": 557,
          "code": "// Successive Over-Relaxation: blend the previous and next state\nlet ω: Float = 2.0 / (1.0 + sin(Float.pi / Float(max(M, N))))\n\nlet redMask   = checkerboard(rows: M, cols: N, phase: 0)\nlet blackMask = checkerboard(rows: M, cols: N, phase: 1)\n\n// Update red cells using black neighbors\nlet sorRed  = ω * conv2d(temperature, kernel, padding: 1) + (1 - ω) * temperature\ntemperature = which(redMask, sorRed, temperature)\ntemperature = which(heatMask, heatSources, temperature)\n\n// Update black cells using (now-updated) red neighbors\nlet sorBlack = ω * conv2d(temperature, kernel, padding: 1) + (1 - ω) * temperature\ntemperature  = which(blackMask, sorBlack, temperature)\ntemperature  = which(heatMask, heatSources, temperature)"
        },
        {
          "title": "Curve fitting with automatic differentiation",
          "language": "swift",
          "startTimeSeconds": 673,
          "code": "// Define a loss, then optimize it with autodiff\n// x, y: data points as MLXArrays\nfunc f(_ θ: MLXArray) -> MLXArray {\n    θ[0] + θ[1] * x + θ[2] * x ** 2\n}\n\nfunc loss(_ θ: MLXArray) -> MLXArray {\n    mean((f(θ) - y) ** 2)\n}\n\nvar θ = zeros([numParams])\nlet gradLoss = grad(loss)\n\nfor _ in 0 ..< steps {\n    let g = gradLoss(θ)         // ∇L(θ)\n    θ = θ - learningRate * g    // parameter update\n    eval(θ)                     // force evaluation\n}"
        }
      ],
      "resources": [
        {
          "title": "MLX Swift LM on GitHub",
          "url": "https://github.com/ml-explore/mlx-swift-lm",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX Swift Examples",
          "url": "https://github.com/ml-explore/mlx-swift-examples",
          "type": "samplecode",
          "description": "MLX Swift Examples"
        },
        {
          "title": "MLX Examples",
          "url": "https://github.com/ml-explore/mlx-examples",
          "type": "samplecode",
          "description": "This repo contains a variety of standalone examples using the MLX framework."
        },
        {
          "title": "MLX Swift",
          "url": "https://github.com/ml-explore/mlx-swift",
          "type": "documentation",
          "description": "MLX Swift is a Swift API for MLX."
        },
        {
          "title": "MLX LM - Python API",
          "url": "https://github.com/ml-explore/mlx-lm",
          "type": "documentation",
          "description": "MLX LM is a Python package for generating text and fine-tuning large language models on Apple silicon with MLX."
        },
        {
          "title": "MLX Explore - Python API",
          "url": "https://github.com/ml-explore/mlx",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        },
        {
          "title": "MLX Framework",
          "url": "https://mlx-framework.org",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX",
          "url": "https://ml-explore.github.io/mlx/",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        }
      ],
      "path": "sessions/wwdc2026/328-explore-numerical-computing-in-swift-with-mlx/",
      "files": {
        "metadata": "sessions/wwdc2026/328-explore-numerical-computing-in-swift-with-mlx/metadata.json",
        "readme": "sessions/wwdc2026/328-explore-numerical-computing-in-swift-with-mlx/README.md",
        "transcript": "sessions/wwdc2026/328-explore-numerical-computing-in-swift-with-mlx/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/328-explore-numerical-computing-in-swift-with-mlx/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-330",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 330,
      "title": "Optimize custom machine learning operations with Metal tensors",
      "description": "Unlock powerful machine learning performance with the Metal Tensor API and Metal Performance Primitives (MPP) Tensor Ops library. Discover how to create portable operations that take advantage of Neural Accelerators in Apple M5 and A19 GPUs. Learn to build custom machine learning kernels for your Core AI applications, and find out how to work effectively with quantized data formats and GPU memory optimization.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/330",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/330",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Graphics & Games",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 973,
      "hasTranscript": true,
      "transcriptWordCount": 2116,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/330/4/0ff2c290-e47b-4d88-8a8f-0634e11506a4/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/330/4/0ff2c290-e47b-4d88-8a8f-0634e11506a4/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/330/4/0ff2c290-e47b-4d88-8a8f-0634e11506a4/downloads/wwdc2026-330_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/330/4/0ff2c290-e47b-4d88-8a8f-0634e11506a4/downloads/wwdc2026-330_hd.mp4",
        "duration": 973
      },
      "codeSnippets": [
        {
          "title": "Create a quantized MTLTensor",
          "language": "objectivec",
          "startTimeSeconds": 233,
          "code": "// Creating a tensor with a quantized data type from device\n\n#define RANK 2\n\nMTLTensorDescriptor *tensorDesc = [MTLTensorDescriptor new];\n\ntensorDesc.dataType = MTLTensorDataTypeMetalFloat8E4M3;\ntensorDesc.usage = MTLTensorUsageCompute;\n\nNSInteger dimensions[RANK] = {NumCols, NumRows};\ntensorDesc.dimensions = [[MTLTensorExtents alloc] initWithRank:RANK values:dimensions];\n\nNSError *err = nil;\nid <MTLTensor> tensor = [device newTensorWithDescriptor:tensorDesc error:&err];"
        },
        {
          "title": "Declare a multi-plane tensor with scale factors",
          "language": "objectivec",
          "startTimeSeconds": 288,
          "code": "// Creating a tensor with a scales auxiliary plane from device\n\n#define RANK 2\n\nMTLTensorAuxiliaryPlaneDescriptor *planeDesc = [MTLTensorAuxiliaryPlaneDescriptor new];\nplaneDesc.dataType = MTLTensorDataTypeMetalFloat8UE8M0;\n\nNSInteger blockFactors[RANK] = {32, 1};\nplaneDesc.blockFactors = [[MTLTensorExtents alloc] initWithRank:RANK values:blockFactors];\n\nMTLTensorAuxiliaryPlaneDescriptorMap *auxiliaryPlanes =\n    [MTLTensorAuxiliaryPlaneDescriptorMap new];\n[auxiliaryPlanes setDescriptor:planeDesc forPlane:MTLTensorPlaneTypeScales];\n\nMTLTensorDescriptor *tensorDesc = [MTLTensorDescriptor new];\ntensorDesc.dataType = MTLTensorDataTypeMetalFloat8E4M3;\ntensorDesc.usage = MTLTensorUsageCompute;\n\nNSInteger dimensions[RANK] = {NumCols, NumRows};\ntensorDesc.dimensions = [[MTLTensorExtents alloc] initWithRank:RANK values:dimensions];\ntensorDesc.auxiliaryPlanes = auxiliaryPlanes;\n\nNSError *err = nil;\nid <MTLTensor> tensor = [device newTensorWithDescriptor:tensorDesc error:&err];"
        },
        {
          "title": "MSL type aliases for an MXFP8 tensor handle",
          "language": "objectivec",
          "startTimeSeconds": 367,
          "code": "// Type aliases for a MXFP8 multi-plane tensor handle\n\n#include <metal_tensor>\n\nusing namespace metal;\n\nusing scales_plane = tensor_blockwise<tensor_plane_scales,\n                                      device metal_fp8_ue8m0_format,\n                                      32, 1>;\n\nusing mxfp8_tensor = tensor<device metal_fp8_e4m3_format,\n                            dextents<int, 2>,\n                            tensor_handle,\n                            scales_plane>;\n\nkernel void matmul(mxfp8_tensor matrixA [[buffer(0)]],\n                   mxfp8_tensor matrixB [[buffer(1)]],\n                   tensor<device half, dextents<int, 2>> matrixC [[buffer(2)]])\n{\n    // ...\n}"
        },
        {
          "title": "Declare an inline MXFP8 tensor on the stack",
          "language": "objectivec",
          "startTimeSeconds": 411,
          "code": "// Type aliases for a MXFP8 multi-plane tensor inline\n\n#include <metal_tensor>\n\nusing namespace metal;\n\nusing scales_plane = tensor_blockwise<tensor_plane_scales,\n                                      device metal_fp8_ue8m0_format,\n                                      32, 1>;\n\nusing mxfp8_tensor_inline = tensor<device metal_fp8_e4m3_format,\n                                   dextents<int, 2>,\n                                   tensor_inline,\n                                   scales_plane>;\n\n// Construct tensor on the stack from buffer pointers\nmxfp8_tensor_inline matrixA(dataBufferA,\n                             dextents<int, 2>(K, M),\n                             array<int, 2>({ 1, K }),\n                             scales_plane(scalesBufferA));"
        },
        {
          "title": "Slice tensors and run a quantized matmul",
          "language": "objectivec",
          "startTimeSeconds": 439,
          "code": "// Slice the tensors to extract the relevant tile\nauto tA = matrixA.slice(0, tgid.y * TILEM);\nauto tB = matrixB.slice(tgid.x * TILEN, 0);\nauto tC = matrixC.slice(tgid.x * TILEN, tgid.y * TILEM);\n\n// Set up the matmul descriptor\nconstexpr auto descriptor = matmul2d_descriptor(TILEM,                  // M\n                                                TILEN,                  // N\n                                                dynamic_length_v<int>,  // K\n                                                false,   // Left matrix transposed\n                                                false);  // Right matrix transposed\n\nmatmul2d<descriptor, execution_simdgroups<4>> op;\n\n// Run the op — TensorOps handles dequantization automatically\nop.run(tA, tB, tC);"
        },
        {
          "title": "Set up simdgroup-scoped QxK multiplication",
          "language": "objectivec",
          "startTimeSeconds": 627,
          "code": "// Setup QxK matrix multiplication op\nconstexpr auto mul_qk_op_desc = matmul2d_descriptor(/* ... */);\nmatmul2d<mul_qk_op_desc, execution_simdgroups> mul_qk_op;\n\n// Slice Q, K, V\nauto tQSlice = tQ.slice<D, ROWS_PER_SIMD>(0, sgid * ROWS_PER_SIMD);\nauto tKSlice = tK.slice<D, BK>(0, k);\nauto tVSlice = tV.slice<D, BK>(0, k);\n\n// Create cooperative tensor to store tile of QxK\nauto ctQK = mul_qk_op.get_destination_cooperative_tensor<decltype(tQSlice),\n                                                         decltype(tKSlice),\n                                                         float>();\n\n// Multiply QxK\nmul_qk_op.run(tQSlice, tKSlice, ctQK);"
        },
        {
          "title": "Compute row-wise reduction for SoftMax",
          "language": "objectivec",
          "startTimeSeconds": 678,
          "code": "// Create a cooperative tensor to store row reduction output\nauto ctTileRowMax = mul_qk_op.get_row_reduction_destination_cooperative_tensor<\n                        decltype(tQSlice),\n                        decltype(tKSlice),\n                        float>();\n\n// Compute max over each row of QxK tile\nreduce_rows(ctQK, ctTileRowMax, reduction_operation::max, -INFINITY);"
        },
        {
          "title": "Compute element-wise SoftMax with map_iterator",
          "language": "objectivec",
          "startTimeSeconds": 716,
          "code": "// Iterate over elements of QxK tile\n#pragma clang loop unroll(full)\nfor (auto it = ctQK.begin(); it != ctQK.end(); it++) {\n    // Fetch row max corresponding to this element\n    auto row_it = ctRowMax.map_iterator(it);\n\n    // Subtract row max from each element and compute exponent\n    *it = exp(*it - *row_it);\n}"
        },
        {
          "title": "Reuse cooperative tensor as matmul input",
          "language": "objectivec",
          "startTimeSeconds": 753,
          "code": "constexpr auto mul_sv_op_desc = matmul2d_descriptor(/* ... */);\nmatmul2d<mul_sv_op_desc, metal::execution_simdgroup> mul_sv_op;\n\nif (mul_sv_op.is_compatible_as_left_input<float, half, float>(ctQK)) {\n    // Directly reuse cooperative tensor as input\n    auto ctQKIn = mul_sv_op.get_left_input_cooperative_tensor<float, half, float>(ctQK);\n    mul_sv_op.run(ctQKIn, tVSlice, ctO);\n} else {\n    // Store and reload through threadgroup memory if layout is not compatible\n    ctQK.store(tgTensor);\n    simdgroup_barrier(mem_flags::mem_threadgroup);\n\n    auto ctQKIn = mul_sv_op.get_left_input_cooperative_tensor<float, half, float>();\n    ctQKIn.load(tgTensor);\n    mul_sv_op.run(ctQKIn, tVSlice, ctO);\n}"
        }
      ],
      "resources": [
        {
          "title": "Running inline ML operations in a shader with Metal 4",
          "url": "https://developer.apple.com/documentation/Metal/running-inline-ml-operations-in-a-shader-with-metal-4",
          "type": "samplecode",
          "description": "Multiply matrices across multiple GPU cores with inline tensor operations.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/running-inline-ml-operations-in-a-shader-with-metal-4",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/running-inline-ml-operations-in-a-shader-with-metal-4.json"
        },
        {
          "title": "Machine learning passes",
          "url": "https://developer.apple.com/documentation/Metal/machine-learning-passes",
          "type": "documentation",
          "description": "Add machine learning model inference to your Metal app’s GPU workflow.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/machine-learning-passes",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/machine-learning-passes.json"
        },
        {
          "title": "Download the Metal Performance Primitives (MPP) Programming Guide",
          "url": "https://developer.apple.com/download/files/Metal-Performance-Primitives-Programming-Guide.pdf",
          "type": "download",
          "description": null,
          "sosumiURL": "https://sosumi.ai/download/files/Metal-Performance-Primitives-Programming-Guide.pdf"
        },
        {
          "title": "Metal Performance Shaders",
          "url": "https://developer.apple.com/documentation/MetalPerformanceShaders",
          "type": "documentation",
          "description": "Optimize graphics and compute performance with kernels that are fine-tuned for the unique characteristics of each Metal GPU family.",
          "sosumiURL": "https://sosumi.ai/documentation/MetalPerformanceShaders",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/MetalPerformanceShaders.json"
        }
      ],
      "path": "sessions/wwdc2026/330-optimize-custom-machine-learning-operations-with-metal-tenso/",
      "files": {
        "metadata": "sessions/wwdc2026/330-optimize-custom-machine-learning-operations-with-metal-tenso/metadata.json",
        "readme": "sessions/wwdc2026/330-optimize-custom-machine-learning-operations-with-metal-tenso/README.md",
        "transcript": "sessions/wwdc2026/330-optimize-custom-machine-learning-operations-with-metal-tenso/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/330-optimize-custom-machine-learning-operations-with-metal-tenso/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-334",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 334,
      "title": "Build AI-powered scripts with the fm CLI and Python SDK",
      "description": "Explore all the new ways to leverage Apple Foundation Models on macOS. The Foundation Models SDK for Python lets you integrate with popular tooling and evaluation packages in the Python ecosystem. Find out how to use the brand new fm command introduced in macOS 27 to streamline scripting, automate model workflows, and accelerate your development process.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/334",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/334",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [
        "ai",
        "machine learning"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 996,
      "hasTranscript": true,
      "transcriptWordCount": 2605,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/334/4/65b71eea-f323-4f86-9096-889b6da91bdd/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/334/4/65b71eea-f323-4f86-9096-889b6da91bdd/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/334/4/65b71eea-f323-4f86-9096-889b6da91bdd/downloads/wwdc2026-334_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/334/4/65b71eea-f323-4f86-9096-889b6da91bdd/downloads/wwdc2026-334_hd.mp4",
        "duration": 996
      },
      "codeSnippets": [
        {
          "title": "Prompt the on-device model with fm respond",
          "language": "bash",
          "startTimeSeconds": 307,
          "code": "$ fm respond \"Provide a basic regex in Swift to parse an email address\"\n# Here is a basic regex to parse an email address in Swift: [...]\n\n$ fm respond \"Provide a comprehensive regex in Swift to parse an email address\" --model pcc\n# [...] Here's a robust Swift implementation using 'NSRegularExpression' to validate a typical email address:\n\n$ fm respond \"What app is the user using in this screenshot?\" --model pcc \\\n\t--image Screenshot.png\n# The user is using the Mail app.\n\n$ fm schema object --name AppsIdentified --string app_names --array > schema.json \n$ fm respond \"What apps are the user actively using in this screenshot?\" \\\n\t--image Screenshot.png --model pcc --schema schema.json\n# {\"app_names\": [\"Messages\", \"Mail\", \"Calendar\"]}\n\n$ fm respond --help"
        },
        {
          "title": "Sort files with fm respond and a schema",
          "language": "bash",
          "startTimeSeconds": 475,
          "code": "fm schema object --name \"TriagedFileList\" \\\n    --string 'final_files' --array \\\n    --string 'draft_files' --array > /tmp/schema.json\n\noutput=$(fm respond \\\n    --instructions \"I just completed a project, and I need help triaging the latest version of the files from the previous versions. I will give you a list of files. Return a list of the latest files (i.e., all files that, you can infer from their name in the list, are the latest versions), and then return separately a list of all draft files (i.e., all files that weren't considered final).\" \\\n    \"This is the list of all files:\\n\\n${files_list}\" \\\n    --schema /tmp/schema.json\n)\n\necho \"${output}\" | jq -r '.final_files[]' | while read -r file; do\n    cp \"${DIRECTORY_TO_TRIAGE}/${file}\" \"${FINAL_FILES_STORAGE_DIRECTORY}\"\ndone\n\necho \"${output}\" | jq -r '.draft_files[]' | while read -r file; do\n    mv \"${DIRECTORY_TO_TRIAGE}/${file}\" \"${DRAFT_FILES_STORAGE_DIRECTORY}\"\ndone"
        },
        {
          "title": "Install the Foundation Models Python SDK",
          "language": "bash",
          "startTimeSeconds": 534,
          "code": "pip install apple_fm_sdk"
        },
        {
          "title": "Create a session and respond to a prompt",
          "language": "python",
          "startTimeSeconds": 600,
          "code": "import apple_fm_sdk as fm\n\nINSTRUCTIONS = \"You're an AI assistant for Cupertino Mart, a grocery store with in-app ordering.\"\n\nasync def answer_question(prompt: str) -> str:\n\tsession = fm.LanguageModelSession(instructions=INSTRUCTIONS)\n  return await session.respond(prompt)"
        },
        {
          "title": "Define a Tool for the language model",
          "language": "python",
          "startTimeSeconds": 621,
          "code": "class GetPastOrdersTool(fm.Tool):\n  name = \"get_past_orders\"\n  description = \"Retrieves information about this user's past orders.\"\n\n  @fm.generable(\"Past orders query parameter\")\n  class Arguments:\n  \tnumber_orders: str = fm.guide(\"How many of the last orders to retrieve\")\n\n  @property\n  def arguments_schema(self) -> fm.GenerationSchema:\n  \treturn self.Arguments.generation_schema()\n\nasync def call(self, args: fm.GeneratedContent) -> str:\n\tnumber_orders = args.value(int, for_property=\"number_orders\")\n  return await Orders.load_last_orders(user_id=user_id, amount=number_orders)"
        },
        {
          "title": "Generate structured output with @fm.generable",
          "language": "python",
          "startTimeSeconds": 635,
          "code": "@fm.generable(\"Suggested items\")\nclass ItemsSuggestion:\n\titem_names: list[str] = fm.guide(\"Names of the suggested items\")\n\nINSTRUCTIONS = \"You're an AI assistant tasked with returning potential grocery items that the user might be interested in.\"\n\nasync def generate_suggested_cart_items(user_input: Optional[str]) -> ItemsSuggestion:\n\tsession = fm.LanguageModelSession(instructions=INSTRUCTIONS, tools=load_tools())\n\tprompt = \"\"\"Using the tools to load the user's previous orders, \\\n              return a list of items the user has already ordered \\\n              and that they might be interested in again \\\n              as they're getting ready to place a new grocery order.\"\"\"\n\tif user_input is not None:\n    prompt += f\"\\nAccount for the following request from the user: {user_input}\"\n    return await session.respond(prompt, generating=ItemsSuggestion)"
        }
      ],
      "resources": [
        {
          "title": "Foundation Models SDK for Python on GitHub",
          "url": "https://github.com/apple/python-apple-fm-sdk",
          "type": "documentation",
          "description": null
        },
        {
          "title": "Foundation Models SDK for Python Documentation on GitHub",
          "url": "https://apple.github.io/python-apple-fm-sdk/",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/334-build-ai-powered-scripts-with-the-fm-cli-and-python-sdk/",
      "files": {
        "metadata": "sessions/wwdc2026/334-build-ai-powered-scripts-with-the-fm-cli-and-python-sdk/metadata.json",
        "readme": "sessions/wwdc2026/334-build-ai-powered-scripts-with-the-fm-cli-and-python-sdk/README.md",
        "transcript": "sessions/wwdc2026/334-build-ai-powered-scripts-with-the-fm-cli-and-python-sdk/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/334-build-ai-powered-scripts-with-the-fm-cli-and-python-sdk/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-335",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 335,
      "title": "Improve your prompts by hill-climbing with Evaluations",
      "description": "Learn comparative evaluation techniques to guide your prompt engineering and select the right model for your app. Explore how to baseline performance, expand your evaluation strategy, and convert results to JSON for integration with other tools. Discover when to apply different prompting strategies and how to iteratively refine prompts for best results.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/335",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/335",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning",
        "testing",
        "xcode"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1601,
      "hasTranscript": true,
      "transcriptWordCount": 4175,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/335/4/a464d330-6aa2-456d-9a07-eae997aef08c/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/335/4/a464d330-6aa2-456d-9a07-eae997aef08c/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/335/4/a464d330-6aa2-456d-9a07-eae997aef08c/downloads/wwdc2026-335_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/335/4/a464d330-6aa2-456d-9a07-eae997aef08c/downloads/wwdc2026-335_hd.mp4",
        "duration": 1601
      },
      "codeSnippets": [
        {
          "title": "The BookTaggingEvaluation",
          "language": "swift",
          "startTimeSeconds": 234,
          "code": "// MARK: - Evaluation\n  struct BookTaggingEvaluation: Evaluation {\n      func subject(from sample: ModelSample<BookTags>) async throws -> ModelSubject<BookTags> {\n          let result = try await BookTaggingService.generateTags(for: sample.promptDescription)\n          return ModelSubject(value: result)\n      }\n\n      // MARK: - Dataset\n      var dataset = ArrayLoader(samples:\n          Book.sampleBooks.map { book in\n              ModelSample(prompt: book.review, expected: BookTags(tags: book.tags))\n          }\n      )\n\n      // MARK: - Evaluators & Metrics\n      var tagCount = Metric(\"Tag Count\")\n      let hasGenreTag = Metric(\"Has Genre Tag\")\n      let noDuplicates = Metric(\"No Duplicates\")\n\n      let relevance = ScoreDimension(\n          \"Relevance\",\n          description: \"\"\"\n              Whether each tag describes a quality, theme, or tone of the\n              book itself rather than incidental details or the reader's\n              personal reactions.\n              \"\"\",\n          scale: .numeric([\n              4: \"Every tag describes the book itself\",\n              3: \"Most tags describe the book, one picks up a reader reaction or minor detail\",\n              2: \"Most tags are surface details or personal reactions, not book descriptors\",\n              1: \"Tags don't meaningfully describe the book\"\n          ])\n      )\n\n      let usefulness = ScoreDimension(\n          \"Usefulness\",\n          description: \"\"\"\n              Whether tags are at the right granularity for browsing — broad\n              enough that multiple books could share the tag, specific enough\n              to help filter.\n              \"\"\",\n          scale: .numeric([\n              4: \"Every tag could group multiple books while still narrowing a search\",\n              3: \"Most tags are at the right level, one is either too broad or too narrow\",\n              2: \"Most tags are too broad to filter or too narrow to group\",\n              1: \"Tags would not help with browsing\"\n          ])\n      )\n\n      var evaluators: Evaluators {\n          // 1. Tag count is within the required 3–8 range\n          Evaluator { _, subject in\n              let count = subject.value.tags.count\n              if (count >= 3 && count <= 8) {\n                  return tagCount.passing(rationale: \"\\(count) tags\")\n              }\n              return tagCount.failing(rationale: \"Got \\(count) tags, expected 3–8\")\n          }\n\n          // 2. At least one tag identifies the genre or literary form\n          Evaluator { _, subject in\n              let tags = subject.value.tags.map { $0.lowercased() }\n              let knownGenres = await BookTaggingService.knownGenres\n              for tag in tags {\n                  if knownGenres.contains(tag) {\n                      return hasGenreTag.passing(rationale: \"Matched \\(tag)\")\n                  }\n              }\n              return hasGenreTag.failing()\n          }\n\n          // 3. No duplicate tags\n          Evaluator { _, subject in\n              let uniqueCount = Set(subject.value.tags.map { $0.lowercased() }).count\n              if (subject.value.tags.count - uniqueCount) > 0 {\n                  return noDuplicates.failing(rationale: \"Found \\(subject.value.tags.count - uniqueCount) duplicates\")\n              }\n              return noDuplicates.passing()\n          }\n\n          // 4. Overall tag quality — groundedness, coverage, specificity\n          ModelJudgeEvaluator(\n              judge: .default,\n              dimensions: [relevance, usefulness],\n              prompt: ModelJudgePrompt(\n                  instructions: \"\"\"\n                      You are evaluating automatically generated tags for Shelf, a personal\n                      book tracking app. Users write a short summary of their reading\n                      experience, and the app generates tags to make their library browsable.\n                      A good tag describes the book itself — its genre, themes, tone, or\n                      setting. A bad tag picks up incidental details or the reader's personal\n                      reactions that don't describe the book.\n                      \"\"\",\n                  evaluationTarget: { output in output.tags.joined(separator: \", \") },\n                  reference: { input, _ in\n                      [\"Expected Tags\": input.expected?.tags.joined(separator: \", \") ?? \"\"]\n                  }\n              )\n          )\n      }\n\n      // MARK: - Analysis\n      func aggregateMetrics(using aggregator: inout MetricsAggregator) {\n          aggregator.group(\"Heuristics\") { group in\n              group.computeMean(of: tagCount)\n              group.computeMean(of: hasGenreTag)\n              group.computeMean(of: noDuplicates)\n          }\n          aggregator.group(\"Quality\") { group in\n              group.computeMean(of: relevance.metric)\n              group.computeMean(of: usefulness.metric)\n          }\n      }\n  }"
        },
        {
          "title": "Refined Relevance & Usefulness score dimensions",
          "language": "swift",
          "startTimeSeconds": 245,
          "code": "let relevance = ScoreDimension(\n      \"Relevance\",\n      description: \"\"\"\n          Whether each tag describes the book itself — its genre, themes,\n          tone, or setting — rather than the reader's reactions, meta-\n          commentary about the review, or facts about the author. A book\n          can be \"suspenseful\" (a property of the text); a reader is\n          \"exhausted\" (a reaction). Mis-labeling the genre is a serious failure.\n          \"\"\",\n      scale: .numeric([\n          4: \"Every tag describes the book itself\",\n          3: \"Most tags describe the book, one picks up a reader reaction or minor detail\",\n          2: \"Most tags are surface details or personal reactions, not book descriptors\",\n          1: \"Tags don't meaningfully describe the book\"\n      ])\n  )\n\n  let usefulness = ScoreDimension(\n      \"Usefulness\",\n      description: \"\"\"\n          Whether tags work as library shelf labels — broad enough that\n          several books could plausibly share the tag, specific enough to\n          meaningfully narrow a search. Standard genre and theme tags work;\n          made-up phrases, character names, hyper-specific descriptors, and\n          overly generic words like \"interesting\" don't.\n          \"\"\",\n      scale: .numeric([\n          4: \"Every tag could group multiple books while still narrowing a search\",\n          3: \"Most tags are at the right level, one is either too broad or too narrow\",\n          2: \"Most tags are too broad to filter or too narrow to group\",\n          1: \"Tags would not help with browsing\"\n      ])\n  )"
        },
        {
          "title": "The alignment dataset, extracted to JSON",
          "language": "swift",
          "startTimeSeconds": 716,
          "code": "// Model judge alignment dataset\n  [\n    {\n      \"input\": \"I have read this book more times than I can count…\",\n      \"response\": \"[\\\"literary-fiction\\\", \\\"historical-fiction\\\", \\\"family-drama\\\", \\\"romantic-drama\\\", \n  \\\"character-driven\\\", \\\"emotional-intensity\\\", \\\"multigenerational-narrative\\\", \\\"penned-by-a-woman\\\"]\"\n    }\n    // ... add your expert ratings to each entry\n  ]"
        },
        {
          "title": "The judge alignment evaluation: dataset, subject, evaluator",
          "language": "swift",
          "startTimeSeconds": 751,
          "code": "// Model judge alignment evaluation\n  struct BookTagJudgmentCalibration: Evaluation {\n\n      // MARK: Dataset — load the extracted summary/tag pairs\n      static let samples: [ModelSample<BookTagJudgmentValue>] = {\n          guard let url = Bundle(for: BundleToken.self).url(\n                  forResource: \"BookTaggingEvaluation-extracted\", withExtension: \"json\"),\n                let data = try? Data(contentsOf: url) else { return [] }\n          // Build ModelSample array (adding expert ratings)\n          // ...\n      }()\n\n      var dataset: some Loader { ArrayLoader(samples: Self.samples) }\n\n      // MARK: Capture Subject — tags are already generated, so just return them\n      func subject(from sample: ModelSample<BookTagJudgmentValue>) async throws -> ModelSubject<BookTagJudgmentValue> {\n          ModelSubject(value: sample.expected ?? BookTagJudgmentValue(\n              tags: [], expertRelevanceScore: 0, expertUsefulnessScore: 0))\n      }\n\n      // MARK: Evaluators — the same model judge as the book-tags evaluation\n      var evaluators: Evaluators {\n          ModelJudgeEvaluator(\n              judge: .default,\n              dimensions: [relevance, usefulness],\n              prompt: ModelJudgePrompt(\n                  instructions: \"You are evaluating automatically generated tags for Book Tracker…\",\n                  evaluationTarget: { output in output.tags.joined(separator: \", \") },\n                  reference: { input, _ in\n                      [\"Expected Tags\": input.expected?.tags.joined(separator: \", \") ?? \"\"]\n                  }\n              )\n          )\n      }\n  }"
        },
        {
          "title": "Cohen's kappa aggregation",
          "language": "swift",
          "startTimeSeconds": 780,
          "code": "func aggregateMetrics(using aggregator: inout MetricsAggregator) {\n      let expertRelevance = Self.samples.map { Double($0.expected?.expertRelevanceScore ?? 0) }\n      let expertUsefulness = Self.samples.map { Double($0.expected?.expertUsefulnessScore ?? 0) }\n\n      aggregator.group(\"Relevance\") { group in\n          group.computeMean(of: relevance.metric)\n          group.computeStandardDeviation(of: relevance.metric)\n          group.custom(of: relevance.metric, label: \"Relevance Alignment Score\") { judge in\n              cohensKappa(ratings1: expertRelevance, ratings2: judge) ?? 0\n          }\n      }\n      aggregator.group(\"Usefulness\") { group in\n          group.computeMean(of: usefulness.metric)\n          group.computeStandardDeviation(of: usefulness.metric)\n          group.custom(of: usefulness.metric, label: \"Usefulness Alignment Score\") { judge in\n              cohensKappa(ratings1: expertUsefulness, ratings2: judge) ?? 0\n          }\n      }\n  }"
        },
        {
          "title": "The judge calibration test",
          "language": "swift",
          "startTimeSeconds": 804,
          "code": "// Model judge alignment tests\n  @Suite(\"Book Tag Judge Calibration\")\n  struct BookTagJudgmentCalibrationTests {\n      static let evaluation = BookTagJudgmentCalibration()\n\n      @Test(\"Judge Calibration\", .evaluates(evaluation))\n      func evaluateJudgeCalibration() async throws {\n          let result = EvaluationContext.current.result\n\n          let usefulnessMetric = BookTagJudgmentCalibrationTests.evaluation.usefulness.metric\n          let relevanceMetric = BookTagJudgmentCalibrationTests.evaluation.relevance.metric\n\n          #expect(result.aggregateValue(.custom(label: \"Relevance: Judge vs Expert\")) > 0.6)\n          #expect(result.aggregateValue(.custom(label: \"Usefulness: Judge vs Expert\")) > 0.6)\n      }\n  }"
        },
        {
          "title": "The experimental judge prompt",
          "language": "swift",
          "startTimeSeconds": 993,
          "code": "// Experimental evaluation\n  struct BookTagJudgmentCalibrationExperimental: Evaluation {\n      var evaluators: Evaluators {\n          ModelJudgeEvaluator(\n              judge: .default,\n              dimensions: [relevance, usefulness],\n              prompt: ModelJudgePrompt(\n                  instructions: \"\"\"\n                      You are an experienced reader and librarian evaluating tags\n                      automatically generated for Book Tracker... Score the tag set on two\n                      independent dimensions: Relevance and Usefulness.\n\n                      ## What a good tag looks like\n                      - Genre/form, theme/subject, tone/atmosphere, setting/era\n\n                      ## Common failure modes\n                      - Reader reactions, meta-commentary, author facts, genre contradictions\n                      \"\"\",   // ← full prompt is ~40 lines; abbreviated here\n                  evaluationTarget: { output in output.tags.joined(separator: \", \") },\n                  reference: { input, _ in\n                      [\"Book Review\": input.promptDescription,\n                       \"Tags Generated for the Review\": input.expected?.tags.joined(separator: \", \") ?? \"\"]\n                  }\n              )\n          )\n      }\n  }"
        },
        {
          "title": "Few-shot worked examples in the judge prompt",
          "language": "swift",
          "startTimeSeconds": 1212,
          "code": "struct ExperimentalBookTagJudgmentCalibration: Evaluation {\n      var evaluators: Evaluators {\n          ModelJudgeEvaluator(\n              judge: SystemLanguageModel(),\n              dimensions: [relevance, usefulness],\n              prompt: ModelJudgePrompt(\n                  instructions: \"\"\"\n                      You are calibrating with an expert librarian who scores\n                      automatically generated tags for Book Tracker... Your goal is to\n                      match how the librarian scores. Use the worked examples to calibrate.\n\n                      ## Worked examples\n                      ### Example A — clean fit (Pride and Prejudice)\n                      Tags: romance, historical-fiction, love, redemption, passion\n                      Librarian: Relevance 4, Usefulness 4\n\n                      ### Example E — flat genre contradiction (Frankenstein)\n                      Tags: horror, science-fiction, ... self-help, self-improvement\n                      Librarian: Relevance 2, Usefulness 3\n                      ... (6 examples A–F; keep the set small to avoid overfitting)\n                      \"\"\",   // ← full prompt is ~60 lines; abbreviated here\n                  evaluationTarget: { output in output.tags.joined(separator: \", \") },\n                  reference: { input, _ in\n                      [\"Book Review\": input.promptDescription,\n                       \"Tags Generated for the Review\": input.expected?.tags.joined(separator: \", \") ?? \"\"]\n                  }\n              )\n          )\n      }\n  }\n\n  9. The BookLookupTool — slides 166–167"
        },
        {
          "title": "The BookLookupTool",
          "language": "swift",
          "startTimeSeconds": 1323,
          "code": "// Book Information Lookup Tool\n  struct BookLookupTool: Tool {\n      let name = \"lookupBook\"\n      let description = \"Looks up the title and author of a book given distinguishing details — such as character names, \n  settings, quoted lines, or notable plot points — extracted from a reader's review.\"\n\n      @Generable\n      struct Arguments {\n          @Guide(description: \"Distinguishing details from the review that identify the book, such as character names, \n  settings, quoted lines, or notable plot points.\")\n          var details: String\n      }\n\n      @Generable\n      struct Output {\n          @Guide(description: \"The title of the identified book, or an empty string if no match was found.\")\n          var title: String\n\n          @Guide(description: \"The author of the identified book, or an empty string if no match was found.\")\n          var author: String\n      }\n\n      func call(arguments: Arguments) async throws -> Output {\n          let needles = arguments.details\n              .lowercased()\n              .split(whereSeparator: { !$0.isLetter && !$0.isNumber })\n              .map(String.init)\n              .filter { $0.count >= 4 }\n\n          let best = Book.sampleBooks\n              .map { book -> (book: Book, score: Int) in\n                  let review = book.review.lowercased()\n                  let score = needles.reduce(0) { partial, needle in\n                      partial + (review.contains(needle) ? 1 : 0)\n                  }\n                  return (book, score)\n              }\n              .max(by: { $0.score < $1.score })\n\n          guard let match = best, match.score > 0 else {\n              return Output(title: \"\", author: \"\")\n          }\n          return Output(title: match.book.title, author: match.book.author)\n      }\n  }"
        },
        {
          "title": "BookTaggingService with a tools parameter",
          "language": "swift",
          "startTimeSeconds": 1356,
          "code": "// Book Tagging Service\n  struct BookTaggingService {\n      static func generateTags(for review: String, tools: [any Tool] = []) async throws -> BookTags {\n          let prompt = tagsPrompt(review: review)\n          let session = LanguageModelSession(\n              model: SystemLanguageModel(guardrails: .permissiveContentTransformations),\n              tools: tools,\n              instructions: instructions\n          )\n          let response = try await session.respond(to: prompt, generating: BookTags.self)\n          return response.content\n      }\n  }"
        },
        {
          "title": "Evaluation with the lookup tool",
          "language": "swift",
          "startTimeSeconds": 1377,
          "code": "// Evaluation of tags with tool\n  struct BookTaggingWithLookupEvaluation: Evaluation {\n      func subject(from sample: ModelSample<BookTags>) async throws -> ModelSubject<BookTags> {\n          let result = try await BookTaggingService.generateTags(\n              for: sample.promptDescription,\n              tools: [BookLookupTool()]\n          )\n          return ModelSubject(value: result)\n      }\n      // ... same dataset, evaluators, and aggregation as BookTaggingEvaluation\n  }"
        },
        {
          "title": "Compare with/without the tool in one suite",
          "language": "swift",
          "startTimeSeconds": 1389,
          "code": "@Suite(\"Book Tag Evaluations\")\n  struct BookTagEvaluationTests {\n      static let evaluation = BookTaggingEvaluation()\n      static let lookupEvaluation = BookTaggingWithLookupEvaluation()\n\n      @Test(\"Book Tag Evaluations\", .evaluates(evaluation, info: evaluationInfo))\n      func evaluateBookTagging() async throws {\n          let result = EvaluationContext.current.result\n          let rangeMetric = BookTagEvaluationTests.evaluation.tagCount\n          let dupeMetric = BookTagEvaluationTests.evaluation.noDuplicates\n          #expect(result.aggregateValue(.mean(of: rangeMetric)) >= 0.8)\n          #expect(result.aggregateValue(.mean(of: dupeMetric)) == 1)\n      }\n\n      @Test(\"Book Tag Evaluations (with BookLookupTool)\", .evaluates(lookupEvaluation, info: lookupEvaluationInfo))\n      func evaluateBookTaggingWithLookup() async throws {\n          let result = EvaluationContext.current.result\n          let rangeMetric = BookTagEvaluationTests.lookupEvaluation.tagCount\n          let dupeMetric = BookTagEvaluationTests.lookupEvaluation.noDuplicates\n          #expect(result.aggregateValue(.mean(of: rangeMetric)) >= 0.8)\n          #expect(result.aggregateValue(.mean(of: dupeMetric)) == 1)\n      }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Book Tracker: Using Evaluations to evaluate an intelligent feature",
          "url": "https://developer.apple.com/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "type": "samplecode",
          "description": "Measure and improve the quality of your app’s intelligence-powered features using the Evaluations framework.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/book-tracker-using-evaluations-to-evaluate-an-intelligent-feature.json"
        },
        {
          "title": "Designing effective model-as-judge evaluators",
          "url": "https://developer.apple.com/documentation/Evaluations/designing-effective-model-judges",
          "type": "documentation",
          "description": "Configure model-as-judge evaluators that produce scores you correlate",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/designing-effective-model-judges",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/designing-effective-model-judges.json"
        },
        {
          "title": "Designing specific, measurable criteria in an evaluation suite",
          "url": "https://developer.apple.com/documentation/Evaluations/designing-evaluation-criteria",
          "type": "documentation",
          "description": "Define quality for your feature by choosing measurable",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations/designing-evaluation-criteria",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations/designing-evaluation-criteria.json"
        }
      ],
      "path": "sessions/wwdc2026/335-improve-your-prompts-by-hill-climbing-with-evaluations/",
      "files": {
        "metadata": "sessions/wwdc2026/335-improve-your-prompts-by-hill-climbing-with-evaluations/metadata.json",
        "readme": "sessions/wwdc2026/335-improve-your-prompts-by-hill-climbing-with-evaluations/README.md",
        "transcript": "sessions/wwdc2026/335-improve-your-prompts-by-hill-climbing-with-evaluations/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/335-improve-your-prompts-by-hill-climbing-with-evaluations/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-338",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 338,
      "title": "Build live production tools for Apple Immersive Video",
      "description": "Go behind the scenes of live Apple Immersive Video production. Discover how to package immersive video, spatial audio, and scene metadata for transport over IP networks using the SMPTE 2110 standard. Harness Apple’s Immersive Media Support, Video Toolbox, and AVFoundation frameworks to power real-time Apple Immersive Video workflows. To get the most out of this session, watch “Learn about Apple Immersive Video technologies” from WWDC25.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/338",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/338",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS",
        "visionOS"
      ],
      "keywords": [],
      "topics": [
        "Spatial Computing",
        "Audio & Video"
      ],
      "primaryTopic": "Audio & Video",
      "duration": 983,
      "hasTranscript": true,
      "transcriptWordCount": 2314,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/338/5/4549be24-44c7-4214-ab9b-f21f9ed04691/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/338/5/4549be24-44c7-4214-ab9b-f21f9ed04691/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/338/5/4549be24-44c7-4214-ab9b-f21f9ed04691/downloads/wwdc2026-338_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/338/5/4549be24-44c7-4214-ab9b-f21f9ed04691/downloads/wwdc2026-338_hd.mp4",
        "duration": 983
      },
      "codeSnippets": [
        {
          "title": "Set compression properties for vexu metadata",
          "language": "swift",
          "startTimeSeconds": 797,
          "code": "import VideoToolbox\n\nlet compressionProperties: [String: Any] = [\n    // ...\n    kVTCompressionPropertyKey_ProjectionKind as String: kVTProjectionKind_AppleImmersiveVideo\n    // ...\n]"
        }
      ],
      "resources": [
        {
          "title": "kVTCompressionPropertyKey_ProjectionKind",
          "url": "https://developer.apple.com/documentation/VideoToolbox/kVTCompressionPropertyKey_ProjectionKind",
          "type": "documentation",
          "description": "A value that indicates the projection kind.",
          "sosumiURL": "https://sosumi.ai/documentation/VideoToolbox/kVTCompressionPropertyKey_ProjectionKind",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/VideoToolbox/kVTCompressionPropertyKey_ProjectionKind.json"
        },
        {
          "title": "CMVideoCodecType",
          "url": "https://developer.apple.com/documentation/CoreMedia/CMVideoCodecType",
          "type": "documentation",
          "description": "A video codec type.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreMedia/CMVideoCodecType",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreMedia/CMVideoCodecType.json"
        },
        {
          "title": "Apple ProRes RAW White Paper",
          "url": "https://www.apple.com/final-cut-pro/docs/Apple_ProRes_RAW.pdf",
          "type": "documentation",
          "description": null
        },
        {
          "title": "Apple ProRes White Paper",
          "url": "https://www.apple.com/final-cut-pro/docs/Apple_ProRes.pdf",
          "type": "documentation",
          "description": null
        },
        {
          "title": "Immersive Media Support",
          "url": "https://developer.apple.com/documentation/ImmersiveMediaSupport",
          "type": "documentation",
          "description": "Read and write essential Apple Immersive Video metadata.",
          "sosumiURL": "https://sosumi.ai/documentation/ImmersiveMediaSupport",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/ImmersiveMediaSupport.json"
        }
      ],
      "path": "sessions/wwdc2026/338-build-live-production-tools-for-apple-immersive-video/",
      "files": {
        "metadata": "sessions/wwdc2026/338-build-live-production-tools-for-apple-immersive-video/metadata.json",
        "readme": "sessions/wwdc2026/338-build-live-production-tools-for-apple-immersive-video/README.md",
        "transcript": "sessions/wwdc2026/338-build-live-production-tools-for-apple-immersive-video/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/338-build-live-production-tools-for-apple-immersive-video/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-339",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 339,
      "title": "Bring an LLM provider to the Foundation Models framework",
      "description": "Extend the Foundation Models framework by implementing a LanguageModelExecutor for new models. Explore how to interface with the LanguageModelSession’s transcript, manage session state effectively, and optimize KV cache utilization. Find out how to support custom segment types and unlock advanced capabilities for your generative AI features.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/339",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/339",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "machine learning"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1241,
      "hasTranscript": true,
      "transcriptWordCount": 3146,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/339/4/334f1ee9-4263-4c86-9b10-632f0f2edab1/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/339/4/334f1ee9-4263-4c86-9b10-632f0f2edab1/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/339/4/334f1ee9-4263-4c86-9b10-632f0f2edab1/downloads/wwdc2026-339_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/339/4/334f1ee9-4263-4c86-9b10-632f0f2edab1/downloads/wwdc2026-339_hd.mp4",
        "duration": 1241
      },
      "codeSnippets": [
        {
          "title": "Choose a language model",
          "language": "swift",
          "startTimeSeconds": 120,
          "code": "import FoundationModels\nimport MLXFoundationModels\n\n// On-device Apple Foundation Model\nlet model = SystemLanguageModel()\n\n// Private Cloud Compute model\n// let model = PrivateCloudComputeLanguageModel()\n\n// Custom Core AI model\n// let model = try await CoreAILanguageModel(resourcesAt: modelURL)\n\n// Open-source MLX model from HuggingFace\n// let model = MLXLanguageModel(modelID: \"mlx-community/my-model\")\n\nlet session = LanguageModelSession(model: model)\nlet response = try await session.respond(to: \"...\")\nprint(response.content)"
        },
        {
          "title": "Configure Package.swift for your model package",
          "language": "swift",
          "startTimeSeconds": 226,
          "code": "// Package.swift\n\nlet package = Package(\n    name: \"MyModel\",\n    platforms: [\n        .macOS(.v27), .iOS(.v27), .visionOS(.v27), .watchOS(.v27)\n    ],\n    products: [\n        .library(name: \"MyModel\", targets: [\"MyModel\"])\n    ],\n    dependencies: [\n        .package(url: \"...\", .upToNextMinor(from: \"1.0.0\"))\n    ],\n    targets: [\n        .target(name: \"MyModelRuntime\"),\n        // public: LanguageModel conformance\n        .target(name: \"MyModel\", dependencies: [\"MyModelRuntime\"]),\n        .testTarget(name: \"MyModelTests\", dependencies: [\"MyModel\"])\n    ]\n)"
        },
        {
          "title": "LanguageModel and LanguageModelExecutor protocols",
          "language": "swift",
          "startTimeSeconds": 296,
          "code": "// LanguageModel protocol\n\npublic protocol LanguageModel: Sendable {\n    var capabilities: LanguageModelCapabilities { get }\n    var executorConfiguration: Executor.Configuration { get }\n}\n\n// LanguageModelExecutor protocol\n\npublic protocol LanguageModelExecutor: Sendable {\n    init(configuration: Configuration) throws\n    func prewarm(model: Model, transcript: Transcript)\n    func respond(\n        to request: LanguageModelExecutorGenerationRequest,\n        model: Model,\n        streamingInto channel: LanguageModelExecutorGenerationChannel\n    ) async throws\n}"
        },
        {
          "title": "Implement LanguageModel and Executor conformances",
          "language": "swift",
          "startTimeSeconds": 385,
          "code": "// LanguageModel conformance\npublic struct MyLanguageModel: LanguageModel {\n    typealias Executor = MyLanguageModelExecutor\n\n    public var capabilities: LanguageModelCapabilities {\n        LanguageModelCapabilities(capabilities: [\n            .toolCalling, .guidedGeneration, .reasoning\n        ])\n    }\n\n    public var executorConfiguration: Executor.Configuration {\n        Executor.Configuration(/* ... */)\n    }\n}\n\n// Executor conformance\npublic struct MyLanguageModelExecutor: LanguageModelExecutor {\n    public typealias Model = MyLanguageModel\n\n    public struct Configuration: Hashable, Sendable { /* ... */ }\n\n    public init(configuration: Configuration) throws { /* ... */ }\n\n    public func respond(\n        to request: LanguageModelExecutorGenerationRequest,\n        model: MyLanguageModel,\n        streamingInto channel: LanguageModelExecutorGenerationChannel\n    ) async throws { /* ... */ }\n}"
        },
        {
          "title": "Manage model resources with prewarm and respond",
          "language": "swift",
          "startTimeSeconds": 448,
          "code": "// One approach to managing resources\n\nstruct MyLanguageModelExecutor: LanguageModelExecutor {\n\n    private mutating func loadModelIfNeeded() throws -> LoadedWeights {\n        let weights = try loadedModel ?? loadWeights()\n        loadedModel = weights\n        return weights\n    }\n\n    func prewarm(transcript: Transcript) {\n        loadedModel = try? loadModelIfNeeded()\n    }\n\n    func respond( ... ) async throws {\n        let weights = try loadModelIfNeeded()\n        // ...generate with 'weights'...\n    }\n}"
        },
        {
          "title": "Map Transcript entries to model messages",
          "language": "swift",
          "startTimeSeconds": 540,
          "code": "// Transcript entries\n\nlet transcript = Transcript(entries: [\n    .instructions( ... ),  // \"You are a helpful assistant\"\n\n    .prompt( ... ),        // \"What's the weather in Pittsburgh?\"\n    .toolCalls( ... ),     // getWeather(location: \"Pittsburgh\")\n    .toolOutput( ... ),    // 65°F, sunny\n    .response( ... ),      // \"It's 65°F and sunny in Pittsburgh\"\n\n    .prompt( ... ),        // \"What's the address of Apple Park?\"\n    .response( ... ),      // \"One Apple Park Way, Cupertino, CA 95014\"\n])"
        },
        {
          "title": "Read generation and context options from the request",
          "language": "swift",
          "startTimeSeconds": 642,
          "code": "// Parse generation and context options\n\nfunc respond(\n    to request: LanguageModelExecutorGenerationRequest,\n    model: MyLanguageModel,\n    streamingInto channel: LanguageModelExecutorGenerationChannel\n) async throws {\n    let reasoningLevel = request.contextOptions.reasoningLevel\n    let temperature = request.generationOptions.temperature\n    let maxTokens = request.generationOptions.maximumResponseTokens\n}"
        },
        {
          "title": "Stream tokens and metadata through the channel",
          "language": "swift",
          "startTimeSeconds": 707,
          "code": "// Streaming text tokens\n\nfunc respond( ... ) async throws {\n    // 1. Report metadata\n    await channel.send(.response(action: .updateMetadata([\n        \"modelID\": \"my-model-2026-06-08\",\n        \"requestID\": request.id.uuidString\n    ])))\n    // 2. Report prompt token usage before generating\n    await channel.send(.response(action: .updateUsage(\n        input: .init(totalTokenCount: promptTokens, cachedTokenCount: cachedTokens),\n        output: .init(totalTokenCount: 0, reasoningTokenCount: 0)\n    )))\n    // 3. Stream text deltas as the model generates\n    for try await token in tokens {\n        await channel.send(.response(action: .appendText(token)))\n    }\n}"
        },
        {
          "title": "Honor the developer's intent or throw",
          "language": "swift",
          "startTimeSeconds": 813,
          "code": "// Honor the developer's intention where possible\n\n// The developer set sampling: .greedy, but our service only takes temperature\nif request.generationOptions.sampling?.kind == .greedy {\n    serviceRequest.temperature = 0\n}\n\n// Otherwise, throw an error\n\n// The token budget is too small to satisfy the schema\nif let schema = request.schema,\n   let budget = request.generationOptions.maximumResponseTokens,\n   budget < minimumTokens(for: schema) {\n    throw LanguageModelError.unsupportedCapability(\n        .init(\n            capability: .guidedGeneration,\n            debugDescription: \"Token budget too small to satisfy this schema.\"\n        )\n    )\n}"
        },
        {
          "title": "Built-in errors that any model can throw",
          "language": "swift",
          "startTimeSeconds": 837,
          "code": "// Built-in errors that any model can throw\n\npublic enum LanguageModelError: LocalizedError, CustomDebugStringConvertible {\n    // Transcript grew past the model's context window. Trim entries and retry.\n    case contextSizeExceeded(     )\n    // Too many requests in a short window. Space them out or reduce load.\n    case rateLimited(     )\n    // Model declined to answer. Fall back to a message of your choosing.\n    case refusal(     )\n    // Safety guardrails tripped on the prompt or the response.\n    case guardrailViolation(     )\n    // Model lacks a feature you used, such as guided generation or tools.\n    case unsupportedCapability(     )\n    // Prompt contains content the model can't process (bad files, unknown formats).\n    case unsupportedTranscriptContent(     )\n    // A generation guide (e.g., a regex pattern) isn't supported by this model.\n    case unsupportedGenerationGuide(     )\n    // Prompt asked for output in a language or locale the model doesn't support.\n    case unsupportedLanguageOrLocale(     )\n    // Request timed out before the model produced a response.\n    case timeout(     )\n}"
        },
        {
          "title": "Handle errors from your model executor",
          "language": "swift",
          "startTimeSeconds": 854,
          "code": "// Custom errors\n\npublic enum MyModelError: Error, LocalizedError {\n    // User hit monthly token limit. Prompt upgrade or wait for reset.\n    case exceededSubscriptionTierLimit\n    // Model variant isn't enabled on this account.\n    case modelNotProvisioned\n    // Billing or policy review locked this account.\n    case accountSuspended\n\n    public var errorDescription: String? {\n        switch self {\n        case .exceededSubscriptionTierLimit:\n            String(localized: \"Your plan limit has been reached.\")\n        // ...\n        }\n    }\n}"
        },
        {
          "title": "Attach custom metadata to responses",
          "language": "swift",
          "startTimeSeconds": 968,
          "code": "// Attach service-specific performance metadata\n\nlet elapsed = Date().timeIntervalSince(startTime)\nlet tokensPerSecond = Double(tokenCount) / elapsed\nlet timeToFirstToken = firstTokenTime?.timeIntervalSince(startTime) ?? 0\n\nawait channel.send(.metadataUpdate([\n    \"tokensPerSecond\": tokensPerSecond,\n    \"timeToFirstToken\": timeToFirstToken\n]))"
        },
        {
          "title": "Define and use custom Transcript segments",
          "language": "swift",
          "startTimeSeconds": 1025,
          "code": "// Define a custom segment\npublic struct AudioSegment: Transcript.CustomSegment {\n    public var id: String\n    public var content: URL\n}\n\n// Pass it in a prompt\nlet recording = AudioSegment(id: UUID().uuidString, content: URL(filePath: \"/path/to/recording.m4a\"))\nlet response = try await session.respond {\n    \"Where was Frank Lloyd Wright's original architecture school located?\"\n    recording\n}\n\n// Emit a custom segment from the executor\nfor try await event in stream {\n    switch event {\n    case .audioFileGenerated(let file):\n        await channel.send(.response(action: .updateCustomSegment(\n            AudioSegment(id: file.id, content: file.url)\n        )))\n    }\n}"
        },
        {
          "title": "Implement server-side tools in your model",
          "language": "swift",
          "startTimeSeconds": 1089,
          "code": "// Configure server-side tools\npublic struct MyLanguageModel: LanguageModel {\n    public struct ServerTool: Sendable {\n        public static let webSearch: ServerTool = ...\n    }\n    public init(serverTools: [ServerTool] = []) { }\n}\n\n// Surface tool results through the channel\nlet client = MyServerClient(serverTools: model.serverTools)\nlet response = try await client.send(prompt: .init(request))\nfor try await chunk in response {\n    switch chunk {\n    case .webSearch(let webSearch):\n        await channel.send(.response(action: .updateCustomSegment(\n            WebSearchSegment(url: webSearch.url, content: webSearch.html)\n        )))\n    case .textDelta(let textDelta):\n        await channel.send(.response(action: .appendText(\n            textDelta.text, tokenCount: textDelta.tokenCount\n        )))\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Foundation Models",
          "url": "https://developer.apple.com/documentation/FoundationModels",
          "type": "documentation",
          "description": "Perform tasks with models that specialize in language understanding, structured output, and tool calling.",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels.json"
        },
        {
          "title": "Core AI Models",
          "url": "https://github.com/apple/coreai-models",
          "type": "documentation",
          "description": null
        },
        {
          "title": "MLX Swift LM on GitHub",
          "url": "https://github.com/ml-explore/mlx-swift-lm",
          "type": "documentation",
          "description": null
        }
      ],
      "path": "sessions/wwdc2026/339-bring-an-llm-provider-to-the-foundation-models-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/339-bring-an-llm-provider-to-the-foundation-models-framework/metadata.json",
        "readme": "sessions/wwdc2026/339-bring-an-llm-provider-to-the-foundation-models-framework/README.md",
        "transcript": "sessions/wwdc2026/339-bring-an-llm-provider-to-the-foundation-models-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/339-bring-an-llm-provider-to-the-foundation-models-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-341",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 341,
      "title": "Support the Center Stage front camera in your iOS app",
      "description": "Supercharge your iOS camera app with Center Stage using AVCapture APIs with the front camera on iPhone 17, iPhone 17 Pro and iPhone Air. Explore how APIs enable zoom and rotate options, for more flexible ways to frame selfies and videos and to automatically get everyone in a group shot. Integrate Center Stage for video calls to automatically adjust the framing, so you’re front and center for virtual meetings and FaceTime calls. And learn how to stabilize your video for real-time video conferencing.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/341",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/341",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS"
      ],
      "keywords": [],
      "topics": [
        "Photos & Camera"
      ],
      "primaryTopic": "Photos & Camera",
      "duration": 1064,
      "hasTranscript": true,
      "transcriptWordCount": 1938,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/341/4/fa1380a3-e2ab-4442-9302-817be212e991/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/341/4/fa1380a3-e2ab-4442-9302-817be212e991/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/341/4/fa1380a3-e2ab-4442-9302-817be212e991/downloads/wwdc2026-341_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/341/4/fa1380a3-e2ab-4442-9302-817be212e991/downloads/wwdc2026-341_hd.mp4",
        "duration": 1064
      },
      "codeSnippets": [
        {
          "title": "Support dynamic aspect ratio",
          "language": "swift",
          "startTimeSeconds": 329,
          "code": "// Select the Center Stage front camera\n\nimport AVFoundation\n\nlet deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInUltraWideCamera], mediaType: .video, position: .front)\n\nguard let camera = deviceDiscoverySession.devices.first else {\n    print(\"Failed to find the capture device\")\n    return\n}\n\n// Find a format that supports the 4x3 aspect ratio\n\nfor format in camera.formats {\n    if format.supportedDynamicAspectRatios.contains(.ratio4x3) {\n        try! camera.lockForConfiguration()\n        camera.activeFormat = format\n        camera.unlockForConfiguration()\n        break\n    }\n}\n\n// Set dynamic aspect ratio\n\ntry! camera.lockForConfiguration()\n\nlet timestamp = try! await camera.setDynamicAspectRatio(.ratio4x3)\nprint(\"Applied dynamic aspect ratio at timestamp: \\(timestamp)\")\n\ncamera.unlockForConfiguration()"
        },
        {
          "title": "Support smart framing monitor",
          "language": "swift",
          "startTimeSeconds": 459,
          "code": "// Find a format that supports smart framing\n\nimport AVFoundation\n\nfor format in camera.formats {\n    if format.isSmartFramingSupported {\n        try! camera.lockForConfiguration()\n        camera.activeFormat = format\n        camera.unlockForConfiguration()\n        break\n    }\n}\n\n// Configure the smart framing monitor\n\nlet monitor = camera.smartFramingMonitor!\n\ntry! camera.lockForConfiguration()\nmonitor.enabledFramings = monitor.supportedFramings\ncamera.unlockForConfiguration()\n\n// Monitor framing recommendations\n\nobservation = monitor.observe(\\.recommendedFraming, options: [.new,]) { monitor, change in\n    if let framing = monitor.recommendedFraming {\n\n        Task {\n            try! camera.lockForConfiguration()\n            try! await camera.setDynamicAspectRatio(framing.aspectRatio)\n            camera.videoZoomFactor = CGFloat(framing.zoomFactor)\n            camera.unlockForConfiguration()\n        }\n\n    }\n}\n\n// Start the smart framing monitor\n\ntry! monitor.startMonitoring()\n\n// Stop the smart framing monitor\n\nobservation?.invalidate()\nobservation = nil\n\nmonitor.stopMonitoring()"
        },
        {
          "title": "Support Center Stage for video calls",
          "language": "swift",
          "startTimeSeconds": 884,
          "code": "// Find a format that supports Center Stage\n\nimport AVFoundation\n\nfor format in camera.formats {\n    if format.isCenterStageSupported {\n        try! camera.lockForConfiguration()\n        camera.activeFormat = format\n        camera.unlockForConfiguration()\n        break\n    }\n}\n\n// Turn on Center Stage\n\nAVCaptureDevice.centerStageControlMode = .cooperative\nAVCaptureDevice.isCenterStageEnabled = true"
        }
      ],
      "resources": [
        {
          "title": "Supporting Center Stage front camera in your iOS app",
          "url": "https://developer.apple.com/documentation/AVFoundation/supporting-center-stage-front-camera-in-your-ios-app",
          "type": "samplecode",
          "description": "Enable Center Stage for photos and videos on the iPhone front camera.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/supporting-center-stage-front-camera-in-your-ios-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/supporting-center-stage-front-camera-in-your-ios-app.json"
        },
        {
          "title": "AVCam: Building a camera app",
          "url": "https://developer.apple.com/documentation/AVFoundation/avcam-building-a-camera-app",
          "type": "samplecode",
          "description": "Capture photos and record video using the front and rear iPhone and iPad cameras.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/avcam-building-a-camera-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/avcam-building-a-camera-app.json"
        },
        {
          "title": "AVFoundation",
          "url": "https://developer.apple.com/documentation/AVFoundation",
          "type": "documentation",
          "description": "Work with audiovisual assets, control device cameras, process audio, and configure system audio interactions.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation.json"
        },
        {
          "title": "Capture setup",
          "url": "https://developer.apple.com/documentation/AVFoundation/capture-setup",
          "type": "documentation",
          "description": "Configure built-in cameras and microphones, and external capture devices, for media capture.",
          "sosumiURL": "https://sosumi.ai/documentation/AVFoundation/capture-setup",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AVFoundation/capture-setup.json"
        }
      ],
      "path": "sessions/wwdc2026/341-support-the-center-stage-front-camera-in-your-ios-app/",
      "files": {
        "metadata": "sessions/wwdc2026/341-support-the-center-stage-front-camera-in-your-ios-app/metadata.json",
        "readme": "sessions/wwdc2026/341-support-the-center-stage-front-camera-in-your-ios-app/README.md",
        "transcript": "sessions/wwdc2026/341-support-the-center-stage-front-camera-in-your-ios-app/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/341-support-the-center-stage-front-camera-in-your-ios-app/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-343",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 343,
      "title": "Explore advanced App Intents features for Siri and Apple Intelligence",
      "description": "Polish how your app works with Siri using advanced App Intents APIs. Learn techniques that let people accomplish more with just their voice, help Apple Intelligence find your content, and provide context for on-screen awareness so Siri understands what’s happening in your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/343",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/343",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "app intents",
        "machine learning",
        "siri",
        "xcode"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1448,
      "hasTranscript": true,
      "transcriptWordCount": 3568,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/343/4/00190d1d-55b6-4eb2-9ee3-e09f3d8d1c7d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/343/4/00190d1d-55b6-4eb2-9ee3-e09f3d8d1c7d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/343/4/00190d1d-55b6-4eb2-9ee3-e09f3d8d1c7d/downloads/wwdc2026-343_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/343/4/00190d1d-55b6-4eb2-9ee3-e09f3d8d1c7d/downloads/wwdc2026-343_hd.mp4",
        "duration": 1448
      },
      "codeSnippets": [
        {
          "title": "Custom dialog response",
          "language": "swift",
          "startTimeSeconds": 162,
          "code": "@AppIntent(schema: .audio.addToPlaylist)\n  struct AddToPlaylistIntent {\n\n      func perform() async throws -> some IntentResult & ProvidesDialog {\n          // Adds song to playlist and responds\n          return .result(\n              dialog: IntentDialog(\n                  full: \"\"\"\n                        Added \\(song.title) to the \\\n                        \\(playlist.title) mix tape.\n                        \"\"\",\n                  supporting: \"Added\"\n              )\n          )\n      }\n  }"
        },
        {
          "title": "Ask a clarifying question within an inten",
          "language": "swift",
          "startTimeSeconds": 222,
          "code": "@AppIntent(schema: .clock.createTimer)\n  struct CreateTimerIntent {\n      // MARK: Schema Parameters\n      var duration: Duration\n      var label: String?\n      var isSleepTimer: Bool\n\n      func perform() async throws -> some ReturnsValue<TimerEntity> {\n          // Checks active timers and requests label parameter\n          label = try await $label.requestValue(\n              \"\"\"\n              You already have a timer running. \\\n              What should we call this one?\n              \"\"\"\n          )\n          return .result(value: timerEntity)\n      }\n  }"
        },
        {
          "title": "Enhanced DisplayRepresentation",
          "language": "swift",
          "startTimeSeconds": 266,
          "code": "// Enhanced DisplayRepresentation\n  @AppEntity(schema: .audio.song)\n  struct SongEntity {\n\n      var displayRepresentation: DisplayRepresentation {\n          DisplayRepresentation(\n              title: \"\\(title)\",\n              subtitle: \"\\(artistName)\",\n              image: artworkImage\n          )\n      }\n  }"
        },
        {
          "title": "Return a custom snippet view",
          "language": "swift",
          "startTimeSeconds": 305,
          "code": "@AppIntent(schema: .audio.addToPlaylist)\n  struct AddToPlaylistIntent {\n\n      var audioEntity: AudioEntity\n      var playlist: PlaylistEntity\n\n      func perform() async throws -> some IntentResult & ProvidesDialog & ShowsSnippetView {\n          // Adds to playlist and shows dialog and snippet\n          let view = PlaylistSnippetView(\n              playlist: updatedEntity,\n              tracks: updated.tracks\n          )\n          return .result(dialog: dialog, view: view)\n      }\n  }"
        },
        {
          "title": "Donate a UI interaction",
          "language": "swift",
          "startTimeSeconds": 464,
          "code": "@ModelActor\n  actor ModelManager {\n      func sendMessage(_ /* ... */, donateIntent: Bool = false) async throws -> [Message.ID] {\n\n          // Donate intent with parameters and result so Siri can learn user preferences\n          if donateIntent {\n              let intent = SendMessageIntent()\n              intent.destination = .recipients(conversation.recipients.map(\\.entity))\n\n              let result = messages.map(\\.entity)\n              Task {\n                  try await IntentDonationManager.shared.donate(\n                      intent: intent,\n                      result: .result(value: result)\n                  )\n              }\n          }\n      }\n  }"
        },
        {
          "title": "Declare entity ownership for confirmations",
          "language": "swift",
          "startTimeSeconds": 603,
          "code": "// Informs system if entity is public or shared with others\n  @AppEntity(schema: .calendar.event)\n  struct EventEntity: OwnershipProvidingEntity {\n\n      var ownership: EntityOwnership {\n          // isShared used to compute ownership state: .shared, .public, or .unknown\n          attendees.isEmpty ? .unknown : .shared\n      }\n  }"
        },
        {
          "title": "Index entities with IndexedEntity",
          "language": "swift",
          "startTimeSeconds": 690,
          "code": "// Indexing IndexedEntity with CSSearchableIndex\n  struct EntityIndexingHelper {\n      // Indexes playlist entities\n      func indexPlaylist(_ playlist: Playlist) async throws {\n          let entity = PlaylistEntity(playlist: playlist)\n          try await CSSearchableIndex(name: indexName)\n              .indexAppEntities([entity])\n      }\n  }"
        },
        {
          "title": "Structured search with IntentValueQuer",
          "language": "swift",
          "startTimeSeconds": 818,
          "code": "// Structured search of songs and playlists\n  struct AudioIntentValueQuery: IntentValueQuery {\n\n      // AudioSearch, IntentPerson, and other system types may be supported as input\n      func values(for input: AudioSearch) async throws -> [AudioEntity] {\n          switch input.criteria {\n          case .searchQuery(let query):\n              return try await searchResults(for: query)\n          case .unspecified:\n              return try await likedSongResults()\n          // ... also a .url case\n          }\n      }\n  }"
        },
        {
          "title": "Re-run Siri search in your app",
          "language": "swift",
          "startTimeSeconds": 889,
          "code": "// Intent that re-runs the Siri search in app\n  @AppIntent(schema: .system.searchInApp)\n  struct SearchAudioLibraryIntent {\n\n      var criteria: StringSearchCriteria\n\n      func perform() async throws -> some IntentResult {\n          // Perform in-app search with Siri search string\n          navigation.searchText = criteria.term\n          navigation.selectedTab = .library\n          return .result()\n      }\n  }"
        },
        {
          "title": "Onscreen awareness annotations",
          "language": "swift",
          "startTimeSeconds": 987,
          "code": "// (a) Single primary entity on screen — NSUserActivity\n  struct NowPlayingView: View {\n      @Environment(PlaybackController.self) private var playback\n\n      var body: some View {\n          VStack {\n              // Player UI\n          }\n          .userActivity(\"cosmotunes.nowPlaying\", isActive: playback.currentTrack) { activity in\n              activity.title = playback.currentTrack?.title\n              activity.appEntityIdentifier = EntityIdentifier(\n                  for: SongEntity.self,\n                  identifier: playback.currentTrack.id\n              )\n          }\n      }\n  }\n\n  // (b) One entity among many — View Entity annotation\n  struct AlbumView: View {\n      private var header: some View {\n          VStack(alignment: .leading, spacing: 6) {\n              // ...\n          }\n          .appEntityIdentifier(\n              EntityIdentifier(for: AlbumEntity.self, identifier: session.id.uuidString)\n          )\n      }\n  }\n\n  // (c) Lists and collections — Collection annotation\n  struct PlaylistDetailView: View {\n      var body: some View {\n          List {\n              ForEach(playlist.tracks) { track in\n                  PlaylistTrackRow(track: track)\n              }\n          }\n          .appEntityIdentifier(forSelectionType: GeneratedTrack.ID.self) { trackID in\n              EntityIdentifier(for: SongEntity.self, identifier: trackID)\n          }\n      }\n  }"
        },
        {
          "title": "Component-based display representation query",
          "language": "swift",
          "startTimeSeconds": 1043,
          "code": "// Component-based display representation queries\n  extension PlaylistQuery {\n      func displayRepresentations(\n          for identifiers: [PlaylistEntity.ID],\n          requestedComponents: DisplayRepresentation.Components = .text\n      ) async throws -> [PlaylistEntity.ID: DisplayRepresentation] {\n          let entities = try await model.playlistEntities(for: identifiers)\n\n          // Fetch display representations for fetched entities\n          var result: [PlaylistEntity.ID: DisplayRepresentation] = [:]\n          for entity in entities {\n              result[entity.id] = await entity.displayRepresentation(with: requestedComponents)\n          }\n          return result\n      }\n  }"
        },
        {
          "title": "Entity annotations on system integrations",
          "language": "swift",
          "startTimeSeconds": 1267,
          "code": "// (a) User notifications\n  import AppIntents\n  import UserNotifications\n\n  func scheduleNotification(message: Message, author: Contact, conversation: Conversation) {\n      let content = UNMutableNotificationContent()\n      content.title = author.name\n      content.body = message.body\n\n      // Annotate with entity identifier\n      content.appEntityIdentifiers = [\n          EntityIdentifier(for: MessageEntity.self, identifier: message.id)\n      ]\n      // Schedule the notification\n  }\n\n  // (b) Now Playing — most specific to least specific\n  import NowPlaying\n\n  final class CosmoTunesMediaSession: MediaSessionRepresentable {\n      var content: (any MediaContentRepresentable)? {\n          var content = MusicContent(id: track.id.uuidString, songTitle: track.title /* ... */)\n          content.appEntityIdentifiers = [\n              EntityIdentifier(for: SongEntity.self, identifier: track.id),\n              EntityIdentifier(for: ArtistEntity.self, identifier: track.session.artistName),\n              EntityIdentifier(for: PlaylistEntity.self, identifier: currentPlaylist.id),\n          ]\n          return content\n      }\n  }\n\n  // (c) AlarmKit\n  import AlarmKit\n\n  func scheduleAlarm(_ alarm: Alarm) async throws {\n      let configuration = AlarmManager.AlarmConfiguration<CosmoTunesAlarmMetadata>.alarm(\n          schedule: schedule,\n          attributes: attributes,\n          appEntityIdentifier: EntityIdentifier(for: AlarmEntity.self, identifier: alarm.id),\n          stopIntent: DismissAlarmIntent(),\n          secondaryIntent: SnoozeAlarmIntent(),\n          sound: sound\n      )\n      // Schedule alarm\n  }"
        }
      ],
      "resources": [
        {
          "title": "App Intents Testing",
          "url": "https://developer.apple.com/documentation/AppIntentsTesting",
          "type": "documentation",
          "description": "Test your app intents, entities, queries, and integration with system features like Siri or Spotlight.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntentsTesting",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntentsTesting.json"
        },
        {
          "title": "Donating your app’s data and actions to the system",
          "url": "https://developer.apple.com/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "type": "documentation",
          "description": "Improve how people interact with your app through Apple Intelligence and Siri",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system.json"
        },
        {
          "title": "Donations and discovery",
          "url": "https://developer.apple.com/documentation/AppIntents/donations-and-discovery",
          "type": "documentation",
          "description": "Donate your app’s intents and entities to the system to help it identify trends and predict",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/donations-and-discovery",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/donations-and-discovery.json"
        },
        {
          "title": "Making app entities available in Spotlight",
          "url": "https://developer.apple.com/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "type": "documentation",
          "description": "Update your app entity types to support Spotlight indexing, and donate entities to",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-app-entities-available-in-spotlight.json"
        },
        {
          "title": "Making actions and content discoverable by Apple Intelligence",
          "url": "https://developer.apple.com/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "type": "documentation",
          "description": "Equip the system so that Siri can work with your app by adding specific schemas from relevant domains.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence.json"
        },
        {
          "title": "Providing contextual cues to Apple Intelligence and Siri",
          "url": "https://developer.apple.com/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "type": "documentation",
          "description": "Annotate your interface with app entities to offer contextual information about your app’s",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri.json"
        },
        {
          "title": "Apple Intelligence and Siri AI",
          "url": "https://developer.apple.com/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "type": "documentation",
          "description": "Integrate your app with Apple Intelligence and bring it to Siri AI.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/apple-intelligence-and-siri-ai.json"
        }
      ],
      "path": "sessions/wwdc2026/343-explore-advanced-app-intents-features-for-siri-and-apple-int/",
      "files": {
        "metadata": "sessions/wwdc2026/343-explore-advanced-app-intents-features-for-siri-and-apple-int/metadata.json",
        "readme": "sessions/wwdc2026/343-explore-advanced-app-intents-features-for-siri-and-apple-int/README.md",
        "transcript": "sessions/wwdc2026/343-explore-advanced-app-intents-features-for-siri-and-apple-int/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/343-explore-advanced-app-intents-features-for-siri-and-apple-int/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-344",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 344,
      "title": "Code-along: Make your app available to Siri",
      "description": "Dive deep into an Xcode project showing how you can make your app available to Siri. Learn how to adopt App Schemas to let people ask questions about calendar events and take natural language actions like scheduling. Discover best practices for making content available in the Spotlight semantic index and providing context for on-screen awareness.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/344",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/344",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [
        "ai",
        "app intents",
        "machine learning",
        "siri",
        "xcode"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1460,
      "hasTranscript": true,
      "transcriptWordCount": 3532,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/344/4/ee45cb19-e252-41f4-a2e0-e9b59238c7aa/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/344/4/ee45cb19-e252-41f4-a2e0-e9b59238c7aa/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/344/4/ee45cb19-e252-41f4-a2e0-e9b59238c7aa/downloads/wwdc2026-344_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/344/4/ee45cb19-e252-41f4-a2e0-e9b59238c7aa/downloads/wwdc2026-344_hd.mp4",
        "duration": 1460
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Integrating your calendar app with Apple Intelligence",
          "url": "https://developer.apple.com/documentation/AppIntents/integrating-your-calendar-app-with-apple-intelligence",
          "type": "documentation",
          "description": "Adopt calendar schemas so people can create, find, and manage events with Siri.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/integrating-your-calendar-app-with-apple-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/integrating-your-calendar-app-with-apple-intelligence.json"
        },
        {
          "title": "Donating your app’s data and actions to the system",
          "url": "https://developer.apple.com/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "type": "documentation",
          "description": "Improve how people interact with your app through Apple Intelligence and Siri",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/donating-your-apps-data-and-actions-to-the-system.json"
        },
        {
          "title": "Donations and discovery",
          "url": "https://developer.apple.com/documentation/AppIntents/donations-and-discovery",
          "type": "documentation",
          "description": "Donate your app’s intents and entities to the system to help it identify trends and predict",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/donations-and-discovery",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/donations-and-discovery.json"
        },
        {
          "title": "Making app entities available in Spotlight",
          "url": "https://developer.apple.com/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "type": "documentation",
          "description": "Update your app entity types to support Spotlight indexing, and donate entities to",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-app-entities-available-in-spotlight",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-app-entities-available-in-spotlight.json"
        },
        {
          "title": "Making actions and content discoverable by Apple Intelligence",
          "url": "https://developer.apple.com/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "type": "documentation",
          "description": "Equip the system so that Siri can work with your app by adding specific schemas from relevant domains.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/making-actions-and-content-discoverable-by-apple-intelligence.json"
        },
        {
          "title": "Providing contextual cues to Apple Intelligence and Siri",
          "url": "https://developer.apple.com/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "type": "documentation",
          "description": "Annotate your interface with app entities to offer contextual information about your app’s",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/providing-contextual-cues-to-apple-intelligence-and-siri.json"
        },
        {
          "title": "Apple Intelligence and Siri AI",
          "url": "https://developer.apple.com/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "type": "documentation",
          "description": "Integrate your app with Apple Intelligence and bring it to Siri AI.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/apple-intelligence-and-siri-ai",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/apple-intelligence-and-siri-ai.json"
        },
        {
          "title": "Calendar",
          "url": "https://developer.apple.com/documentation/AppIntents/app-schema-domain-calendar",
          "type": "documentation",
          "description": "Make your calendar app’s actions available to Apple Intelligence and Siri by adopting schemas for common calendar actions.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/app-schema-domain-calendar",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/app-schema-domain-calendar.json"
        },
        {
          "title": "App schema domains",
          "url": "https://developer.apple.com/documentation/AppIntents/app-schema-domains",
          "type": "documentation",
          "description": "Declare support for well-known actions and content by applying system-defined schemas to",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/app-schema-domains",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/app-schema-domains.json"
        }
      ],
      "path": "sessions/wwdc2026/344-code-along-make-your-app-available-to-siri/",
      "files": {
        "metadata": "sessions/wwdc2026/344-code-along-make-your-app-available-to-siri/metadata.json",
        "readme": "sessions/wwdc2026/344-code-along-make-your-app-available-to-siri/README.md",
        "transcript": "sessions/wwdc2026/344-code-along-make-your-app-available-to-siri/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/344-code-along-make-your-app-available-to-siri/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-345",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 345,
      "title": "Discover new capabilities in the App Intents framework",
      "description": "Level up your App Intents adoption with advanced features to make it faster, more flexible, and more relevant. Find out how ValueRepresentation and RelevantEntities make your content more discoverable and allow it to travel across apps, EntityCollection improves performance, and SyncableEntity let you scale across devices. Explore richer parameter types including union values and long-running intents that handle cancellation gracefully.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/345",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/345",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "visionOS"
      ],
      "keywords": [
        "ai",
        "app intents",
        "machine learning",
        "siri",
        "xcode"
      ],
      "topics": [
        "App Services",
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 1082,
      "hasTranscript": true,
      "transcriptWordCount": 2786,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/345/4/bc719e14-772a-4737-aceb-6e54cda6b511/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/345/4/bc719e14-772a-4737-aceb-6e54cda6b511/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/345/4/bc719e14-772a-4737-aceb-6e54cda6b511/downloads/wwdc2026-345_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/345/4/bc719e14-772a-4737-aceb-6e54cda6b511/downloads/wwdc2026-345_hd.mp4",
        "duration": 1082
      },
      "codeSnippets": [
        {
          "title": "Share structured entities with ValueRepresentation",
          "language": "swift",
          "startTimeSeconds": 1,
          "code": "struct LandmarkEntity: AppEntity, Transferable {\n      var id: Int\n      var landmark: Landmark  // contains CLLocationCoordinate2D\n\n      static var transferRepresentation: some TransferRepresentation {\n          ValueRepresentation(\n              exporting: { entity in\n                  PlaceDescriptor(\n                      representations: [.coordinate(entity.landmark.locationCoordinate)],\n                      commonName: entity.landmark.name\n                  )\n              }\n          )\n      }\n  }\n\n  // If the entity already has a PlaceDescriptor property, use a key-path — much less code:\n  struct LandmarkEntity: AppEntity, Transferable {\n      var id: Int\n      @Property var placeDescriptor: PlaceDescriptor\n\n      static var transferRepresentation: some TransferRepresentation {\n          ValueRepresentation(exporting: \\.placeDescriptor)\n      }\n  }"
        },
        {
          "title": "Register relevant entities with RelevantEntities",
          "language": "swift",
          "startTimeSeconds": 318,
          "code": "// Suggest playlists for the workout session\n  let playlistEntities = [dailyRun, runningMix]\n  let workoutContext = AppEntityContext.audio(.workout(activityType: .running))\n\n  try await RelevantEntities.shared.updateEntities(\n      playlistEntities, for: workoutContext\n  )\n\n  // Clear all entities for a context\n  try await RelevantEntities.shared.removeAllEntities(for: workoutContext)\n\n  // Remove specific entities from a context\n  try await RelevantEntities.shared.removeEntities(playlistEntities, from: workoutContext)\n\n  // Or remove all entities across all contexts\n  try await RelevantEntities.shared.removeAllEntities()"
        },
        {
          "title": "Handle large entity sets with EntityCollection",
          "language": "swift",
          "startTimeSeconds": 435,
          "code": "struct TagPhotosIntent: AppIntent {\n      static let title: LocalizedStringResource = \"Tag Travel Photos\"\n\n      @Parameter var photos: EntityCollection<PhotoEntity>   // was: [PhotoEntity]\n      @Parameter var tag: String\n\n      func perform() async throws -> some IntentResult {\n          modelData.tagPhotos(ids: photos.identifiers, tag: tag)   // was: tagPhotos(photos, tag: tag)\n          return .result()\n      }\n  }"
        },
        {
          "title": "Make entity IDs stable with SyncableEntity",
          "language": "swift",
          "startTimeSeconds": 614,
          "code": "// If your ID is already stable across devices (server UUID, CloudKit record ID):\n  struct PhotoEntity: AppEntity, SyncableEntity {\n      var id: Int  // Already stable across devices — that's it\n  }\n\n  // If you use local IDs, pair a local and a stable ID:\n  struct PhotoEntity: AppEntity, SyncableEntity {\n      var id: SyncableEntityIdentifier<String, String>\n\n      init(localID: String, stableID: String) {\n          self.id = SyncableEntityIdentifier(local: localID, stable: stableID)\n      }\n  }"
        },
        {
          "title": "Accept multiple types with @UnionValue",
          "language": "swift",
          "startTimeSeconds": 718,
          "code": "@UnionValue\n  enum TravelGalleryContent {\n      case landmarkCollection(LandmarkCollectionEntity)\n      case photoAlbum(PhotoAlbumEntity)\n\n      static let typeDisplayRepresentation: TypeDisplayRepresentation = \"Travel Gallery\"\n      static let caseDisplayRepresentations: [Cases: DisplayRepresentation] = [\n          .landmarkCollection: \"Landmark Collection\",\n          .photoAlbum: \"Photo Album\"\n      ]\n  }"
        },
        {
          "title": "Run beyond 30 s with LongRunningIntent + CancellableIntent",
          "language": "swift",
          "startTimeSeconds": 821,
          "code": "struct UploadPhotoIntent: LongRunningIntent, CancellableIntent {\n      static let title: LocalizedStringResource = \"Upload Photo\"\n\n      @Parameter var photo: IntentFile\n\n      func perform() async throws -> some IntentResult & ProvidesDialog {\n          let result = try await performBackgroundTask {\n              let chunks = calculateChunks(for: photo)\n              progress.totalUnitCount = Int64(chunks)\n\n              for chunk in 1...chunks {\n                  try Task.checkCancellation()\n                  try await uploadChunk(chunk)\n                  progress.completedUnitCount = Int64(chunk)\n              }\n              return \"Upload complete!\"\n          } onCancel: { reason in\n              cleanup(for: reason)\n          }\n          return .result(dialog: \"\\(result)\")\n      }\n  }"
        },
        {
          "title": "Control which process runs your intent with ExecutionTargets",
          "language": "swift",
          "startTimeSeconds": 1014,
          "code": "// Write operation — needs the main app\n  struct UpdateFavoriteIntent: AppIntent {\n      static var allowedExecutionTargets: ExecutionTargets { .main }\n  }\n\n  // Standalone download — runs in the extension\n  struct DownloadPhotoIntent: AppIntent {\n      static var allowedExecutionTargets: ExecutionTargets { .appIntentsExtension }\n  }\n\n  // Display-only — runs in the widget extension\n  struct GetLandmarkStatusIntent: AppIntent {\n      static var allowedExecutionTargets: ExecutionTargets { .widgetKitExtension }\n  }\n\n  // Works in either — lets the system choose\n  struct TagPhotosIntent: AppIntent {\n      static var allowedExecutionTargets: ExecutionTargets { [.main, .appIntentsExtension] }\n  }"
        }
      ],
      "resources": [
        {
          "title": "Adopting App Intents to support system experiences",
          "url": "https://developer.apple.com/documentation/AppIntents/adopting-app-intents-to-support-system-experiences",
          "type": "samplecode",
          "description": "Create app intents and entities so people can use your app’s content and actions across system experiences.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents/adopting-app-intents-to-support-system-experiences",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents/adopting-app-intents-to-support-system-experiences.json"
        },
        {
          "title": "App Intents",
          "url": "https://developer.apple.com/documentation/AppIntents",
          "type": "documentation",
          "description": "Make content and actions discoverable by Apple Intelligence and support system experiences like Siri, Spotlight, Shortcuts, and widgets.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents.json"
        }
      ],
      "path": "sessions/wwdc2026/345-discover-new-capabilities-in-the-app-intents-framework/",
      "files": {
        "metadata": "sessions/wwdc2026/345-discover-new-capabilities-in-the-app-intents-framework/metadata.json",
        "readme": "sessions/wwdc2026/345-discover-new-capabilities-in-the-app-intents-framework/README.md",
        "transcript": "sessions/wwdc2026/345-discover-new-capabilities-in-the-app-intents-framework/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/345-discover-new-capabilities-in-the-app-intents-framework/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-347",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 347,
      "title": "Secure your app: mitigate risks to agentic features",
      "description": "Explore how to evaluate threats from indirect prompt injection, such as data exfiltration and unintended actions. Discover system safeguards and security best practices for using App Intents and the Foundation Models framework, including mitigations such as user confirmations, secure prompt design, and authentication.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/347",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/347",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Privacy & Security"
      ],
      "primaryTopic": "Privacy & Security",
      "duration": 1512,
      "hasTranscript": true,
      "transcriptWordCount": 4048,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/347/4/07cdbfeb-280a-49e3-aeba-c18fbb0d32b4/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/347/4/07cdbfeb-280a-49e3-aeba-c18fbb0d32b4/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/347/4/07cdbfeb-280a-49e3-aeba-c18fbb0d32b4/downloads/wwdc2026-347_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/347/4/07cdbfeb-280a-49e3-aeba-c18fbb0d32b4/downloads/wwdc2026-347_hd.mp4",
        "duration": 1512
      },
      "codeSnippets": [
        {
          "title": "Tools",
          "language": "swift",
          "startTimeSeconds": 770,
          "code": "// Tools\n\nstruct OrderTeaTool: Tool {\n  let name = \"orderTeaTool\"\n  let description: String = \"Orders a particular quantity of a tea from the store.\"\n  // Arguments\n  // Implementation\n}\n\nstruct PostAndFetchPublicFeedTool: Tool {\n  let name = \"postAndFetchPublicFeedTool\"\n  let description: String = \"Posts a message to the public feed.”\n  // Arguments\n  // Implementation\n}"
        },
        {
          "title": "Profile",
          "language": "swift",
          "startTimeSeconds": 793,
          "code": "// Profile\n\nclass LooseLeafAgent {\n  struct DefaultProfile: LanguageModelSession.DynamicProfile {\n    var body: some DynamicProfile {\n      Profile {\n        Instructions(\"You are a helpful, tea-loving assistant ... \")\n\n        OrderTeaTool()\n        PostAndFetchPublicFeedTool()\n      }\n      .model(SystemLanguageModel())\n    }\n  }\n}"
        },
        {
          "title": "Session",
          "language": "swift",
          "startTimeSeconds": 808,
          "code": "// Session \n\nclass LooseLeafAgent {\n  struct DefaultProfile: LanguageModelSession.DynamicProfile {\n    var body: some DynamicProfile {\n      Profile {\n        Instructions(\"You are a helpful, tea-loving assistant ... \")\n\n        OrderTeaTool()\n        PostAndFetchPublicFeedTool()\n      }\n      .model(SystemLanguageModel())\n    }\n  }\n\n  let session: LanguageModelSession\n\n  public init() {\n    self.session = LanguageModelSession(profile: DefaultProfile())\n  }\n}"
        },
        {
          "title": "Confirmation via onToolCall",
          "language": "swift",
          "startTimeSeconds": 873,
          "code": "// Confirmation via onToolCall\n\nvar body: some DynamicProfile {\n  Profile {\n    Instructions(\"You are a helpful, tea-loving assistant ... \")\n\n    OrderTeaTool() // Financial impact; risky tool.\n    // Other Tools\n  }\n\n  .onToolCall { call in\n    guard call.toolName == \"orderTeaTool\" else {\n      return\n    }\n    guard ConfirmationAction.confirmWithUser() else {\n      throw LooseLeafError.userConfirmationDenied\n    }\n  }\n}"
        },
        {
          "title": "Spotlighting via historyTransform",
          "language": "swift",
          "startTimeSeconds": 956,
          "code": "// Spotlighting via historyTransform\n\nvar body: some DynamicProfile {\n  Profile {\n    Instructions(\"You are a helpful, tea-loving assistant ... \")\n\n    PostAndFetchPublicFeedTool() // Returns untrusted data; requires spotlighting\n    // Other Tools\n  }\n\n  .historyTransform {γentries in\n    entries.map { entry in\n      guard case .toolOutput(var toolOutput) = entry,\n        toolOutput.toolName == \"postAndFetchPublicFeedTool\"\n      else {\n        return entry\n      }\n    }\n    toolOutput.segments = toolOutput.segments.map { segment in\n      delimit(segment: segment,\n              startDelimiter: \"<<UNTRUSTED>>\",\n              endDelimiter: \"<</UNTRUSTED>>\")\n    }\n    return .toolOutput(toolOutput)\n  }\n}\n\nfunc delimit(segment: Transcript.Segment,\n             startDelimiter: String,\n             endDelimiter: String) -> Transcript.Segment"
        },
        {
          "title": "Redaction via historyTransform",
          "language": "swift",
          "startTimeSeconds": 1008,
          "code": "// Redaction via historyTransform\n\nvar body: some DynamicProfile {\n  Profile {\n    Instructions(\"You are a helpful, tea-loving assistant ... \")\n\n    PostAndFetchPublicFeedTool() // Returns untrusted data; requires spotlighting\n    // Other Tools\n  }\n\n  .historyTransform {γentries in\n    entries.map { entry in\n      guard case .toolOutput(var toolOutput) = entry,\n        toolOutput.toolName == \"postAndFetchPublicFeedTool\"\n      else {\n        return entry\n      }\n    }\n    toolOutput.segments = toolOutput.segments.map { segment in\n      redactPII(segment: segment,\n                placeHolder: \"[REDACTED]\")\n    }\n    return .toolOutput(toolOutput)\n  }\n}\n\nfunc redactPII(segment: Transcript.Segment,\n               placeHolder: String) -> Transcript.Segment"
        },
        {
          "title": "Intent authentication policy",
          "language": "swift",
          "startTimeSeconds": 1388,
          "code": "// Intent authentication policy\n\nstruct DeletePhotoIntent: DeleteIntent {\n    var entities: [LooseLeafPhoto]\n\n    static var authenticationPolicy: IntentAuthenticationPolicy = .requiresAuthentication\n\n    func perform() async throws -> some IntentResult {\n        // Implementation\n    }\n}"
        },
        {
          "title": "Schema authentication policy",
          "language": "swift",
          "startTimeSeconds": 1407,
          "code": "// Schema authentication policy\n\n@AppIntent(schema: .photos.deleteAssets)\nstruct DeletePhotoIntent {\n    var entities: [LooseLeafPhoto]\n\n    // Example: Schema default authentication policy is .requiresAuthentication\n\n    func perform() async throws -> some IntentResult {\n        // Implementation\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Security Overview",
          "url": "https://developer.apple.com/security/",
          "type": "documentation",
          "description": null,
          "sosumiURL": "https://sosumi.ai/security/"
        }
      ],
      "path": "sessions/wwdc2026/347-secure-your-app-mitigate-risks-to-agentic-features/",
      "files": {
        "metadata": "sessions/wwdc2026/347-secure-your-app-mitigate-risks-to-agentic-features/metadata.json",
        "readme": "sessions/wwdc2026/347-secure-your-app-mitigate-risks-to-agentic-features/README.md",
        "transcript": "sessions/wwdc2026/347-secure-your-app-mitigate-risks-to-agentic-features/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/347-secure-your-app-mitigate-risks-to-agentic-features/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-356",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 356,
      "title": "Bringing Cyberpunk 2077 to Mac",
      "description": "Go behind the scenes and learn from CD PROJEKT RED how Cyberpunk 2077 came to Mac, setting a new standard for AAA gaming on macOS. Explore how the team leveraged Apple’s robust hardware, software, and development tools to bring this high-fidelity experience to life. Learn how you can apply similar techniques to your games. Find out how the innovative ‘For this Mac’ preset automatically optimizes graphical settings to balance visual fidelity and frame rate across the Mac lineup.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/356",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/356",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 1674,
      "hasTranscript": true,
      "transcriptWordCount": 3826,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/356/5/d3ce460b-554d-4760-ae03-072c5acf42aa/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/356/5/d3ce460b-554d-4760-ae03-072c5acf42aa/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/356/5/d3ce460b-554d-4760-ae03-072c5acf42aa/downloads/wwdc2026-356_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/356/5/d3ce460b-554d-4760-ae03-072c5acf42aa/downloads/wwdc2026-356_hd.mp4",
        "duration": 1674
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Performing your own tone mapping",
          "url": "https://developer.apple.com/documentation/Metal/performing-your-own-tone-mapping",
          "type": "documentation",
          "description": "Apply your own tone mapping to get the exact behavior you want.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/performing-your-own-tone-mapping",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/performing-your-own-tone-mapping.json"
        },
        {
          "title": "Personalizing spatial audio in your app",
          "url": "https://developer.apple.com/documentation/PHASE/personalizing-spatial-audio-in-your-app",
          "type": "documentation",
          "description": "Enhance the realism of spatial audio output by tracking a person’s head movement and accounting for their personal spatial audio profile.",
          "sosumiURL": "https://sosumi.ai/documentation/PHASE/personalizing-spatial-audio-in-your-app",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PHASE/personalizing-spatial-audio-in-your-app.json"
        },
        {
          "title": "Download the Game Porting Toolkit",
          "url": "https://developer.apple.com/games/game-porting-toolkit/",
          "type": "documentation",
          "description": "The Game Porting Toolkit includes an updated set of tools that can help you accelerate porting your advanced games to Mac, and to get them up and running on iPad and iPhone.",
          "sosumiURL": "https://sosumi.ai/games/game-porting-toolkit/"
        }
      ],
      "path": "sessions/wwdc2026/356-bringing-cyberpunk-2077-to-mac/",
      "files": {
        "metadata": "sessions/wwdc2026/356-bringing-cyberpunk-2077-to-mac/metadata.json",
        "readme": "sessions/wwdc2026/356-bringing-cyberpunk-2077-to-mac/README.md",
        "transcript": "sessions/wwdc2026/356-bringing-cyberpunk-2077-to-mac/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/356-bringing-cyberpunk-2077-to-mac/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-357",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 357,
      "title": "Speedrun your game port with agentic coding",
      "description": "Kickstart your game’s journey to Apple platforms with new agentic skills in Game Porting Toolkit 4 that can dramatically accelerate the process of porting your game. Explore how to work alongside your AI coding assistant to adopt Metal 4, integrate MetalFX, and tune your game for Apple hardware. Find out how agents can autonomously troubleshoot GPU rendering issues using Metal debugging tools, empowering you to focus on what matters most.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/357",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/357",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 1680,
      "hasTranscript": true,
      "transcriptWordCount": 3353,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/357/5/5cfd0ceb-598f-4535-9abc-12e22a778326/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/357/5/5cfd0ceb-598f-4535-9abc-12e22a778326/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/357/5/5cfd0ceb-598f-4535-9abc-12e22a778326/downloads/wwdc2026-357_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/357/5/5cfd0ceb-598f-4535-9abc-12e22a778326/downloads/wwdc2026-357_hd.mp4",
        "duration": 1680
      },
      "codeSnippets": [
        {
          "title": "Install Game Porting Toolkit skills",
          "language": "bash",
          "startTimeSeconds": 211,
          "code": "/plugin marketplace add apple/game-porting-toolkit\n/plugin install game-porting-skills@game-porting-toolkit"
        },
        {
          "title": "Register resources for residency",
          "language": "cpp",
          "startTimeSeconds": 624,
          "code": "// With skill\nresidencySet->addAllocation(texture);\nresidencySet->commit();\n// ...\nargumentTable->setAddress(texture->gpuAddress(), bindPoint);\n\n// Without skill\nargumentTable->setAddress(texture->gpuAddress(), bindPoint);"
        },
        {
          "title": "Query argument buffer offsets",
          "language": "cpp",
          "startTimeSeconds": 685,
          "code": "// With skill\nIRRootSignatureGetResourceLocations(m_MtlCurIRRootSig, locations);\nsize_t offset = locations[i].topLevelOffset;\n\n// Without skill\nsize_t offset = paramIndex * descriptorSize;"
        },
        {
          "title": "Map D3D12 states to Metal 4 stages",
          "language": "cpp",
          "startTimeSeconds": 754,
          "code": "// With skill\nm_MtlPendingProducerStages |= MtlProducerStageFromD3D12(OldState);\nm_MtlPendingConsumerStages |= MtlConsumerStageFromD3D12(NewState);\n// ...\nm_ComputeEncoder->barrierAfterStages(\n    m_MtlPendingProducerStages,\n    m_MtlPendingConsumerStages,\n    MTL4::VisibilityOptionDevice);\n\n// Without skill\nm_ComputeEncoder->barrierAfterStages(\n    MTL::StageDispatch,\n    MTL::StageAll,\n    MTL4::VisibilityOptionDevice);"
        },
        {
          "title": "Query shader reflection parameter count",
          "language": "cpp",
          "startTimeSeconds": 864,
          "code": "// With skill\nIRShaderReflection* refl = IRShaderReflectionCreate();\nIRObjectGetReflection(compiledObj, IRShaderStageCompute, refl);\n// ...\ns_RootSignature.Reset(4, 2); // Reflection reveals: 4 params\n\n// Without skill\ns_RootSignature.Reset(5, 2);"
        }
      ],
      "resources": [
        {
          "title": "Game Porting Toolkit on GitHub",
          "url": "https://github.com/apple/game-porting-toolkit/",
          "type": "download",
          "description": "This repository includes a collection of agent skills to assist porting games to Apple platforms so you can produce higher-quality ports and ship on Apple platforms faster."
        },
        {
          "title": "Download the Game Porting Toolkit",
          "url": "https://developer.apple.com/games/game-porting-toolkit/",
          "type": "documentation",
          "description": "The Game Porting Toolkit includes an updated set of tools that can help you accelerate porting your advanced games to Mac, and to get them up and running on iPad and iPhone.",
          "sosumiURL": "https://sosumi.ai/games/game-porting-toolkit/"
        }
      ],
      "path": "sessions/wwdc2026/357-speedrun-your-game-port-with-agentic-coding/",
      "files": {
        "metadata": "sessions/wwdc2026/357-speedrun-your-game-port-with-agentic-coding/metadata.json",
        "readme": "sessions/wwdc2026/357-speedrun-your-game-port-with-agentic-coding/README.md",
        "transcript": "sessions/wwdc2026/357-speedrun-your-game-port-with-agentic-coding/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/357-speedrun-your-game-port-with-agentic-coding/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-358",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 358,
      "title": "Make your game great with touch",
      "description": "Dive deeper into the techniques you can use to create compelling touch experiences for your games. We’ll share expert insights from indie to AAA game development, explore best practices for intuitive touch controls, and show you how to take advantage of Apple technologies like Touch Controller framework and Metal for great performance.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/358",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/358",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 1463,
      "hasTranscript": true,
      "transcriptWordCount": 3094,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/358/4/fdd21d54-a233-49d4-8d00-4dc51284515d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/358/4/fdd21d54-a233-49d4-8d00-4dc51284515d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/358/4/fdd21d54-a233-49d4-8d00-4dc51284515d/downloads/wwdc2026-358_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/358/4/fdd21d54-a233-49d4-8d00-4dc51284515d/downloads/wwdc2026-358_hd.mp4",
        "duration": 1463
      },
      "codeSnippets": [
        {
          "title": "GCController polling vs. change handlers",
          "language": "swift",
          "startTimeSeconds": 124,
          "code": "// Polling\nif (button.isPressed) {\n    // ...\n}\n\n// Change handlers\npressedInput.pressedDidChangeHandler = { (element: any GCPhysicalInputElement,\n                                           input: any GCPressedStateInput,\n                                           pressed: Bool)\n    // ...\n}"
        },
        {
          "title": "Set up a TCTouchController",
          "language": "swift",
          "startTimeSeconds": 194,
          "code": "// Set up a TCTouchController\nprivate(set) var touchController: TCTouchController?\n\nlet descriptor = TCTouchControllerDescriptor(mtkView: mtkView)\nif TCTouchController.isSupported {\n    touchController = TCTouchController(descriptor: descriptor)\n}\ntouchController?.connect()\ntouchController?.render(using: renderEncoder)\n\noverride func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n    for touch in touches {\n        touchControls.handleTouchBegan(at: touch.location(in: view), index: touch.hash)\n    }\n}\n\nbuttonA?.valueChangedHandler = { (_ button: GCControllerButtonInput, _ value: Float,\n                                  _ pressed: Bool) in\n    // ...\n}"
        },
        {
          "title": "Create a standard circular button B",
          "language": "swift",
          "startTimeSeconds": 513,
          "code": "// Create a standard circular button B\nlet buttonBDesc = TCButtonDescriptor()\nbuttonBDesc.label = TCControlLabel.buttonB\nbuttonBDesc.anchor = .bottomRight\nbuttonBDesc.offset = adjustedOffset(CGPoint(x: -35, y: -106), for: buttonBDesc.anchor)\nbuttonBDesc.contents = .buttonContents(forSystemImageNamed: \"b.circle\",\n                                       size: buttonBDesc.size, shape: .circle,\n                                       controller: touchController)\n// Set other properties ...\ntouchController.addButton(descriptor: buttonBDesc)\n\nfunc adjustedOffset(_ offset: CGPoint, for anchor: TCControlLayoutAnchor) -> CGPoint {\n    // Adjust offset for other anchors ...\n    case .bottomRight:\n        x -= safeArea.right\n        y -= safeArea.bottom\n}"
        },
        {
          "title": "Change icon image",
          "language": "swift",
          "startTimeSeconds": 648,
          "code": "// Change icon image\nbuttonBDesc.contents = .buttonContents(forSystemImageNamed: \"figure.fencing\",\n                                       size: buttonBDesc.size,\n                                       shape: .circle,\n                                       controller: touchController)"
        },
        {
          "title": "Update contents for button B based on context",
          "language": "swift",
          "startTimeSeconds": 711,
          "code": "// Update contents for button B based on context\nfunc setButtonBContents(symbolName: String) {\n    for button in touchController.buttons {\n        if button.label == TCControlLabel.buttonB {\n            button.contents = .buttonContents(forSystemImageNamed: symbolName, size: buttonSize,\n                                              shape: .circle, controller: touchController)\n        }\n    }\n}\n\nfunc cyclePower() {\n    // Get the current power type ...\n    switch currentPower {\n        case .strike:       touchControls?.setButtonBContents(symbolName: \"figure.fencing\")\n        case .fireball:     touchControls?.setButtonBContents(symbolName: \"flame.fill\")\n        case .waterBlaster: touchControls?.setButtonBContents(symbolName: \"drop.fill\")\n    }\n}"
        },
        {
          "title": "Hide left thumbstick when not touched",
          "language": "swift",
          "startTimeSeconds": 781,
          "code": "// Hide left thumbstick when it is not touched\nlet leftStickDesc = TCThumbstickDescriptor()\nleftStickDesc.hidesWhenNotPressed = true\n// Set other properties ...\ntouchController.addThumbstick(descriptor: leftStickDesc)"
        },
        {
          "title": "Show/hide the pick-up button",
          "language": "swift",
          "startTimeSeconds": 799,
          "code": "// Show pickup button when there's an item nearby\nfunc showPickupButton(at projectedPosition: CGPoint) {\n    // Calculate the position(ptX, ptY) for pickup button ...\n    descriptor.offset = CGPoint(x: ptX, y: ptY)\n    // Set other properties ...\n    touchController.addButton(descriptor: descriptor)\n}\n\nfunc hidePickupButton() {\n    for button in touchController.buttons {\n        if button.label == TCControlLabel.buttonY {\n            touchController.removeControl(button)\n        }\n    }\n}"
        },
        {
          "title": "Show power options as touch controls",
          "language": "swift",
          "startTimeSeconds": 836,
          "code": "// Show power options as touch controls\nbuttonX?.pressedChangedHandler = { (_ button: GCControllerButtonInput, _ value: Float,\n                                    _ pressed: Bool) -> Void in\n    if pressed {\n        self.openPowerWheel()\n    }\n}\n\nfunc openPowerWheel() {\n    touchControls?.showPowerWheelButtons(fireballCount: fireballCount, has: hasWaterBlaster)\n    wirePowerWheelHandlers()\n    DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in\n        guard let self = self, self.powerWheelActive else { return }\n        self.closePowerWheel()\n    }\n}"
        },
        {
          "title": "Use the left half of the screen for character movement",
          "language": "swift",
          "startTimeSeconds": 934,
          "code": "// Use the left half of the screen for character movement\nlet leftStickDesc = TCThumbstickDescriptor()\nleftStickDesc.colliderShape = .leftSide // Don't set as .circle\n// Set other properties ...\ntouchController.addThumbstick(descriptor: leftStickDesc)"
        },
        {
          "title": "Calculate thumbstick tilt magnitude to trigger sprint",
          "language": "swift",
          "startTimeSeconds": 999,
          "code": "// Calculate left thumbstick's tilt magnitude to trigger sprint\nfunc pollInput() {\n    if let gamePad = gameController.extendedGamepad {\n        let gamePadLeft = gamePad.leftThumbstick\n        var moveInput = simd_make_float2(gamePadLeft.xAxis.value, -gamePadLeft.yAxis.value)\n        let magnitude = simd_length(moveInput)\n        if magnitude > 0.8 {\n            self.runModifier = 1.3\n        }\n        self.characterDirection = moveInput\n    }\n}"
        },
        {
          "title": "Replace right thumbstick with a touchpad",
          "language": "swift",
          "startTimeSeconds": 1056,
          "code": "// Replace right thumbstick with touchpad\nlet touchpadDesc = TCTouchpadDescriptor()\ntouchpadDesc.label = TCControlLabel.rightThumbstick\ntouchpadDesc.colliderShape = .rightSide\ntouchpadDesc.reportsRelativeValues = true\n// Set other properties ...\ntouchController.addTouchpad(descriptor: touchpadDesc)"
        },
        {
          "title": "Collapse two QTE buttons into one",
          "language": "swift",
          "startTimeSeconds": 1170,
          "code": "// Collapse 2 QTE buttons into 1 single button\nfunc setupControls() {\n    let desc = TCButtonDescriptor()\n    desc.label = TCControlLabel(name: \"escape_button\", role: .button)\n    // Set up other properties ...\n    touchController.addButton(descriptor: desc)\n}\n\nfunc showEscapeButton() {\n    // Find escape button in touchController ...\n    escapeButton.isEnabled = true\n}\n\nfunc hideEscapeButton() {\n    // Find escape button in touchController ...\n    escapeButton.isEnabled = false\n}"
        },
        {
          "title": "Use button B to aim, move, and release power",
          "language": "swift",
          "startTimeSeconds": 1228,
          "code": "// Use button B to aim, move, and release power\nbuttonB?.valueChangedHandler = { (_ button: GCControllerButtonInput, _ value: Float,\n                                  _ pressed: Bool) -> Void in\n    self.releasePower(pressed: pressed)\n}\n\noverride func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {\n    for touch in touches {\n        let point = touch.location(in: metalView)\n        // Handle touch input ...\n        if let gc = gameController, gc.isAiming {\n            let prev = touch.previousLocation(in: metalView)\n            gc.aimTouchDelta += simd_float2(Float(point.x - prev.x), Float(point.y - prev.y))\n        }\n    }\n}"
        },
        {
          "title": "Add a halo effect with custom TCControlContents",
          "language": "swift",
          "startTimeSeconds": 1312,
          "code": "// Add a halo effect around left thumbstick with customized TCControlContents\nlet haloLayer = TCControlImage(texture: haloTexture, size: haloSize, highlight: nil,\n                               offset: .zero, tintColor: tint)\nlet normalBgImages = TCControlContents.thumbstickStickBackgroundContents(size: bgSize,\n                                                                         controller: controller).images\nhaloThumbstickBg = TCControlContents(images: [haloLayer] + normalBgImages)\nthumbstick.backgroundContents = active ? haloThumbstickBg : normalThumbstickBg"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/358-make-your-game-great-with-touch/",
      "files": {
        "metadata": "sessions/wwdc2026/358-make-your-game-great-with-touch/metadata.json",
        "readme": "sessions/wwdc2026/358-make-your-game-great-with-touch/README.md",
        "transcript": "sessions/wwdc2026/358-make-your-game-great-with-touch/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/358-make-your-game-great-with-touch/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-359",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 359,
      "title": "Build real-time neural rendering pipelines with Metal",
      "description": "Discover how to integrate machine learning into your real-time rendering pipeline using Metal 4. We’ll explore practical adoption patterns and best practices for achieving production-quality results with MetalFX neural denoising, featuring real-world insights from Maxon’s Redshift Live. Learn how to train and deploy a neural tone mapper using the ML command encoder inline with your graphics work. Finally, dive into the new tensor API to build and evaluate small, specialized neural networks directly within your shaders.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/359",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/359",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 1336,
      "hasTranscript": true,
      "transcriptWordCount": 3243,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/359/5/9da4a720-0dcb-4b8e-b61b-ba8310a61f29/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/359/5/9da4a720-0dcb-4b8e-b61b-ba8310a61f29/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/359/5/9da4a720-0dcb-4b8e-b61b-ba8310a61f29/downloads/wwdc2026-359_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/359/5/9da4a720-0dcb-4b8e-b61b-ba8310a61f29/downloads/wwdc2026-359_hd.mp4",
        "duration": 1336
      },
      "codeSnippets": [
        {
          "title": "Compute camera-only motion vectors",
          "language": "cpp",
          "startTimeSeconds": 526,
          "code": "#include <metal_stdlib>\nusing namespace metal;\n\n// Compute camera-only motion vectors\nfloat4 clipCurrent = viewProjCurrent * float4(worldPos, 1.0);\nfloat2 ndcCurrent = clipCurrent.xy / clipCurrent.w;\n\nfloat4 clipPrevious = viewProjPrevious * float4(worldPos, 1.0);\nfloat2 ndcPrevious = clipPrevious.xy / clipPrevious.w;\n\nfloat2 motion = ndcPrevious - ndcCurrent;\n\n// Get subpixel offset for current and previous frames\nfloat2 jitterCurrent = getJitter(frameIndex);\nfloat2 jitterPrevious = getJitter(frameIndexPrevious);\nmotion -= jitterPrevious - jitterCurrent;"
        }
      ],
      "resources": [
        {
          "title": "Training a neural network to render irradiance in real time",
          "url": "https://developer.apple.com/documentation/Metal/training-a-neural-network-to-render-irradiance-in-real-time",
          "type": "samplecode",
          "description": "Train a small neural network on the GPU to approximate diffuse irradiance, and compare the result against Monte Carlo integration and a pre-trained ML model.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/training-a-neural-network-to-render-irradiance-in-real-time",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/training-a-neural-network-to-render-irradiance-in-real-time.json"
        },
        {
          "title": "Metal sample code library",
          "url": "https://developer.apple.com/documentation/Metal/metal-sample-code-library",
          "type": "samplecode",
          "description": "Explore the complete set of Metal samples.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/metal-sample-code-library",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/metal-sample-code-library.json"
        },
        {
          "title": "Download the Metal Performance Primitives (MPP) Programming Guide",
          "url": "https://developer.apple.com/download/files/Metal-Performance-Primitives-Programming-Guide.pdf",
          "type": "download",
          "description": null,
          "sosumiURL": "https://sosumi.ai/download/files/Metal-Performance-Primitives-Programming-Guide.pdf"
        },
        {
          "title": "Understanding the Metal 4 core API",
          "url": "https://developer.apple.com/documentation/Metal/understanding-the-metal-4-core-api",
          "type": "documentation",
          "description": "Discover the features and functionality in the Metal 4 foundational APIs.",
          "sosumiURL": "https://sosumi.ai/documentation/Metal/understanding-the-metal-4-core-api",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Metal/understanding-the-metal-4-core-api.json"
        }
      ],
      "path": "sessions/wwdc2026/359-build-real-time-neural-rendering-pipelines-with-metal/",
      "files": {
        "metadata": "sessions/wwdc2026/359-build-real-time-neural-rendering-pipelines-with-metal/metadata.json",
        "readme": "sessions/wwdc2026/359-build-real-time-neural-rendering-pipelines-with-metal/README.md",
        "transcript": "sessions/wwdc2026/359-build-real-time-neural-rendering-pipelines-with-metal/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/359-build-real-time-neural-rendering-pipelines-with-metal/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-369",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 369,
      "title": "Find your accessory with Bluetooth Channel Sounding",
      "description": "Get started with Channel Sounding to bring distance and direction awareness to your Bluetooth accessories. Dive into the new Nearby Interaction and Core Bluetooth APIs, and walk through the accessory-side changes you’ll need. Optimize power consumption while ensuring a smooth, responsive experience.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/369",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/369",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [],
      "topics": [
        "System Services"
      ],
      "primaryTopic": "System Services",
      "duration": 492,
      "hasTranscript": true,
      "transcriptWordCount": 947,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/369/4/fea90204-fd38-4da4-b9e7-5dce37bc87d8/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/369/4/fea90204-fd38-4da4-b9e7-5dce37bc87d8/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/369/4/fea90204-fd38-4da4-b9e7-5dce37bc87d8/downloads/wwdc2026-369_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/369/4/fea90204-fd38-4da4-b9e7-5dce37bc87d8/downloads/wwdc2026-369_hd.mp4",
        "duration": 492
      },
      "codeSnippets": [
        {
          "title": "Start a Core Bluetooth Channel Sounding session",
          "language": "swift",
          "startTimeSeconds": 223,
          "code": "import CoreBluetooth\n\nfunc isChannelSoundingSupported() -> BOOL {\n    guard centralManager.state == .poweredOn else { return }\n    if #available(iOS 27.0, *) {\n        // Check current device supports Bluetooth Channel Sounding\n        return CBCentralManager.supportsFeatures(.channelSounding)\n    }\n}\n\nfunc startChannelSounding(_ peripheral: CBPeripheral) {\n    guard peripheral.isConnected else { return }\n    if #available(iOS 27.0, *) {  \n        // Step 1: Create a CBChannelSoundingSessionConfiguration\n        let config = CBChannelSoundingSessionConfiguration(role: .initiator)\n\n        // Step 2: Start the channel sounding session\n        peripheral.startChannelSoundingSession(config)\n    }\n}"
        },
        {
          "title": "Receive distance results and cancel a session",
          "language": "swift",
          "startTimeSeconds": 249,
          "code": "import CoreBluetooth\n\n// Receive distance results\nfunc peripheral(_ peripheral: CBPeripheral,\n                didReceive results: CBChannelSoundingProcedureResults?,\n                error: Error?) {\n    guard let results = results else { return }\n\n    let distance = results.distance\n\n    // Do something with distance\n}\n\n// Cancel a Channel Sounding session\nfunc cancelChannelSounding(_ peripheral: CBPeripheral) {\n    guard peripheral.isConnected else { return }\n    if #available(iOS 27.0, *) {\n        // Cancel the channel sounding session\n        peripheral.cancelChannelSoundingSession(config)\n    }\n}\n\nfunc peripheral(_ peripheral: CBPeripheral,\n                didCompleteChannelSoundingSession error: Error?) {   \n    // Session is complete\n}"
        },
        {
          "title": "Start a Nearby Interaction Channel Sounding session",
          "language": "swift",
          "startTimeSeconds": 281,
          "code": "import CoreBluetooth\nimport NearbyInteraction\n\n// Configure a Nearby Interaction Channel Sounding session\nfunc startChannelSoundingThroughNearbyInteraction(_ peripheral: CBPeripheral) {\n    if #available(iOS 27.0, *) {        \n        // Step 1: Check current device supports Bluetooth Channel Sounding\n        guard NISession.deviceCapabilities.supportsBluetoothChannelSounding else { return }\n\n        // Step 2: Create an NINearbyAccessoryConfiguration\n        let config = NINearbyAccessoryConfiguration(\n            bluetoothChannelSoundingIdentifier: peripheral.identifier, \n            previousChannelSoundingIdentifier: nil)\n\n        // Step 3: Enable camera assistance for direction support\n        if NISession.deviceCapabilities.supportsCameraAssistance { \n            config.isCameraAssistanceEnabled = true\n        }\n    }\n}"
        },
        {
          "title": "Run a Nearby Interaction Channel Sounding session",
          "language": "swift",
          "startTimeSeconds": 319,
          "code": "import CoreBluetooth\nimport NearbyInteraction\n\n// Run a Nearby Interaction Channel Sounding session\nfunc runChannelSoundingThroughNearbyInteraction(_ config: NINearbyAccessoryConfiguration) {\n    // Create an NISession\n    let session = NISession()\n    session.delegate = self\n    // Run the NISession with the accessory configuration\n    session.run(config)\n}\n\n// Improve Nearby Interaction direction outputs\nfunc updateAccessoryMotionState(_ isMoving: Bool) {\n    NIMotionActivityState motionState = isMoving ? .moving : .stationary\n\n    // Tell NISession about.the accessory's motion state\n    session.updateMotionState(motionState, forObjectWithToken: object.discoveryToken)\n}\n\n// Receive NISession updates\nfunc session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObjects]) {   \n    guard let object = nearbyObjects.first else { return }\n\n    if let distance = object.distance {\n        // Do something with distance\n    }\n\n    if let direction = object.horizontalAngle {\n        // Do something with horizontal angle\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Measuring distance between devices using Channel Sounding",
          "url": "https://developer.apple.com/documentation/CoreBluetooth/measuring-distance-between-devices-using-channel-sounding",
          "type": "samplecode",
          "description": "Measure the distance between two Bluetooth Low Energy devices in real time with Channel Sounding.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreBluetooth/measuring-distance-between-devices-using-channel-sounding",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreBluetooth/measuring-distance-between-devices-using-channel-sounding.json"
        },
        {
          "title": "AccessorySetupKit",
          "url": "https://developer.apple.com/documentation/AccessorySetupKit",
          "type": "documentation",
          "description": "Enable privacy-preserving discovery and configuration of accessories.",
          "sosumiURL": "https://sosumi.ai/documentation/AccessorySetupKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AccessorySetupKit.json"
        },
        {
          "title": "Nearby Interaction",
          "url": "https://developer.apple.com/documentation/NearbyInteraction",
          "type": "documentation",
          "description": "Locate and interact with nearby devices using identifiers, distance, and direction.",
          "sosumiURL": "https://sosumi.ai/documentation/NearbyInteraction",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/NearbyInteraction.json"
        },
        {
          "title": "Core Bluetooth",
          "url": "https://developer.apple.com/documentation/CoreBluetooth",
          "type": "documentation",
          "description": "Communicate with Bluetooth low energy and BR/EDR (“Classic”) Devices.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreBluetooth",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreBluetooth.json"
        }
      ],
      "path": "sessions/wwdc2026/369-find-your-accessory-with-bluetooth-channel-sounding/",
      "files": {
        "metadata": "sessions/wwdc2026/369-find-your-accessory-with-bluetooth-channel-sounding/metadata.json",
        "readme": "sessions/wwdc2026/369-find-your-accessory-with-bluetooth-channel-sounding/README.md",
        "transcript": "sessions/wwdc2026/369-find-your-accessory-with-bluetooth-channel-sounding/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/369-find-your-accessory-with-bluetooth-channel-sounding/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-370",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 370,
      "title": "Elevate your app’s text experience with TextKit",
      "description": "Discover how to combine the convenience of built-in text views with the control of TextKit. We’ll show you how new APIs make it easy to extend UITextView and NSTextView with custom behaviors like line numbers and collapsible sections. We’ll also explore the TextKit architecture and walk through new caching and reuse policies for text attachments. To get the most out of this session, watch “Meet TextKit 2” from WWDC21 and “What’s New in TextKit and text views” from WWDC22.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/370",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/370",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "screenshots"
      ],
      "topics": [
        "App Services",
        "SwiftUI & UI Frameworks"
      ],
      "primaryTopic": "SwiftUI & UI Frameworks",
      "duration": 1426,
      "hasTranscript": true,
      "transcriptWordCount": 3189,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/370/5/f61dbe38-7302-451a-b3ab-9851d5746315/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/370/5/f61dbe38-7302-451a-b3ab-9851d5746315/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/370/5/f61dbe38-7302-451a-b3ab-9851d5746315/downloads/wwdc2026-370_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/370/5/f61dbe38-7302-451a-b3ab-9851d5746315/downloads/wwdc2026-370_hd.mp4",
        "duration": 1426
      },
      "codeSnippets": [
        {
          "title": "NSTextViewportRenderingSurface conformance",
          "language": "swift",
          "startTimeSeconds": 587,
          "code": "class MyView: UIView, NSTextViewportRenderingSurface {}"
        },
        {
          "title": "NSTextViewportRenderingSurfaceKey and NSMapTable",
          "language": "swift",
          "startTimeSeconds": 625,
          "code": "class MyView: UIView, NSTextViewportRenderingSurface {}\n\nvar cache: NSMapTable<NSTextLayoutFragment, MyView>"
        },
        {
          "title": "UITextView/NSTextView in SwiftUI via ViewRepresentable",
          "language": "swift",
          "startTimeSeconds": 759,
          "code": "// Using a TextView in SwiftUI\n\nimport SwiftUI\n\nstruct MyTextView: View {\n    var body: some View { TextViewRepresentable() }\n}\n\n#if os(macOS)\nstruct TextViewRepresentable: NSViewRepresentable {\n    func makeNSView(context: Context) -> NSTextView { \n      NSTextView() \n    }\n    func updateNSView(_ nsView: NSTextView, context: Context) {\n    }\n}\n#else\nstruct TextViewRepresentable: UIViewRepresentable {\n    func makeUIView(context: Context) -> UITextView {\n        UITextView() \n    }\n    func updateUIView(_ uiView: UITextView, context: Context) {\n    }\n}\n#endif"
        },
        {
          "title": "ContainerView with TextView and line number view",
          "language": "swift",
          "startTimeSeconds": 813,
          "code": "// Create a text view subclass for a code editor\n\nimport UIKit\n\nclass TextView: UITextView {}\n\nclass ContainerView: UIView {\n    let textView = TextView()\n    let lineNumberView = UIView()\n\n    textView.font = UIFont.monospacedSystemFont\n}"
        },
        {
          "title": "Three NSTextViewportLayoutControllerDelegate overrides",
          "language": "swift",
          "startTimeSeconds": 882,
          "code": "// Override viewport controller delegate methods\n\nclass TextView: UITextView {\n    // Set up\n\t\toverride func textViewportLayoutControllerWillLayout(_ textViewportLayoutController: NSTextViewportLayoutController) {\n    \tsuper.textViewportLayoutControllerWillLayout(textViewportLayoutController)\n      //...\n    }\n\n    // Get paragraph bounds\n    override func textViewportLayoutController (_ textViewportLayoutController: NSTextViewportLayoutController, configureRenderingSurfaceFor textLayoutFragment: NSTextLayoutFragment) {\n\t\t\tsuper.textViewportLayoutController(textViewportLayoutController, configureRenderingSurfaceFor: textLayoutFragment)\n      //...\n    }\n\n    // Share accumulated info back to ContainerView\n\t\toverride func textViewportLayoutControllerDidLayout (_ textViewportLayoutController: NSTextViewportLayoutController) {\n\t\t  super.textViewportLayoutControllerDidLayout(textViewportLayoutController)\n      //...\n    }\n}"
        },
        {
          "title": "startingLineNumber(for:) using enumerateTextElements",
          "language": "swift",
          "startTimeSeconds": 959,
          "code": "func startingLineNumber(for viewportRange: NSTextRange?) -> Int {\n    guard let viewportRange,\n          let storage = textLayoutManager?.textContentManager\n              as? NSTextContentStorage else { return 0 }\n    let startLocation = storage.documentRange.location\n    var count = 1\n    storage.enumerateTextElements(from: startLocation) { element in\n        guard let range = element.elementRange else { return true }\n        if range.location.compare(viewportRange.location)\n            != .orderedAscending { return false }\n        count += 1\n        return true\n    }\n    return count\n}"
        },
        {
          "title": "DidLayout: convert frames to viewport coordinates",
          "language": "swift",
          "startTimeSeconds": 1022,
          "code": "// Override viewport controller delegate methods\n\nclass TextView: UITextView {\n    private var lines: [CGRect] = []\n    private var startingLineNumber = 0\n    var onDidLayout: ((Int, [CGRect]) -> Void)?\n\n    // Share accumulated info back to ContainerView\n\t\toverride func textViewportLayoutControllerDidLayout (_ textViewportLayoutController: NSTextViewportLayoutController) {\n        super.textViewportLayoutControllerDidLayout(controller)\n        let origin = controller.viewportBounds.origin\n        onDidLayout?(startingLineNumber, lines.map {$0.offsetBy(dx: 0, dy: -origin.y) })\n    }\n}"
        },
        {
          "title": "Draw line numbers in ContainerView closure",
          "language": "swift",
          "startTimeSeconds": 1036,
          "code": "// Draw line numbers in the ContainerView\n\nclass ContainerView: UIView {\n    let textView = TextView()\n    let lineNumberView = UIView()\n    func setup() {\n        textView.onDidLayout = {startingLineNumber, lines in\n            let attributes: [NSAttributedString.Key: Any] = [\n                .font: UIFont.monospacedSystemFont(ofSize: 11, weight: .regular),\n                .foregroundColor: UIColor.secondaryLabel\n            ]\n            for (i, frame) in lines.enumerated() {\n                let number = \"\\(startingLineNumber + i)\" as NSString\n                number.draw(at: CGPoint(x: 8, y: frame.minY),\n                    withAttributes: attributes)\n            }\n        }\n    }\n}"
        },
        {
          "title": "Collapsible sections: full TextView class",
          "language": "swift",
          "startTimeSeconds": 1162,
          "code": "// Add collapsible sections to your text view\n\nclass TextView: UITextView, NSTextContentStorageDelegate {\n    var collapsedSections: Set<Int> = []\n\n    // Set up\n\t\toverride func textViewportLayoutControllerWillLayout(_ textViewportLayoutController: NSTextViewportLayoutController) {\n    \tsuper.textViewportLayoutControllerWillLayout(textViewportLayoutController)\n      //...\n    }\n\n    // Get paragraph bounds\n    override func textViewportLayoutController (_ textViewportLayoutController: NSTextViewportLayoutController, configureRenderingSurfaceFor textLayoutFragment: NSTextLayoutFragment) {\n\t\t\tsuper.textViewportLayoutController(textViewportLayoutController, configureRenderingSurfaceFor: textLayoutFragment)\n      //...\n    }\n\n    // Share accumulated info back to ContainerView\n\t\toverride func textViewportLayoutControllerDidLayout (_ textViewportLayoutController: NSTextViewportLayoutController) {\n\t\t  super.textViewportLayoutControllerDidLayout(textViewportLayoutController)\n      //...\n    }\n\n    // Skip layout for paragraphs marked as collapsed\n    func textContentManager(shouldEnumerate textElement: NSTextElement, options: NSTextContentManager.EnumerationOptions) -> Bool {\n      //...\n    }\n\n    // Handle section collapse toggling\n    func toggleSection(headerOffset: Int) {\n        if collapsedSections.contains(headerOffset) {\n            collapsedSections.remove(headerOffset)\n        } else {\n            collapsedSections.insert(headerOffset)\n        }\n        guard let textLayoutManager = textLayoutManager else { return }\n\n        let textViewportLayoutController = textLayoutManager.textViewportLayoutController\n        textViewportLayoutController.delegate?.textViewportLayoutControllerReceivedSetNeedsLayout?(textViewportLayoutController)\n    }\n}"
        },
        {
          "title": "Text attachment view provider reuse policy",
          "language": "swift",
          "startTimeSeconds": 1326,
          "code": "// Cache text attachment view providers\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    var textView: UITextView\n\n    func setupTextView() {\n        textView = UITextView()\n        textView.register(\n            [.onEditingInlineParagraphs],\n            forTextAttachmentViewProviderType: AnimatedAttachmentViewProvider.self\n        )\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Enriching your text in text views",
          "url": "https://developer.apple.com/documentation/UIKit/enriching-your-text-in-text-views",
          "type": "documentation",
          "description": "Support line numbering, section collapsing, inline attachment caching, exclusion paths, text attachments, and text lists in a text view.",
          "sosumiURL": "https://sosumi.ai/documentation/UIKit/enriching-your-text-in-text-views",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/enriching-your-text-in-text-views.json"
        },
        {
          "title": "TextKit",
          "url": "https://developer.apple.com/documentation/AppKit/textkit",
          "type": "documentation",
          "description": "Manage text storage and perform custom layout of text-based content in your app’s views.",
          "sosumiURL": "https://sosumi.ai/documentation/AppKit/textkit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppKit/textkit.json"
        }
      ],
      "path": "sessions/wwdc2026/370-elevate-your-app-s-text-experience-with-textkit/",
      "files": {
        "metadata": "sessions/wwdc2026/370-elevate-your-app-s-text-experience-with-textkit/metadata.json",
        "readme": "sessions/wwdc2026/370-elevate-your-app-s-text-experience-with-textkit/README.md",
        "transcript": "sessions/wwdc2026/370-elevate-your-app-s-text-experience-with-textkit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/370-elevate-your-app-s-text-experience-with-textkit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-372",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 372,
      "title": "Unwrap PaperKit",
      "description": "Craft a canvas-based application with PaperKit. Explore the new data model APIs that let you access, create, and modify markup elements. Learn how to add custom controls and annotations, and discover best practices for integrating these features into your app to build a fully featured creative canvas.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/372",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/372",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "🎈",
        "paper"
      ],
      "topics": [
        "SwiftUI & UI Frameworks",
        "App Services"
      ],
      "primaryTopic": "App Services",
      "duration": 459,
      "hasTranscript": true,
      "transcriptWordCount": 1053,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/372/4/012a7de6-cf54-420f-aaf7-02ea568485bf/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/372/4/012a7de6-cf54-420f-aaf7-02ea568485bf/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/372/4/012a7de6-cf54-420f-aaf7-02ea568485bf/downloads/wwdc2026-372_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/372/4/012a7de6-cf54-420f-aaf7-02ea568485bf/downloads/wwdc2026-372_hd.mp4",
        "duration": 459
      },
      "codeSnippets": [
        {
          "title": "Creating markup subelements",
          "language": "swift",
          "startTimeSeconds": 96,
          "code": "import PaperKit\n\nfunc generateMarkup(pageSize: CGSize, panelFrames: [CGRect], configuration: ShapeConfiguration) -> PaperMarkup {\n    var markup = PaperMarkup(bounds: CGRect(origin: .zero, size: pageSize))\n    var subelements: MarkupOrderedSet = markup.subelements\n    for panelFrame: CGRect in panelFrames {\n        let shape = ShapeMarkup(frame: panelFrame, configuration: configuration)\n        subelements.append(shape)\n    }\n    markup.subelements = subelements\n    return markup\n}"
        },
        {
          "title": "Making template elements read-only",
          "language": "swift",
          "startTimeSeconds": 183,
          "code": "import PaperKit\n\nfunc generateMarkup(pageSize: CGSize, panelFrames: [CGRect], configuration: ShapeConfiguration) -> PaperMarkup {\n    var markup = PaperMarkup(bounds: CGRect(origin: .zero, size: pageSize))\n    var subelements: MarkupOrderedSet = markup.subelements\n    for panelFrame: CGRect in panelFrames {\n        var shape = ShapeMarkup(frame: panelFrame, configuration: configuration)\n        shape.allowedInteractions = .readOnly\n        subelements.append(shape)\n    }\n    markup.subelements = subelements\n    return markup\n}"
        },
        {
          "title": "Apply style to template elements",
          "language": "swift",
          "startTimeSeconds": 262,
          "code": "import PaperKit\n\nfunc updatePanelColor(_ selectedColor: CGColor) {\n    guard var markup: PaperMarkup = paperMarkupViewController.markup else { return }\n    var subelements: MarkupOrderedSet = markup.subelements\n    for element in subelements {\n        guard var shape = element as? ShapeMarkup else { continue }\n        shape.strokeColor = selectedColor\n        shape.fillColor = selectedColor.copy(alpha: 0.15)\n        subelements.updateOrAppend(shape)\n    }\n    markup.subelements = subelements\n    markup.backgroundColor = selectedColor.copy(alpha: 0.15)\n    paperMarkupViewController.markup = markup\n}"
        },
        {
          "title": "Add adornments to each panel",
          "language": "swift",
          "startTimeSeconds": 353,
          "code": "import PaperKit\n\nfunc addPanelAdornments(for page: Page) {\n    var adornments: [MarkupAdornment] = []\n    for (panelIndex, panel) in page.panels.enumerated() {\n        let adornmentID = UUID()\n        adornmentPanelMapping[adornmentID] = panelIndex\n        let center = CGPoint(x: panel.midX, y: panel.midY)\n        let adornment = MarkupAdornment(\n            id: adornmentID,\n            anchor: .canvas(location: center),\n            imageConfiguration: .systemImage(\"photo.badge.plus\"),\n            dragRegion: .fixed,\n            scalesWithZoom: false\n        )\n        adornments.append(adornment)\n    }\n    paperMarkupViewController.adornments = adornments\n}"
        },
        {
          "title": "Handle adornment taps",
          "language": "swift",
          "startTimeSeconds": 368,
          "code": "import ImagePlayground\nimport PaperKit\n\nfunc paperMarkupViewController(_ paperMarkupViewController: PaperMarkupViewController, didTapAdornmentWithID id: UUID) {\n    guard let panelIndex = adornmentPanelMapping[id] else { return }\n    activeImageGenerationPanelIndex = panelIndex\n\n    let imagePlaygroundViewController = ImagePlaygroundViewController()\n    imagePlaygroundViewController.delegate = self\n    present(imagePlaygroundViewController, animated: true)\n}"
        },
        {
          "title": "Place the generated image",
          "language": "swift",
          "startTimeSeconds": 380,
          "code": "import ImagePlayground\nimport PaperKit\n\nfunc imageViewController(_ imageViewController: ImagePlaygroundViewController, didCreateImageAt imageURL: URL) {\n    guard let panelFrame = activeGenerationPanelFrame,\n          let paperMarkupViewController = pageViewController.paperViewController,\n          var markup = paperMarkupViewController.markup,\n          let image = UIImage(contentsOfFile: imageURL.path) else { return }\n\n    let imageMarkup = ImageMarkup(frame: panelFrame, image: image)\n    markup.subelements.append(imageMarkup)\n    paperMarkupViewController.markup = markup\n}"
        }
      ],
      "resources": [
        {
          "title": "PaperKit",
          "url": "https://developer.apple.com/documentation/PaperKit",
          "type": "documentation",
          "description": "Add drawings, shapes, and a consistent markup experience to your app.",
          "sosumiURL": "https://sosumi.ai/documentation/PaperKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/PaperKit.json"
        }
      ],
      "path": "sessions/wwdc2026/372-unwrap-paperkit/",
      "files": {
        "metadata": "sessions/wwdc2026/372-unwrap-paperkit/metadata.json",
        "readme": "sessions/wwdc2026/372-unwrap-paperkit/README.md",
        "transcript": "sessions/wwdc2026/372-unwrap-paperkit/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/372-unwrap-paperkit/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-375",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 375,
      "title": "Create high-quality images using Image Playground",
      "description": "Enable high-quality image creation in your app using Image Playground. With a new generative model that runs on Private Cloud Compute, users can make images in virtually any style, including photorealistic, in your app. You can also specify dimensions for use in even more places, and allow people to modify images using natural language descriptions and touch. Explore how to adopt Image Playground, generate images from descriptions and photos, and manage feature availability in your app.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/375",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/375",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "visionOS"
      ],
      "keywords": [
        "imagecreator"
      ],
      "topics": [
        "AI & Machine Learning"
      ],
      "primaryTopic": "AI & Machine Learning",
      "duration": 851,
      "hasTranscript": true,
      "transcriptWordCount": 1729,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/375/4/01104285-3253-4b2d-80c3-0d5cdf95c97e/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/375/4/01104285-3253-4b2d-80c3-0d5cdf95c97e/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/375/4/01104285-3253-4b2d-80c3-0d5cdf95c97e/downloads/wwdc2026-375_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/375/4/01104285-3253-4b2d-80c3-0d5cdf95c97e/downloads/wwdc2026-375_hd.mp4",
        "duration": 851
      },
      "codeSnippets": [
        {
          "title": "Adopt Image Playground in SwiftUI",
          "language": "swift",
          "startTimeSeconds": 328,
          "code": "// Adopt Image Playground in SwiftUI\n\nfunc imagePlaygroundSheet(\n    isPresented: Binding<Bool>,\n    concepts: [ImagePlaygroundConcept] = [],\n    sourceImage: Image? = nil,\n    onCompletion: @escaping (URL) -> Void,\n    onCancellation: (() -> Void)? = nil\n) -> some View"
        },
        {
          "title": "Add Image Playground sheet with binding to @State",
          "language": "swift",
          "startTimeSeconds": 339,
          "code": "// Adopt Image Playground\n\n@State private var showingPlayground = false\n\nvar body: some View {\n    Button(\"Create image\") {\n        showingPlayground = true\n    }\n    .imagePlaygroundSheet(\n        isPresented: $showingPlayground,\n        onCompletion: { url in\n            var updated = currentCard\n            store.saveImage(url, for: &updated)\n        }\n    )\n}"
        },
        {
          "title": "Seeding the sheet with context from your card",
          "language": "swift",
          "startTimeSeconds": 389,
          "code": "// Seeding the sheet with context from your card\n\nvar concepts: [ImagePlaygroundConcept] {\n    [\n        .text(card.theme),\n        .extracted(from: card.message, title: card.theme),\n    ]\n}\n\nvar body: some View {\n    Button(\"Create image\") {\n        showingPlayground = true\n    }\n    .imagePlaygroundSheet(\n        isPresented: $showingPlayground,\n        concepts: concepts,\n        onCompletion: { url in\n            var updated = card\n            store.saveImage(url, for: &updated)\n        }\n    )\n}"
        },
        {
          "title": "Starting from a reference photo",
          "language": "swift",
          "startTimeSeconds": 431,
          "code": "// Starting from a reference photo\n\n@State private var sourceImage: Image?\n\nvar body: some View {\n    Button(\"Create image\") {\n        showingPlayground = true\n    }\n    .imagePlaygroundSheet(\n        isPresented: $showingPlayground,\n        concepts: concepts,\n        sourceImage: sourceImage,\n        onCompletion: { url in\n            var updated = card\n            store.saveImage(url, for: &updated)\n        }\n    )\n}"
        },
        {
          "title": "Providing a visual suggestion using a drawing",
          "language": "swift",
          "startTimeSeconds": 462,
          "code": "// Providing a visual suggestion using a drawing\n\n@State private var drawing = PKDrawing()\n\nvar concepts: [ImagePlaygroundConcept] {\n    var result: [ImagePlaygroundConcept] = [\n        .text(card.theme),\n        .extracted(from: card.message)\n    ]\n    if !drawing.strokes.isEmpty {\n        result.append(.drawing(drawing))\n    }\n    return result\n}"
        },
        {
          "title": "Adopt Image Playground in UIKit or AppKit",
          "language": "swift",
          "startTimeSeconds": 486,
          "code": "// Adopt Image Playground in UIKit or AppKit\n\nfunc presentViewController() {\n    let viewController = ImagePlaygroundViewController()\n    viewController.concepts = [\n        .text(card.theme),\n        .extracted(from: card.message)\n    ]\n    viewController.delegate = self\n    present(viewController, animated: true)\n}\n\nfunc imagePlaygroundViewController(\n    _ viewController: ImagePlaygroundViewController,\n    didCreateImageAt url: URL\n) {\n    var updated = card\n    store.saveImage(url, for: &updated)\n    dismiss(animated: true)\n}"
        },
        {
          "title": "Size Specification",
          "language": "swift",
          "startTimeSeconds": 542,
          "code": "// Size Specification\n\nvar options: ImagePlaygroundOptions {\n    var options = ImagePlaygroundOptions()\n    options.sizeSpecification = .closest(to: card.format.size)\n    return options\n}\n\nvar body: some View {\n    Button(\"Create image\") { showingPlayground = true }\n        .imagePlaygroundSheet(\n            isPresented: $showingPlayground,\n            concepts: concepts,\n            onCompletion: { url in\n                var updated = card\n                store.saveImage(url, for: &updated)\n            }\n        )\n        .imagePlaygroundOptions(options)\n}"
        },
        {
          "title": "Styles",
          "language": "swift",
          "startTimeSeconds": 579,
          "code": "// Styles\n\nvar options: ImagePlaygroundOptions {\n    var options = ImagePlaygroundOptions()\n    options.sizeSpecification = .closest(to: card.format.size)\n    return options\n}\n\nvar body: some View {\n    Button(\"Create image\") { showingPlayground = true }\n        .imagePlaygroundSheet(\n            isPresented: $showingPlayground,\n            concepts: concepts,\n            onCompletion: { url in\n                var updated = card\n                store.saveImage(url, for: &updated)\n            }\n        )\n        .imagePlaygroundOptions(options)\n        .imagePlaygroundGenerationStyle(\n            pendingStylePreset.defaultStyle,\n            in: pendingStylePreset.allowedStyles\n        )\n}"
        },
        {
          "title": "External Provider Style",
          "language": "swift",
          "startTimeSeconds": 627,
          "code": "// External Provider Style\n\nvar options: ImagePlaygroundOptions {\n    var options = ImagePlaygroundOptions()\n    options.sizeSpecification = .closest(to: card.format.size)\n    return options\n}\n\nvar body: some View {\n    Button(\"Create image\") { showingPlayground = true }\n        .imagePlaygroundSheet(\n            isPresented: $showingPlayground,\n            concepts: concepts,\n            onCompletion: { url in\n                var updated = card\n                store.saveImage(url, for: &updated)\n            }\n        )\n        .imagePlaygroundOptions(options)\n        .imagePlaygroundGenerationStyle(\n            pendingStylePreset.defaultStyle,\n            in: pendingStylePreset.allowedStyles + [.externalProvider]\n        )\n}"
        },
        {
          "title": "Generating an expressive icon for the card thumbnail",
          "language": "swift",
          "startTimeSeconds": 662,
          "code": "// Generating an expressive icon for the card thumbnail\n\n@State private var showingIconPlayground = false\n\nvar body: some View {\n    Button(\"Create icon\") {\n        showingIconPlayground = true\n    }\n    Color.clear\n        .imagePlaygroundSheet(\n            isPresented: $showingIconPlayground,\n            concepts: concepts,\n            onCompletion: { _ in\n            } ,\n            onAdaptiveImageGlyphCreation: { glyph in\n                var updatedCard = card\n                store.saveIcon(glyph, for: &updatedCard)\n            }\n        )\n        .imagePlaygroundGenerationStyle(.emoji, in: [.emoji])\n}"
        },
        {
          "title": "Disabling personalization when it doesn't fit your context",
          "language": "swift",
          "startTimeSeconds": 721,
          "code": "// Disabling personalization when it doesn't fit your context\n\nvar options: ImagePlaygroundOptions {\n    var options = ImagePlaygroundOptions()\n    options.sizeSpecification = .closest(to: card.format.size)\n    options.personalization = .disabled\n    return options\n}"
        },
        {
          "title": "Supports image generation",
          "language": "swift",
          "startTimeSeconds": 752,
          "code": "// Supports image generation\n\n@Environment(\\.supportsImageGeneration)\nprivate var supportsImageGeneration\n\nvar body: some View {\n    NavigationLink(card.recipient) {\n        if supportsImageGeneration {\n            CardEditorView(card: card)\n        }γelse {\n            CardPickerView(card: card)\n        }\n    }\n}"
        }
      ],
      "resources": [],
      "path": "sessions/wwdc2026/375-create-high-quality-images-using-image-playground/",
      "files": {
        "metadata": "sessions/wwdc2026/375-create-high-quality-images-using-image-playground/metadata.json",
        "readme": "sessions/wwdc2026/375-create-high-quality-images-using-image-playground/README.md",
        "transcript": "sessions/wwdc2026/375-create-high-quality-images-using-image-playground/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/375-create-high-quality-images-using-image-playground/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-378",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 378,
      "title": "Unlock in-game content with StoreKit and Background Assets",
      "description": "Unlock native Apple In-App Purchases for your Unity game with the new StoreKit plug-in. Reduce download sizes with the new Background Assets plug-in, which delivers language-specific asset packs so each player gets just what they need. Plus, a new Steam Asset Converter helps you migrate existing builds.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/378",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/378",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "App Services",
        "App Store, Distribution & Marketing"
      ],
      "primaryTopic": "App Store, Distribution & Marketing",
      "duration": 599,
      "hasTranscript": true,
      "transcriptWordCount": 1506,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/downloads/wwdc2026-378_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/downloads/wwdc2026-378_hd.mp4",
        "duration": 599
      },
      "codeSnippets": [
        {
          "title": "Asset pack manifest for a localized asset pack",
          "language": "json",
          "startTimeSeconds": 186,
          "code": "// Asset pack manifest\n\n{\n   \"assetPackID\": \"voice-english\",\n   \"downloadPolicy\": { /* … */ },\n   \"language\": \"en-US\",\n   \"sourceRoot\": \".\",\n   \"fileSelectors\": [ /* … */ ],\n   \"platforms\": [ /* … */ ]\n    //… \n}"
        },
        {
          "title": "Convert a Steam depot to an asset pack manifest",
          "language": "bash",
          "startTimeSeconds": 207,
          "code": "# Convert a Steam depot to an asset pack manifest\nxcrun ba-package convert --asset-pack-id voice-english -l en-US --on-demand voice-english.vdf -o voice-english.json"
        },
        {
          "title": "Convert an asset pack manifest to an asset pack archive",
          "language": "bash",
          "startTimeSeconds": 208,
          "code": "# Convert an asset pack manifest to an asset pack archive\nxcrun ba-package voice-english.json -o voice-english.aar"
        },
        {
          "title": "Fetch and purchase products with the StoreKit plug-in",
          "language": "csharp",
          "startTimeSeconds": 352,
          "code": "// Fetch and purchase products with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\nasync void Start() {\n    var products = await Product.FetchProducts(new[] {\n            \"com.thecoast.capecod\"\n    });\n}"
        },
        {
          "title": "Fetch and purchase products with the StoreKit plug-in",
          "language": "csharp",
          "startTimeSeconds": 361,
          "code": "// Fetch and purchase products with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\nasync void Purchase(Product product) {\n    var result = await product.Purchase();\n    if (result.Result == PurchaseResult.ResultEnum.Success\n        && result.TransactionVerification.IsVerified)\n    {\n        // Unlock access to purchased content\n\n        result.TransactionVerification.SafePayload.Finish();\n    }\n}"
        },
        {
          "title": "Listen for Transaction updates with the StoreKit plug-in",
          "language": "csharp",
          "startTimeSeconds": 383,
          "code": "// Listen for Transaction updates with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\npublic static class TransactionListener {\n    public static void Initialize() => Transaction.Updates += OnUpdate;\n\n\n    async void OnUpdate(VerificationResult<Transaction> result) {\n        if (!result.IsVerified) return;\n        var verifiedTransaction = result.SafePayload;\n\n        // Consumables are not in CurrentEntitlements, so handle them inline\n        if (verifiedTransaction.ProductType == ProductType.ProductTypeEnum.Consumable) {\n            if (verifiedTransaction.RevocationDate != null) {\n                // Revoke the consumable identified by verifiedTransaction.ProductId\n            } else {\n                // Grant access to the consumable\n            }\n        }else {\n            // Non-consumables and subscriptions: re-read CurrentEntitlements as source of truth\n            await foreach (var verificationResult in Transaction.GetCurrentEntitlements()) {\n                if (!verificationResult.IsVerified) continue;\n                // Grant access to the product\n            }\n        }\n        verifiedTransaction.Finish();\n    }\n}"
        },
        {
          "title": "Download asset packs with the Background Assets plug-in",
          "language": "csharp",
          "startTimeSeconds": 433,
          "code": "// Download asset packs with the Background Assets plug-in\n\nusing Apple.BackgroundAssets;\nusing UnityEngine;\n\nasync void LoadTutorial(string language) {\n    try {\n        string assetPackId = $\"tutorial-{language}\";\n        AssetPackManifest manifest = await AssetPackManager.GetManifestAsync();\n        AssetPack assetPack = manifest.GetAssetPack(assetPackId);\n        CancellationTokenSource tokenSource = new CancellationTokenSource();\n        _ = Task.Run(async () => {\n            await foreach (AssetPackManager.DownloadStatusUpdate statusUpdate in AssetPackManager.DownloadStatusUpdatesAsync(assetPackId)) { \n            \t\t// Update download progress in UI\n            }\n        }, tokenSource.Token);\n        await AssetPackManager.EnsureLocalAvailabilityOfAssetPackAsync(assetPack);\n        tokenSource.Cancel();\n        // Start tutorial with the locally available assets\n    } catch (Exception exception) {\n        // Handle the exception\n    }\n}"
        }
      ],
      "resources": [
        {
          "title": "Apple Unity Plug-Ins on GitHub",
          "url": "https://github.com/apple/unityplugins",
          "type": "download",
          "description": null
        },
        {
          "title": "Background Assets",
          "url": "https://developer.apple.com/documentation/BackgroundAssets",
          "type": "documentation",
          "description": "Improve or eliminate the time people wait while your app downloads assets.",
          "sosumiURL": "https://sosumi.ai/documentation/BackgroundAssets",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/BackgroundAssets.json"
        },
        {
          "title": "StoreKit",
          "url": "https://developer.apple.com/documentation/StoreKit",
          "type": "documentation",
          "description": "Support In-App Purchases and interactions with the App Store.",
          "sosumiURL": "https://sosumi.ai/documentation/StoreKit",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit.json"
        }
      ],
      "path": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/",
      "files": {
        "metadata": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/metadata.json",
        "readme": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/README.md",
        "transcript": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-379",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 379,
      "title": "Meet Trust Insights",
      "description": "Uncover how Trust Insights can help protect people from social scams and coercion. Explore how this new framework uses privacy-preserving machine learning to detect when someone may be coached into risky actions. Find out how to integrate Trust Insights into your app, interpret its signals, and design thoughtful interventions that safeguard people while respecting their privacy.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/379",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/379",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS"
      ],
      "keywords": [
        "🎈"
      ],
      "topics": [
        "Business & Education",
        "Privacy & Security"
      ],
      "primaryTopic": "Privacy & Security",
      "duration": 837,
      "hasTranscript": true,
      "transcriptWordCount": 1560,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/379/4/e12c4703-5c00-44f7-a5f8-80f6e5b7ebd5/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/379/4/e12c4703-5c00-44f7-a5f8-80f6e5b7ebd5/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/379/4/e12c4703-5c00-44f7-a5f8-80f6e5b7ebd5/downloads/wwdc2026-379_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/379/4/e12c4703-5c00-44f7-a5f8-80f6e5b7ebd5/downloads/wwdc2026-379_hd.mp4",
        "duration": 837
      },
      "codeSnippets": [
        {
          "title": "Generating insights",
          "language": "swift",
          "startTimeSeconds": 181,
          "code": "import TrustInsights\n\nlet request = IsLikelyBeingCoachedInsight.request(schema: .version1, modelVersion: .current)\nlet context = InsightEvaluator.InsightContext(operationCategory: .resourceUse,\n                                              requestedEvaluations: request)\n\nlet evaluator = InsightEvaluator()\nguard try await evaluator.requestAuthorization(for: context) == .authorized else { return }\n\nlet assessment = try await evaluator.requestEvaluation(context: context)\ndo {\n    try handleAssessment(assessment)\n} catch {\n    // Handle error\n}\n\nassessment.reportConsumption(.usedIncreasedFriction)"
        },
        {
          "title": "Handling results for IsLikelyBeingCoachedInsight",
          "language": "swift",
          "startTimeSeconds": 337,
          "code": "func handleAssessment(_ assessment: InsightEvaluation<IsLikelyBeingCoachedInsight>) throws {\n\tswitch try assessment.insight.outcome.get() {\n\t\tcase .unknown:\n\n\t\tcase .medium:\n\n\t\tcase .high:\n\n\t\t@unknown default:\n\n\t}\n}"
        },
        {
          "title": "Real-time consumption feedback",
          "language": "swift",
          "startTimeSeconds": 425,
          "code": "import TrustInsights\n\nlet request = IsLikelyBeingCoachedInsight.request(schema: .version1, modelVersion: .current)\nlet context = InsightEvaluator.InsightContext(operationCategory: .resourceUse,\n                                              requestedEvaluations: request)\n\nlet evaluator = InsightEvaluator()\nguard try await evaluator.requestAuthorization(for: context) == .authorized else { return }\n\nlet assessment = try await evaluator.requestEvaluation(context: context)\ndo {\n    try handleAssessment(assessment)\n} catch {\n    // Handle error\n}\n\nassessment.reportConsumption(.usedIncreasedFriction)"
        }
      ],
      "resources": [
        {
          "title": "Trust Insights",
          "url": "https://developer.apple.com/documentation/TrustInsights",
          "type": "documentation",
          "description": "Evaluate transactions for potential coercive activity while preserving people’s privacy.",
          "sosumiURL": "https://sosumi.ai/documentation/TrustInsights",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/TrustInsights.json"
        }
      ],
      "path": "sessions/wwdc2026/379-meet-trust-insights/",
      "files": {
        "metadata": "sessions/wwdc2026/379-meet-trust-insights/metadata.json",
        "readme": "sessions/wwdc2026/379-meet-trust-insights/README.md",
        "transcript": "sessions/wwdc2026/379-meet-trust-insights/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/379-meet-trust-insights/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-382",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 382,
      "title": "Inside Apple Intelligence and Xcode: Special Presentation",
      "description": "Step inside Steve Jobs Theater to discover the latest Apple Intelligence and Xcode advancements. Learn how to accelerate your development with new agentic coding workflows in Xcode 27, and discover how App Intents enable Siri to understand context and take action inside your app. Find out how to ship intelligent features using the Foundation Models framework, deploy custom on-device models with Core AI, and scale your machine learning research and training using MLX.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/382",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/382",
      "type": "Video",
      "publishedAt": "2026-06-17T09:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "AI & Machine Learning",
        "Developer Tools",
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 5272,
      "hasTranscript": true,
      "transcriptWordCount": 12677,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/382/1/a1dfe905-059c-45b1-b109-e68230f76399/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/382/1/a1dfe905-059c-45b1-b109-e68230f76399/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/382/1/a1dfe905-059c-45b1-b109-e68230f76399/downloads/wwdc2026-382_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/382/1/a1dfe905-059c-45b1-b109-e68230f76399/downloads/wwdc2026-382_hd.mp4",
        "duration": 5272
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Xcode",
          "url": "https://developer.apple.com/documentation/Xcode",
          "type": "documentation",
          "description": "Build, test, and submit your app with Apple’s integrated development environment.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode.json"
        },
        {
          "title": "Evaluations",
          "url": "https://developer.apple.com/documentation/Evaluations",
          "type": "documentation",
          "description": "Measure the quality of your app’s intelligence-powered features.",
          "sosumiURL": "https://sosumi.ai/documentation/Evaluations",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Evaluations.json"
        },
        {
          "title": "Core AI",
          "url": "https://developer.apple.com/documentation/CoreAI",
          "type": "documentation",
          "description": "Run AI models in your app on Apple silicon.",
          "sosumiURL": "https://sosumi.ai/documentation/CoreAI",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/CoreAI.json"
        },
        {
          "title": "Foundation Models",
          "url": "https://developer.apple.com/documentation/FoundationModels",
          "type": "documentation",
          "description": "Perform tasks with models that specialize in language understanding, structured output, and tool calling.",
          "sosumiURL": "https://sosumi.ai/documentation/FoundationModels",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/FoundationModels.json"
        },
        {
          "title": "MLX",
          "url": "https://ml-explore.github.io/mlx/",
          "type": "documentation",
          "description": "MLX is an array framework for machine learning on Apple silicon, brought to you by Apple machine learning research."
        },
        {
          "title": "App Intents",
          "url": "https://developer.apple.com/documentation/AppIntents",
          "type": "documentation",
          "description": "Make content and actions discoverable by Apple Intelligence and support system experiences like Siri, Spotlight, Shortcuts, and widgets.",
          "sosumiURL": "https://sosumi.ai/documentation/AppIntents",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/AppIntents.json"
        }
      ],
      "path": "sessions/wwdc2026/382-inside-apple-intelligence-and-xcode-special-presentation/",
      "files": {
        "metadata": "sessions/wwdc2026/382-inside-apple-intelligence-and-xcode-special-presentation/metadata.json",
        "readme": "sessions/wwdc2026/382-inside-apple-intelligence-and-xcode-special-presentation/README.md",
        "transcript": "sessions/wwdc2026/382-inside-apple-intelligence-and-xcode-special-presentation/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/382-inside-apple-intelligence-and-xcode-special-presentation/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-388",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 388,
      "title": "Find and fix performance issues in your Metal games",
      "description": "Track down hard-to-find game performance issues with powerful Metal tools. Discover how to collect rich performance data using Game Performance Overview in Instruments, run background traces with metalperftrace on macOS and Control Center on iOS, and use the new StateReporting API to correlate metrics directly to your game’s runtime state. Turn hours of telemetry into clear, actionable insights.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/388",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/388",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "Developer Tools",
        "Graphics & Games"
      ],
      "primaryTopic": "Graphics & Games",
      "duration": 1261,
      "hasTranscript": true,
      "transcriptWordCount": 2852,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/388/4/682e727f-75f9-441f-81d9-2d6f38bde4b0/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/388/4/682e727f-75f9-441f-81d9-2d6f38bde4b0/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/388/4/682e727f-75f9-441f-81d9-2d6f38bde4b0/downloads/wwdc2026-388_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/388/4/682e727f-75f9-441f-81d9-2d6f38bde4b0/downloads/wwdc2026-388_hd.mp4",
        "duration": 1261
      },
      "codeSnippets": [
        {
          "title": "Collect a trace with metalperftrace",
          "language": "bash",
          "startTimeSeconds": 300,
          "code": "# Collect the last 5 hours\nmetalperftrace collect /tmp --last 5h\n\n# Output\n# Metal performance traces collected to: /tmp\n# /tmp/MetalPerfTrace_20260401_094100_to_144100.atrc\n\n# Or collect an explicit time range\nmetalperftrace collect /tmp \\\n  --start 2026-04-01T09:41:00 \\\n  --end 2026-04-01T12:41:00"
        },
        {
          "title": "Print a trace overview",
          "language": "bash",
          "startTimeSeconds": 422,
          "code": "metalperftrace overview /Data/MyGameTrace.atrc\n\n# [Modern Renderer pid:13833]\n# Mem: 2146.1 MiB (2343.9 Peak, 1199.4 Metal)\n# Total CPU Time: 2417.601s (33.17% Sys, 66.83% User)\n# Instructions: 9944836683668 (5.75% P, 94.25% E)\n# Cycles: 5176430469224 (4.45% P, 95.55% E)\n# Disk Reads / Writes: 317.37 / 0.04 MiB (Logical Write 0.04)\n# Layer 0x729293000 (3456x2104) Interval 300.065s Active 300.065s\n#   59.7 FPS  17735 Frames  188 Skipped\n#   Frame Time avg: 16.74ms min: 8.33 max: 125.00 stddev: 3.70\n#   CPU Begin-to-Present avg: 3.99ms min: 1.40 max: 94.37 stddev: 1.80\n#   On-GPU Time avg: 13.39ms min: 5.24 max: 37.57 stddev: 1.43\n#   Next Drawable Wait avg: 0.26ms min: 0.00 max: 91.08 stddev: 1.75\n#   Shader Compilation Time: 0.000s (Total: 0, Cached: 18)"
        },
        {
          "title": "Filter by process and emit JSON",
          "language": "objectivec",
          "startTimeSeconds": 478,
          "code": "// Report state transitions\n#import <StateReporting/StateReporting.h>\n\nNSString *domain = @\"com.mygame.level\";\nSRStateReporter *reporter = [SRStateReporter reporterForDomain:domain];\n\n[reporter reportTransitionToStateLabel:@\"Level 1\"\n                        stableMetadata:nil\n                      volatileMetadata:nil];\n\n[reporter reportTransitionToStateLabel:@\"Level 1\"\n                        stableMetadata:@{ @\"id\": @1001 }\n                      volatileMetadata:nil];\n\n[reporter reportVolatileMetadataUpdate:@{ @\"health\": @100 }];"
        },
        {
          "title": "Include full state transitions in overview",
          "language": "bash",
          "startTimeSeconds": 835,
          "code": "metalperftrace overview /Data/MyGameTrace.atrc --include-state-transitions\n\n# [States]\n# com.mygame.graphics\n#   High (30.59%, 14.996s)  raytracing: 1  shadow: ultra\n#   Medium (69.38%, 34.012s)  raytracing: 0  shadow: medium\n# com.mygame.level\n#   Level 1 (20.47%, 10.033s)  biome: forest   id: 1001\n#   Level 2 (79.53%, 38.991s)  biome: volcano  id: 1002"
        },
        {
          "title": "Aggregate metrics by state",
          "language": "bash",
          "startTimeSeconds": 855,
          "code": "# Aggregate across all domains / transitions\nmetalperftrace overview /Data/MyGameTrace.atrc --aggregate\n\n# Aggregate one domain\nmetalperftrace overview /Data/MyGameTrace.atrc --aggregate \\\n  --domain com.mygame.graphics\n\n# Aggregate a specific state label within a domain\nmetalperftrace overview /Data/MyGameTrace.atrc --aggregate \\\n  --domain com.mygame.graphics \\\n  --state-label \"High\""
        }
      ],
      "resources": [
        {
          "title": "Understanding the Metal Performance HUD metrics",
          "url": "https://developer.apple.com/documentation/Xcode/Understanding-metal-performance-hud-metrics",
          "type": "documentation",
          "description": "Learn what each of the metrics reported by the heads-up display indicates.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/Understanding-metal-performance-hud-metrics",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/Understanding-metal-performance-hud-metrics.json"
        },
        {
          "title": "Monitoring your Metal app’s graphics performance",
          "url": "https://developer.apple.com/documentation/Xcode/Monitoring-your-Metal-apps-graphics-performance",
          "type": "documentation",
          "description": "Catch performance issues using the Metal Performance HUD while your app runs.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/Monitoring-your-Metal-apps-graphics-performance",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/Monitoring-your-Metal-apps-graphics-performance.json"
        },
        {
          "title": "Getting started with StateReporting",
          "url": "https://developer.apple.com/documentation/StateReporting/getting-started-with-statereporting",
          "type": "documentation",
          "description": "Define reportable metadata types, obtain a state reporter for your domain, and report transitions at the right call sites in your app.",
          "sosumiURL": "https://sosumi.ai/documentation/StateReporting/getting-started-with-statereporting",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StateReporting/getting-started-with-statereporting.json"
        },
        {
          "title": "Metal debugger",
          "url": "https://developer.apple.com/documentation/Xcode/Metal-debugger",
          "type": "documentation",
          "description": "Debug and profile your Metal workload with a GPU trace.",
          "sosumiURL": "https://sosumi.ai/documentation/Xcode/Metal-debugger",
          "doccJSON": "https://developer.apple.com/tutorials/data/documentation/Xcode/Metal-debugger.json"
        }
      ],
      "path": "sessions/wwdc2026/388-find-and-fix-performance-issues-in-your-metal-games/",
      "files": {
        "metadata": "sessions/wwdc2026/388-find-and-fix-performance-issues-in-your-metal-games/metadata.json",
        "readme": "sessions/wwdc2026/388-find-and-fix-performance-issues-in-your-metal-games/README.md",
        "transcript": "sessions/wwdc2026/388-find-and-fix-performance-issues-in-your-metal-games/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/388-find-and-fix-performance-issues-in-your-metal-games/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-389",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 389,
      "title": "Discover container machines",
      "description": "Meet container machines, a new tool included in Container that offers a lightweight persistent Linux environment on Mac. Explore how container machines work and how the design of Containerization allows for a performant and seamless experience when developing for Linux on macOS.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/389",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/389",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "macOS"
      ],
      "keywords": [],
      "topics": [
        "Swift",
        "System Services",
        "Developer Tools"
      ],
      "primaryTopic": "Developer Tools",
      "duration": 667,
      "hasTranscript": true,
      "transcriptWordCount": 1214,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/389/4/8dd035e7-0481-4028-b4bd-e91ba3634198/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/389/4/8dd035e7-0481-4028-b4bd-e91ba3634198/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/389/4/8dd035e7-0481-4028-b4bd-e91ba3634198/downloads/wwdc2026-389_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/389/4/8dd035e7-0481-4028-b4bd-e91ba3634198/downloads/wwdc2026-389_hd.mp4",
        "duration": 667
      },
      "codeSnippets": [
        {
          "title": "Viewing container machine commands",
          "language": "bash",
          "startTimeSeconds": 281,
          "code": "container machine"
        },
        {
          "title": "Creating a new container machine",
          "language": "bash",
          "startTimeSeconds": 300,
          "code": "container machine create --name demo --set-default alpine"
        },
        {
          "title": "Echo hi",
          "language": "bash",
          "startTimeSeconds": 339,
          "code": "container machine run echo hi"
        },
        {
          "title": "Running uname",
          "language": "bash",
          "startTimeSeconds": 357,
          "code": "container machine run uname"
        },
        {
          "title": "Start interactive shell",
          "language": "bash",
          "startTimeSeconds": 388,
          "code": "container machine run"
        },
        {
          "title": "List container machines",
          "language": "bash",
          "startTimeSeconds": 481,
          "code": "container machine list"
        },
        {
          "title": "Start interactive shell",
          "language": "bash",
          "startTimeSeconds": 502,
          "code": "container machine run"
        },
        {
          "title": "Run the application",
          "language": "bash",
          "startTimeSeconds": 553,
          "code": "swift run"
        }
      ],
      "resources": [
        {
          "title": "Container",
          "url": "https://github.com/apple/container",
          "type": "guide",
          "description": "Details on the container command line tooling, utilizing the Containerization library."
        },
        {
          "title": "Containerization",
          "url": "https://github.com/apple/containerization",
          "type": "guide",
          "description": "Open-source project for the Containerization library."
        }
      ],
      "path": "sessions/wwdc2026/389-discover-container-machines/",
      "files": {
        "metadata": "sessions/wwdc2026/389-discover-container-machines/metadata.json",
        "readme": "sessions/wwdc2026/389-discover-container-machines/README.md",
        "transcript": "sessions/wwdc2026/389-discover-container-machines/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/389-discover-container-machines/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-391",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 391,
      "title": "Offer subscriptions to groups and organizations",
      "description": "Discover how to reach more customers by offering subscriptions to groups and organizations. The Group Purchases feature lets a single subscriber buy multiple seats and invite others directly from your app. Volume Purchasing through Apple Business and Apple School Manager puts your subscriptions in front of enterprise and education buyers who already procure apps at scale. Learn how to offer these subscriptions and the options to configure availability and pricing in App Store Connect.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/391",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/391",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "multi seat",
        "multi-seat"
      ],
      "topics": [
        "Business & Education",
        "App Store, Distribution & Marketing"
      ],
      "primaryTopic": "App Store, Distribution & Marketing",
      "duration": 476,
      "hasTranscript": true,
      "transcriptWordCount": 1262,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/391/4/84af4bfe-b42d-4350-91d0-5581899a3e9d/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/391/4/84af4bfe-b42d-4350-91d0-5581899a3e9d/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/391/4/84af4bfe-b42d-4350-91d0-5581899a3e9d/downloads/wwdc2026-391_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/391/4/84af4bfe-b42d-4350-91d0-5581899a3e9d/downloads/wwdc2026-391_hd.mp4",
        "duration": 476
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/391-offer-subscriptions-to-groups-and-organizations/",
      "files": {
        "metadata": "sessions/wwdc2026/391-offer-subscriptions-to-groups-and-organizations/metadata.json",
        "readme": "sessions/wwdc2026/391-offer-subscriptions-to-groups-and-organizations/README.md",
        "transcript": "sessions/wwdc2026/391-offer-subscriptions-to-groups-and-organizations/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/391-offer-subscriptions-to-groups-and-organizations/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-393",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 393,
      "title": "Supercharge your spatial workflows with Reality Composer Pro 3",
      "description": "Discover how to build rich interactivity and stunning visual effects entirely within Reality Composer Pro using its powerful suite of graph-based tools. Learn to craft dynamic materials with Shader Graph, blend skeletal animations with Animation Graph, and simulate particle effects with Compute Graph. Go further by wiring up app interactivity with Script Graph, coordinating scene events with Sequencer, and designing intelligent NPC behaviors with Behavior Trees — all without leaving the editor.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/393",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/393",
      "type": "Video",
      "publishedAt": "2026-06-08T14:00:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS"
      ],
      "keywords": [
        "3d",
        "3d content",
        "animation",
        "augmented reality",
        "behavior tree",
        "compute graph",
        "environment",
        "game",
        "navigation",
        "navigation mesh",
        "particle effects",
        "reality",
        "reality composer pro",
        "realitykit",
        "scene",
        "script graph",
        "shader graph",
        "spatial computing",
        "usdz",
        "visionos"
      ],
      "topics": [
        "Graphics & Games",
        "Spatial Computing"
      ],
      "primaryTopic": "Spatial Computing",
      "duration": 1312,
      "hasTranscript": true,
      "transcriptWordCount": 3391,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/393/4/e68b947f-f7f3-49b5-b959-7a70fd9899c3/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/393/4/e68b947f-f7f3-49b5-b959-7a70fd9899c3/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/393/4/e68b947f-f7f3-49b5-b959-7a70fd9899c3/downloads/wwdc2026-393_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/393/4/e68b947f-f7f3-49b5-b959-7a70fd9899c3/downloads/wwdc2026-393_hd.mp4",
        "duration": 1312
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/393-supercharge-your-spatial-workflows-with-reality-composer-pro/",
      "files": {
        "metadata": "sessions/wwdc2026/393-supercharge-your-spatial-workflows-with-reality-composer-pro/metadata.json",
        "readme": "sessions/wwdc2026/393-supercharge-your-spatial-workflows-with-reality-composer-pro/README.md",
        "transcript": "sessions/wwdc2026/393-supercharge-your-spatial-workflows-with-reality-composer-pro/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/393-supercharge-your-spatial-workflows-with-reality-composer-pro/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-394",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 394,
      "title": "Get ready for WWDC26",
      "description": "Get the inside track on everything Apple has to offer — and make the most of every session, lab, and moment.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/394",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/394",
      "type": "Video",
      "publishedAt": "2026-06-08T13:30:00-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 84,
      "hasTranscript": true,
      "transcriptWordCount": 211,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/394/3/957ab100-9008-44f0-804b-37ad25ee524c/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/394/3/957ab100-9008-44f0-804b-37ad25ee524c/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/394/3/957ab100-9008-44f0-804b-37ad25ee524c/downloads/wwdc2026-394_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/394/3/957ab100-9008-44f0-804b-37ad25ee524c/downloads/wwdc2026-394_hd.mp4",
        "duration": 84
      },
      "codeSnippets": [],
      "resources": [
        {
          "title": "Sign up for Group Labs",
          "url": "https://developer.apple.com/wwdc26/schedule/group-labs",
          "type": "guide",
          "description": null,
          "sosumiURL": "https://sosumi.ai/wwdc26/schedule/group-labs"
        }
      ],
      "path": "sessions/wwdc2026/394-get-ready-for-wwdc26/",
      "files": {
        "metadata": "sessions/wwdc2026/394-get-ready-for-wwdc26/metadata.json",
        "readme": "sessions/wwdc2026/394-get-ready-for-wwdc26/README.md",
        "transcript": "sessions/wwdc2026/394-get-ready-for-wwdc26/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/394-get-ready-for-wwdc26/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-397",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 397,
      "title": "Dub Dub Daily: Day 2",
      "description": "The biggest announcements of WWDC26, all in one place. Catch up on everything revealed, go deeper on the themes shaping this year’s conference, and hear from a special guest joining us to break it all down.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/397",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/397",
      "type": "Video",
      "publishedAt": "2026-06-09T07:00:00-07:00",
      "platforms": [],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 352,
      "hasTranscript": true,
      "transcriptWordCount": 1166,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/397/2/84ab23e3-fe1e-4fa1-9896-67424f14dda6/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/397/2/84ab23e3-fe1e-4fa1-9896-67424f14dda6/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/397/2/84ab23e3-fe1e-4fa1-9896-67424f14dda6/downloads/wwdc2026-397_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/397/2/84ab23e3-fe1e-4fa1-9896-67424f14dda6/downloads/wwdc2026-397_hd.mp4",
        "duration": 352
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/397-dub-dub-daily-day-2/",
      "files": {
        "metadata": "sessions/wwdc2026/397-dub-dub-daily-day-2/metadata.json",
        "readme": "sessions/wwdc2026/397-dub-dub-daily-day-2/README.md",
        "transcript": "sessions/wwdc2026/397-dub-dub-daily-day-2/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/397-dub-dub-daily-day-2/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-398",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 398,
      "title": "Dub Dub Daily: Day 3",
      "description": "Apple Intelligence is evolving — fast. Today we dig into the latest AI announcements, what they mean for your apps, and what’s possible now that wasn’t before. Plus, a special guest joins to explore where it’s all heading.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/398",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/398",
      "type": "Video",
      "publishedAt": "2026-06-10T07:00:00-07:00",
      "platforms": [],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 367,
      "hasTranscript": true,
      "transcriptWordCount": 1121,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/398/2/410c7536-3689-45c3-a343-661e3cdd641f/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/398/2/410c7536-3689-45c3-a343-661e3cdd641f/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/398/2/410c7536-3689-45c3-a343-661e3cdd641f/downloads/wwdc2026-398_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/398/2/410c7536-3689-45c3-a343-661e3cdd641f/downloads/wwdc2026-398_hd.mp4",
        "duration": 367
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/398-dub-dub-daily-day-3/",
      "files": {
        "metadata": "sessions/wwdc2026/398-dub-dub-daily-day-3/metadata.json",
        "readme": "sessions/wwdc2026/398-dub-dub-daily-day-3/README.md",
        "transcript": "sessions/wwdc2026/398-dub-dub-daily-day-3/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/398-dub-dub-daily-day-3/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-399",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 399,
      "title": "Dub Dub Daily: Day 4",
      "description": "Your tools just got a serious upgrade. We’re covering Xcode and the developer toolchain designed to help you build faster and smarter — with a special guest who knows what it takes to make developers more productive.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/399",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/399",
      "type": "Video",
      "publishedAt": "2026-06-11T07:00:00-07:00",
      "platforms": [],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 397,
      "hasTranscript": true,
      "transcriptWordCount": 1251,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/399/2/3b82f5d9-fdd9-47cd-862b-8d6c6d9ffa02/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/399/2/3b82f5d9-fdd9-47cd-862b-8d6c6d9ffa02/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/399/2/3b82f5d9-fdd9-47cd-862b-8d6c6d9ffa02/downloads/wwdc2026-399_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/399/2/3b82f5d9-fdd9-47cd-862b-8d6c6d9ffa02/downloads/wwdc2026-399_hd.mp4",
        "duration": 397
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/399-dub-dub-daily-day-4/",
      "files": {
        "metadata": "sessions/wwdc2026/399-dub-dub-daily-day-4/metadata.json",
        "readme": "sessions/wwdc2026/399-dub-dub-daily-day-4/README.md",
        "transcript": "sessions/wwdc2026/399-dub-dub-daily-day-4/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/399-dub-dub-daily-day-4/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-400",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 400,
      "title": "Dub Dub Daily: Day 5",
      "description": "Swift keeps getting better. Today we explore the latest language updates, what they unlock for your code, and why this is an exciting moment to be a Swift developer — with a special guest to help us go deeper.",
      "url": "https://developer.apple.com/videos/play/wwdc2026/400",
      "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/400",
      "type": "Video",
      "publishedAt": "2026-06-12T07:00:00-07:00",
      "platforms": [],
      "keywords": [],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": 460,
      "hasTranscript": true,
      "transcriptWordCount": 1429,
      "availableLanguages": [
        "eng",
        "fra",
        "jpn",
        "kor",
        "por",
        "spa",
        "zho"
      ],
      "media": {
        "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/400/2/71024f51-e63d-4684-b97c-39b7b148238f/cmaf.m3u8",
        "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/400/2/71024f51-e63d-4684-b97c-39b7b148238f/cmaf-download.m3u8",
        "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/400/2/71024f51-e63d-4684-b97c-39b7b148238f/downloads/wwdc2026-400_sd.mp4",
        "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/400/2/71024f51-e63d-4684-b97c-39b7b148238f/downloads/wwdc2026-400_hd.mp4",
        "duration": 460
      },
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/400-dub-dub-daily-day-5/",
      "files": {
        "metadata": "sessions/wwdc2026/400-dub-dub-daily-day-5/metadata.json",
        "readme": "sessions/wwdc2026/400-dub-dub-daily-day-5/README.md",
        "transcript": "sessions/wwdc2026/400-dub-dub-daily-day-5/transcript.md",
        "transcriptJSON": "sessions/wwdc2026/400-dub-dub-daily-day-5/transcript.json"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-403",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 403,
      "title": "Stream the WWDC26 Keynote",
      "description": "Catch the reveal of the latest Apple software and technologies.",
      "url": "https://developer.apple.com/news/?id=w53ezvjk",
      "sosumiURL": "https://sosumi.ai/news/?id=w53ezvjk",
      "type": "Article",
      "publishedAt": "2026-06-07T12:00:53-07:00",
      "platforms": [
        "iOS",
        "iPadOS",
        "macOS",
        "tvOS",
        "visionOS",
        "watchOS"
      ],
      "keywords": [
        "keynote",
        "keynote 2026",
        "wwdc"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": null,
      "hasTranscript": false,
      "transcriptWordCount": 0,
      "availableLanguages": [],
      "media": {},
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/403-stream-the-wwdc26-keynote/",
      "files": {
        "metadata": "sessions/wwdc2026/403-stream-the-wwdc26-keynote/metadata.json",
        "readme": "sessions/wwdc2026/403-stream-the-wwdc26-keynote/README.md"
      }
    },
    {
      "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json",
      "schemaVersion": 1,
      "id": "wwdc2026-1102",
      "event": "wwdc2026",
      "eventName": "WWDC26",
      "year": 2026,
      "eventContentId": 1102,
      "title": "Stream the WWDC26 Platforms State of the Union",
      "description": "Dive deeper into the newest advancements for your apps and games.",
      "url": "https://developer.apple.com/news/?id=geyh0ylz",
      "sosumiURL": "https://sosumi.ai/news/?id=geyh0ylz",
      "type": "Article",
      "publishedAt": "2026-06-07T11:59:51-07:00",
      "platforms": [],
      "keywords": [
        "sotu",
        "sotu2026"
      ],
      "topics": [
        "Essentials"
      ],
      "primaryTopic": "Essentials",
      "duration": null,
      "hasTranscript": false,
      "transcriptWordCount": 0,
      "availableLanguages": [],
      "media": {},
      "codeSnippets": [],
      "resources": [],
      "path": "sessions/wwdc2026/1102-stream-the-wwdc26-platforms-state-of-the-union/",
      "files": {
        "metadata": "sessions/wwdc2026/1102-stream-the-wwdc26-platforms-state-of-the-union/metadata.json",
        "readme": "sessions/wwdc2026/1102-stream-the-wwdc26-platforms-state-of-the-union/README.md"
      }
    }
  ]
}
