[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-getting-started":3,"mdc--8liph7-key":37,"related-repo-meta-getting-started":1222,"related-org-meta-getting-started":1320},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"getting-started","set up Meta wearable SDK integration","SDK setup, Swift Package Manager integration, Info.plist configuration, and first connection to Meta glasses",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"meta","Meta Open Source","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmeta.png","facebook",[13,17,20,23],{"name":14,"slug":15,"type":16},"Configuration","configuration","tag",{"name":18,"slug":19,"type":16},"iOS","ios",{"name":21,"slug":22,"type":16},"Swift","swift",{"name":24,"slug":25,"type":16},"SDK","sdk",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-05-15T06:14:41.086639",null,112,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Meta Wearables Device Access Toolkit for iOS","https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios\u002Ftree\u002FHEAD\u002Fplugins\u002Fmwdat-ios\u002Fskills\u002Fgetting-started","---\nname: getting-started\ndescription: SDK setup, Swift Package Manager integration, Info.plist configuration, and first connection to Meta glasses\n---\n\n# Getting Started with DAT SDK (iOS)\n\nSet up the Meta Wearables Device Access Toolkit in an iOS app.\n\n## Prerequisites\n\n- Xcode 15.0+, iOS 16.0+ deployment target\n- Meta AI companion app installed on test device\n- Ray-Ban Meta glasses or Meta Ray-Ban Display glasses (or use MockDeviceKit for development)\n- Developer Mode enabled in Meta AI app (Settings > Your glasses > Developer Mode)\n\n## Step 1: Add the SDK via Swift Package Manager\n\n1. In Xcode, select **File** > **Add Package Dependencies...**\n2. Enter `https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios`\n3. Select a [version](https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios\u002Ftags)\n4. Add `MWDATCore` and `MWDATCamera` to your target\n\n## Step 2: Configure Info.plist\n\nAdd these required entries to your `Info.plist`:\n\n```xml\n\u003C!-- URL scheme for Meta AI callbacks -->\n\u003Ckey>CFBundleURLTypes\u003C\u002Fkey>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleTypeRole\u003C\u002Fkey>\n    \u003Cstring>Editor\u003C\u002Fstring>\n    \u003Ckey>CFBundleURLName\u003C\u002Fkey>\n    \u003Cstring>$(PRODUCT_BUNDLE_IDENTIFIER)\u003C\u002Fstring>\n    \u003Ckey>CFBundleURLSchemes\u003C\u002Fkey>\n    \u003Carray>\n      \u003Cstring>myexampleapp\u003C\u002Fstring>\n    \u003C\u002Farray>\n  \u003C\u002Fdict>\n\u003C\u002Farray>\n\n\u003C!-- External accessory protocol -->\n\u003Ckey>UISupportedExternalAccessoryProtocols\u003C\u002Fkey>\n\u003Carray>\n  \u003Cstring>com.meta.ar.wearable\u003C\u002Fstring>\n\u003C\u002Farray>\n\n\u003C!-- Background modes -->\n\u003Ckey>UIBackgroundModes\u003C\u002Fkey>\n\u003Carray>\n  \u003Cstring>bluetooth-peripheral\u003C\u002Fstring>\n  \u003Cstring>external-accessory\u003C\u002Fstring>\n\u003C\u002Farray>\n\u003Ckey>NSBluetoothAlwaysUsageDescription\u003C\u002Fkey>\n\u003Cstring>Needed to connect to Meta Wearables\u003C\u002Fstring>\n\n\u003C!-- DAT configuration -->\n\u003Ckey>MWDAT\u003C\u002Fkey>\n\u003Cdict>\n  \u003Ckey>AppLinkURLScheme\u003C\u002Fkey>\n  \u003Cstring>myexampleapp:\u002F\u002F\u003C\u002Fstring>\n  \u003Ckey>MetaAppID\u003C\u002Fkey>\n  \u003Cstring>0\u003C\u002Fstring>\n\u003C\u002Fdict>\n```\n\nReplace `myexampleapp` with your app's URL scheme. Use `0` for `MetaAppID` during development with Developer Mode. Also add `fb-viewapp` to the Info.plist URL query-schemes allowlist used by `UIApplication.canOpenURL` so the SDK can detect and open Meta AI.\n\n## Step 3: Initialize the SDK\n\nCall `Wearables.configure()` once at app launch:\n\n```swift\nimport MWDATCore\n\n@main\nstruct MyApp: App {\n    init() {\n        do {\n            try Wearables.configure()\n        } catch {\n            assertionFailure(\"Failed to configure Wearables SDK: \\(error)\")\n        }\n    }\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n```\n\n## Step 4: Handle URL callbacks\n\nYour app must handle the URL callback from Meta AI after registration:\n\n```swift\n.onOpenURL { url in\n    Task {\n        _ = try? await Wearables.shared.handleUrl(url)\n    }\n}\n```\n\n## Step 5: Register with Meta AI\n\n```swift\nfunc startRegistration() async throws {\n    try await Wearables.shared.startRegistration()\n}\n```\n\nObserve registration state:\n\n```swift\nTask {\n    for await state in Wearables.shared.registrationStateStream() {\n        \u002F\u002F Update UI based on registration state\n    }\n}\n```\n\n## Step 6: Start streaming\n\n```swift\nimport MWDATCore\nimport MWDATCamera\n\n\u002F\u002F Create a DeviceSession — device selection is configured here\nlet wearables = Wearables.shared\nlet deviceSelector = AutoDeviceSelector(wearables: wearables)\nlet deviceSession = try wearables.createSession(deviceSelector: deviceSelector)\ntry deviceSession.start()\n\n\u002F\u002F Wait for the device session to reach the started state\nfor await state in deviceSession.stateStream() {\n    if state == .started { break }\n}\n\nlet config = StreamConfiguration(\n    videoCodec: .raw,\n    resolution: .low,\n    frameRate: 24\n)\nguard let stream = try deviceSession.addStream(config: config) else {\n    return\n}\n\n\u002F\u002F Observe frames\nlet frameToken = stream.videoFramePublisher.listen { frame in\n    guard let image = frame.makeUIImage() else { return }\n    Task { @MainActor in\n        self.currentFrame = image\n    }\n}\n\n\u002F\u002F Start the stream capability\nstream.start()\n```\n\n## Next steps\n\n- [Camera Streaming](camera-streaming.md) — Resolution, frame rate, photo capture\n- [MockDevice Testing](mockdevice-testing.md) — Test without hardware\n- [Session Lifecycle](session-lifecycle.md) — Handle pause\u002Fresume\u002Fstop\n- [Permissions](permissions-registration.md) — Camera permission flows\n- [Full documentation](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fdevelop\u002F)\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,64,89,95,163,169,182,532,577,583,596,744,750,755,800,806,836,841,886,892,1153,1159,1216],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"getting-started-with-dat-sdk-ios",[48],{"type":49,"value":50},"text","Getting Started with DAT SDK (iOS)",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Set up the Meta Wearables Device Access Toolkit in an iOS app.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"prerequisites",[62],{"type":49,"value":63},"Prerequisites",{"type":43,"tag":65,"props":66,"children":67},"ul",{},[68,74,79,84],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72],{"type":49,"value":73},"Xcode 15.0+, iOS 16.0+ deployment target",{"type":43,"tag":69,"props":75,"children":76},{},[77],{"type":49,"value":78},"Meta AI companion app installed on test device",{"type":43,"tag":69,"props":80,"children":81},{},[82],{"type":49,"value":83},"Ray-Ban Meta glasses or Meta Ray-Ban Display glasses (or use MockDeviceKit for development)",{"type":43,"tag":69,"props":85,"children":86},{},[87],{"type":49,"value":88},"Developer Mode enabled in Meta AI app (Settings > Your glasses > Developer Mode)",{"type":43,"tag":58,"props":90,"children":92},{"id":91},"step-1-add-the-sdk-via-swift-package-manager",[93],{"type":49,"value":94},"Step 1: Add the SDK via Swift Package Manager",{"type":43,"tag":96,"props":97,"children":98},"ol",{},[99,117,128,142],{"type":43,"tag":69,"props":100,"children":101},{},[102,104,110,112],{"type":49,"value":103},"In Xcode, select ",{"type":43,"tag":105,"props":106,"children":107},"strong",{},[108],{"type":49,"value":109},"File",{"type":49,"value":111}," > ",{"type":43,"tag":105,"props":113,"children":114},{},[115],{"type":49,"value":116},"Add Package Dependencies...",{"type":43,"tag":69,"props":118,"children":119},{},[120,122],{"type":49,"value":121},"Enter ",{"type":43,"tag":123,"props":124,"children":126},"code",{"className":125},[],[127],{"type":49,"value":27},{"type":43,"tag":69,"props":129,"children":130},{},[131,133],{"type":49,"value":132},"Select a ",{"type":43,"tag":134,"props":135,"children":139},"a",{"href":136,"rel":137},"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios\u002Ftags",[138],"nofollow",[140],{"type":49,"value":141},"version",{"type":43,"tag":69,"props":143,"children":144},{},[145,147,153,155,161],{"type":49,"value":146},"Add ",{"type":43,"tag":123,"props":148,"children":150},{"className":149},[],[151],{"type":49,"value":152},"MWDATCore",{"type":49,"value":154}," and ",{"type":43,"tag":123,"props":156,"children":158},{"className":157},[],[159],{"type":49,"value":160},"MWDATCamera",{"type":49,"value":162}," to your target",{"type":43,"tag":58,"props":164,"children":166},{"id":165},"step-2-configure-infoplist",[167],{"type":49,"value":168},"Step 2: Configure Info.plist",{"type":43,"tag":52,"props":170,"children":171},{},[172,174,180],{"type":49,"value":173},"Add these required entries to your ",{"type":43,"tag":123,"props":175,"children":177},{"className":176},[],[178],{"type":49,"value":179},"Info.plist",{"type":49,"value":181},":",{"type":43,"tag":183,"props":184,"children":189},"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- URL scheme for Meta AI callbacks -->\n\u003Ckey>CFBundleURLTypes\u003C\u002Fkey>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleTypeRole\u003C\u002Fkey>\n    \u003Cstring>Editor\u003C\u002Fstring>\n    \u003Ckey>CFBundleURLName\u003C\u002Fkey>\n    \u003Cstring>$(PRODUCT_BUNDLE_IDENTIFIER)\u003C\u002Fstring>\n    \u003Ckey>CFBundleURLSchemes\u003C\u002Fkey>\n    \u003Carray>\n      \u003Cstring>myexampleapp\u003C\u002Fstring>\n    \u003C\u002Farray>\n  \u003C\u002Fdict>\n\u003C\u002Farray>\n\n\u003C!-- External accessory protocol -->\n\u003Ckey>UISupportedExternalAccessoryProtocols\u003C\u002Fkey>\n\u003Carray>\n  \u003Cstring>com.meta.ar.wearable\u003C\u002Fstring>\n\u003C\u002Farray>\n\n\u003C!-- Background modes -->\n\u003Ckey>UIBackgroundModes\u003C\u002Fkey>\n\u003Carray>\n  \u003Cstring>bluetooth-peripheral\u003C\u002Fstring>\n  \u003Cstring>external-accessory\u003C\u002Fstring>\n\u003C\u002Farray>\n\u003Ckey>NSBluetoothAlwaysUsageDescription\u003C\u002Fkey>\n\u003Cstring>Needed to connect to Meta Wearables\u003C\u002Fstring>\n\n\u003C!-- DAT configuration -->\n\u003Ckey>MWDAT\u003C\u002Fkey>\n\u003Cdict>\n  \u003Ckey>AppLinkURLScheme\u003C\u002Fkey>\n  \u003Cstring>myexampleapp:\u002F\u002F\u003C\u002Fstring>\n  \u003Ckey>MetaAppID\u003C\u002Fkey>\n  \u003Cstring>0\u003C\u002Fstring>\n\u003C\u002Fdict>\n","xml","",[190],{"type":43,"tag":123,"props":191,"children":192},{"__ignoreMap":188},[193,204,213,222,231,240,249,258,267,276,285,294,303,312,321,331,340,349,357,366,374,382,391,400,408,417,426,434,443,452,460,469,478,487,496,505,514,523],{"type":43,"tag":194,"props":195,"children":198},"span",{"class":196,"line":197},"line",1,[199],{"type":43,"tag":194,"props":200,"children":201},{},[202],{"type":49,"value":203},"\u003C!-- URL scheme for Meta AI callbacks -->\n",{"type":43,"tag":194,"props":205,"children":207},{"class":196,"line":206},2,[208],{"type":43,"tag":194,"props":209,"children":210},{},[211],{"type":49,"value":212},"\u003Ckey>CFBundleURLTypes\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":214,"children":216},{"class":196,"line":215},3,[217],{"type":43,"tag":194,"props":218,"children":219},{},[220],{"type":49,"value":221},"\u003Carray>\n",{"type":43,"tag":194,"props":223,"children":225},{"class":196,"line":224},4,[226],{"type":43,"tag":194,"props":227,"children":228},{},[229],{"type":49,"value":230},"  \u003Cdict>\n",{"type":43,"tag":194,"props":232,"children":234},{"class":196,"line":233},5,[235],{"type":43,"tag":194,"props":236,"children":237},{},[238],{"type":49,"value":239},"    \u003Ckey>CFBundleTypeRole\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":241,"children":243},{"class":196,"line":242},6,[244],{"type":43,"tag":194,"props":245,"children":246},{},[247],{"type":49,"value":248},"    \u003Cstring>Editor\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":250,"children":252},{"class":196,"line":251},7,[253],{"type":43,"tag":194,"props":254,"children":255},{},[256],{"type":49,"value":257},"    \u003Ckey>CFBundleURLName\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":259,"children":261},{"class":196,"line":260},8,[262],{"type":43,"tag":194,"props":263,"children":264},{},[265],{"type":49,"value":266},"    \u003Cstring>$(PRODUCT_BUNDLE_IDENTIFIER)\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":268,"children":270},{"class":196,"line":269},9,[271],{"type":43,"tag":194,"props":272,"children":273},{},[274],{"type":49,"value":275},"    \u003Ckey>CFBundleURLSchemes\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":277,"children":279},{"class":196,"line":278},10,[280],{"type":43,"tag":194,"props":281,"children":282},{},[283],{"type":49,"value":284},"    \u003Carray>\n",{"type":43,"tag":194,"props":286,"children":288},{"class":196,"line":287},11,[289],{"type":43,"tag":194,"props":290,"children":291},{},[292],{"type":49,"value":293},"      \u003Cstring>myexampleapp\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":295,"children":297},{"class":196,"line":296},12,[298],{"type":43,"tag":194,"props":299,"children":300},{},[301],{"type":49,"value":302},"    \u003C\u002Farray>\n",{"type":43,"tag":194,"props":304,"children":306},{"class":196,"line":305},13,[307],{"type":43,"tag":194,"props":308,"children":309},{},[310],{"type":49,"value":311},"  \u003C\u002Fdict>\n",{"type":43,"tag":194,"props":313,"children":315},{"class":196,"line":314},14,[316],{"type":43,"tag":194,"props":317,"children":318},{},[319],{"type":49,"value":320},"\u003C\u002Farray>\n",{"type":43,"tag":194,"props":322,"children":324},{"class":196,"line":323},15,[325],{"type":43,"tag":194,"props":326,"children":328},{"emptyLinePlaceholder":327},true,[329],{"type":49,"value":330},"\n",{"type":43,"tag":194,"props":332,"children":334},{"class":196,"line":333},16,[335],{"type":43,"tag":194,"props":336,"children":337},{},[338],{"type":49,"value":339},"\u003C!-- External accessory protocol -->\n",{"type":43,"tag":194,"props":341,"children":343},{"class":196,"line":342},17,[344],{"type":43,"tag":194,"props":345,"children":346},{},[347],{"type":49,"value":348},"\u003Ckey>UISupportedExternalAccessoryProtocols\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":350,"children":352},{"class":196,"line":351},18,[353],{"type":43,"tag":194,"props":354,"children":355},{},[356],{"type":49,"value":221},{"type":43,"tag":194,"props":358,"children":360},{"class":196,"line":359},19,[361],{"type":43,"tag":194,"props":362,"children":363},{},[364],{"type":49,"value":365},"  \u003Cstring>com.meta.ar.wearable\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":367,"children":369},{"class":196,"line":368},20,[370],{"type":43,"tag":194,"props":371,"children":372},{},[373],{"type":49,"value":320},{"type":43,"tag":194,"props":375,"children":377},{"class":196,"line":376},21,[378],{"type":43,"tag":194,"props":379,"children":380},{"emptyLinePlaceholder":327},[381],{"type":49,"value":330},{"type":43,"tag":194,"props":383,"children":385},{"class":196,"line":384},22,[386],{"type":43,"tag":194,"props":387,"children":388},{},[389],{"type":49,"value":390},"\u003C!-- Background modes -->\n",{"type":43,"tag":194,"props":392,"children":394},{"class":196,"line":393},23,[395],{"type":43,"tag":194,"props":396,"children":397},{},[398],{"type":49,"value":399},"\u003Ckey>UIBackgroundModes\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":401,"children":403},{"class":196,"line":402},24,[404],{"type":43,"tag":194,"props":405,"children":406},{},[407],{"type":49,"value":221},{"type":43,"tag":194,"props":409,"children":411},{"class":196,"line":410},25,[412],{"type":43,"tag":194,"props":413,"children":414},{},[415],{"type":49,"value":416},"  \u003Cstring>bluetooth-peripheral\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":418,"children":420},{"class":196,"line":419},26,[421],{"type":43,"tag":194,"props":422,"children":423},{},[424],{"type":49,"value":425},"  \u003Cstring>external-accessory\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":427,"children":429},{"class":196,"line":428},27,[430],{"type":43,"tag":194,"props":431,"children":432},{},[433],{"type":49,"value":320},{"type":43,"tag":194,"props":435,"children":437},{"class":196,"line":436},28,[438],{"type":43,"tag":194,"props":439,"children":440},{},[441],{"type":49,"value":442},"\u003Ckey>NSBluetoothAlwaysUsageDescription\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":444,"children":446},{"class":196,"line":445},29,[447],{"type":43,"tag":194,"props":448,"children":449},{},[450],{"type":49,"value":451},"\u003Cstring>Needed to connect to Meta Wearables\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":453,"children":455},{"class":196,"line":454},30,[456],{"type":43,"tag":194,"props":457,"children":458},{"emptyLinePlaceholder":327},[459],{"type":49,"value":330},{"type":43,"tag":194,"props":461,"children":463},{"class":196,"line":462},31,[464],{"type":43,"tag":194,"props":465,"children":466},{},[467],{"type":49,"value":468},"\u003C!-- DAT configuration -->\n",{"type":43,"tag":194,"props":470,"children":472},{"class":196,"line":471},32,[473],{"type":43,"tag":194,"props":474,"children":475},{},[476],{"type":49,"value":477},"\u003Ckey>MWDAT\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":479,"children":481},{"class":196,"line":480},33,[482],{"type":43,"tag":194,"props":483,"children":484},{},[485],{"type":49,"value":486},"\u003Cdict>\n",{"type":43,"tag":194,"props":488,"children":490},{"class":196,"line":489},34,[491],{"type":43,"tag":194,"props":492,"children":493},{},[494],{"type":49,"value":495},"  \u003Ckey>AppLinkURLScheme\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":497,"children":499},{"class":196,"line":498},35,[500],{"type":43,"tag":194,"props":501,"children":502},{},[503],{"type":49,"value":504},"  \u003Cstring>myexampleapp:\u002F\u002F\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":506,"children":508},{"class":196,"line":507},36,[509],{"type":43,"tag":194,"props":510,"children":511},{},[512],{"type":49,"value":513},"  \u003Ckey>MetaAppID\u003C\u002Fkey>\n",{"type":43,"tag":194,"props":515,"children":517},{"class":196,"line":516},37,[518],{"type":43,"tag":194,"props":519,"children":520},{},[521],{"type":49,"value":522},"  \u003Cstring>0\u003C\u002Fstring>\n",{"type":43,"tag":194,"props":524,"children":526},{"class":196,"line":525},38,[527],{"type":43,"tag":194,"props":528,"children":529},{},[530],{"type":49,"value":531},"\u003C\u002Fdict>\n",{"type":43,"tag":52,"props":533,"children":534},{},[535,537,543,545,551,553,559,561,567,569,575],{"type":49,"value":536},"Replace ",{"type":43,"tag":123,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":542},"myexampleapp",{"type":49,"value":544}," with your app's URL scheme. Use ",{"type":43,"tag":123,"props":546,"children":548},{"className":547},[],[549],{"type":49,"value":550},"0",{"type":49,"value":552}," for ",{"type":43,"tag":123,"props":554,"children":556},{"className":555},[],[557],{"type":49,"value":558},"MetaAppID",{"type":49,"value":560}," during development with Developer Mode. Also add ",{"type":43,"tag":123,"props":562,"children":564},{"className":563},[],[565],{"type":49,"value":566},"fb-viewapp",{"type":49,"value":568}," to the Info.plist URL query-schemes allowlist used by ",{"type":43,"tag":123,"props":570,"children":572},{"className":571},[],[573],{"type":49,"value":574},"UIApplication.canOpenURL",{"type":49,"value":576}," so the SDK can detect and open Meta AI.",{"type":43,"tag":58,"props":578,"children":580},{"id":579},"step-3-initialize-the-sdk",[581],{"type":49,"value":582},"Step 3: Initialize the SDK",{"type":43,"tag":52,"props":584,"children":585},{},[586,588,594],{"type":49,"value":587},"Call ",{"type":43,"tag":123,"props":589,"children":591},{"className":590},[],[592],{"type":49,"value":593},"Wearables.configure()",{"type":49,"value":595}," once at app launch:",{"type":43,"tag":183,"props":597,"children":600},{"className":598,"code":599,"language":22,"meta":188,"style":188},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import MWDATCore\n\n@main\nstruct MyApp: App {\n    init() {\n        do {\n            try Wearables.configure()\n        } catch {\n            assertionFailure(\"Failed to configure Wearables SDK: \\(error)\")\n        }\n    }\n\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n",[601],{"type":43,"tag":123,"props":602,"children":603},{"__ignoreMap":188},[604,612,619,627,635,643,651,659,667,675,683,691,698,706,714,722,729,736],{"type":43,"tag":194,"props":605,"children":606},{"class":196,"line":197},[607],{"type":43,"tag":194,"props":608,"children":609},{},[610],{"type":49,"value":611},"import MWDATCore\n",{"type":43,"tag":194,"props":613,"children":614},{"class":196,"line":206},[615],{"type":43,"tag":194,"props":616,"children":617},{"emptyLinePlaceholder":327},[618],{"type":49,"value":330},{"type":43,"tag":194,"props":620,"children":621},{"class":196,"line":215},[622],{"type":43,"tag":194,"props":623,"children":624},{},[625],{"type":49,"value":626},"@main\n",{"type":43,"tag":194,"props":628,"children":629},{"class":196,"line":224},[630],{"type":43,"tag":194,"props":631,"children":632},{},[633],{"type":49,"value":634},"struct MyApp: App {\n",{"type":43,"tag":194,"props":636,"children":637},{"class":196,"line":233},[638],{"type":43,"tag":194,"props":639,"children":640},{},[641],{"type":49,"value":642},"    init() {\n",{"type":43,"tag":194,"props":644,"children":645},{"class":196,"line":242},[646],{"type":43,"tag":194,"props":647,"children":648},{},[649],{"type":49,"value":650},"        do {\n",{"type":43,"tag":194,"props":652,"children":653},{"class":196,"line":251},[654],{"type":43,"tag":194,"props":655,"children":656},{},[657],{"type":49,"value":658},"            try Wearables.configure()\n",{"type":43,"tag":194,"props":660,"children":661},{"class":196,"line":260},[662],{"type":43,"tag":194,"props":663,"children":664},{},[665],{"type":49,"value":666},"        } catch {\n",{"type":43,"tag":194,"props":668,"children":669},{"class":196,"line":269},[670],{"type":43,"tag":194,"props":671,"children":672},{},[673],{"type":49,"value":674},"            assertionFailure(\"Failed to configure Wearables SDK: \\(error)\")\n",{"type":43,"tag":194,"props":676,"children":677},{"class":196,"line":278},[678],{"type":43,"tag":194,"props":679,"children":680},{},[681],{"type":49,"value":682},"        }\n",{"type":43,"tag":194,"props":684,"children":685},{"class":196,"line":287},[686],{"type":43,"tag":194,"props":687,"children":688},{},[689],{"type":49,"value":690},"    }\n",{"type":43,"tag":194,"props":692,"children":693},{"class":196,"line":296},[694],{"type":43,"tag":194,"props":695,"children":696},{"emptyLinePlaceholder":327},[697],{"type":49,"value":330},{"type":43,"tag":194,"props":699,"children":700},{"class":196,"line":305},[701],{"type":43,"tag":194,"props":702,"children":703},{},[704],{"type":49,"value":705},"    var body: some Scene {\n",{"type":43,"tag":194,"props":707,"children":708},{"class":196,"line":314},[709],{"type":43,"tag":194,"props":710,"children":711},{},[712],{"type":49,"value":713},"        WindowGroup {\n",{"type":43,"tag":194,"props":715,"children":716},{"class":196,"line":323},[717],{"type":43,"tag":194,"props":718,"children":719},{},[720],{"type":49,"value":721},"            ContentView()\n",{"type":43,"tag":194,"props":723,"children":724},{"class":196,"line":333},[725],{"type":43,"tag":194,"props":726,"children":727},{},[728],{"type":49,"value":682},{"type":43,"tag":194,"props":730,"children":731},{"class":196,"line":342},[732],{"type":43,"tag":194,"props":733,"children":734},{},[735],{"type":49,"value":690},{"type":43,"tag":194,"props":737,"children":738},{"class":196,"line":351},[739],{"type":43,"tag":194,"props":740,"children":741},{},[742],{"type":49,"value":743},"}\n",{"type":43,"tag":58,"props":745,"children":747},{"id":746},"step-4-handle-url-callbacks",[748],{"type":49,"value":749},"Step 4: Handle URL callbacks",{"type":43,"tag":52,"props":751,"children":752},{},[753],{"type":49,"value":754},"Your app must handle the URL callback from Meta AI after registration:",{"type":43,"tag":183,"props":756,"children":758},{"className":598,"code":757,"language":22,"meta":188,"style":188},".onOpenURL { url in\n    Task {\n        _ = try? await Wearables.shared.handleUrl(url)\n    }\n}\n",[759],{"type":43,"tag":123,"props":760,"children":761},{"__ignoreMap":188},[762,770,778,786,793],{"type":43,"tag":194,"props":763,"children":764},{"class":196,"line":197},[765],{"type":43,"tag":194,"props":766,"children":767},{},[768],{"type":49,"value":769},".onOpenURL { url in\n",{"type":43,"tag":194,"props":771,"children":772},{"class":196,"line":206},[773],{"type":43,"tag":194,"props":774,"children":775},{},[776],{"type":49,"value":777},"    Task {\n",{"type":43,"tag":194,"props":779,"children":780},{"class":196,"line":215},[781],{"type":43,"tag":194,"props":782,"children":783},{},[784],{"type":49,"value":785},"        _ = try? await Wearables.shared.handleUrl(url)\n",{"type":43,"tag":194,"props":787,"children":788},{"class":196,"line":224},[789],{"type":43,"tag":194,"props":790,"children":791},{},[792],{"type":49,"value":690},{"type":43,"tag":194,"props":794,"children":795},{"class":196,"line":233},[796],{"type":43,"tag":194,"props":797,"children":798},{},[799],{"type":49,"value":743},{"type":43,"tag":58,"props":801,"children":803},{"id":802},"step-5-register-with-meta-ai",[804],{"type":49,"value":805},"Step 5: Register with Meta AI",{"type":43,"tag":183,"props":807,"children":809},{"className":598,"code":808,"language":22,"meta":188,"style":188},"func startRegistration() async throws {\n    try await Wearables.shared.startRegistration()\n}\n",[810],{"type":43,"tag":123,"props":811,"children":812},{"__ignoreMap":188},[813,821,829],{"type":43,"tag":194,"props":814,"children":815},{"class":196,"line":197},[816],{"type":43,"tag":194,"props":817,"children":818},{},[819],{"type":49,"value":820},"func startRegistration() async throws {\n",{"type":43,"tag":194,"props":822,"children":823},{"class":196,"line":206},[824],{"type":43,"tag":194,"props":825,"children":826},{},[827],{"type":49,"value":828},"    try await Wearables.shared.startRegistration()\n",{"type":43,"tag":194,"props":830,"children":831},{"class":196,"line":215},[832],{"type":43,"tag":194,"props":833,"children":834},{},[835],{"type":49,"value":743},{"type":43,"tag":52,"props":837,"children":838},{},[839],{"type":49,"value":840},"Observe registration state:",{"type":43,"tag":183,"props":842,"children":844},{"className":598,"code":843,"language":22,"meta":188,"style":188},"Task {\n    for await state in Wearables.shared.registrationStateStream() {\n        \u002F\u002F Update UI based on registration state\n    }\n}\n",[845],{"type":43,"tag":123,"props":846,"children":847},{"__ignoreMap":188},[848,856,864,872,879],{"type":43,"tag":194,"props":849,"children":850},{"class":196,"line":197},[851],{"type":43,"tag":194,"props":852,"children":853},{},[854],{"type":49,"value":855},"Task {\n",{"type":43,"tag":194,"props":857,"children":858},{"class":196,"line":206},[859],{"type":43,"tag":194,"props":860,"children":861},{},[862],{"type":49,"value":863},"    for await state in Wearables.shared.registrationStateStream() {\n",{"type":43,"tag":194,"props":865,"children":866},{"class":196,"line":215},[867],{"type":43,"tag":194,"props":868,"children":869},{},[870],{"type":49,"value":871},"        \u002F\u002F Update UI based on registration state\n",{"type":43,"tag":194,"props":873,"children":874},{"class":196,"line":224},[875],{"type":43,"tag":194,"props":876,"children":877},{},[878],{"type":49,"value":690},{"type":43,"tag":194,"props":880,"children":881},{"class":196,"line":233},[882],{"type":43,"tag":194,"props":883,"children":884},{},[885],{"type":49,"value":743},{"type":43,"tag":58,"props":887,"children":889},{"id":888},"step-6-start-streaming",[890],{"type":49,"value":891},"Step 6: Start streaming",{"type":43,"tag":183,"props":893,"children":895},{"className":598,"code":894,"language":22,"meta":188,"style":188},"import MWDATCore\nimport MWDATCamera\n\n\u002F\u002F Create a DeviceSession — device selection is configured here\nlet wearables = Wearables.shared\nlet deviceSelector = AutoDeviceSelector(wearables: wearables)\nlet deviceSession = try wearables.createSession(deviceSelector: deviceSelector)\ntry deviceSession.start()\n\n\u002F\u002F Wait for the device session to reach the started state\nfor await state in deviceSession.stateStream() {\n    if state == .started { break }\n}\n\nlet config = StreamConfiguration(\n    videoCodec: .raw,\n    resolution: .low,\n    frameRate: 24\n)\nguard let stream = try deviceSession.addStream(config: config) else {\n    return\n}\n\n\u002F\u002F Observe frames\nlet frameToken = stream.videoFramePublisher.listen { frame in\n    guard let image = frame.makeUIImage() else { return }\n    Task { @MainActor in\n        self.currentFrame = image\n    }\n}\n\n\u002F\u002F Start the stream capability\nstream.start()\n",[896],{"type":43,"tag":123,"props":897,"children":898},{"__ignoreMap":188},[899,906,914,921,929,937,945,953,961,968,976,984,992,999,1006,1014,1022,1030,1038,1046,1054,1062,1069,1076,1084,1092,1100,1108,1116,1123,1130,1137,1145],{"type":43,"tag":194,"props":900,"children":901},{"class":196,"line":197},[902],{"type":43,"tag":194,"props":903,"children":904},{},[905],{"type":49,"value":611},{"type":43,"tag":194,"props":907,"children":908},{"class":196,"line":206},[909],{"type":43,"tag":194,"props":910,"children":911},{},[912],{"type":49,"value":913},"import MWDATCamera\n",{"type":43,"tag":194,"props":915,"children":916},{"class":196,"line":215},[917],{"type":43,"tag":194,"props":918,"children":919},{"emptyLinePlaceholder":327},[920],{"type":49,"value":330},{"type":43,"tag":194,"props":922,"children":923},{"class":196,"line":224},[924],{"type":43,"tag":194,"props":925,"children":926},{},[927],{"type":49,"value":928},"\u002F\u002F Create a DeviceSession — device selection is configured here\n",{"type":43,"tag":194,"props":930,"children":931},{"class":196,"line":233},[932],{"type":43,"tag":194,"props":933,"children":934},{},[935],{"type":49,"value":936},"let wearables = Wearables.shared\n",{"type":43,"tag":194,"props":938,"children":939},{"class":196,"line":242},[940],{"type":43,"tag":194,"props":941,"children":942},{},[943],{"type":49,"value":944},"let deviceSelector = AutoDeviceSelector(wearables: wearables)\n",{"type":43,"tag":194,"props":946,"children":947},{"class":196,"line":251},[948],{"type":43,"tag":194,"props":949,"children":950},{},[951],{"type":49,"value":952},"let deviceSession = try wearables.createSession(deviceSelector: deviceSelector)\n",{"type":43,"tag":194,"props":954,"children":955},{"class":196,"line":260},[956],{"type":43,"tag":194,"props":957,"children":958},{},[959],{"type":49,"value":960},"try deviceSession.start()\n",{"type":43,"tag":194,"props":962,"children":963},{"class":196,"line":269},[964],{"type":43,"tag":194,"props":965,"children":966},{"emptyLinePlaceholder":327},[967],{"type":49,"value":330},{"type":43,"tag":194,"props":969,"children":970},{"class":196,"line":278},[971],{"type":43,"tag":194,"props":972,"children":973},{},[974],{"type":49,"value":975},"\u002F\u002F Wait for the device session to reach the started state\n",{"type":43,"tag":194,"props":977,"children":978},{"class":196,"line":287},[979],{"type":43,"tag":194,"props":980,"children":981},{},[982],{"type":49,"value":983},"for await state in deviceSession.stateStream() {\n",{"type":43,"tag":194,"props":985,"children":986},{"class":196,"line":296},[987],{"type":43,"tag":194,"props":988,"children":989},{},[990],{"type":49,"value":991},"    if state == .started { break }\n",{"type":43,"tag":194,"props":993,"children":994},{"class":196,"line":305},[995],{"type":43,"tag":194,"props":996,"children":997},{},[998],{"type":49,"value":743},{"type":43,"tag":194,"props":1000,"children":1001},{"class":196,"line":314},[1002],{"type":43,"tag":194,"props":1003,"children":1004},{"emptyLinePlaceholder":327},[1005],{"type":49,"value":330},{"type":43,"tag":194,"props":1007,"children":1008},{"class":196,"line":323},[1009],{"type":43,"tag":194,"props":1010,"children":1011},{},[1012],{"type":49,"value":1013},"let config = StreamConfiguration(\n",{"type":43,"tag":194,"props":1015,"children":1016},{"class":196,"line":333},[1017],{"type":43,"tag":194,"props":1018,"children":1019},{},[1020],{"type":49,"value":1021},"    videoCodec: .raw,\n",{"type":43,"tag":194,"props":1023,"children":1024},{"class":196,"line":342},[1025],{"type":43,"tag":194,"props":1026,"children":1027},{},[1028],{"type":49,"value":1029},"    resolution: .low,\n",{"type":43,"tag":194,"props":1031,"children":1032},{"class":196,"line":351},[1033],{"type":43,"tag":194,"props":1034,"children":1035},{},[1036],{"type":49,"value":1037},"    frameRate: 24\n",{"type":43,"tag":194,"props":1039,"children":1040},{"class":196,"line":359},[1041],{"type":43,"tag":194,"props":1042,"children":1043},{},[1044],{"type":49,"value":1045},")\n",{"type":43,"tag":194,"props":1047,"children":1048},{"class":196,"line":368},[1049],{"type":43,"tag":194,"props":1050,"children":1051},{},[1052],{"type":49,"value":1053},"guard let stream = try deviceSession.addStream(config: config) else {\n",{"type":43,"tag":194,"props":1055,"children":1056},{"class":196,"line":376},[1057],{"type":43,"tag":194,"props":1058,"children":1059},{},[1060],{"type":49,"value":1061},"    return\n",{"type":43,"tag":194,"props":1063,"children":1064},{"class":196,"line":384},[1065],{"type":43,"tag":194,"props":1066,"children":1067},{},[1068],{"type":49,"value":743},{"type":43,"tag":194,"props":1070,"children":1071},{"class":196,"line":393},[1072],{"type":43,"tag":194,"props":1073,"children":1074},{"emptyLinePlaceholder":327},[1075],{"type":49,"value":330},{"type":43,"tag":194,"props":1077,"children":1078},{"class":196,"line":402},[1079],{"type":43,"tag":194,"props":1080,"children":1081},{},[1082],{"type":49,"value":1083},"\u002F\u002F Observe frames\n",{"type":43,"tag":194,"props":1085,"children":1086},{"class":196,"line":410},[1087],{"type":43,"tag":194,"props":1088,"children":1089},{},[1090],{"type":49,"value":1091},"let frameToken = stream.videoFramePublisher.listen { frame in\n",{"type":43,"tag":194,"props":1093,"children":1094},{"class":196,"line":419},[1095],{"type":43,"tag":194,"props":1096,"children":1097},{},[1098],{"type":49,"value":1099},"    guard let image = frame.makeUIImage() else { return }\n",{"type":43,"tag":194,"props":1101,"children":1102},{"class":196,"line":428},[1103],{"type":43,"tag":194,"props":1104,"children":1105},{},[1106],{"type":49,"value":1107},"    Task { @MainActor in\n",{"type":43,"tag":194,"props":1109,"children":1110},{"class":196,"line":436},[1111],{"type":43,"tag":194,"props":1112,"children":1113},{},[1114],{"type":49,"value":1115},"        self.currentFrame = image\n",{"type":43,"tag":194,"props":1117,"children":1118},{"class":196,"line":445},[1119],{"type":43,"tag":194,"props":1120,"children":1121},{},[1122],{"type":49,"value":690},{"type":43,"tag":194,"props":1124,"children":1125},{"class":196,"line":454},[1126],{"type":43,"tag":194,"props":1127,"children":1128},{},[1129],{"type":49,"value":743},{"type":43,"tag":194,"props":1131,"children":1132},{"class":196,"line":462},[1133],{"type":43,"tag":194,"props":1134,"children":1135},{"emptyLinePlaceholder":327},[1136],{"type":49,"value":330},{"type":43,"tag":194,"props":1138,"children":1139},{"class":196,"line":471},[1140],{"type":43,"tag":194,"props":1141,"children":1142},{},[1143],{"type":49,"value":1144},"\u002F\u002F Start the stream capability\n",{"type":43,"tag":194,"props":1146,"children":1147},{"class":196,"line":480},[1148],{"type":43,"tag":194,"props":1149,"children":1150},{},[1151],{"type":49,"value":1152},"stream.start()\n",{"type":43,"tag":58,"props":1154,"children":1156},{"id":1155},"next-steps",[1157],{"type":49,"value":1158},"Next steps",{"type":43,"tag":65,"props":1160,"children":1161},{},[1162,1173,1184,1195,1206],{"type":43,"tag":69,"props":1163,"children":1164},{},[1165,1171],{"type":43,"tag":134,"props":1166,"children":1168},{"href":1167},"camera-streaming.md",[1169],{"type":49,"value":1170},"Camera Streaming",{"type":49,"value":1172}," — Resolution, frame rate, photo capture",{"type":43,"tag":69,"props":1174,"children":1175},{},[1176,1182],{"type":43,"tag":134,"props":1177,"children":1179},{"href":1178},"mockdevice-testing.md",[1180],{"type":49,"value":1181},"MockDevice Testing",{"type":49,"value":1183}," — Test without hardware",{"type":43,"tag":69,"props":1185,"children":1186},{},[1187,1193],{"type":43,"tag":134,"props":1188,"children":1190},{"href":1189},"session-lifecycle.md",[1191],{"type":49,"value":1192},"Session Lifecycle",{"type":49,"value":1194}," — Handle pause\u002Fresume\u002Fstop",{"type":43,"tag":69,"props":1196,"children":1197},{},[1198,1204],{"type":43,"tag":134,"props":1199,"children":1201},{"href":1200},"permissions-registration.md",[1202],{"type":49,"value":1203},"Permissions",{"type":49,"value":1205}," — Camera permission flows",{"type":43,"tag":69,"props":1207,"children":1208},{},[1209],{"type":43,"tag":134,"props":1210,"children":1213},{"href":1211,"rel":1212},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fdevelop\u002F",[138],[1214],{"type":49,"value":1215},"Full documentation",{"type":43,"tag":1217,"props":1218,"children":1219},"style",{},[1220],{"type":49,"value":1221},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1223,"total":269},[1224,1241,1254,1267,1287,1294,1309],{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1228,"tags":1229,"stars":26,"repoUrl":27,"updatedAt":1240},"camera-streaming","configure camera streaming and photo capture","Stream, video frames, photo capture, resolution\u002Fframe rate configuration",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1230,1233,1236,1237],{"name":1231,"slug":1232,"type":16},"Camera","camera",{"name":1234,"slug":1235,"type":16},"Hardware","hardware",{"name":18,"slug":19,"type":16},{"name":1238,"slug":1239,"type":16},"Video","video","2026-05-15T06:14:43.555881",{"slug":1242,"name":1242,"fn":1243,"description":1244,"org":1245,"tags":1246,"stars":26,"repoUrl":27,"updatedAt":1253},"dat-conventions","develop iOS applications with DAT SDK","Swift patterns, async\u002Fawait, naming conventions, key types for DAT SDK iOS development",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1247,1248,1251,1252],{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},"Mobile","mobile",{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},"2026-05-15T06:14:42.334435",{"slug":1255,"name":1255,"fn":1256,"description":1257,"org":1258,"tags":1259,"stars":26,"repoUrl":27,"updatedAt":1266},"debugging","debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1260,1262,1265],{"name":1261,"slug":1255,"type":16},"Debugging",{"name":1263,"slug":1264,"type":16},"Engineering","engineering",{"name":18,"slug":19,"type":16},"2026-05-15T06:14:38.626606",{"slug":1268,"name":1268,"fn":1269,"description":1270,"org":1271,"tags":1272,"stars":26,"repoUrl":27,"updatedAt":1286},"display-access","manage display capabilities on wearable devices","Display capability setup, display-capable device selection, UI DSL, icons, buttons, images, and video playback",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1273,1276,1279,1282,1285],{"name":1274,"slug":1275,"type":16},"Design","design",{"name":1277,"slug":1278,"type":16},"Images","images",{"name":1280,"slug":1281,"type":16},"Interaction","interaction",{"name":1283,"slug":1284,"type":16},"UI Components","ui-components",{"name":1238,"slug":1239,"type":16},"2026-05-15T06:14:39.844502",{"slug":4,"name":4,"fn":5,"description":6,"org":1288,"tags":1289,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1290,1291,1292,1293],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1295,"name":1295,"fn":1296,"description":1297,"org":1298,"tags":1299,"stars":26,"repoUrl":27,"updatedAt":1308},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1300,1301,1302,1305],{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},{"name":1303,"slug":1304,"type":16},"QA","qa",{"name":1306,"slug":1307,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":1310,"name":1310,"fn":1311,"description":1312,"org":1313,"tags":1314,"stars":26,"repoUrl":27,"updatedAt":1319},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1315,1316,1317],{"name":1231,"slug":1232,"type":16},{"name":18,"slug":19,"type":16},{"name":1203,"slug":1318,"type":16},"permissions","2026-05-15T06:14:46.030253",{"items":1321,"total":428},[1322,1344,1358,1379,1386,1393,1399,1407,1414,1421,1427,1437],{"slug":1323,"name":1323,"fn":1324,"description":1325,"org":1326,"tags":1327,"stars":1341,"repoUrl":1342,"updatedAt":1343},"relay-best-practices","write idiomatic Relay code","Best practices for writing idiomatic Relay code. ALWAYS use this skill when writing or modifying React components that use Relay for data fetching. Covers fragments, queries, mutations, pagination, and common anti-patterns. Use when you see `useFragment`, `useLazyLoadQuery`, `usePreloadedQuery`, `useMutation`, `usePaginationFragment`, `graphql` template literals, `react-relay` imports, or `__generated__\u002F*.graphql` files. Also use when asked to explain Relay concepts, debug Relay issues, or review Relay code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1328,1329,1332,1335,1338],{"name":1263,"slug":1264,"type":16},{"name":1330,"slug":1331,"type":16},"Frontend","frontend",{"name":1333,"slug":1334,"type":16},"GraphQL","graphql",{"name":1336,"slug":1337,"type":16},"React","react",{"name":1339,"slug":1340,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":1345,"name":1345,"fn":1346,"description":1347,"org":1348,"tags":1349,"stars":1341,"repoUrl":1342,"updatedAt":1357},"relay-performance","optimize Relay application performance","Performance best practices for Relay applications. Use when optimizing data fetching, reducing re-renders, configuring caching, or improving time to first meaningful paint. Covers query placement, @defer, pagination, fetch policies, garbage collection, fragment granularity, and server-side filtering. Companion to the relay-best-practices skill which covers correctness and architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1350,1351,1352,1355,1356],{"name":1330,"slug":1331,"type":16},{"name":1333,"slug":1334,"type":16},{"name":1353,"slug":1354,"type":16},"Performance","performance",{"name":1336,"slug":1337,"type":16},{"name":1339,"slug":1340,"type":16},"2026-06-10T07:30:28.726513",{"slug":1359,"name":1359,"fn":1360,"description":1361,"org":1362,"tags":1363,"stars":1376,"repoUrl":1377,"updatedAt":1378},"add-shape-types-to-torch-model","annotate PyTorch models with tensor shapes","Port a PyTorch model to use pyrefly's tensor shape type system (Tensor[[B, C, H, W]], Int[T]). Use this skill whenever the user wants to add shape annotations to a PyTorch model, type a model with tensor dimensions, port a model to use shape tracking, or annotate model forward methods with tensor shapes. Also use when the user mentions tensor shape ports, Int types for PyTorch, or pyrefly shape checking on a model file. Invoke BEFORE starting any model port — the skill's gated workflow prevents common failure modes.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1364,1367,1370,1373],{"name":1365,"slug":1366,"type":16},"Data Modeling","data-modeling",{"name":1368,"slug":1369,"type":16},"Deep Learning","deep-learning",{"name":1371,"slug":1372,"type":16},"Python","python",{"name":1374,"slug":1375,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1380,"tags":1381,"stars":26,"repoUrl":27,"updatedAt":1240},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1382,1383,1384,1385],{"name":1231,"slug":1232,"type":16},{"name":1234,"slug":1235,"type":16},{"name":18,"slug":19,"type":16},{"name":1238,"slug":1239,"type":16},{"slug":1242,"name":1242,"fn":1243,"description":1244,"org":1387,"tags":1388,"stars":26,"repoUrl":27,"updatedAt":1253},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1389,1390,1391,1392],{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1255,"name":1255,"fn":1256,"description":1257,"org":1394,"tags":1395,"stars":26,"repoUrl":27,"updatedAt":1266},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1396,1397,1398],{"name":1261,"slug":1255,"type":16},{"name":1263,"slug":1264,"type":16},{"name":18,"slug":19,"type":16},{"slug":1268,"name":1268,"fn":1269,"description":1270,"org":1400,"tags":1401,"stars":26,"repoUrl":27,"updatedAt":1286},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1402,1403,1404,1405,1406],{"name":1274,"slug":1275,"type":16},{"name":1277,"slug":1278,"type":16},{"name":1280,"slug":1281,"type":16},{"name":1283,"slug":1284,"type":16},{"name":1238,"slug":1239,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":1408,"tags":1409,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1410,1411,1412,1413],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1295,"name":1295,"fn":1296,"description":1297,"org":1415,"tags":1416,"stars":26,"repoUrl":27,"updatedAt":1308},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1417,1418,1419,1420],{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},{"name":1303,"slug":1304,"type":16},{"name":1306,"slug":1307,"type":16},{"slug":1310,"name":1310,"fn":1311,"description":1312,"org":1422,"tags":1423,"stars":26,"repoUrl":27,"updatedAt":1319},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1424,1425,1426],{"name":1231,"slug":1232,"type":16},{"name":18,"slug":19,"type":16},{"name":1203,"slug":1318,"type":16},{"slug":1428,"name":1428,"fn":1429,"description":1430,"org":1431,"tags":1432,"stars":26,"repoUrl":27,"updatedAt":1436},"sample-app-guide","build wearable apps with camera streaming","Building a complete DAT app with camera streaming and photo capture",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1433,1434,1435],{"name":1231,"slug":1232,"type":16},{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},"2026-05-15T06:14:36.185947",{"slug":1438,"name":1438,"fn":1439,"description":1440,"org":1441,"tags":1442,"stars":26,"repoUrl":27,"updatedAt":1449},"session-lifecycle","monitor device session lifecycle states","Device session states, pause\u002Fresume, availability monitoring",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1443,1444,1445,1448],{"name":18,"slug":19,"type":16},{"name":1249,"slug":1250,"type":16},{"name":1446,"slug":1447,"type":16},"Monitoring","monitoring",{"name":1353,"slug":1354,"type":16},"2026-05-15T06:14:44.790925"]