[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-dat-conventions":3,"mdc--go9oi6-key":37,"related-org-meta-dat-conventions":1070,"related-repo-meta-dat-conventions":1250},{"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},"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},"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},"iOS","ios","tag",{"name":18,"slug":19,"type":16},"Mobile","mobile",{"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:42.334435",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\u002Fdat-conventions","---\nname: dat-conventions\ndescription: Swift patterns, async\u002Fawait, naming conventions, key types for DAT SDK iOS development\n---\n\n# DAT SDK Conventions (iOS)\n\n## Architecture\n\nThe SDK is organized into four modules:\n- **MWDATCore**: Device discovery, registration, permissions, device selectors\n- **MWDATCamera**: Stream, VideoFrame, photo capture\n- **MWDATDisplay**: Display capability, display UI components, icons, images, buttons, video\n- **MWDATMockDevice**: MockDeviceKit for testing without hardware\n\n## Swift Patterns\n\n- Use `async\u002Fawait` for all SDK operations — the SDK is fully async\n- Use `AsyncSequence` \u002F publisher `.listen {}` for observing streams\n- Annotate UI-updating code with `@MainActor`\n- Never block the main thread with frame processing\n- Handle errors with do\u002Fcatch — the SDK throws typed errors\n\n## Naming Conventions\n\n| Type | Convention | Example |\n|------|-----------|---------|\n| Entry point | `Wearables.shared` | `Wearables.shared.startRegistration()` |\n| Device sessions | `*Session` | `DeviceSession` |\n| Capabilities | Named by function | `Stream` |\n| Selectors | `*DeviceSelector` | `AutoDeviceSelector`, `SpecificDeviceSelector` |\n| Config | `*Configuration` | `StreamConfiguration` |\n| Publishers | `*Publisher` | `statePublisher`, `videoFramePublisher` |\n\n## Imports\n\n```swift\nimport MWDATCore    \u002F\u002F Registration, devices, permissions\nimport MWDATCamera  \u002F\u002F Stream, VideoFrame, photo capture\nimport MWDATDisplay \u002F\u002F Display, FlexBox, Text, Button, Image, Icon, VideoPlayer\n```\n\nFor testing:\n```swift\nimport MWDATMockDevice  \u002F\u002F MockDeviceKit, MockGlasses, MockCameraKit\n```\n\n## Key Types\n\n- `Wearables` — SDK entry point. Call `Wearables.configure()` at launch, then use `Wearables.shared`\n- `Stream` — Camera streaming session. Create with config + device selector\n- `Display` — Display capability attached to a started DeviceSession\n- `VideoFrame` — Individual video frame with `.makeUIImage()` convenience\n- `AutoDeviceSelector` — Automatically selects the best available device\n- `SpecificDeviceSelector` — Selects a specific device by identifier\n- `StreamConfiguration` — Configure video codec, resolution, frame rate\n- `MockDeviceKit` — Factory for creating simulated devices in tests\n\n## Error Handling\n\n```swift\ndo {\n    try Wearables.configure()\n} catch {\n    \u002F\u002F Handle configuration error\n}\n\ndo {\n    try await Wearables.shared.startRegistration()\n} catch {\n    \u002F\u002F Handle registration error\n}\n```\n\n## Build and Test\n\n```bash\n# Install dependencies via Swift Package Manager\n# In Xcode: File > Add Package Dependencies > enter repo URL\n\n# Build from command line\nxcodebuild -scheme MWDATCore -destination 'platform=iOS Simulator,name=iPhone 16'\n\n# Run tests\nxcodebuild test -scheme MWDATCoreTests -destination 'platform=iOS Simulator,name=iPhone 16'\n```\n\nFor sample apps:\n```bash\n# Open the sample app workspace\nopen ExternalSampleApps\u002FCameraAccess\u002FCameraAccess.xcodeproj\n\n# Build and run on simulator (uses MockDeviceKit - no glasses needed)\nxcodebuild -scheme CameraAccess -destination 'platform=iOS Simulator,name=iPhone 16'\n```\n\n## Development Workflow\n\n1. **Add SDK** via Swift Package Manager (SPM) in Xcode\n2. **Import modules** (`MWDATCore`, `MWDATCamera`, `MWDATDisplay` when rendering Display content)\n3. **Configure** at app launch: `try Wearables.configure()`\n4. **Build** with Xcode or `xcodebuild`\n5. **Test** with MockDeviceKit - no physical glasses required\n6. **Debug** using Xcode console for SDK logs\n\n## Live docs search\n\nIf your editor supports remote MCP servers, connect `https:\u002F\u002Fmcp.developer.meta.com\u002Fwearables` and use `search_dat_docs` for current DAT setup, session lifecycle, camera streaming, MockDeviceKit, permissions, and exact API symbols. This public docs server does not require authentication; do not configure tokens, OAuth, or custom authorization headers for it.\n\nUse `llms.txt` when your tool only supports static reference context.\n\n## Links\n\n- [iOS API Reference](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Freference\u002Fios_swift\u002Fdat\u002F0.8)\n- [Developer Documentation](https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fdevelop\u002F)\n- [GitHub Repository](https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios)\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,58,64,110,116,174,180,380,386,425,430,444,450,558,564,665,671,805,810,885,891,985,991,1012,1024,1030,1064],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"dat-sdk-conventions-ios",[48],{"type":49,"value":50},"text","DAT SDK Conventions (iOS)",{"type":43,"tag":52,"props":53,"children":55},"h2",{"id":54},"architecture",[56],{"type":49,"value":57},"Architecture",{"type":43,"tag":59,"props":60,"children":61},"p",{},[62],{"type":49,"value":63},"The SDK is organized into four modules:",{"type":43,"tag":65,"props":66,"children":67},"ul",{},[68,80,90,100],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72,78],{"type":43,"tag":73,"props":74,"children":75},"strong",{},[76],{"type":49,"value":77},"MWDATCore",{"type":49,"value":79},": Device discovery, registration, permissions, device selectors",{"type":43,"tag":69,"props":81,"children":82},{},[83,88],{"type":43,"tag":73,"props":84,"children":85},{},[86],{"type":49,"value":87},"MWDATCamera",{"type":49,"value":89},": Stream, VideoFrame, photo capture",{"type":43,"tag":69,"props":91,"children":92},{},[93,98],{"type":43,"tag":73,"props":94,"children":95},{},[96],{"type":49,"value":97},"MWDATDisplay",{"type":49,"value":99},": Display capability, display UI components, icons, images, buttons, video",{"type":43,"tag":69,"props":101,"children":102},{},[103,108],{"type":43,"tag":73,"props":104,"children":105},{},[106],{"type":49,"value":107},"MWDATMockDevice",{"type":49,"value":109},": MockDeviceKit for testing without hardware",{"type":43,"tag":52,"props":111,"children":113},{"id":112},"swift-patterns",[114],{"type":49,"value":115},"Swift Patterns",{"type":43,"tag":65,"props":117,"children":118},{},[119,133,153,164,169],{"type":43,"tag":69,"props":120,"children":121},{},[122,124,131],{"type":49,"value":123},"Use ",{"type":43,"tag":125,"props":126,"children":128},"code",{"className":127},[],[129],{"type":49,"value":130},"async\u002Fawait",{"type":49,"value":132}," for all SDK operations — the SDK is fully async",{"type":43,"tag":69,"props":134,"children":135},{},[136,137,143,145,151],{"type":49,"value":123},{"type":43,"tag":125,"props":138,"children":140},{"className":139},[],[141],{"type":49,"value":142},"AsyncSequence",{"type":49,"value":144}," \u002F publisher ",{"type":43,"tag":125,"props":146,"children":148},{"className":147},[],[149],{"type":49,"value":150},".listen {}",{"type":49,"value":152}," for observing streams",{"type":43,"tag":69,"props":154,"children":155},{},[156,158],{"type":49,"value":157},"Annotate UI-updating code with ",{"type":43,"tag":125,"props":159,"children":161},{"className":160},[],[162],{"type":49,"value":163},"@MainActor",{"type":43,"tag":69,"props":165,"children":166},{},[167],{"type":49,"value":168},"Never block the main thread with frame processing",{"type":43,"tag":69,"props":170,"children":171},{},[172],{"type":49,"value":173},"Handle errors with do\u002Fcatch — the SDK throws typed errors",{"type":43,"tag":52,"props":175,"children":177},{"id":176},"naming-conventions",[178],{"type":49,"value":179},"Naming Conventions",{"type":43,"tag":181,"props":182,"children":183},"table",{},[184,208],{"type":43,"tag":185,"props":186,"children":187},"thead",{},[188],{"type":43,"tag":189,"props":190,"children":191},"tr",{},[192,198,203],{"type":43,"tag":193,"props":194,"children":195},"th",{},[196],{"type":49,"value":197},"Type",{"type":43,"tag":193,"props":199,"children":200},{},[201],{"type":49,"value":202},"Convention",{"type":43,"tag":193,"props":204,"children":205},{},[206],{"type":49,"value":207},"Example",{"type":43,"tag":209,"props":210,"children":211},"tbody",{},[212,239,265,287,321,347],{"type":43,"tag":189,"props":213,"children":214},{},[215,221,230],{"type":43,"tag":216,"props":217,"children":218},"td",{},[219],{"type":49,"value":220},"Entry point",{"type":43,"tag":216,"props":222,"children":223},{},[224],{"type":43,"tag":125,"props":225,"children":227},{"className":226},[],[228],{"type":49,"value":229},"Wearables.shared",{"type":43,"tag":216,"props":231,"children":232},{},[233],{"type":43,"tag":125,"props":234,"children":236},{"className":235},[],[237],{"type":49,"value":238},"Wearables.shared.startRegistration()",{"type":43,"tag":189,"props":240,"children":241},{},[242,247,256],{"type":43,"tag":216,"props":243,"children":244},{},[245],{"type":49,"value":246},"Device sessions",{"type":43,"tag":216,"props":248,"children":249},{},[250],{"type":43,"tag":125,"props":251,"children":253},{"className":252},[],[254],{"type":49,"value":255},"*Session",{"type":43,"tag":216,"props":257,"children":258},{},[259],{"type":43,"tag":125,"props":260,"children":262},{"className":261},[],[263],{"type":49,"value":264},"DeviceSession",{"type":43,"tag":189,"props":266,"children":267},{},[268,273,278],{"type":43,"tag":216,"props":269,"children":270},{},[271],{"type":49,"value":272},"Capabilities",{"type":43,"tag":216,"props":274,"children":275},{},[276],{"type":49,"value":277},"Named by function",{"type":43,"tag":216,"props":279,"children":280},{},[281],{"type":43,"tag":125,"props":282,"children":284},{"className":283},[],[285],{"type":49,"value":286},"Stream",{"type":43,"tag":189,"props":288,"children":289},{},[290,295,304],{"type":43,"tag":216,"props":291,"children":292},{},[293],{"type":49,"value":294},"Selectors",{"type":43,"tag":216,"props":296,"children":297},{},[298],{"type":43,"tag":125,"props":299,"children":301},{"className":300},[],[302],{"type":49,"value":303},"*DeviceSelector",{"type":43,"tag":216,"props":305,"children":306},{},[307,313,315],{"type":43,"tag":125,"props":308,"children":310},{"className":309},[],[311],{"type":49,"value":312},"AutoDeviceSelector",{"type":49,"value":314},", ",{"type":43,"tag":125,"props":316,"children":318},{"className":317},[],[319],{"type":49,"value":320},"SpecificDeviceSelector",{"type":43,"tag":189,"props":322,"children":323},{},[324,329,338],{"type":43,"tag":216,"props":325,"children":326},{},[327],{"type":49,"value":328},"Config",{"type":43,"tag":216,"props":330,"children":331},{},[332],{"type":43,"tag":125,"props":333,"children":335},{"className":334},[],[336],{"type":49,"value":337},"*Configuration",{"type":43,"tag":216,"props":339,"children":340},{},[341],{"type":43,"tag":125,"props":342,"children":344},{"className":343},[],[345],{"type":49,"value":346},"StreamConfiguration",{"type":43,"tag":189,"props":348,"children":349},{},[350,355,364],{"type":43,"tag":216,"props":351,"children":352},{},[353],{"type":49,"value":354},"Publishers",{"type":43,"tag":216,"props":356,"children":357},{},[358],{"type":43,"tag":125,"props":359,"children":361},{"className":360},[],[362],{"type":49,"value":363},"*Publisher",{"type":43,"tag":216,"props":365,"children":366},{},[367,373,374],{"type":43,"tag":125,"props":368,"children":370},{"className":369},[],[371],{"type":49,"value":372},"statePublisher",{"type":49,"value":314},{"type":43,"tag":125,"props":375,"children":377},{"className":376},[],[378],{"type":49,"value":379},"videoFramePublisher",{"type":43,"tag":52,"props":381,"children":383},{"id":382},"imports",[384],{"type":49,"value":385},"Imports",{"type":43,"tag":387,"props":388,"children":392},"pre",{"className":389,"code":390,"language":22,"meta":391,"style":391},"language-swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import MWDATCore    \u002F\u002F Registration, devices, permissions\nimport MWDATCamera  \u002F\u002F Stream, VideoFrame, photo capture\nimport MWDATDisplay \u002F\u002F Display, FlexBox, Text, Button, Image, Icon, VideoPlayer\n","",[393],{"type":43,"tag":125,"props":394,"children":395},{"__ignoreMap":391},[396,407,416],{"type":43,"tag":397,"props":398,"children":401},"span",{"class":399,"line":400},"line",1,[402],{"type":43,"tag":397,"props":403,"children":404},{},[405],{"type":49,"value":406},"import MWDATCore    \u002F\u002F Registration, devices, permissions\n",{"type":43,"tag":397,"props":408,"children":410},{"class":399,"line":409},2,[411],{"type":43,"tag":397,"props":412,"children":413},{},[414],{"type":49,"value":415},"import MWDATCamera  \u002F\u002F Stream, VideoFrame, photo capture\n",{"type":43,"tag":397,"props":417,"children":419},{"class":399,"line":418},3,[420],{"type":43,"tag":397,"props":421,"children":422},{},[423],{"type":49,"value":424},"import MWDATDisplay \u002F\u002F Display, FlexBox, Text, Button, Image, Icon, VideoPlayer\n",{"type":43,"tag":59,"props":426,"children":427},{},[428],{"type":49,"value":429},"For testing:",{"type":43,"tag":387,"props":431,"children":433},{"className":389,"code":432,"language":22,"meta":391,"style":391},"import MWDATMockDevice  \u002F\u002F MockDeviceKit, MockGlasses, MockCameraKit\n",[434],{"type":43,"tag":125,"props":435,"children":436},{"__ignoreMap":391},[437],{"type":43,"tag":397,"props":438,"children":439},{"class":399,"line":400},[440],{"type":43,"tag":397,"props":441,"children":442},{},[443],{"type":49,"value":432},{"type":43,"tag":52,"props":445,"children":447},{"id":446},"key-types",[448],{"type":49,"value":449},"Key Types",{"type":43,"tag":65,"props":451,"children":452},{},[453,477,487,498,517,527,537,547],{"type":43,"tag":69,"props":454,"children":455},{},[456,462,464,470,472],{"type":43,"tag":125,"props":457,"children":459},{"className":458},[],[460],{"type":49,"value":461},"Wearables",{"type":49,"value":463}," — SDK entry point. Call ",{"type":43,"tag":125,"props":465,"children":467},{"className":466},[],[468],{"type":49,"value":469},"Wearables.configure()",{"type":49,"value":471}," at launch, then use ",{"type":43,"tag":125,"props":473,"children":475},{"className":474},[],[476],{"type":49,"value":229},{"type":43,"tag":69,"props":478,"children":479},{},[480,485],{"type":43,"tag":125,"props":481,"children":483},{"className":482},[],[484],{"type":49,"value":286},{"type":49,"value":486}," — Camera streaming session. Create with config + device selector",{"type":43,"tag":69,"props":488,"children":489},{},[490,496],{"type":43,"tag":125,"props":491,"children":493},{"className":492},[],[494],{"type":49,"value":495},"Display",{"type":49,"value":497}," — Display capability attached to a started DeviceSession",{"type":43,"tag":69,"props":499,"children":500},{},[501,507,509,515],{"type":43,"tag":125,"props":502,"children":504},{"className":503},[],[505],{"type":49,"value":506},"VideoFrame",{"type":49,"value":508}," — Individual video frame with ",{"type":43,"tag":125,"props":510,"children":512},{"className":511},[],[513],{"type":49,"value":514},".makeUIImage()",{"type":49,"value":516}," convenience",{"type":43,"tag":69,"props":518,"children":519},{},[520,525],{"type":43,"tag":125,"props":521,"children":523},{"className":522},[],[524],{"type":49,"value":312},{"type":49,"value":526}," — Automatically selects the best available device",{"type":43,"tag":69,"props":528,"children":529},{},[530,535],{"type":43,"tag":125,"props":531,"children":533},{"className":532},[],[534],{"type":49,"value":320},{"type":49,"value":536}," — Selects a specific device by identifier",{"type":43,"tag":69,"props":538,"children":539},{},[540,545],{"type":43,"tag":125,"props":541,"children":543},{"className":542},[],[544],{"type":49,"value":346},{"type":49,"value":546}," — Configure video codec, resolution, frame rate",{"type":43,"tag":69,"props":548,"children":549},{},[550,556],{"type":43,"tag":125,"props":551,"children":553},{"className":552},[],[554],{"type":49,"value":555},"MockDeviceKit",{"type":49,"value":557}," — Factory for creating simulated devices in tests",{"type":43,"tag":52,"props":559,"children":561},{"id":560},"error-handling",[562],{"type":49,"value":563},"Error Handling",{"type":43,"tag":387,"props":565,"children":567},{"className":389,"code":566,"language":22,"meta":391,"style":391},"do {\n    try Wearables.configure()\n} catch {\n    \u002F\u002F Handle configuration error\n}\n\ndo {\n    try await Wearables.shared.startRegistration()\n} catch {\n    \u002F\u002F Handle registration error\n}\n",[568],{"type":43,"tag":125,"props":569,"children":570},{"__ignoreMap":391},[571,579,587,595,604,613,623,631,640,648,657],{"type":43,"tag":397,"props":572,"children":573},{"class":399,"line":400},[574],{"type":43,"tag":397,"props":575,"children":576},{},[577],{"type":49,"value":578},"do {\n",{"type":43,"tag":397,"props":580,"children":581},{"class":399,"line":409},[582],{"type":43,"tag":397,"props":583,"children":584},{},[585],{"type":49,"value":586},"    try Wearables.configure()\n",{"type":43,"tag":397,"props":588,"children":589},{"class":399,"line":418},[590],{"type":43,"tag":397,"props":591,"children":592},{},[593],{"type":49,"value":594},"} catch {\n",{"type":43,"tag":397,"props":596,"children":598},{"class":399,"line":597},4,[599],{"type":43,"tag":397,"props":600,"children":601},{},[602],{"type":49,"value":603},"    \u002F\u002F Handle configuration error\n",{"type":43,"tag":397,"props":605,"children":607},{"class":399,"line":606},5,[608],{"type":43,"tag":397,"props":609,"children":610},{},[611],{"type":49,"value":612},"}\n",{"type":43,"tag":397,"props":614,"children":616},{"class":399,"line":615},6,[617],{"type":43,"tag":397,"props":618,"children":620},{"emptyLinePlaceholder":619},true,[621],{"type":49,"value":622},"\n",{"type":43,"tag":397,"props":624,"children":626},{"class":399,"line":625},7,[627],{"type":43,"tag":397,"props":628,"children":629},{},[630],{"type":49,"value":578},{"type":43,"tag":397,"props":632,"children":634},{"class":399,"line":633},8,[635],{"type":43,"tag":397,"props":636,"children":637},{},[638],{"type":49,"value":639},"    try await Wearables.shared.startRegistration()\n",{"type":43,"tag":397,"props":641,"children":643},{"class":399,"line":642},9,[644],{"type":43,"tag":397,"props":645,"children":646},{},[647],{"type":49,"value":594},{"type":43,"tag":397,"props":649,"children":651},{"class":399,"line":650},10,[652],{"type":43,"tag":397,"props":653,"children":654},{},[655],{"type":49,"value":656},"    \u002F\u002F Handle registration error\n",{"type":43,"tag":397,"props":658,"children":660},{"class":399,"line":659},11,[661],{"type":43,"tag":397,"props":662,"children":663},{},[664],{"type":49,"value":612},{"type":43,"tag":52,"props":666,"children":668},{"id":667},"build-and-test",[669],{"type":49,"value":670},"Build and Test",{"type":43,"tag":387,"props":672,"children":676},{"className":673,"code":674,"language":675,"meta":391,"style":391},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Install dependencies via Swift Package Manager\n# In Xcode: File > Add Package Dependencies > enter repo URL\n\n# Build from command line\nxcodebuild -scheme MWDATCore -destination 'platform=iOS Simulator,name=iPhone 16'\n\n# Run tests\nxcodebuild test -scheme MWDATCoreTests -destination 'platform=iOS Simulator,name=iPhone 16'\n","bash",[677],{"type":43,"tag":125,"props":678,"children":679},{"__ignoreMap":391},[680,689,697,704,712,753,760,768],{"type":43,"tag":397,"props":681,"children":682},{"class":399,"line":400},[683],{"type":43,"tag":397,"props":684,"children":686},{"style":685},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[687],{"type":49,"value":688},"# Install dependencies via Swift Package Manager\n",{"type":43,"tag":397,"props":690,"children":691},{"class":399,"line":409},[692],{"type":43,"tag":397,"props":693,"children":694},{"style":685},[695],{"type":49,"value":696},"# In Xcode: File > Add Package Dependencies > enter repo URL\n",{"type":43,"tag":397,"props":698,"children":699},{"class":399,"line":418},[700],{"type":43,"tag":397,"props":701,"children":702},{"emptyLinePlaceholder":619},[703],{"type":49,"value":622},{"type":43,"tag":397,"props":705,"children":706},{"class":399,"line":597},[707],{"type":43,"tag":397,"props":708,"children":709},{"style":685},[710],{"type":49,"value":711},"# Build from command line\n",{"type":43,"tag":397,"props":713,"children":714},{"class":399,"line":606},[715,721,727,732,737,743,748],{"type":43,"tag":397,"props":716,"children":718},{"style":717},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[719],{"type":49,"value":720},"xcodebuild",{"type":43,"tag":397,"props":722,"children":724},{"style":723},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[725],{"type":49,"value":726}," -scheme",{"type":43,"tag":397,"props":728,"children":729},{"style":723},[730],{"type":49,"value":731}," MWDATCore",{"type":43,"tag":397,"props":733,"children":734},{"style":723},[735],{"type":49,"value":736}," -destination",{"type":43,"tag":397,"props":738,"children":740},{"style":739},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[741],{"type":49,"value":742}," '",{"type":43,"tag":397,"props":744,"children":745},{"style":723},[746],{"type":49,"value":747},"platform=iOS Simulator,name=iPhone 16",{"type":43,"tag":397,"props":749,"children":750},{"style":739},[751],{"type":49,"value":752},"'\n",{"type":43,"tag":397,"props":754,"children":755},{"class":399,"line":615},[756],{"type":43,"tag":397,"props":757,"children":758},{"emptyLinePlaceholder":619},[759],{"type":49,"value":622},{"type":43,"tag":397,"props":761,"children":762},{"class":399,"line":625},[763],{"type":43,"tag":397,"props":764,"children":765},{"style":685},[766],{"type":49,"value":767},"# Run tests\n",{"type":43,"tag":397,"props":769,"children":770},{"class":399,"line":633},[771,775,780,784,789,793,797,801],{"type":43,"tag":397,"props":772,"children":773},{"style":717},[774],{"type":49,"value":720},{"type":43,"tag":397,"props":776,"children":777},{"style":723},[778],{"type":49,"value":779}," test",{"type":43,"tag":397,"props":781,"children":782},{"style":723},[783],{"type":49,"value":726},{"type":43,"tag":397,"props":785,"children":786},{"style":723},[787],{"type":49,"value":788}," MWDATCoreTests",{"type":43,"tag":397,"props":790,"children":791},{"style":723},[792],{"type":49,"value":736},{"type":43,"tag":397,"props":794,"children":795},{"style":739},[796],{"type":49,"value":742},{"type":43,"tag":397,"props":798,"children":799},{"style":723},[800],{"type":49,"value":747},{"type":43,"tag":397,"props":802,"children":803},{"style":739},[804],{"type":49,"value":752},{"type":43,"tag":59,"props":806,"children":807},{},[808],{"type":49,"value":809},"For sample apps:",{"type":43,"tag":387,"props":811,"children":813},{"className":673,"code":812,"language":675,"meta":391,"style":391},"# Open the sample app workspace\nopen ExternalSampleApps\u002FCameraAccess\u002FCameraAccess.xcodeproj\n\n# Build and run on simulator (uses MockDeviceKit - no glasses needed)\nxcodebuild -scheme CameraAccess -destination 'platform=iOS Simulator,name=iPhone 16'\n",[814],{"type":43,"tag":125,"props":815,"children":816},{"__ignoreMap":391},[817,825,838,845,853],{"type":43,"tag":397,"props":818,"children":819},{"class":399,"line":400},[820],{"type":43,"tag":397,"props":821,"children":822},{"style":685},[823],{"type":49,"value":824},"# Open the sample app workspace\n",{"type":43,"tag":397,"props":826,"children":827},{"class":399,"line":409},[828,833],{"type":43,"tag":397,"props":829,"children":830},{"style":717},[831],{"type":49,"value":832},"open",{"type":43,"tag":397,"props":834,"children":835},{"style":723},[836],{"type":49,"value":837}," ExternalSampleApps\u002FCameraAccess\u002FCameraAccess.xcodeproj\n",{"type":43,"tag":397,"props":839,"children":840},{"class":399,"line":418},[841],{"type":43,"tag":397,"props":842,"children":843},{"emptyLinePlaceholder":619},[844],{"type":49,"value":622},{"type":43,"tag":397,"props":846,"children":847},{"class":399,"line":597},[848],{"type":43,"tag":397,"props":849,"children":850},{"style":685},[851],{"type":49,"value":852},"# Build and run on simulator (uses MockDeviceKit - no glasses needed)\n",{"type":43,"tag":397,"props":854,"children":855},{"class":399,"line":606},[856,860,864,869,873,877,881],{"type":43,"tag":397,"props":857,"children":858},{"style":717},[859],{"type":49,"value":720},{"type":43,"tag":397,"props":861,"children":862},{"style":723},[863],{"type":49,"value":726},{"type":43,"tag":397,"props":865,"children":866},{"style":723},[867],{"type":49,"value":868}," CameraAccess",{"type":43,"tag":397,"props":870,"children":871},{"style":723},[872],{"type":49,"value":736},{"type":43,"tag":397,"props":874,"children":875},{"style":739},[876],{"type":49,"value":742},{"type":43,"tag":397,"props":878,"children":879},{"style":723},[880],{"type":49,"value":747},{"type":43,"tag":397,"props":882,"children":883},{"style":739},[884],{"type":49,"value":752},{"type":43,"tag":52,"props":886,"children":888},{"id":887},"development-workflow",[889],{"type":49,"value":890},"Development Workflow",{"type":43,"tag":892,"props":893,"children":894},"ol",{},[895,905,934,950,965,975],{"type":43,"tag":69,"props":896,"children":897},{},[898,903],{"type":43,"tag":73,"props":899,"children":900},{},[901],{"type":49,"value":902},"Add SDK",{"type":49,"value":904}," via Swift Package Manager (SPM) in Xcode",{"type":43,"tag":69,"props":906,"children":907},{},[908,913,915,920,921,926,927,932],{"type":43,"tag":73,"props":909,"children":910},{},[911],{"type":49,"value":912},"Import modules",{"type":49,"value":914}," (",{"type":43,"tag":125,"props":916,"children":918},{"className":917},[],[919],{"type":49,"value":77},{"type":49,"value":314},{"type":43,"tag":125,"props":922,"children":924},{"className":923},[],[925],{"type":49,"value":87},{"type":49,"value":314},{"type":43,"tag":125,"props":928,"children":930},{"className":929},[],[931],{"type":49,"value":97},{"type":49,"value":933}," when rendering Display content)",{"type":43,"tag":69,"props":935,"children":936},{},[937,942,944],{"type":43,"tag":73,"props":938,"children":939},{},[940],{"type":49,"value":941},"Configure",{"type":49,"value":943}," at app launch: ",{"type":43,"tag":125,"props":945,"children":947},{"className":946},[],[948],{"type":49,"value":949},"try Wearables.configure()",{"type":43,"tag":69,"props":951,"children":952},{},[953,958,960],{"type":43,"tag":73,"props":954,"children":955},{},[956],{"type":49,"value":957},"Build",{"type":49,"value":959}," with Xcode or ",{"type":43,"tag":125,"props":961,"children":963},{"className":962},[],[964],{"type":49,"value":720},{"type":43,"tag":69,"props":966,"children":967},{},[968,973],{"type":43,"tag":73,"props":969,"children":970},{},[971],{"type":49,"value":972},"Test",{"type":49,"value":974}," with MockDeviceKit - no physical glasses required",{"type":43,"tag":69,"props":976,"children":977},{},[978,983],{"type":43,"tag":73,"props":979,"children":980},{},[981],{"type":49,"value":982},"Debug",{"type":49,"value":984}," using Xcode console for SDK logs",{"type":43,"tag":52,"props":986,"children":988},{"id":987},"live-docs-search",[989],{"type":49,"value":990},"Live docs search",{"type":43,"tag":59,"props":992,"children":993},{},[994,996,1002,1004,1010],{"type":49,"value":995},"If your editor supports remote MCP servers, connect ",{"type":43,"tag":125,"props":997,"children":999},{"className":998},[],[1000],{"type":49,"value":1001},"https:\u002F\u002Fmcp.developer.meta.com\u002Fwearables",{"type":49,"value":1003}," and use ",{"type":43,"tag":125,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":49,"value":1009},"search_dat_docs",{"type":49,"value":1011}," for current DAT setup, session lifecycle, camera streaming, MockDeviceKit, permissions, and exact API symbols. This public docs server does not require authentication; do not configure tokens, OAuth, or custom authorization headers for it.",{"type":43,"tag":59,"props":1013,"children":1014},{},[1015,1016,1022],{"type":49,"value":123},{"type":43,"tag":125,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":49,"value":1021},"llms.txt",{"type":49,"value":1023}," when your tool only supports static reference context.",{"type":43,"tag":52,"props":1025,"children":1027},{"id":1026},"links",[1028],{"type":49,"value":1029},"Links",{"type":43,"tag":65,"props":1031,"children":1032},{},[1033,1045,1055],{"type":43,"tag":69,"props":1034,"children":1035},{},[1036],{"type":43,"tag":1037,"props":1038,"children":1042},"a",{"href":1039,"rel":1040},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Freference\u002Fios_swift\u002Fdat\u002F0.8",[1041],"nofollow",[1043],{"type":49,"value":1044},"iOS API Reference",{"type":43,"tag":69,"props":1046,"children":1047},{},[1048],{"type":43,"tag":1037,"props":1049,"children":1052},{"href":1050,"rel":1051},"https:\u002F\u002Fwearables.developer.meta.com\u002Fdocs\u002Fdevelop\u002F",[1041],[1053],{"type":49,"value":1054},"Developer Documentation",{"type":43,"tag":69,"props":1056,"children":1057},{},[1058],{"type":43,"tag":1037,"props":1059,"children":1061},{"href":27,"rel":1060},[1041],[1062],{"type":49,"value":1063},"GitHub Repository",{"type":43,"tag":1065,"props":1066,"children":1067},"style",{},[1068],{"type":49,"value":1069},"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":1071,"total":1249},[1072,1096,1110,1131,1148,1155,1166,1186,1199,1214,1226,1236],{"slug":1073,"name":1073,"fn":1074,"description":1075,"org":1076,"tags":1077,"stars":1093,"repoUrl":1094,"updatedAt":1095},"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},[1078,1081,1084,1087,1090],{"name":1079,"slug":1080,"type":16},"Engineering","engineering",{"name":1082,"slug":1083,"type":16},"Frontend","frontend",{"name":1085,"slug":1086,"type":16},"GraphQL","graphql",{"name":1088,"slug":1089,"type":16},"React","react",{"name":1091,"slug":1092,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":1097,"name":1097,"fn":1098,"description":1099,"org":1100,"tags":1101,"stars":1093,"repoUrl":1094,"updatedAt":1109},"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},[1102,1103,1104,1107,1108],{"name":1082,"slug":1083,"type":16},{"name":1085,"slug":1086,"type":16},{"name":1105,"slug":1106,"type":16},"Performance","performance",{"name":1088,"slug":1089,"type":16},{"name":1091,"slug":1092,"type":16},"2026-06-10T07:30:28.726513",{"slug":1111,"name":1111,"fn":1112,"description":1113,"org":1114,"tags":1115,"stars":1128,"repoUrl":1129,"updatedAt":1130},"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},[1116,1119,1122,1125],{"name":1117,"slug":1118,"type":16},"Data Modeling","data-modeling",{"name":1120,"slug":1121,"type":16},"Deep Learning","deep-learning",{"name":1123,"slug":1124,"type":16},"Python","python",{"name":1126,"slug":1127,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":1132,"name":1132,"fn":1133,"description":1134,"org":1135,"tags":1136,"stars":26,"repoUrl":27,"updatedAt":1147},"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},[1137,1140,1143,1144],{"name":1138,"slug":1139,"type":16},"Camera","camera",{"name":1141,"slug":1142,"type":16},"Hardware","hardware",{"name":14,"slug":15,"type":16},{"name":1145,"slug":1146,"type":16},"Video","video","2026-05-15T06:14:43.555881",{"slug":4,"name":4,"fn":5,"description":6,"org":1149,"tags":1150,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1151,1152,1153,1154],{"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":1156,"name":1156,"fn":1157,"description":1158,"org":1159,"tags":1160,"stars":26,"repoUrl":27,"updatedAt":1165},"debugging","debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1161,1163,1164],{"name":1162,"slug":1156,"type":16},"Debugging",{"name":1079,"slug":1080,"type":16},{"name":14,"slug":15,"type":16},"2026-05-15T06:14:38.626606",{"slug":1167,"name":1167,"fn":1168,"description":1169,"org":1170,"tags":1171,"stars":26,"repoUrl":27,"updatedAt":1185},"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},[1172,1175,1178,1181,1184],{"name":1173,"slug":1174,"type":16},"Design","design",{"name":1176,"slug":1177,"type":16},"Images","images",{"name":1179,"slug":1180,"type":16},"Interaction","interaction",{"name":1182,"slug":1183,"type":16},"UI Components","ui-components",{"name":1145,"slug":1146,"type":16},"2026-05-15T06:14:39.844502",{"slug":1187,"name":1187,"fn":1188,"description":1189,"org":1190,"tags":1191,"stars":26,"repoUrl":27,"updatedAt":1198},"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},[1192,1195,1196,1197],{"name":1193,"slug":1194,"type":16},"Configuration","configuration",{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},"2026-05-15T06:14:41.086639",{"slug":1200,"name":1200,"fn":1201,"description":1202,"org":1203,"tags":1204,"stars":26,"repoUrl":27,"updatedAt":1213},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1205,1206,1207,1210],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":1208,"slug":1209,"type":16},"QA","qa",{"name":1211,"slug":1212,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":1215,"name":1215,"fn":1216,"description":1217,"org":1218,"tags":1219,"stars":26,"repoUrl":27,"updatedAt":1225},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1220,1221,1222],{"name":1138,"slug":1139,"type":16},{"name":14,"slug":15,"type":16},{"name":1223,"slug":1224,"type":16},"Permissions","permissions","2026-05-15T06:14:46.030253",{"slug":1227,"name":1227,"fn":1228,"description":1229,"org":1230,"tags":1231,"stars":26,"repoUrl":27,"updatedAt":1235},"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},[1232,1233,1234],{"name":1138,"slug":1139,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},"2026-05-15T06:14:36.185947",{"slug":1237,"name":1237,"fn":1238,"description":1239,"org":1240,"tags":1241,"stars":26,"repoUrl":27,"updatedAt":1248},"session-lifecycle","monitor device session lifecycle states","Device session states, pause\u002Fresume, availability monitoring",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1242,1243,1244,1247],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":1245,"slug":1246,"type":16},"Monitoring","monitoring",{"name":1105,"slug":1106,"type":16},"2026-05-15T06:14:44.790925",27,{"items":1251,"total":642},[1252,1259,1266,1272,1280,1287,1294],{"slug":1132,"name":1132,"fn":1133,"description":1134,"org":1253,"tags":1254,"stars":26,"repoUrl":27,"updatedAt":1147},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1255,1256,1257,1258],{"name":1138,"slug":1139,"type":16},{"name":1141,"slug":1142,"type":16},{"name":14,"slug":15,"type":16},{"name":1145,"slug":1146,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":1260,"tags":1261,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1262,1263,1264,1265],{"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":1156,"name":1156,"fn":1157,"description":1158,"org":1267,"tags":1268,"stars":26,"repoUrl":27,"updatedAt":1165},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1269,1270,1271],{"name":1162,"slug":1156,"type":16},{"name":1079,"slug":1080,"type":16},{"name":14,"slug":15,"type":16},{"slug":1167,"name":1167,"fn":1168,"description":1169,"org":1273,"tags":1274,"stars":26,"repoUrl":27,"updatedAt":1185},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1275,1276,1277,1278,1279],{"name":1173,"slug":1174,"type":16},{"name":1176,"slug":1177,"type":16},{"name":1179,"slug":1180,"type":16},{"name":1182,"slug":1183,"type":16},{"name":1145,"slug":1146,"type":16},{"slug":1187,"name":1187,"fn":1188,"description":1189,"org":1281,"tags":1282,"stars":26,"repoUrl":27,"updatedAt":1198},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1283,1284,1285,1286],{"name":1193,"slug":1194,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1200,"name":1200,"fn":1201,"description":1202,"org":1288,"tags":1289,"stars":26,"repoUrl":27,"updatedAt":1213},{"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":1208,"slug":1209,"type":16},{"name":1211,"slug":1212,"type":16},{"slug":1215,"name":1215,"fn":1216,"description":1217,"org":1295,"tags":1296,"stars":26,"repoUrl":27,"updatedAt":1225},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1297,1298,1299],{"name":1138,"slug":1139,"type":16},{"name":14,"slug":15,"type":16},{"name":1223,"slug":1224,"type":16}]