{"id":"141b8ed1-3799-4e28-9005-00c214a45d9f","shortId":"kT72p5","kind":"skill","title":"dockkit","tagline":"Control motorized camera docks and enable intelligent subject tracking using DockKit. Use when discovering DockKit-compatible accessories, implementing camera subject tracking for faces or bodies, controlling dock motors for pan and tilt, configuring framing behavior, setting reg","description":"# DockKit\n\nFramework for integrating with motorized camera stands and gimbals that\nphysically track subjects by rotating the iPhone. DockKit handles motor\ncontrol, subject detection, and framing so camera apps get 360-degree pan\nand 90-degree tilt tracking with no additional code. Apps can override\nsystem tracking to supply custom observations, control motors directly,\nor adjust framing. iOS 17+, Swift 6.3.\n\n## Contents\n\n- [Setup](#setup)\n- [Discovering Accessories](#discovering-accessories)\n- [System Tracking](#system-tracking)\n- [Custom Tracking](#custom-tracking)\n- [Framing and Region of Interest](#framing-and-region-of-interest)\n- [Motor Control](#motor-control)\n- [Animations](#animations)\n- [Tracking State and Subject Selection](#tracking-state-and-subject-selection)\n- [Accessory Events](#accessory-events)\n- [Battery Monitoring](#battery-monitoring)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup\n\nImport DockKit:\n\n```swift\nimport DockKit\n```\n\nDockKit requires a physical DockKit-compatible accessory and a real device.\nThe Simulator cannot connect to dock hardware.\n\nNo special entitlements or Info.plist keys are required. The framework\ncommunicates with paired accessories automatically through the DockKit\nsystem daemon.\n\nThe app must use AVFoundation camera APIs. DockKit hooks into the camera\npipeline to analyze frames for system tracking.\n\n## Discovering Accessories\n\nUse `DockAccessoryManager.shared` to observe dock connections:\n\n```swift\nimport DockKit\n\nfunc observeAccessories() async throws {\n    for await stateChange in try DockAccessoryManager.shared.accessoryStateChanges {\n        switch stateChange.state {\n        case .docked:\n            guard let accessory = stateChange.accessory else { continue }\n            // Accessory is connected and ready\n            configureAccessory(accessory)\n        case .undocked:\n            // iPhone removed from dock\n            handleUndocked()\n        @unknown default:\n            break\n        }\n    }\n}\n```\n\n`accessoryStateChanges` is an `AsyncSequence` that emits\n`DockAccessory.StateChange` values. Each change includes:\n\n- `state` -- `.docked` or `.undocked`\n- `accessory` -- the `DockAccessory` instance (present when docked)\n- `trackingButtonEnabled` -- whether the physical tracking button is active\n\n### Accessory Identity\n\nEach `DockAccessory` has an `identifier` with:\n\n- `name` -- human-readable accessory name\n- `category` -- `.trackingStand` (currently the only category)\n- `uuid` -- unique identifier for this accessory\n\nHardware details are available via `firmwareVersion` and `hardwareModel`.\n\n## System Tracking\n\nSystem tracking is DockKit's default mode. When enabled, the system\nanalyzes camera frames through built-in ML inference, detects faces and\nbodies, and drives the motors to keep subjects in frame. Any app using\nAVFoundation camera APIs benefits automatically.\n\n### Enable or Disable\n\n```swift\n// Enable system tracking (default)\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(true)\n\n// Disable system tracking for custom control\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\n```\n\nCheck current state:\n\n```swift\nlet isEnabled = DockAccessoryManager.shared.isSystemTrackingEnabled\n```\n\nSystem tracking state does not persist across app termination, reboots,\nor background/foreground transitions. Set it explicitly whenever the app\nneeds a specific value.\n\n### Tap to Select Subject\n\nAllow users to select a specific subject by tapping:\n\n```swift\n// Select the subject at a screen coordinate\ntry await accessory.selectSubject(at: CGPoint(x: 0.5, y: 0.5))\n\n// Select specific subjects by identifier\ntry await accessory.selectSubjects([subjectUUID])\n\n// Clear selection (return to automatic selection)\ntry await accessory.selectSubjects([])\n```\n\n## Custom Tracking\n\nDisable system tracking and provide your own observations when using\ncustom ML models or the Vision framework.\n\n### Providing Observations\n\nConstruct `DockAccessory.Observation` values from your inference output\nand pass them to the accessory at 10-30 fps:\n\n```swift\nimport DockKit\nimport AVFoundation\n\nfunc processFrame(\n    _ sampleBuffer: CMSampleBuffer,\n    accessory: DockAccessory,\n    device: AVCaptureDevice\n) async throws {\n    let cameraInfo = DockAccessory.CameraInformation(\n        captureDevice: device.deviceType,\n        cameraPosition: device.position,\n        orientation: .corrected,\n        cameraIntrinsics: nil,\n        referenceDimensions: nil\n    )\n\n    // Create observation from your detection output\n    let observation = DockAccessory.Observation(\n        identifier: 0,\n        type: .humanFace,\n        rect: detectedFaceRect,       // CGRect in normalized coordinates\n        faceYawAngle: nil\n    )\n\n    try await accessory.track(\n        [observation],\n        cameraInformation: cameraInfo\n    )\n}\n```\n\n### Observation Types\n\n| Type | Use |\n|---|---|\n| `.humanFace` | Preserves system multi-person tracking and framing optimizations |\n| `.humanBody` | Full body tracking |\n| `.object` | Arbitrary objects (pets, hands, barcodes, etc.) |\n\nThe `rect` uses normalized coordinates with a lower-left origin (same\ncoordinate system as Vision framework -- no conversion needed).\n\n### Camera Information\n\n`DockAccessory.CameraInformation` describes the active camera. Set\norientation to `.corrected` when coordinates are already relative to the\nbottom-left corner of the screen. Optional `cameraIntrinsics` and\n`referenceDimensions` improve tracking accuracy.\n\nTrack variants also accept `[AVMetadataObject]` instead of observations,\nand an optional `CVPixelBuffer` for enhanced tracking.\n\n## Framing and Region of Interest\n\n### Framing Modes\n\nControl how the system frames tracked subjects:\n\n```swift\ntry await accessory.setFramingMode(.center)\n```\n\n| Mode | Behavior |\n|---|---|\n| `.automatic` | System decides optimal framing |\n| `.center` | Keep subject centered (default) |\n| `.left` | Frame subject in left third |\n| `.right` | Frame subject in right third |\n\nRead the current mode:\n\n```swift\nlet currentMode = accessory.framingMode\n```\n\nUse `.left` or `.right` when graphic overlays occupy part of the frame.\n\n### Region of Interest\n\nConstrain tracking to a specific area of the video frame:\n\n```swift\n// Normalized coordinates, origin at upper-left\nlet squareRegion = CGRect(x: 0.25, y: 0.0, width: 0.5, height: 1.0)\ntry await accessory.setRegionOfInterest(squareRegion)\n```\n\nRead the current region:\n\n```swift\nlet currentROI = accessory.regionOfInterest\n```\n\nUse region of interest when cropping to a non-standard aspect ratio\n(e.g., square video for conferencing) so subjects stay within the\nvisible area.\n\n## Motor Control\n\nDisable system tracking before controlling motors directly.\n\n### Angular Velocity\n\nSet continuous rotation speed in radians per second:\n\n```swift\nimport Spatial\n\n// Pan right at 0.2 rad/s, tilt down at 0.1 rad/s\nlet velocity = Vector3D(x: 0.1, y: 0.2, z: 0.0)\ntry await accessory.setAngularVelocity(velocity)\n\n// Stop all motion\ntry await accessory.setAngularVelocity(Vector3D())\n```\n\nAxes:\n- `x` -- pitch (tilt). Positive tilts down on iOS.\n- `y` -- yaw (pan). Positive pans right.\n- `z` -- roll (if supported by hardware).\n\n### Set Orientation\n\nMove to a specific position over a duration:\n\n```swift\nlet target = Vector3D(x: 0.0, y: 0.5, z: 0.0)  // Yaw 0.5 rad\nlet progress = try accessory.setOrientation(\n    target,\n    duration: .seconds(2),\n    relative: false\n)\n```\n\nAlso accepts `Rotation3D` for quaternion-based orientation. Set\n`relative: true` to move relative to the current position. The returned\n`Progress` object tracks completion.\n\n### Motion State\n\nMonitor the accessory's current position and velocity:\n\n```swift\nfor await state in accessory.motionStates {\n    let positions = state.angularPositions   // Vector3D\n    let velocities = state.angularVelocities // Vector3D\n    let time = state.timestamp\n    if let error = state.error {\n        // Motor error occurred\n    }\n}\n```\n\n### Setting Limits\n\nRestrict range of motion and maximum speed per axis:\n\n```swift\nlet yawLimit = try DockAccessory.Limits.Limit(\n    positionRange: -1.0 ..< 1.0,   // radians\n    maximumSpeed: 0.5               // rad/s\n)\nlet limits = DockAccessory.Limits(yaw: yawLimit, pitch: nil, roll: nil)\ntry accessory.setLimits(limits)\n```\n\n## Animations\n\nBuilt-in character animations that move the dock expressively:\n\n```swift\n// Disable system tracking before animating\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\n\nlet progress = try await accessory.animate(motion: .kapow)\n\n// Wait for completion\nwhile !progress.isFinished && !progress.isCancelled {\n    try await Task.sleep(for: .milliseconds(100))\n}\n\n// Restore system tracking\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(true)\n```\n\n| Animation | Effect |\n|---|---|\n| `.yes` | Nodding motion |\n| `.no` | Shaking motion |\n| `.wakeup` | Startup-style motion |\n| `.kapow` | Dramatic pendulum swing |\n\nAnimations start from the accessory's current position and execute\nasynchronously. Always restore tracking state after completion.\n\n## Tracking State and Subject Selection\n\niOS 18+ exposes ML-derived tracking signals through `trackingStates`.\nEach `TrackingState` contains a timestamp and a list of\n`TrackedSubjectType` values (`.person` or `.object`). Persons include\n`speakingConfidence`, `lookingAtCameraConfidence`, and `saliencyRank`\n(1 = most important, lower is more salient).\n\n```swift\nfor await state in accessory.trackingStates {\n    for subject in state.trackedSubjects {\n        switch subject {\n        case .person(let person):\n            let speaking = person.speakingConfidence   // 0.0 - 1.0\n            let saliency = person.saliencyRank\n        case .object(let object):\n            let saliency = object.saliencyRank\n        }\n    }\n}\n```\n\nUse `selectSubjects(_:)` to lock tracking onto specific subjects by UUID.\nPass an empty array to return to automatic selection. See\n[references/dockkit-patterns.md](references/dockkit-patterns.md) for speaker-tracking and saliency\nfiltering recipes.\n\n## Accessory Events\n\nPhysical buttons on the dock trigger events:\n\n```swift\nfor await event in accessory.accessoryEvents {\n    switch event {\n    case .cameraShutter:\n        // Start or stop recording / take photo\n        break\n    case .cameraFlip:\n        // Switch front/back camera\n        break\n    case .cameraZoom(factor: let factor):\n        // factor > 0 means zoom in, < 0 means zoom out\n        break\n    case .button(id: let id, pressed: let pressed):\n        // Custom button with identifier\n        break\n    @unknown default:\n        break\n    }\n}\n```\n\nFor first-party apps (Camera, FaceTime), shutter/flip/zoom events work\nautomatically. Third-party apps receive these events and implement\nbehavior through AVFoundation.\n\n## Battery Monitoring\n\nMonitor the dock's battery status (iOS 18+). A dock can report multiple\nbatteries, each identified by `name`:\n\n```swift\nfor await battery in accessory.batteryStates {\n    let level = battery.batteryLevel       // 0.0 - 1.0\n    let charging = battery.chargeState     // .charging, .notCharging, .notChargeable\n    let low = battery.lowBattery\n}\n```\n\n## Common Mistakes\n\n### DON'T: Control motors without disabling system tracking\n\n```swift\n// WRONG -- system tracking fights manual commands\ntry await accessory.setAngularVelocity(velocity)\n\n// CORRECT -- disable system tracking first\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\ntry await accessory.setAngularVelocity(velocity)\n```\n\n### DON'T: Assume tracking state persists across lifecycle events\n\n```swift\n// WRONG -- state may have reset after backgrounding\nfunc applicationDidBecomeActive() {\n    // Assume custom tracking is still active\n}\n\n// CORRECT -- re-set tracking state on foreground\nfunc applicationDidBecomeActive() {\n    Task {\n        try await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\n    }\n}\n```\n\n### DON'T: Call track() outside the recommended rate\n\n```swift\n// WRONG -- calling once per second is too slow\ntry await accessory.track(observations, cameraInformation: cameraInfo)\n// (called at 1 fps)\n\n// CORRECT -- call at 10-30 fps\n// Hook into AVCaptureVideoDataOutputSampleBufferDelegate for per-frame calls\n```\n\n### DON'T: Forget to restore tracking after animations\n\n```swift\n// WRONG -- tracking stays disabled after animation\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\nlet progress = try await accessory.animate(motion: .kapow)\n\n// CORRECT -- restore tracking when animation completes\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(false)\nlet progress = try await accessory.animate(motion: .kapow)\nwhile !progress.isFinished && !progress.isCancelled {\n    try await Task.sleep(for: .milliseconds(100))\n}\ntry await DockAccessoryManager.shared.setSystemTrackingEnabled(true)\n```\n\n### DON'T: Use DockKit in Simulator\n\nDockKit requires a physical DockKit-compatible accessory. Guard\ninitialization and provide fallback behavior when no accessory is\navailable.\n\n## Review Checklist\n\n- [ ] `import DockKit` present where needed\n- [ ] Subscribed to `accessoryStateChanges` to detect dock/undock events\n- [ ] Handled both `.docked` and `.undocked` states\n- [ ] System tracking disabled before custom tracking or motor control\n- [ ] System tracking restored after animations complete\n- [ ] Custom observations supplied at 10-30 fps\n- [ ] Observation `rect` uses normalized coordinates (lower-left origin)\n- [ ] Camera information matches the active capture device\n- [ ] `@unknown default` handled in all switch statements over DockKit enums\n- [ ] Motion limits set if restricting accessory range of motion\n- [ ] Tracking state re-applied after app returns to foreground\n- [ ] Accessory events handled for physical button integration\n- [ ] Battery state monitored when showing dock status to user\n- [ ] No DockKit code paths executed in Simulator builds\n\n## References\n\n- Extended patterns (Vision integration, service architecture, custom animations): [references/dockkit-patterns.md](references/dockkit-patterns.md)\n- [DockKit framework](https://sosumi.ai/documentation/dockkit)\n- [DockAccessoryManager](https://sosumi.ai/documentation/dockkit/dockaccessorymanager)\n- [DockAccessory](https://sosumi.ai/documentation/dockkit/dockaccessory)\n- [Controlling a DockKit accessory using your camera app](https://sosumi.ai/documentation/dockkit/controlling-a-dockkit-accessory-using-your-camera-app)\n- [Track custom objects in a frame](https://sosumi.ai/documentation/dockkit/track-custom-objects-in-a-frame)\n- [Modify rotation and positioning programmatically](https://sosumi.ai/documentation/dockkit/modify-rotation-and-positioning-behavior-programmatically)\n- [Integrate with motorized iPhone stands using DockKit -- WWDC23](https://sosumi.ai/videos/play/wwdc2023/10304/)\n- [What's new in DockKit -- WWDC24](https://sosumi.ai/videos/play/wwdc2024/10164/)","tags":["dockkit","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-dockkit","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/dockkit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.684","qualityRationale":"deterministic score 0.68 from registry signals: · indexed on github topic:agent-skills · 468 github stars · SKILL.md body (15,009 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:53:42.744Z","embedding":null,"createdAt":"2026-04-18T22:00:57.246Z","updatedAt":"2026-04-22T00:53:42.744Z","lastSeenAt":"2026-04-22T00:53:42.744Z","tsv":"'-1.0':987 '-30':525,1420,1551 '/documentation/dockkit)':1637 '/documentation/dockkit/controlling-a-dockkit-accessory-using-your-camera-app)':1656 '/documentation/dockkit/dockaccessory)':1645 '/documentation/dockkit/dockaccessorymanager)':1641 '/documentation/dockkit/modify-rotation-and-positioning-behavior-programmatically)':1673 '/documentation/dockkit/track-custom-objects-in-a-frame)':1665 '/videos/play/wwdc2023/10304/)':1684 '/videos/play/wwdc2024/10164/)':1693 '0':565,1227,1231 '0.0':764,846,894,898,1147,1304 '0.1':836,842 '0.2':831,844 '0.25':762 '0.5':468,470,766,896,900,991 '1':1121,1414 '1.0':768,988,1148,1305 '10':524,1419,1550 '100':1044,1481 '17':98 '18':1092,1284 '2':909 '360':70 '6.3':100 '90':74 'accept':662,913 'accessori':19,105,108,148,151,183,208,235,261,265,271,297,312,324,337,522,536,940,1073,1189,1499,1508,1584,1598,1649 'accessory-ev':150 'accessory.accessoryevents':1203 'accessory.animate':1030,1453,1470 'accessory.batterystates':1300 'accessory.framingmode':724 'accessory.motionstates':951 'accessory.regionofinterest':780 'accessory.selectsubject':464 'accessory.selectsubjects':478,488 'accessory.setangularvelocity':849,856,1334,1347 'accessory.setframingmode':691 'accessory.setlimits':1003 'accessory.setorientation':905 'accessory.setregionofinterest':771 'accessory.track':578,1408 'accessory.trackingstates':1133 'accessorystatechang':282,1520 'accuraci':658 'across':424,1355 'activ':311,632,1373,1566 'addit':80 'adjust':95 'allow':445 'alreadi':641 'also':661,912 'alway':1080 'analyz':229,359 'angular':815 'anim':135,136,1005,1010,1021,1052,1069,1437,1444,1460,1544,1630 'api':221,386 'app':68,82,216,382,425,436,1256,1266,1594,1653 'appli':1592 'applicationdidbecomeact':1367,1383 'arbitrari':601 'architectur':1628 'area':745,805 'array':1172 'aspect':792 'assum':1351,1368 'async':247,540 'asynchron':1079 'asyncsequ':285 'automat':209,388,484,695,1176,1262 'avail':341,1510 'avcapturedevic':539 'avcapturevideodataoutputsamplebufferdeleg':1424 'avfound':219,384,531,1274 'avmetadataobject':663 'await':250,398,408,463,477,487,577,690,770,848,855,948,1023,1029,1040,1049,1130,1200,1297,1333,1342,1346,1386,1407,1446,1452,1463,1469,1477,1483 'axe':858 'axi':980 'background':1365 'background/foreground':429 'barcod':605 'base':918 'batteri':153,156,1275,1281,1290,1298,1605 'battery-monitor':155 'battery.batterylevel':1303 'battery.chargestate':1308 'battery.lowbattery':1314 'behavior':37,694,1272,1505 'benefit':387 'bodi':27,371,598 'bottom':646 'bottom-left':645 'break':281,1214,1220,1235,1248,1251 'build':1621 'built':364,1007 'built-in':363,1006 'button':309,1192,1237,1245,1603 'call':1391,1399,1412,1417,1429 'camera':4,21,46,67,220,226,360,385,627,633,1219,1257,1562,1652 'cameraflip':1216 'camerainfo':543,581,1411 'camerainform':580,1410 'cameraintrins':551,653 'cameraposit':547 'camerashutt':1207 'camerazoom':1222 'cannot':190 'captur':1567 'capturedevic':545 'case':257,272,1140,1152,1206,1215,1221,1236 'categori':326,331 'center':692,700,703 'cgpoint':466 'cgrect':570,760 'chang':291 'charact':1009 'charg':1307,1309 'check':411 'checklist':164,167,1512 'clear':480 'cmsamplebuff':535 'code':81,1616 'command':1331 'common':158,161,1315 'common-mistak':160 'communic':205 'compat':18,182,1498 'complet':935,1035,1085,1461,1545 'conferenc':798 'configur':35 'configureaccessori':270 'connect':191,241,267 'constrain':740 'construct':510 'contain':1103 'content':101 'continu':264,818 'control':2,28,61,91,131,134,406,681,807,812,1319,1539,1646 'convers':625 'coordin':461,573,611,619,639,752,1557 'corner':648 'correct':550,637,1336,1374,1416,1456 'creat':555 'crop':786 'current':328,412,719,775,928,942,1075 'currentmod':723 'currentroi':779 'custom':89,114,117,405,489,501,1244,1369,1535,1546,1629,1658 'custom-track':116 'cvpixelbuff':670 'daemon':214 'decid':697 'default':280,353,396,704,1250,1570 'degre':71,75 'deriv':1096 'describ':630 'detail':339 'detect':63,368,559,1522 'detectedfacerect':569 'devic':187,538,1568 'device.devicetype':546 'device.position':548 'direct':93,814 'disabl':391,401,491,808,1017,1322,1337,1442,1533 'discov':15,104,107,234 'discovering-accessori':106 'dock':5,29,193,240,258,277,294,303,1014,1195,1279,1286,1527,1610 'dock/undock':1523 'dockaccessori':299,315,537,1642 'dockaccessory.camerainformation':544,629 'dockaccessory.limits':995 'dockaccessory.limits.limit':985 'dockaccessory.observation':511,563 'dockaccessory.statechange':288 'dockaccessorymanag':1638 'dockaccessorymanager.shared':237 'dockaccessorymanager.shared.accessorystatechanges':254 'dockaccessorymanager.shared.issystemtrackingenabled':417 'dockaccessorymanager.shared.setsystemtrackingenabled':399,409,1024,1050,1343,1387,1447,1464,1484 'dockkit':1,12,17,40,58,172,175,176,181,212,222,244,351,529,1489,1492,1497,1514,1577,1615,1633,1648,1680,1689 'dockkit-compat':16,180,1496 'dramat':1066 'drive':373 'durat':888,907 'e.g':794 'effect':1053 'els':263 'emit':287 'empti':1171 'enabl':7,356,389,393 'enhanc':672 'entitl':197 'enum':1578 'error':965,968 'etc':606 'event':149,152,1190,1197,1201,1205,1260,1269,1357,1524,1599 'execut':1078,1618 'explicit':433 'expos':1093 'express':1015 'extend':1623 'face':25,369 'facetim':1258 'faceyawangl':574 'factor':1223,1225,1226 'fallback':1504 'fals':410,911,1025,1344,1388,1448,1465 'fight':1329 'filter':1187 'firmwarevers':343 'first':1254,1340 'first-parti':1253 'foreground':1381,1597 'forget':1432 'fps':526,1415,1421,1552 'frame':36,65,96,119,125,230,361,380,594,674,679,685,699,706,712,736,749,1428,1662 'framework':41,204,507,623,1634 'framing-and-region-of-interest':124 'front/back':1218 'full':597 'func':245,532,1366,1382 'get':69 'gimbal':49 'graphic':730 'guard':259,1500 'hand':604 'handl':59,1525,1571,1600 'handleundock':278 'hardwar':194,338,878 'hardwaremodel':345 'height':767 'hook':223,1422 'human':322 'human-read':321 'humanbodi':596 'humanfac':567,586 'id':1238,1240 'ident':313 'identifi':318,334,475,564,1247,1292 'implement':20,1271 'import':171,174,243,528,530,826,1123,1513 'improv':656 'includ':292,1116 'infer':367,515 'info.plist':199 'inform':628,1563 'initi':1501 'instanc':300 'instead':664 'integr':43,1604,1626,1674 'intellig':8 'interest':123,129,678,739,784 'io':97,866,1091,1283 'iphon':57,274,1677 'isen':416 'kapow':1032,1065,1455,1472 'keep':377,701 'key':200 'left':616,647,705,709,726,757,1560 'let':260,415,542,561,722,758,778,838,890,902,952,956,960,964,982,993,1026,1142,1144,1149,1154,1156,1224,1239,1242,1301,1306,1312,1449,1466 'level':1302 'lifecycl':1356 'limit':971,994,1004,1580 'list':1108 'lock':1162 'lookingatcameraconfid':1118 'low':1313 'lower':615,1124,1559 'lower-left':614,1558 'manual':1330 'match':1564 'maximum':977 'maximumspe':990 'may':1361 'mean':1228,1232 'millisecond':1043,1480 'mistak':159,162,1316 'ml':366,502,1095 'ml-deriv':1094 'mode':354,680,693,720 'model':503 'modifi':1666 'monitor':154,157,938,1276,1277,1607 'motion':853,936,975,1031,1056,1059,1064,1454,1471,1579,1587 'motor':3,30,45,60,92,130,133,375,806,813,967,1320,1538,1676 'motor-control':132 'move':881,924,1012 'multi':590 'multi-person':589 'multipl':1289 'must':217 'name':320,325,1294 'need':437,626,1517 'new':1687 'nil':552,554,575,999,1001 'nod':1055 'non':790 'non-standard':789 'normal':572,610,751,1556 'notcharg':1310,1311 'object':600,602,933,1114,1153,1155,1659 'object.saliencyrank':1158 'observ':90,239,498,509,556,562,579,582,666,1409,1547,1553 'observeaccessori':246 'occupi':732 'occur':969 'onto':1164 'optim':595,698 'option':652,669 'orient':549,635,880,919 'origin':617,753,1561 'output':516,560 'outsid':1393 'overlay':731 'overrid':84 'pair':207 'pan':32,72,828,869,871 'part':733 'parti':1255,1265 'pass':518,1169 'path':1617 'pattern':1624 'pendulum':1067 'per':823,979,1401,1427 'per-fram':1426 'persist':423,1354 'person':591,1112,1115,1141,1143 'person.saliencyrank':1151 'person.speakingconfidence':1146 'pet':603 'photo':1213 'physic':51,179,307,1191,1495,1602 'pipelin':227 'pitch':860,998 'posit':862,870,885,929,943,953,1076,1669 'positionrang':986 'present':301,1515 'preserv':587 'press':1241,1243 'processfram':533 'programmat':1670 'progress':903,932,1027,1450,1467 'progress.iscancelled':1038,1475 'progress.isfinished':1037,1474 'provid':495,508,1503 'quaternion':917 'quaternion-bas':916 'rad':901 'rad/s':832,837,992 'radian':822,989 'rang':973,1585 'rate':1396 'ratio':793 're':1376,1591 're-appli':1590 're-set':1375 'read':717,773 'readabl':323 'readi':269 'real':186 'reboot':427 'receiv':1267 'recip':1188 'recommend':1395 'record':1211 'rect':568,608,1554 'refer':168,169,1622 'referencedimens':553,655 'references/dockkit-patterns.md':1179,1180,1631,1632 'reg':39 'region':121,127,676,737,776,782 'relat':642,910,921,925 'remov':275 'report':1288 'requir':177,202,1493 'reset':1363 'restor':1045,1081,1434,1457,1542 'restrict':972,1583 'return':482,931,1174,1595 'review':163,166,1511 'review-checklist':165 'right':711,715,728,829,872 'roll':874,1000 'rotat':55,819,1667 'rotation3d':914 'salienc':1150,1157,1186 'saliencyrank':1120 'salient':1127 'samplebuff':534 'screen':460,651 'second':824,908,1402 'see':1178 'select':141,147,443,448,455,471,481,485,1090,1177 'selectsubject':1160 'servic':1627 'set':38,431,634,817,879,920,970,1377,1581 'setup':102,103,170 'shake':1058 'show':1609 'shutter/flip/zoom':1259 'signal':1098 'simul':189,1491,1620 'skill' 'skill-dockkit' 'slow':1405 'sosumi.ai':1636,1640,1644,1655,1664,1672,1683,1692 'sosumi.ai/documentation/dockkit)':1635 'sosumi.ai/documentation/dockkit/controlling-a-dockkit-accessory-using-your-camera-app)':1654 'sosumi.ai/documentation/dockkit/dockaccessory)':1643 'sosumi.ai/documentation/dockkit/dockaccessorymanager)':1639 'sosumi.ai/documentation/dockkit/modify-rotation-and-positioning-behavior-programmatically)':1671 'sosumi.ai/documentation/dockkit/track-custom-objects-in-a-frame)':1663 'sosumi.ai/videos/play/wwdc2023/10304/)':1682 'sosumi.ai/videos/play/wwdc2024/10164/)':1691 'source-dpearson2699' 'spatial':827 'speak':1145 'speaker':1183 'speaker-track':1182 'speakingconfid':1117 'special':196 'specif':439,450,472,744,884,1165 'speed':820,978 'squar':795 'squareregion':759,772 'stand':47,1678 'standard':791 'start':1070,1208 'startup':1062 'startup-styl':1061 'state':138,144,293,413,420,937,949,1083,1087,1131,1353,1360,1379,1530,1589,1606 'state.angularpositions':954 'state.angularvelocities':958 'state.error':966 'state.timestamp':962 'state.trackedsubjects':1137 'statechang':251 'statechange.accessory':262 'statechange.state':256 'statement':1575 'status':1282,1611 'stay':801,1441 'still':1372 'stop':851,1210 'style':1063 'subject':9,22,53,62,140,146,378,444,451,457,473,687,702,707,713,800,1089,1135,1139,1166 'subjectuuid':479 'subscrib':1518 'suppli':88,1548 'support':876 'swift':99,173,242,392,414,454,527,688,721,750,777,825,889,946,981,1016,1128,1198,1295,1325,1358,1397,1438 'swing':1068 'switch':255,1138,1204,1217,1574 'system':85,109,112,213,232,346,348,358,394,402,418,492,588,620,684,696,809,1018,1046,1323,1327,1338,1531,1540 'system-track':111 'take':1212 'tap':441,453 'target':891,906 'task':1384 'task.sleep':1041,1478 'termin':426 'third':710,716,1264 'third-parti':1263 'throw':248,541 'tilt':34,76,833,861,863 'time':961 'timestamp':1105 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'track':10,23,52,77,86,110,113,115,118,137,143,233,308,347,349,395,403,419,490,493,592,599,657,659,673,686,741,810,934,1019,1047,1082,1086,1097,1163,1184,1324,1328,1339,1352,1370,1378,1392,1435,1440,1458,1532,1536,1541,1588,1657 'trackedsubjecttyp':1110 'tracking-state-and-subject-select':142 'trackingbuttonen':304 'trackingst':1100,1102 'trackingstand':327 'transit':430 'tri':253,397,407,462,476,486,576,689,769,847,854,904,984,1002,1022,1028,1039,1048,1332,1341,1345,1385,1406,1445,1451,1462,1468,1476,1482 'trigger':1196 'true':400,922,1051,1485 'type':566,583,584 'undock':273,296,1529 'uniqu':333 'unknown':279,1249,1569 'upper':756 'upper-left':755 'use':11,13,218,236,383,500,585,609,725,781,1159,1488,1555,1650,1679 'user':446,1613 'uuid':332,1168 'valu':289,440,512,1111 'variant':660 'vector3d':840,857,892,955,959 'veloc':816,839,850,945,957,1335,1348 'via':342 'video':748,796 'visibl':804 'vision':506,622,1625 'wait':1033 'wakeup':1060 'whenev':434 'whether':305 'width':765 'within':802 'without':1321 'work':1261 'wrong':1326,1359,1398,1439 'wwdc23':1681 'wwdc24':1690 'x':467,761,841,859,893 'y':469,763,843,867,895 'yaw':868,899,996 'yawlimit':983,997 'yes':1054 'z':845,873,897 'zoom':1229,1233","prices":[{"id":"5c0fc4e5-f187-4365-9d61-d6843fac44d0","listingId":"141b8ed1-3799-4e28-9005-00c214a45d9f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:00:57.246Z"}],"sources":[{"listingId":"141b8ed1-3799-4e28-9005-00c214a45d9f","source":"github","sourceId":"dpearson2699/swift-ios-skills/dockkit","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/dockkit","isPrimary":false,"firstSeenAt":"2026-04-18T22:00:57.246Z","lastSeenAt":"2026-04-22T00:53:42.744Z"}],"details":{"listingId":"141b8ed1-3799-4e28-9005-00c214a45d9f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"dockkit","github":{"repo":"dpearson2699/swift-ios-skills","stars":468,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-21T19:26:16Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"c8207fb76a9246e59c09b033a2959946a277ae69","skill_md_path":"skills/dockkit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/dockkit"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"dockkit","description":"Control motorized camera docks and enable intelligent subject tracking using DockKit. Use when discovering DockKit-compatible accessories, implementing camera subject tracking for faces or bodies, controlling dock motors for pan and tilt, configuring framing behavior, setting regions of interest, or building video apps with automatic camera tracking."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/dockkit"},"updatedAt":"2026-04-22T00:53:42.744Z"}}