{"id":"dd7fc032-b5c3-4292-bf9e-5c7e39ff4b14","shortId":"T7847a","kind":"skill","title":"relevancekit","tagline":"Increase widget visibility on Apple Watch using RelevanceKit. Use when providing contextual relevance signals for watchOS widgets, declaring time-based or location-based relevance, combining multiple relevance providers, or helping the system surface the right widget at the right","description":"# RelevanceKit\n\nProvide on-device contextual clues that increase a widget's visibility in the\nSmart Stack on Apple Watch. RelevanceKit tells the system *when* a widget is\nrelevant -- by time, location, fitness state, sleep schedule, or connected\nhardware -- so the Smart Stack can surface the right widget at the right moment.\nTargets Swift 6.3 / watchOS 26+.\n\n> **Beta-sensitive.** RelevanceKit shipped with watchOS 26. Re-check Apple\n> documentation before making strong claims about API availability or behavior.\n\nSee [references/relevancekit-patterns.md](references/relevancekit-patterns.md) for complete code patterns including\nrelevant widgets, timeline provider integration, grouping, previews, and\npermission handling.\n\n## Contents\n\n- [Overview](#overview)\n- [Setup](#setup)\n- [Relevance Providers](#relevance-providers)\n- [Time-Based Relevance](#time-based-relevance)\n- [Location-Based Relevance](#location-based-relevance)\n- [Fitness and Sleep Relevance](#fitness-and-sleep-relevance)\n- [Hardware Relevance](#hardware-relevance)\n- [Combining Signals](#combining-signals)\n- [Widget Integration](#widget-integration)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Overview\n\nwatchOS uses two mechanisms to determine widget relevance in the Smart Stack:\n\n1. **Timeline provider relevance** -- implement `relevance()` on an existing\n   `AppIntentTimelineProvider` to attach `RelevantContext` clues to timeline\n   entries. Available across platforms; only watchOS acts on the data.\n2. **Relevant widget** -- use `RelevanceConfiguration` with a\n   `RelevanceEntriesProvider` to build a widget driven entirely by relevance\n   clues. The system creates individual Smart Stack cards per relevant entry.\n   watchOS 26+ only.\n\nChoose a timeline provider when the widget always has data to show and relevance\nis supplementary. Choose a relevant widget when the widget should *only* appear\nwhen conditions match, or when multiple cards should appear simultaneously (e.g.,\nseveral upcoming calendar events).\n\n### Key Types\n\n| Type | Module | Role |\n|---|---|---|\n| `RelevantContext` | RelevanceKit | A contextual clue (date, location, fitness, sleep, hardware) |\n| `WidgetRelevance` | WidgetKit | Collection of relevance attributes for a widget kind |\n| `WidgetRelevanceAttribute` | WidgetKit | Pairs a widget configuration with a `RelevantContext` |\n| `WidgetRelevanceGroup` | WidgetKit | Controls grouping behavior in the Smart Stack |\n| `RelevanceConfiguration` | WidgetKit | Widget configuration driven by relevance clues (watchOS 26+) |\n| `RelevanceEntriesProvider` | WidgetKit | Provides entries for a relevance-configured widget (watchOS 26+) |\n| `RelevanceEntry` | WidgetKit | Data needed to render one relevant widget card (watchOS 26+) |\n\n## Setup\n\n### Import\n\n```swift\nimport RelevanceKit\nimport WidgetKit\n```\n\n### Platform Availability\n\n`RelevantContext` is declared across platforms (iOS 17+, watchOS 10+), but\n**RelevanceKit functionality only takes effect on watchOS**. Calling the API on\nother platforms has no effect. `RelevanceConfiguration`, `RelevanceEntriesProvider`,\nand `RelevanceEntry` are watchOS 26+ only.\n\n### Permissions\n\nCertain relevance clues require the user to grant permission to both the app\nand the widget extension:\n\n| Clue | Required Permission |\n|---|---|\n| `.location(inferred:)` | Location access |\n| `.location(_:)` (CLRegion) | Location access |\n| `.location(category:)` | Location access |\n| `.fitness(_:)` | HealthKit workout/activity rings permission |\n| `.sleep(_:)` | HealthKit `sleepAnalysis` permission |\n| `.hardware(headphones:)` | None |\n| `.date(...)` | None |\n\nRequest permissions in both the main app target and the widget extension target.\n\n## Relevance Providers\n\n### Option 1: Timeline Provider with Relevance\n\nAdd a `relevance()` method to an existing `AppIntentTimelineProvider`. This\napproach shares code across iOS and watchOS while adding watchOS Smart Stack\nintelligence.\n\n```swift\nstruct MyProvider: AppIntentTimelineProvider {\n    // ... snapshot, timeline, placeholder ...\n\n    func relevance() async -> WidgetRelevance<MyWidgetIntent> {\n        let attributes = events.map { event in\n            let context = RelevantContext.date(\n                from: event.startDate,\n                to: event.endDate\n            )\n            return WidgetRelevanceAttribute(\n                configuration: MyWidgetIntent(event: event),\n                context: context\n            )\n        }\n        return WidgetRelevance(attributes)\n    }\n}\n```\n\n### Option 2: RelevanceEntriesProvider (watchOS 26+)\n\nBuild a widget that only appears when conditions match. The system calls\n`relevance()` to learn *when* the widget matters, then calls `entry()` with\nthe matching configuration to get render data.\n\n```swift\nstruct MyRelevanceProvider: RelevanceEntriesProvider {\n    func relevance() async -> WidgetRelevance<MyWidgetIntent> {\n        let attributes = events.map { event in\n            WidgetRelevanceAttribute(\n                configuration: MyWidgetIntent(event: event),\n                context: RelevantContext.date(event.date, kind: .scheduled)\n            )\n        }\n        return WidgetRelevance(attributes)\n    }\n\n    func entry(\n        configuration: MyWidgetIntent,\n        context: Context\n    ) async throws -> MyRelevanceEntry {\n        if context.isPreview {\n            return .preview\n        }\n        return MyRelevanceEntry(event: configuration.event)\n    }\n\n    func placeholder(context: Context) -> MyRelevanceEntry {\n        .placeholder\n    }\n}\n```\n\n## Time-Based Relevance\n\nTime clues tell the system a widget matters at or around a specific moment.\n\n### Single Date\n\n```swift\nRelevantContext.date(eventDate)\n```\n\n### Date with Kind\n\n`DateKind` provides an additional hint about the nature of the time relevance:\n\n| Kind | Use |\n|---|---|\n| `.default` | General time relevance |\n| `.scheduled` | A scheduled event (meeting, flight) |\n| `.informational` | Information relevant around a time (weather forecast) |\n\n```swift\nRelevantContext.date(meetingStart, kind: .scheduled)\n```\n\n### Date Range\n\n```swift\n// Using from/to\nRelevantContext.date(from: startDate, to: endDate)\n\n// Using DateInterval\nRelevantContext.date(interval: dateInterval, kind: .scheduled)\n\n// Using ClosedRange\nRelevantContext.date(range: startDate...endDate, kind: .default)\n```\n\n## Location-Based Relevance\n\n### Inferred Locations\n\nThe system infers certain locations from a person's routine. No coordinates\nneeded.\n\n```swift\nRelevantContext.location(inferred: .home)\nRelevantContext.location(inferred: .work)\nRelevantContext.location(inferred: .school)\nRelevantContext.location(inferred: .commute)\n```\n\nRequires location permission in both the app and widget extension.\n\n### Specific Region\n\n```swift\nimport CoreLocation\n\nlet region = CLCircularRegion(\n    center: CLLocationCoordinate2D(latitude: 37.3349, longitude: -122.0090),\n    radius: 500,\n    identifier: \"apple-park\"\n)\nRelevantContext.location(region)\n```\n\n### Point-of-Interest Category (watchOS 26+)\n\nIndicate relevance near any location of a given category. Returns `nil` if the\ncategory is unsupported.\n\n```swift\nimport MapKit\n\nif let context = RelevantContext.location(category: .beach) {\n    // Widget is relevant whenever the person is near a beach\n}\n```\n\n## Fitness and Sleep Relevance\n\n### Fitness\n\n```swift\n// Relevant when activity rings are incomplete\nRelevantContext.fitness(.activityRingsIncomplete)\n\n// Relevant during an active workout\nRelevantContext.fitness(.workoutActive)\n```\n\nRequires HealthKit workout/activity permission.\n\n### Sleep\n\n```swift\n// Relevant around bedtime\nRelevantContext.sleep(.bedtime)\n\n// Relevant around wakeup\nRelevantContext.sleep(.wakeup)\n```\n\nRequires HealthKit `sleepAnalysis` permission.\n\n## Hardware Relevance\n\n```swift\n// Relevant when headphones are connected\nRelevantContext.hardware(headphones: .connected)\n```\n\nNo special permission required.\n\n## Combining Signals\n\nReturn multiple `WidgetRelevanceAttribute` values in the `WidgetRelevance`\narray to make a widget relevant under several different conditions.\n\n```swift\nfunc relevance() async -> WidgetRelevance<MyIntent> {\n    var attributes: [WidgetRelevanceAttribute<MyIntent>] = []\n\n    // Relevant during morning commute\n    attributes.append(\n        WidgetRelevanceAttribute(\n            configuration: MyIntent(mode: .commute),\n            context: .location(inferred: .commute)\n        )\n    )\n\n    // Relevant at work\n    attributes.append(\n        WidgetRelevanceAttribute(\n            configuration: MyIntent(mode: .work),\n            context: .location(inferred: .work)\n        )\n    )\n\n    // Relevant around a scheduled event\n    for event in upcomingEvents {\n        attributes.append(\n            WidgetRelevanceAttribute(\n                configuration: MyIntent(eventID: event.id),\n                context: .date(event.date, kind: .scheduled)\n            )\n        )\n    }\n\n    return WidgetRelevance(attributes)\n}\n```\n\n**Order matters.** Return relevance attributes ordered by priority. The system\nmay use only a subset of the provided relevances.\n\n## Widget Integration\n\n### Relevant Widget with RelevanceConfiguration\n\n```swift\n@available(watchOS 26, *)\nstruct MyRelevantWidget: Widget {\n    var body: some WidgetConfiguration {\n        RelevanceConfiguration(\n            kind: \"com.example.relevant-events\",\n            provider: MyRelevanceProvider()\n        ) { entry in\n            EventWidgetView(entry: entry)\n        }\n        .configurationDisplayName(\"Events\")\n        .description(\"Shows upcoming events when relevant\")\n    }\n}\n```\n\n### Associating with a Timeline Widget\n\nWhen both a timeline widget and a relevant widget show the same data, use\n`associatedKind` to prevent duplicate cards. The system replaces the timeline\nwidget card with relevant widget cards when they are suggested.\n\n```swift\nRelevanceConfiguration(\n    kind: \"com.example.relevant-events\",\n    provider: MyRelevanceProvider()\n) { entry in\n    EventWidgetView(entry: entry)\n}\n.associatedKind(\"com.example.timeline-events\")\n```\n\n### Grouping\n\n`WidgetRelevanceGroup` controls how the system groups widgets in the Smart Stack.\n\n```swift\n// Opt out of default per-app grouping so each card appears independently\nWidgetRelevanceAttribute(\n    configuration: intent,\n    group: .ungrouped\n)\n\n// Named group -- only one widget from the group appears at a time\nWidgetRelevanceAttribute(\n    configuration: intent,\n    group: .named(\"weather-alerts\")\n)\n\n// Default system grouping\nWidgetRelevanceAttribute(\n    configuration: intent,\n    group: .automatic\n)\n```\n\n### RelevantIntent (Timeline Provider Path)\n\nWhen using a timeline provider, also update `RelevantIntentManager` so the\nsystem has relevance data between timeline refreshes.\n\n```swift\nimport AppIntents\n\nfunc updateRelevantIntents() async {\n    let intents = events.map { event in\n        RelevantIntent(\n            MyWidgetIntent(event: event),\n            widgetKind: \"com.example.events\",\n            relevance: RelevantContext.date(from: event.start, to: event.end)\n        )\n    }\n    try? await RelevantIntentManager.shared.updateRelevantIntents(intents)\n}\n```\n\nCall this whenever relevance data changes -- not only during timeline refreshes.\n\n### Previewing Relevant Widgets\n\nUse Xcode previews to verify appearance without simulating real conditions.\n\n```swift\n// Preview with sample entries\n#Preview(\"Events\", widget: MyRelevantWidget.self, relevanceEntries: {\n    [EventEntry(event: .surfing), EventEntry(event: .meditation)]\n})\n\n// Preview with relevance configurations\n#Preview(\"Relevance\", widget: MyRelevantWidget.self, relevance: {\n    WidgetRelevance([\n        WidgetRelevanceAttribute(configuration: MyIntent(event: .surfing),\n                                 context: .date(Date(), kind: .scheduled))\n    ])\n})\n\n// Preview with the full provider\n#Preview(\"Provider\", widget: MyRelevantWidget.self,\n         relevanceProvider: MyRelevanceProvider())\n```\n\n### Testing\n\nEnable **WidgetKit Developer Mode** in Settings > Developer on the watch to\nbypass Smart Stack rotation limits during development.\n\n## Common Mistakes\n\n- **Ignoring return order.** The system may only use a subset of relevance\n  attributes. Return them sorted by priority (most important first).\n- **Missing permissions in widget extension.** Location, fitness, and sleep\n  clues require permission in *both* the app and the widget extension. If only\n  the app has permission, the clues are silently ignored.\n- **Using RelevanceKit API expecting iOS behavior.** The API compiles on all\n  platforms but only has effect on watchOS.\n- **Duplicate Smart Stack cards.** When offering both a timeline widget and a\n  relevant widget for the same data, use `.associatedKind(_:)` to prevent\n  duplication.\n- **Forgetting placeholder and preview entries.** `RelevanceEntriesProvider`\n  requires both `placeholder(context:)` and a preview branch in\n  `entry(configuration:context:)` when `context.isPreview` is true.\n- **Not calling `updateRelevantIntents`.** When using timeline providers,\n  calling this only inside `timeline()` means the system has stale relevance\n  data between refreshes. Update whenever data changes.\n- **Ignoring nil from `location(category:)`.** This factory returns an optional.\n  Not all `MKPointOfInterestCategory` values are supported.\n\n## Review Checklist\n\n- [ ] `import RelevanceKit` is present alongside `import WidgetKit`\n- [ ] `RelevantContext` clues match the app's actual data model\n- [ ] Relevance attributes are ordered by priority\n- [ ] Permissions requested in both app target and widget extension for location/fitness/sleep clues\n- [ ] `RelevanceEntriesProvider` implements `entry`, `placeholder`, and `relevance`\n- [ ] `context.isPreview` handled in `entry(configuration:context:)` to return preview data\n- [ ] `.associatedKind(_:)` used when a timeline widget and relevant widget show the same data\n- [ ] `RelevantIntentManager.updateRelevantIntents` called when data changes (timeline provider path)\n- [ ] `location(category:)` nil return handled\n- [ ] WidgetKit Developer Mode used for testing\n- [ ] Widget previews verify appearance across display sizes\n\n## References\n\n- [references/relevancekit-patterns.md](references/relevancekit-patterns.md) -- extended patterns, full provider\n  implementations, permission handling, and grouping strategies\n- [RelevanceKit documentation](https://sosumi.ai/documentation/relevancekit)\n- [RelevantContext](https://sosumi.ai/documentation/relevancekit/relevantcontext)\n- [Increasing the visibility of widgets in Smart Stacks](https://sosumi.ai/documentation/widgetkit/widget-suggestions-in-smart-stacks)\n- [RelevanceConfiguration](https://sosumi.ai/documentation/widgetkit/relevanceconfiguration)\n- [RelevanceEntriesProvider](https://sosumi.ai/documentation/widgetkit/relevanceentriesprovider)\n- [What's new in watchOS 26 (WWDC25 session 334)](https://sosumi.ai/videos/play/wwdc2025/334/)","tags":["relevancekit","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-relevancekit","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/relevancekit","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 (14,980 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:44.384Z","embedding":null,"createdAt":"2026-04-18T22:01:14.047Z","updatedAt":"2026-04-22T00:53:44.384Z","lastSeenAt":"2026-04-22T00:53:44.384Z","tsv":"'-122.0090':783 '/documentation/relevancekit)':1539 '/documentation/relevancekit/relevantcontext)':1543 '/documentation/widgetkit/relevanceconfiguration)':1558 '/documentation/widgetkit/relevanceentriesprovider)':1562 '/documentation/widgetkit/widget-suggestions-in-smart-stacks)':1554 '/videos/play/wwdc2025/334/)':1574 '1':215,495 '10':406 '17':404 '2':241,557 '26':99,107,269,364,376,388,430,560,798,995,1568 '334':1571 '37.3349':781 '500':785 '6.3':97 'access':456,460,464 'across':233,401,512,1519 'act':237 'activ':842,851 'activityringsincomplet':847 'actual':1446 'ad':517 'add':500 'addit':669 'alert':1126 'alongsid':1437 'also':1144 'alway':278 'api':118,417,1329,1334 'app':445,485,766,1095,1311,1319,1444,1459 'appear':296,305,566,1100,1115,1202,1518 'appint':1158 'appintenttimelineprovid':224,507,525 'appl':6,61,111,788 'apple-park':787 'approach':509 'around':654,693,862,867,945 'array':899 'associ':1022 'associatedkind':1041,1073,1364,1483 'async':531,597,623,912,1161 'attach':226 'attribut':332,534,555,600,616,915,966,971,1287,1450 'attributes.append':921,934,953 'automat':1134 'avail':119,232,397,993 'await':1180 'base':22,26,152,156,160,164,642,730 'beach':823,833 'bedtim':863,865 'behavior':121,350,1332 'beta':101 'beta-sensit':100 'bodi':1000 'branch':1381 'build':250,561 'bypass':1266 'calendar':310 'call':415,572,581,1183,1391,1397,1497 'card':264,303,386,1045,1052,1056,1099,1348 'categori':462,796,807,812,822,1419,1505 'center':778 'certain':433,737 'chang':1188,1414,1500 'check':110 'checklist':196,199,1432 'choos':271,287 'claim':116 'clcircularregion':777 'cllocationcoordinate2d':779 'closedrang':721 'clregion':458 'clue':49,228,257,321,362,435,450,645,1305,1323,1441,1466 'code':127,511 'collect':329 'com.example.events':1172 'com.example.relevant':1005,1064 'com.example.timeline':1074 'combin':28,180,183,890 'combining-sign':182 'common':190,193,1273 'common-mistak':192 'commut':759,920,926,930 'compil':1335 'complet':126 'condit':298,568,908,1206 'configur':342,358,373,547,586,605,619,923,936,955,1103,1120,1131,1226,1234,1384,1477 'configuration.event':633 'configurationdisplaynam':1014 'connect':80,882,885 'content':140 'context':539,551,552,609,621,622,636,637,820,927,940,959,1238,1377,1385,1478 'context.ispreview':627,1387,1473 'contextu':13,48,320 'control':348,1078 'coordin':745 'coreloc':774 'creat':260 'data':240,280,379,590,1039,1152,1187,1362,1408,1413,1447,1482,1495,1499 'date':322,477,659,663,703,960,1239,1240 'dateinterv':714,717 'datekind':666 'declar':19,400 'default':680,727,1092,1127 'descript':1016 'determin':208 'develop':1257,1261,1272,1510 'devic':47 'differ':907 'display':1520 'document':112,1536 'driven':253,359 'duplic':1044,1345,1367 'e.g':307 'effect':412,423,1342 'enabl':1255 'enddat':712,725 'entir':254 'entri':231,267,368,582,618,1009,1012,1013,1068,1071,1072,1211,1372,1383,1469,1476 'event':311,536,549,550,602,607,608,632,687,948,950,1006,1015,1019,1065,1075,1165,1169,1170,1213,1218,1221,1236 'event.date':611,961 'event.end':1178 'event.enddate':544 'event.id':958 'event.start':1176 'event.startdate':542 'eventd':662 'evententri':1217,1220 'eventid':957 'events.map':535,601,1164 'eventwidgetview':1011,1070 'exist':223,506 'expect':1330 'extend':1525 'extens':449,490,769,1300,1315,1463 'factori':1421 'first':1295 'fit':75,166,171,324,465,834,838,1302 'fitness-and-sleep-relev':170 'flight':689 'forecast':697 'forget':1368 'from/to':707 'full':1246,1527 'func':529,595,617,634,910,1159 'function':409 'general':681 'get':588 'given':806 'grant':440 'group':135,349,1076,1082,1096,1105,1108,1114,1122,1129,1133,1533 'handl':139,1474,1508,1531 'hardwar':81,175,178,326,474,875 'hardware-relev':177 'headphon':475,880,884 'healthkit':466,471,856,872 'help':33 'hint':670 'home':750 'identifi':786 'ignor':1275,1326,1415 'implement':219,1468,1529 'import':390,392,394,773,816,1157,1294,1433,1438 'includ':129 'incomplet':845 'increas':2,51,1544 'independ':1101 'indic':799 'individu':261 'infer':454,732,736,749,752,755,758,929,942 'inform':690,691 'insid':1400 'integr':134,186,189,987 'intellig':521 'intent':1104,1121,1132,1163,1182 'interest':795 'interv':716 'io':403,513,1331 'key':312 'kind':336,612,665,678,701,718,726,962,1004,1063,1241 'latitud':780 'learn':575 'let':533,538,599,775,819,1162 'limit':1270 'locat':25,74,159,163,323,453,455,457,459,461,463,729,733,738,761,803,928,941,1301,1418,1504 'location-bas':24,158,728 'location-based-relev':162 'location/fitness/sleep':1465 'longitud':782 'main':484 'make':114,901 'mapkit':817 'match':299,569,585,1442 'matter':579,651,968 'may':977,1280 'mean':1402 'mechan':206 'medit':1222 'meet':688 'meetingstart':700 'method':503 'miss':1296 'mistak':191,194,1274 'mkpointofinterestcategori':1427 'mode':925,938,1258,1511 'model':1448 'modul':315 'moment':94,657 'morn':919 'multipl':29,302,893 'myintent':924,937,956,1235 'myprovid':524 'myrelevanceentri':625,631,638 'myrelevanceprovid':593,1008,1067,1253 'myrelevantwidget':997 'myrelevantwidget.self':1215,1230,1251 'mywidgetint':548,606,620,1168 'name':1107,1123 'natur':673 'near':801,831 'need':380,746 'new':1565 'nil':809,1416,1506 'none':476,478 'offer':1350 'on-devic':45 'one':383,1110 'opt':1089 'option':494,556,1424 'order':967,972,1277,1452 'overview':141,142,202 'pair':339 'park':789 'path':1138,1503 'pattern':128,1526 'per':265,1094 'per-app':1093 'permiss':138,432,441,452,469,473,480,762,858,874,888,1297,1307,1321,1455,1530 'person':741,829 'placehold':528,635,639,1369,1376,1470 'platform':234,396,402,420,1338 'point':793 'point-of-interest':792 'present':1436 'prevent':1043,1366 'preview':136,629,1194,1199,1208,1212,1223,1227,1243,1248,1371,1380,1481,1516 'prioriti':974,1292,1454 'provid':12,31,44,133,146,149,217,274,367,493,497,667,984,1007,1066,1137,1143,1247,1249,1396,1502,1528 'radius':784 'rang':704,723 're':109 're-check':108 'real':1205 'refer':200,201,1522 'references/relevancekit-patterns.md':123,124,1523,1524 'refresh':1155,1193,1410 'region':771,776,791 'relev':14,27,30,71,130,145,148,153,157,161,165,169,174,176,179,210,218,220,242,256,266,284,289,331,361,372,384,434,492,499,502,530,573,596,643,677,683,692,731,800,826,837,840,848,861,866,876,878,904,911,917,931,944,970,985,988,1021,1034,1054,1151,1173,1186,1195,1225,1228,1231,1286,1357,1407,1449,1472,1490 'relevance-configur':371 'relevance-provid':147 'relevanceconfigur':245,355,424,991,1003,1062,1555 'relevanceentri':377,427,1216 'relevanceentriesprovid':248,365,425,558,594,1373,1467,1559 'relevancekit':1,9,43,63,103,318,393,408,1328,1434,1535 'relevanceprovid':1252 'relevantcontext':227,317,345,398,1440,1540 'relevantcontext.date':540,610,661,699,708,715,722,1174 'relevantcontext.fitness':846,853 'relevantcontext.hardware':883 'relevantcontext.location':748,751,754,757,790,821 'relevantcontext.sleep':864,869 'relevantint':1135,1167 'relevantintentmanag':1146 'relevantintentmanager.shared.updaterelevantintents':1181 'relevantintentmanager.updaterelevantintents':1496 'render':382,589 'replac':1048 'request':479,1456 'requir':436,451,760,855,871,889,1306,1374 'return':545,553,614,628,630,808,892,964,969,1276,1288,1422,1480,1507 'review':195,198,1431 'review-checklist':197 'right':38,42,89,93 'ring':468,843 'role':316 'rotat':1269 'routin':743 'sampl':1210 'schedul':78,613,684,686,702,719,947,963,1242 'school':756 'see':122 'sensit':102 'session':1570 'set':1260 'setup':143,144,389 'sever':308,906 'share':510 'ship':104 'show':282,1017,1036,1492 'signal':15,181,184,891 'silent':1325 'simul':1204 'simultan':306 'singl':658 'size':1521 'skill' 'skill-relevancekit' 'sleep':77,168,173,325,470,836,859,1304 'sleepanalysi':472,873 'smart':58,84,213,262,353,519,1086,1267,1346,1550 'snapshot':526 'sort':1290 'sosumi.ai':1538,1542,1553,1557,1561,1573 'sosumi.ai/documentation/relevancekit)':1537 'sosumi.ai/documentation/relevancekit/relevantcontext)':1541 'sosumi.ai/documentation/widgetkit/relevanceconfiguration)':1556 'sosumi.ai/documentation/widgetkit/relevanceentriesprovider)':1560 'sosumi.ai/documentation/widgetkit/widget-suggestions-in-smart-stacks)':1552 'sosumi.ai/videos/play/wwdc2025/334/)':1572 'source-dpearson2699' 'special':887 'specif':656,770 'stack':59,85,214,263,354,520,1087,1268,1347,1551 'stale':1406 'startdat':710,724 'state':76 'strategi':1534 'strong':115 'struct':523,592,996 'subset':981,1284 'suggest':1060 'supplementari':286 'support':1430 'surf':1219,1237 'surfac':36,87 'swift':96,391,522,591,660,698,705,747,772,815,839,860,877,909,992,1061,1088,1156,1207 'system':35,66,259,571,648,735,976,1047,1081,1128,1149,1279,1404 'take':411 'target':95,486,491,1460 'tell':64,646 'test':1254,1514 'throw':624 'time':21,73,151,155,641,644,676,682,695,1118 'time-bas':20,150,640 'time-based-relev':154 'timelin':132,216,230,273,496,527,1025,1030,1050,1136,1142,1154,1192,1353,1395,1401,1487,1501 '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' 'tri':1179 'true':1389 'two':205 'type':313,314 'ungroup':1106 'unsupport':814 'upcom':309,1018 'upcomingev':952 'updat':1145,1411 'updaterelevantint':1160,1392 'use':8,10,204,244,679,706,713,720,978,1040,1140,1197,1282,1327,1363,1394,1484,1512 'user':438 'valu':895,1428 'var':914,999 'verifi':1201,1517 'visibl':4,55,1546 'wakeup':868,870 'watch':7,62,1264 'watcho':17,98,106,203,236,268,363,375,387,405,414,429,515,518,559,797,994,1344,1567 'weather':696,1125 'weather-alert':1124 'whenev':827,1185,1412 'widget':3,18,39,53,69,90,131,185,188,209,243,252,277,290,293,335,341,357,374,385,448,489,563,578,650,768,824,903,986,989,998,1026,1031,1035,1051,1055,1083,1111,1196,1214,1229,1250,1299,1314,1354,1358,1462,1488,1491,1515,1548 'widget-integr':187 'widgetconfigur':1002 'widgetkind':1171 'widgetkit':328,338,347,356,366,378,395,1256,1439,1509 'widgetrelev':327,532,554,598,615,898,913,965,1232 'widgetrelevanceattribut':337,546,604,894,916,922,935,954,1102,1119,1130,1233 'widgetrelevancegroup':346,1077 'without':1203 'work':753,933,939,943 'workout':852 'workout/activity':467,857 'workoutact':854 'wwdc25':1569 'xcode':1198","prices":[{"id":"a879356e-74fc-4759-82b8-80a3866071f5","listingId":"dd7fc032-b5c3-4292-bf9e-5c7e39ff4b14","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:01:14.047Z"}],"sources":[{"listingId":"dd7fc032-b5c3-4292-bf9e-5c7e39ff4b14","source":"github","sourceId":"dpearson2699/swift-ios-skills/relevancekit","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/relevancekit","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:14.047Z","lastSeenAt":"2026-04-22T00:53:44.384Z"}],"details":{"listingId":"dd7fc032-b5c3-4292-bf9e-5c7e39ff4b14","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"relevancekit","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":"92c8b2100cd5b46d56206bd905d2860c4d89d461","skill_md_path":"skills/relevancekit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/relevancekit"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"relevancekit","description":"Increase widget visibility on Apple Watch using RelevanceKit. Use when providing contextual relevance signals for watchOS widgets, declaring time-based or location-based relevance, combining multiple relevance providers, or helping the system surface the right widget at the right time on watchOS 26."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/relevancekit"},"updatedAt":"2026-04-22T00:53:44.384Z"}}