[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-permissions-registration":3,"mdc--nnhu9l-key":34,"related-repo-meta-permissions-registration":652,"related-org-meta-permissions-registration":752},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"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],{"name":14,"slug":15,"type":16},"Permissions","permissions","tag",{"name":18,"slug":19,"type":16},"iOS","ios",{"name":21,"slug":22,"type":16},"Camera","camera",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-05-15T06:14:46.030253",null,112,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Meta Wearables Device Access Toolkit for iOS","https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios\u002Ftree\u002FHEAD\u002Fplugins\u002Fmwdat-ios\u002Fskills\u002Fpermissions-registration","---\nname: permissions-registration\ndescription: App registration with Meta AI, camera permission flows\n---\n\n# Permissions & Registration (iOS)\n\nRegister your app with Meta AI, then request the device permissions it needs.\n\nThe DAT SDK separates two concepts:\n1. **Registration** — Your app registers with Meta AI to become a permitted integration\n2. **Device permissions** — After registration, request specific device permissions (e.g., camera)\n\nAll permission grants occur through the Meta AI companion app.\n\n## Registration flow\n\n### Start registration\n\n```swift\nfunc startRegistration() async throws {\n    try await Wearables.shared.startRegistration()\n}\n```\n\nThis opens the Meta AI app where the user approves your app. Meta AI then calls back via your URL scheme.\n\n### Handle the callback\n\n```swift\n.onOpenURL { url in\n    Task {\n        _ = try? await Wearables.shared.handleUrl(url)\n    }\n}\n```\n\n### Observe registration state\n\n```swift\nTask {\n    for await state in Wearables.shared.registrationStateStream() {\n        switch state {\n        case .registered:\n            \u002F\u002F App is registered, can request permissions\n        case .unavailable:\n            \u002F\u002F Registration is unavailable\n        case .available:\n            \u002F\u002F Ready to register\n        case .registering:\n            \u002F\u002F Registration in progress\n        }\n    }\n}\n```\n\n### Unregister\n\n```swift\nfunc startUnregistration() async throws {\n    try await Wearables.shared.startUnregistration()\n}\n```\n\n## Camera permissions\n\n### Check permission status\n\n```swift\nlet status = try await Wearables.shared.checkPermissionStatus(.camera)\n```\n\n### Request permission\n\n```swift\nlet status = try await Wearables.shared.requestPermission(.camera)\n```\n\nThe SDK opens Meta AI for the user to grant access. Users can choose:\n- **Allow once** — temporary, single-session grant\n- **Allow always** — persistent grant\n\n## Multi-device behavior\n\nUsers can link multiple glasses to Meta AI. The SDK handles this transparently:\n- Permission granted on **any** linked device means your app has access\n- You don't need to track which device has permissions\n- If all devices disconnect, permissions become unavailable\n\n## Developer Mode vs Production\n\n| Mode | Registration behavior |\n|------|----------------------|\n| Developer Mode | Registration always allowed (use `MetaAppID` = `0`) |\n| Production | Users must be in proper release channel |\n\nFor production, get your `APPLICATION_ID` from the [Wearables Developer Center](https:\u002F\u002Fwearables.developer.meta.com\u002F).\n\n## Prerequisites\n\n- Registration requires an internet connection\n- Meta AI companion app must be installed\n- For Developer Mode: enable in Meta AI > Settings > Your glasses > Developer Mode\n\n## Links\n\n- [Permissions documentation](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fpermissions-requests)\n- [Getting started guide](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fgetting-started-toolkit)\n- [Manage projects](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fmanage-projects)\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,54,59,85,90,97,104,145,150,156,204,210,336,342,372,378,384,398,404,418,423,447,453,458,483,489,559,583,589,607,613,646],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"permissions-registration-ios",[45],{"type":46,"value":47},"text","Permissions & Registration (iOS)",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Register your app with Meta AI, then request the device permissions it needs.",{"type":40,"tag":49,"props":55,"children":56},{},[57],{"type":46,"value":58},"The DAT SDK separates two concepts:",{"type":40,"tag":60,"props":61,"children":62},"ol",{},[63,75],{"type":40,"tag":64,"props":65,"children":66},"li",{},[67,73],{"type":40,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":46,"value":72},"Registration",{"type":46,"value":74}," — Your app registers with Meta AI to become a permitted integration",{"type":40,"tag":64,"props":76,"children":77},{},[78,83],{"type":40,"tag":68,"props":79,"children":80},{},[81],{"type":46,"value":82},"Device permissions",{"type":46,"value":84}," — After registration, request specific device permissions (e.g., camera)",{"type":40,"tag":49,"props":86,"children":87},{},[88],{"type":46,"value":89},"All permission grants occur through the Meta AI companion app.",{"type":40,"tag":91,"props":92,"children":94},"h2",{"id":93},"registration-flow",[95],{"type":46,"value":96},"Registration flow",{"type":40,"tag":98,"props":99,"children":101},"h3",{"id":100},"start-registration",[102],{"type":46,"value":103},"Start registration",{"type":40,"tag":105,"props":106,"children":111},"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func startRegistration() async throws {\n    try await Wearables.shared.startRegistration()\n}\n","swift","",[112],{"type":40,"tag":113,"props":114,"children":115},"code",{"__ignoreMap":110},[116,127,136],{"type":40,"tag":117,"props":118,"children":121},"span",{"class":119,"line":120},"line",1,[122],{"type":40,"tag":117,"props":123,"children":124},{},[125],{"type":46,"value":126},"func startRegistration() async throws {\n",{"type":40,"tag":117,"props":128,"children":130},{"class":119,"line":129},2,[131],{"type":40,"tag":117,"props":132,"children":133},{},[134],{"type":46,"value":135},"    try await Wearables.shared.startRegistration()\n",{"type":40,"tag":117,"props":137,"children":139},{"class":119,"line":138},3,[140],{"type":40,"tag":117,"props":141,"children":142},{},[143],{"type":46,"value":144},"}\n",{"type":40,"tag":49,"props":146,"children":147},{},[148],{"type":46,"value":149},"This opens the Meta AI app where the user approves your app. Meta AI then calls back via your URL scheme.",{"type":40,"tag":98,"props":151,"children":153},{"id":152},"handle-the-callback",[154],{"type":46,"value":155},"Handle the callback",{"type":40,"tag":105,"props":157,"children":159},{"className":107,"code":158,"language":109,"meta":110,"style":110},".onOpenURL { url in\n    Task {\n        _ = try? await Wearables.shared.handleUrl(url)\n    }\n}\n",[160],{"type":40,"tag":113,"props":161,"children":162},{"__ignoreMap":110},[163,171,179,187,196],{"type":40,"tag":117,"props":164,"children":165},{"class":119,"line":120},[166],{"type":40,"tag":117,"props":167,"children":168},{},[169],{"type":46,"value":170},".onOpenURL { url in\n",{"type":40,"tag":117,"props":172,"children":173},{"class":119,"line":129},[174],{"type":40,"tag":117,"props":175,"children":176},{},[177],{"type":46,"value":178},"    Task {\n",{"type":40,"tag":117,"props":180,"children":181},{"class":119,"line":138},[182],{"type":40,"tag":117,"props":183,"children":184},{},[185],{"type":46,"value":186},"        _ = try? await Wearables.shared.handleUrl(url)\n",{"type":40,"tag":117,"props":188,"children":190},{"class":119,"line":189},4,[191],{"type":40,"tag":117,"props":192,"children":193},{},[194],{"type":46,"value":195},"    }\n",{"type":40,"tag":117,"props":197,"children":199},{"class":119,"line":198},5,[200],{"type":40,"tag":117,"props":201,"children":202},{},[203],{"type":46,"value":144},{"type":40,"tag":98,"props":205,"children":207},{"id":206},"observe-registration-state",[208],{"type":46,"value":209},"Observe registration state",{"type":40,"tag":105,"props":211,"children":213},{"className":107,"code":212,"language":109,"meta":110,"style":110},"Task {\n    for await state in Wearables.shared.registrationStateStream() {\n        switch state {\n        case .registered:\n            \u002F\u002F App is registered, can request permissions\n        case .unavailable:\n            \u002F\u002F Registration is unavailable\n        case .available:\n            \u002F\u002F Ready to register\n        case .registering:\n            \u002F\u002F Registration in progress\n        }\n    }\n}\n",[214],{"type":40,"tag":113,"props":215,"children":216},{"__ignoreMap":110},[217,225,233,241,249,257,266,275,284,293,302,311,320,328],{"type":40,"tag":117,"props":218,"children":219},{"class":119,"line":120},[220],{"type":40,"tag":117,"props":221,"children":222},{},[223],{"type":46,"value":224},"Task {\n",{"type":40,"tag":117,"props":226,"children":227},{"class":119,"line":129},[228],{"type":40,"tag":117,"props":229,"children":230},{},[231],{"type":46,"value":232},"    for await state in Wearables.shared.registrationStateStream() {\n",{"type":40,"tag":117,"props":234,"children":235},{"class":119,"line":138},[236],{"type":40,"tag":117,"props":237,"children":238},{},[239],{"type":46,"value":240},"        switch state {\n",{"type":40,"tag":117,"props":242,"children":243},{"class":119,"line":189},[244],{"type":40,"tag":117,"props":245,"children":246},{},[247],{"type":46,"value":248},"        case .registered:\n",{"type":40,"tag":117,"props":250,"children":251},{"class":119,"line":198},[252],{"type":40,"tag":117,"props":253,"children":254},{},[255],{"type":46,"value":256},"            \u002F\u002F App is registered, can request permissions\n",{"type":40,"tag":117,"props":258,"children":260},{"class":119,"line":259},6,[261],{"type":40,"tag":117,"props":262,"children":263},{},[264],{"type":46,"value":265},"        case .unavailable:\n",{"type":40,"tag":117,"props":267,"children":269},{"class":119,"line":268},7,[270],{"type":40,"tag":117,"props":271,"children":272},{},[273],{"type":46,"value":274},"            \u002F\u002F Registration is unavailable\n",{"type":40,"tag":117,"props":276,"children":278},{"class":119,"line":277},8,[279],{"type":40,"tag":117,"props":280,"children":281},{},[282],{"type":46,"value":283},"        case .available:\n",{"type":40,"tag":117,"props":285,"children":287},{"class":119,"line":286},9,[288],{"type":40,"tag":117,"props":289,"children":290},{},[291],{"type":46,"value":292},"            \u002F\u002F Ready to register\n",{"type":40,"tag":117,"props":294,"children":296},{"class":119,"line":295},10,[297],{"type":40,"tag":117,"props":298,"children":299},{},[300],{"type":46,"value":301},"        case .registering:\n",{"type":40,"tag":117,"props":303,"children":305},{"class":119,"line":304},11,[306],{"type":40,"tag":117,"props":307,"children":308},{},[309],{"type":46,"value":310},"            \u002F\u002F Registration in progress\n",{"type":40,"tag":117,"props":312,"children":314},{"class":119,"line":313},12,[315],{"type":40,"tag":117,"props":316,"children":317},{},[318],{"type":46,"value":319},"        }\n",{"type":40,"tag":117,"props":321,"children":323},{"class":119,"line":322},13,[324],{"type":40,"tag":117,"props":325,"children":326},{},[327],{"type":46,"value":195},{"type":40,"tag":117,"props":329,"children":331},{"class":119,"line":330},14,[332],{"type":40,"tag":117,"props":333,"children":334},{},[335],{"type":46,"value":144},{"type":40,"tag":98,"props":337,"children":339},{"id":338},"unregister",[340],{"type":46,"value":341},"Unregister",{"type":40,"tag":105,"props":343,"children":345},{"className":107,"code":344,"language":109,"meta":110,"style":110},"func startUnregistration() async throws {\n    try await Wearables.shared.startUnregistration()\n}\n",[346],{"type":40,"tag":113,"props":347,"children":348},{"__ignoreMap":110},[349,357,365],{"type":40,"tag":117,"props":350,"children":351},{"class":119,"line":120},[352],{"type":40,"tag":117,"props":353,"children":354},{},[355],{"type":46,"value":356},"func startUnregistration() async throws {\n",{"type":40,"tag":117,"props":358,"children":359},{"class":119,"line":129},[360],{"type":40,"tag":117,"props":361,"children":362},{},[363],{"type":46,"value":364},"    try await Wearables.shared.startUnregistration()\n",{"type":40,"tag":117,"props":366,"children":367},{"class":119,"line":138},[368],{"type":40,"tag":117,"props":369,"children":370},{},[371],{"type":46,"value":144},{"type":40,"tag":91,"props":373,"children":375},{"id":374},"camera-permissions",[376],{"type":46,"value":377},"Camera permissions",{"type":40,"tag":98,"props":379,"children":381},{"id":380},"check-permission-status",[382],{"type":46,"value":383},"Check permission status",{"type":40,"tag":105,"props":385,"children":387},{"className":107,"code":386,"language":109,"meta":110,"style":110},"let status = try await Wearables.shared.checkPermissionStatus(.camera)\n",[388],{"type":40,"tag":113,"props":389,"children":390},{"__ignoreMap":110},[391],{"type":40,"tag":117,"props":392,"children":393},{"class":119,"line":120},[394],{"type":40,"tag":117,"props":395,"children":396},{},[397],{"type":46,"value":386},{"type":40,"tag":98,"props":399,"children":401},{"id":400},"request-permission",[402],{"type":46,"value":403},"Request permission",{"type":40,"tag":105,"props":405,"children":407},{"className":107,"code":406,"language":109,"meta":110,"style":110},"let status = try await Wearables.shared.requestPermission(.camera)\n",[408],{"type":40,"tag":113,"props":409,"children":410},{"__ignoreMap":110},[411],{"type":40,"tag":117,"props":412,"children":413},{"class":119,"line":120},[414],{"type":40,"tag":117,"props":415,"children":416},{},[417],{"type":46,"value":406},{"type":40,"tag":49,"props":419,"children":420},{},[421],{"type":46,"value":422},"The SDK opens Meta AI for the user to grant access. Users can choose:",{"type":40,"tag":424,"props":425,"children":426},"ul",{},[427,437],{"type":40,"tag":64,"props":428,"children":429},{},[430,435],{"type":40,"tag":68,"props":431,"children":432},{},[433],{"type":46,"value":434},"Allow once",{"type":46,"value":436}," — temporary, single-session grant",{"type":40,"tag":64,"props":438,"children":439},{},[440,445],{"type":40,"tag":68,"props":441,"children":442},{},[443],{"type":46,"value":444},"Allow always",{"type":46,"value":446}," — persistent grant",{"type":40,"tag":91,"props":448,"children":450},{"id":449},"multi-device-behavior",[451],{"type":46,"value":452},"Multi-device behavior",{"type":40,"tag":49,"props":454,"children":455},{},[456],{"type":46,"value":457},"Users can link multiple glasses to Meta AI. The SDK handles this transparently:",{"type":40,"tag":424,"props":459,"children":460},{},[461,473,478],{"type":40,"tag":64,"props":462,"children":463},{},[464,466,471],{"type":46,"value":465},"Permission granted on ",{"type":40,"tag":68,"props":467,"children":468},{},[469],{"type":46,"value":470},"any",{"type":46,"value":472}," linked device means your app has access",{"type":40,"tag":64,"props":474,"children":475},{},[476],{"type":46,"value":477},"You don't need to track which device has permissions",{"type":40,"tag":64,"props":479,"children":480},{},[481],{"type":46,"value":482},"If all devices disconnect, permissions become unavailable",{"type":40,"tag":91,"props":484,"children":486},{"id":485},"developer-mode-vs-production",[487],{"type":46,"value":488},"Developer Mode vs Production",{"type":40,"tag":490,"props":491,"children":492},"table",{},[493,512],{"type":40,"tag":494,"props":495,"children":496},"thead",{},[497],{"type":40,"tag":498,"props":499,"children":500},"tr",{},[501,507],{"type":40,"tag":502,"props":503,"children":504},"th",{},[505],{"type":46,"value":506},"Mode",{"type":40,"tag":502,"props":508,"children":509},{},[510],{"type":46,"value":511},"Registration behavior",{"type":40,"tag":513,"props":514,"children":515},"tbody",{},[516,546],{"type":40,"tag":498,"props":517,"children":518},{},[519,525],{"type":40,"tag":520,"props":521,"children":522},"td",{},[523],{"type":46,"value":524},"Developer Mode",{"type":40,"tag":520,"props":526,"children":527},{},[528,530,536,538,544],{"type":46,"value":529},"Registration always allowed (use ",{"type":40,"tag":113,"props":531,"children":533},{"className":532},[],[534],{"type":46,"value":535},"MetaAppID",{"type":46,"value":537}," = ",{"type":40,"tag":113,"props":539,"children":541},{"className":540},[],[542],{"type":46,"value":543},"0",{"type":46,"value":545},")",{"type":40,"tag":498,"props":547,"children":548},{},[549,554],{"type":40,"tag":520,"props":550,"children":551},{},[552],{"type":46,"value":553},"Production",{"type":40,"tag":520,"props":555,"children":556},{},[557],{"type":46,"value":558},"Users must be in proper release channel",{"type":40,"tag":49,"props":560,"children":561},{},[562,564,570,572,581],{"type":46,"value":563},"For production, get your ",{"type":40,"tag":113,"props":565,"children":567},{"className":566},[],[568],{"type":46,"value":569},"APPLICATION_ID",{"type":46,"value":571}," from the ",{"type":40,"tag":573,"props":574,"children":578},"a",{"href":575,"rel":576},"https:\u002F\u002Fwearables.developer.meta.com\u002F",[577],"nofollow",[579],{"type":46,"value":580},"Wearables Developer Center",{"type":46,"value":582},".",{"type":40,"tag":91,"props":584,"children":586},{"id":585},"prerequisites",[587],{"type":46,"value":588},"Prerequisites",{"type":40,"tag":424,"props":590,"children":591},{},[592,597,602],{"type":40,"tag":64,"props":593,"children":594},{},[595],{"type":46,"value":596},"Registration requires an internet connection",{"type":40,"tag":64,"props":598,"children":599},{},[600],{"type":46,"value":601},"Meta AI companion app must be installed",{"type":40,"tag":64,"props":603,"children":604},{},[605],{"type":46,"value":606},"For Developer Mode: enable in Meta AI > Settings > Your glasses > Developer Mode",{"type":40,"tag":91,"props":608,"children":610},{"id":609},"links",[611],{"type":46,"value":612},"Links",{"type":40,"tag":424,"props":614,"children":615},{},[616,626,636],{"type":40,"tag":64,"props":617,"children":618},{},[619],{"type":40,"tag":573,"props":620,"children":623},{"href":621,"rel":622},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fpermissions-requests",[577],[624],{"type":46,"value":625},"Permissions documentation",{"type":40,"tag":64,"props":627,"children":628},{},[629],{"type":40,"tag":573,"props":630,"children":633},{"href":631,"rel":632},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fgetting-started-toolkit",[577],[634],{"type":46,"value":635},"Getting started guide",{"type":40,"tag":64,"props":637,"children":638},{},[639],{"type":40,"tag":573,"props":640,"children":643},{"href":641,"rel":642},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fmanage-projects",[577],[644],{"type":46,"value":645},"Manage projects",{"type":40,"tag":647,"props":648,"children":649},"style",{},[650],{"type":46,"value":651},"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":653,"total":286},[654,669,685,698,718,731,746],{"slug":655,"name":655,"fn":656,"description":657,"org":658,"tags":659,"stars":23,"repoUrl":24,"updatedAt":668},"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},[660,661,664,665],{"name":21,"slug":22,"type":16},{"name":662,"slug":663,"type":16},"Hardware","hardware",{"name":18,"slug":19,"type":16},{"name":666,"slug":667,"type":16},"Video","video","2026-05-15T06:14:43.555881",{"slug":670,"name":670,"fn":671,"description":672,"org":673,"tags":674,"stars":23,"repoUrl":24,"updatedAt":684},"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},[675,676,679,682],{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},"Mobile","mobile",{"name":680,"slug":681,"type":16},"SDK","sdk",{"name":683,"slug":109,"type":16},"Swift","2026-05-15T06:14:42.334435",{"slug":686,"name":686,"fn":687,"description":688,"org":689,"tags":690,"stars":23,"repoUrl":24,"updatedAt":697},"debugging","debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[691,693,696],{"name":692,"slug":686,"type":16},"Debugging",{"name":694,"slug":695,"type":16},"Engineering","engineering",{"name":18,"slug":19,"type":16},"2026-05-15T06:14:38.626606",{"slug":699,"name":699,"fn":700,"description":701,"org":702,"tags":703,"stars":23,"repoUrl":24,"updatedAt":717},"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},[704,707,710,713,716],{"name":705,"slug":706,"type":16},"Design","design",{"name":708,"slug":709,"type":16},"Images","images",{"name":711,"slug":712,"type":16},"Interaction","interaction",{"name":714,"slug":715,"type":16},"UI Components","ui-components",{"name":666,"slug":667,"type":16},"2026-05-15T06:14:39.844502",{"slug":719,"name":719,"fn":720,"description":721,"org":722,"tags":723,"stars":23,"repoUrl":24,"updatedAt":730},"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},[724,727,728,729],{"name":725,"slug":726,"type":16},"Configuration","configuration",{"name":18,"slug":19,"type":16},{"name":680,"slug":681,"type":16},{"name":683,"slug":109,"type":16},"2026-05-15T06:14:41.086639",{"slug":732,"name":732,"fn":733,"description":734,"org":735,"tags":736,"stars":23,"repoUrl":24,"updatedAt":745},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[737,738,739,742],{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},{"name":740,"slug":741,"type":16},"QA","qa",{"name":743,"slug":744,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":4,"name":4,"fn":5,"description":6,"org":747,"tags":748,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[749,750,751],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"items":753,"total":882},[754,776,790,811,818,825,831,839,846,853,859,869],{"slug":755,"name":755,"fn":756,"description":757,"org":758,"tags":759,"stars":773,"repoUrl":774,"updatedAt":775},"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},[760,761,764,767,770],{"name":694,"slug":695,"type":16},{"name":762,"slug":763,"type":16},"Frontend","frontend",{"name":765,"slug":766,"type":16},"GraphQL","graphql",{"name":768,"slug":769,"type":16},"React","react",{"name":771,"slug":772,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":777,"name":777,"fn":778,"description":779,"org":780,"tags":781,"stars":773,"repoUrl":774,"updatedAt":789},"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},[782,783,784,787,788],{"name":762,"slug":763,"type":16},{"name":765,"slug":766,"type":16},{"name":785,"slug":786,"type":16},"Performance","performance",{"name":768,"slug":769,"type":16},{"name":771,"slug":772,"type":16},"2026-06-10T07:30:28.726513",{"slug":791,"name":791,"fn":792,"description":793,"org":794,"tags":795,"stars":808,"repoUrl":809,"updatedAt":810},"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},[796,799,802,805],{"name":797,"slug":798,"type":16},"Data Modeling","data-modeling",{"name":800,"slug":801,"type":16},"Deep Learning","deep-learning",{"name":803,"slug":804,"type":16},"Python","python",{"name":806,"slug":807,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":655,"name":655,"fn":656,"description":657,"org":812,"tags":813,"stars":23,"repoUrl":24,"updatedAt":668},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[814,815,816,817],{"name":21,"slug":22,"type":16},{"name":662,"slug":663,"type":16},{"name":18,"slug":19,"type":16},{"name":666,"slug":667,"type":16},{"slug":670,"name":670,"fn":671,"description":672,"org":819,"tags":820,"stars":23,"repoUrl":24,"updatedAt":684},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[821,822,823,824],{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},{"name":680,"slug":681,"type":16},{"name":683,"slug":109,"type":16},{"slug":686,"name":686,"fn":687,"description":688,"org":826,"tags":827,"stars":23,"repoUrl":24,"updatedAt":697},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[828,829,830],{"name":692,"slug":686,"type":16},{"name":694,"slug":695,"type":16},{"name":18,"slug":19,"type":16},{"slug":699,"name":699,"fn":700,"description":701,"org":832,"tags":833,"stars":23,"repoUrl":24,"updatedAt":717},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[834,835,836,837,838],{"name":705,"slug":706,"type":16},{"name":708,"slug":709,"type":16},{"name":711,"slug":712,"type":16},{"name":714,"slug":715,"type":16},{"name":666,"slug":667,"type":16},{"slug":719,"name":719,"fn":720,"description":721,"org":840,"tags":841,"stars":23,"repoUrl":24,"updatedAt":730},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[842,843,844,845],{"name":725,"slug":726,"type":16},{"name":18,"slug":19,"type":16},{"name":680,"slug":681,"type":16},{"name":683,"slug":109,"type":16},{"slug":732,"name":732,"fn":733,"description":734,"org":847,"tags":848,"stars":23,"repoUrl":24,"updatedAt":745},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[849,850,851,852],{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},{"name":740,"slug":741,"type":16},{"name":743,"slug":744,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":854,"tags":855,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[856,857,858],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"slug":860,"name":860,"fn":861,"description":862,"org":863,"tags":864,"stars":23,"repoUrl":24,"updatedAt":868},"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},[865,866,867],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},"2026-05-15T06:14:36.185947",{"slug":870,"name":870,"fn":871,"description":872,"org":873,"tags":874,"stars":23,"repoUrl":24,"updatedAt":881},"session-lifecycle","monitor device session lifecycle states","Device session states, pause\u002Fresume, availability monitoring",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[875,876,877,880],{"name":18,"slug":19,"type":16},{"name":677,"slug":678,"type":16},{"name":878,"slug":879,"type":16},"Monitoring","monitoring",{"name":785,"slug":786,"type":16},"2026-05-15T06:14:44.790925",27]