@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,308 +1,376 @@
1
1
  ---
2
2
  name: app-store-optimization
3
- description: "Optimize App Store product pages for search visibility and conversion. Use for App Store Optimization (ASO), keyword research, app name/subtitle/keyword-field strategy, conversion-focused descriptions and promotional text, screenshot captions and ordering, Custom Product Pages with assigned search keywords, In-App Events, Product Page Optimization tests, localized metadata, ratings/review strategy, and in-app review prompt timing with RequestReviewAction or AppStore.requestReview. Also use when routing ASO vs App Store review, privacy/ATT, or StoreKit implementation boundaries."
3
+ description: "App Store Optimization (ASO) for ranking and conversion: keyword research; app name, subtitle and 100-byte keyword field; description and promotional text that convert; screenshot captions and slot order; Custom Product Pages and their assigned search keywords; In-App Events; Product Page Optimization A/B tests; localized metadata; ratings, review replies, and when to call RequestReviewAction or AppStore.requestReview. Use when improving App Store ranking or conversion, or deciding what belongs to ASO versus App Store review, privacy and ATT, or StoreKit implementation."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
- # App Store Optimization (ASO)
8
+ # App Store Optimization
9
9
 
10
- Search visibility and conversion optimization for App Store product pages. This skill covers strategic metadata decisions -- which keywords to target, how to structure descriptions for conversion, and how to use Custom Product Pages and in-app events for discoverability. For metadata compliance rules (character limits, screenshot device requirements, rejection triggers), see the `app-store-review` skill.
10
+ This skill decides what to say on the product page and where: which keywords,
11
+ how the copy converts, which custom pages and events to run. Compliance
12
+ questions such as field limits enforced at submission, screenshot device sizes
13
+ and rejection risks belong to `app-store-review`.
11
14
 
12
15
  ## Contents
13
16
 
14
17
  - [Overview](#overview)
15
- - [Title and Subtitle Strategy](#title-and-subtitle-strategy)
16
- - [Keyword Field Strategy](#keyword-field-strategy)
17
- - [Description Structure](#description-structure)
18
- - [Promotional Text](#promotional-text)
19
- - [Screenshot and Preview Optimization](#screenshot-and-preview-optimization)
20
- - [In-App Review Prompts](#in-app-review-prompts)
21
- - [Custom Product Pages](#custom-product-pages)
22
- - [In-App Events](#in-app-events)
23
- - [Product Page Optimization](#product-page-optimization)
24
- - [Ratings and Review Management](#ratings-and-review-management)
25
- - [Localized Metadata Optimization](#localized-metadata-optimization)
26
- - [Common Mistakes](#common-mistakes)
27
- - [Review Checklist](#review-checklist)
18
+ - [Name and subtitle](#name-and-subtitle)
19
+ - [Keyword field](#keyword-field)
20
+ - [Description](#description)
21
+ - [Promotional text](#promotional-text)
22
+ - [Screenshots and previews](#screenshots-and-previews)
23
+ - [Asking for reviews in the app](#asking-for-reviews-in-the-app)
24
+ - [Custom pages](#custom-product-pages)
25
+ - [Events](#in-app-events)
26
+ - [Page tests](#product-page-optimization)
27
+ - [Ratings and reviews](#ratings-and-reviews)
28
+ - [Localizing the listing](#localized-metadata-optimization)
29
+ - [Mistakes to catch](#mistakes-to-catch)
30
+ - [Review checklist](#review-checklist)
28
31
  - [References](#references)
29
32
 
30
33
  ## Overview
31
34
 
32
- ASO has two pillars:
33
-
34
- 1. **Search visibility** -- ranking for relevant queries so users find the app.
35
- 2. **Conversion rate** -- convincing users who land on the product page to download.
36
-
37
- Apply this skill when a developer asks about improving discoverability, keyword strategy, download conversion, or any product page element that affects either pillar.
38
-
39
- For metadata format rules and compliance guardrails, see the `app-store-review` skill. This skill assumes the developer is working within those constraints and focuses on strategy.
40
-
41
- When producing an ASO plan or ownership split, explicitly separate **Visibility** from **Conversion**. Visibility covers search and browse discoverability: app name, subtitle, keyword field, primary category, localization, ratings and reviews, relevant In-App Events, and Custom Product Pages. Conversion covers the product-page decision path: screenshots, app previews, description, promotional text, Custom Product Page messaging, Product Page Optimization tests, and alignment between public claims, screenshots, and the real in-app UI.
42
-
43
- Boundary rule: ASO owns listing strategy, keyword/message fit, screenshots, promotional text, Custom Product Pages, Product Page Optimization, localization, In-App Event positioning, ratings strategy, and lightweight review-prompt timing. `app-store-review` owns review compliance, PrivacyInfo.xcprivacy, ATT wording, and submission guardrails; ASO only cross-checks that public claims and screenshots are accurate. `storekit` owns purchase implementation, subscription paywall code, entitlement checks, and monetization mechanics.
44
-
45
- For any full ASO plan, include these explicit checklist items so important App Store mechanics do not get dropped:
46
-
47
- - Visibility: app name, subtitle, keyword field, primary category, localization, ratings/reviews, In-App Events if relevant, and Custom Product Pages with assigned keyword search visibility.
48
- - Conversion: description hook, first screenshots or app preview, promotional text, Custom Product Page message fit, Product Page Optimization, and public-claim/screenshot accuracy.
49
- - Experimentation: one PPO hypothesis, up to three treatments, selected localizations, target metric, and decision rule.
50
- - Review prompts: positive trigger, bad-trigger avoidance, and the note that StoreKit decides whether a request displays a prompt.
51
-
52
- Do not leave these implicit: reject high-volume keywords, state CPP capacity as 70 pages, list up to three PPO treatments, and mark In-App Events and ratings ASO-owned.
53
-
54
- ## Title and Subtitle Strategy
55
-
56
- Apple indexes the app name and subtitle for search. Together they provide 60 characters (30 + 30) of indexed, high-visibility keyword real estate.
57
-
58
- ### Positioning framework
59
-
60
- Use **Brand -- Keyword** when the brand already has recognition, **Keyword -- Brand** when a new app must compete on category terms, and a blended name when the brand naturally contains a relevant keyword.
61
-
62
- ### Rules
63
-
64
- - Do not repeat words between the name and subtitle -- Apple indexes both, so duplicates waste characters.
65
- - Front-load the highest-value keyword in whichever field has more room.
66
- - Avoid generic filler words ("the", "best", "app") -- they consume space without search value.
67
- - The subtitle should communicate the primary value proposition, not a tagline.
68
-
69
- ## Keyword Field Strategy
70
-
71
- The keyword field is 100 characters, comma-separated, no spaces after commas. See the `app-store-review` skill for the full format rules. This section focuses on which keywords to choose and how to prioritize them.
72
-
73
- ### Research process
74
-
75
- 1. **Competitor audit** -- identify the top 5-10 competitors in the category and note which keywords appear in their titles, subtitles, and descriptions.
76
- 2. **Category analysis** -- identify terms users associate with the app's category that competitors may be missing.
77
- 3. **Search Ads signals** -- run Apple Search Ads discovery campaigns to surface high-intent queries with actual impression and tap data.
78
- 4. **Iterate each release** -- update keywords based on Search Ads performance, App Analytics impressions, and conversion data.
79
-
80
- ### Prioritization
81
-
82
- Rank candidate keywords by three factors:
83
-
84
- | Factor | Weight | Signal |
85
- |--------|--------|--------|
86
- | **Relevance** | Highest | Does the keyword describe what the app actually does? |
87
- | **Search volume** | Medium | Are users actually searching for this term? |
88
- | **Competition** | Lower | How many apps target this keyword? |
89
-
90
- Relevance always wins. A high-volume keyword that does not describe the app will get impressions but not conversions.
91
-
92
- For search relevance, prioritize user intent first, then metadata fit. Always account for the primary category alongside the app name, subtitle, and keyword field; do not repeat category terms in the keyword field.
93
-
94
- ### Tactical rules
95
-
96
- - Deduplicate against title and subtitle -- Apple already indexes those words.
97
- - Use singular forms only -- Apple matches both singular and plural from singular.
98
- - Omit the category name -- Apple adds the app's primary category to search automatically.
99
- - Omit spaces after commas -- they count against the 100-character limit.
100
- - Consider abbreviations and common misspellings if they are genuine search terms.
101
- - Reserve space for the most relevant, highest-intent terms; do not spend characters on terms that only weakly describe the app.
102
-
103
- **See:** [references/keyword-research-methodology.md](references/keyword-research-methodology.md) for the full research process, scoring framework, and indexing details.
104
-
105
- ## Description Structure
106
-
107
- Apple's search guidance centers text relevance on the app name, subtitle, keywords, and primary category, plus behavior signals such as downloads, ratings, and reviews. Treat the description as conversion copy, not a place to stuff extra search terms: users who expand it are evaluating whether to download.
108
-
109
- ### Four-part structure
110
-
111
- 1. **Hook** (first 1-3 lines) -- the only text visible before the "more" fold. Lead with the strongest benefit or differentiator. This is the most important copy on the page.
112
- 2. **Feature highlights** -- 4-6 short feature descriptions. Use Unicode bullet characters (•) since the App Store does not render markdown. Focus on outcomes, not technical details.
113
- 3. **Social proof** -- awards, press quotes, user count milestones, or notable ratings. One or two lines.
114
- 4. **Call to action** -- a closing line encouraging the download. Keep it short and benefit-focused.
115
-
116
- ### Formatting notes
117
-
118
- - The App Store does not render markdown, HTML, or rich text. Use plain text with Unicode characters for structure.
119
- - Short paragraphs with line breaks between them. Walls of text kill conversion.
120
- - Write per locale -- translate the structure, not the words. See [Localized Metadata Optimization](#localized-metadata-optimization).
121
-
122
- ## Promotional Text
123
-
124
- Promotional text appears above the description, is limited to 170 characters, and can be updated at any time without submitting a new app version.
125
-
126
- ### Rotation strategy
127
-
128
- Update promotional text for feature launches, seasonal moments, awards or press, promotions, and in-app events. Do not leave it static across releases; if there is nothing timely to promote, rotate between the app's strongest selling points.
129
-
130
- ## Screenshot and Preview Optimization
131
-
132
- Most users never scroll past the first 3 visible screenshots. These slots determine whether a user engages with the full product page or moves on.
133
-
134
- ### First 3 screenshots
135
-
136
- - Lead with the primary value proposition -- the screen that best demonstrates why someone should download.
137
- - Never place onboarding, splash, or loading screens in the first 3 slots.
138
- - Each screenshot should demonstrate a different benefit or feature.
139
-
140
- ### Caption writing
141
-
142
- - Write benefit-oriented captions, not feature labels. "Never miss a deadline" converts better than "Calendar View".
143
- - Keep captions to 2-5 words above the screenshot and one short line below.
144
- - Use action verbs: "Track", "Share", "Discover", "Build".
145
-
146
- ### Ordering strategy
147
-
148
- Use slot 1 for the primary value proposition, slot 2 for the core differentiator, slot 3 for the next strongest feature, and later slots for supporting features, social proof, or edge cases.
149
-
150
- ### App preview video
151
-
152
- If a preview video is present, it occupies the first slot. The first frame becomes the poster image when autoplay is disabled -- choose a frame that works as a standalone screenshot.
153
-
154
- For screenshot device requirements and compliance rules, see the `app-store-review` skill.
155
-
156
- ## In-App Review Prompts
157
-
158
- StoreKit provides `RequestReviewAction` for SwiftUI and `AppStore.requestReview(in:)` for UIKit. Use this section for timing strategy; for the full StoreKit API surface, see the `storekit` skill.
159
-
160
- ### System behavior
161
-
162
- - The system enforces a maximum of 3 prompts per 365-day period per device for users who have not yet rated the app.
163
- - The API is a request, not a guarantee -- StoreKit decides whether to show the prompt.
164
- - During development, the prompt always appears. In TestFlight, it never appears.
165
-
166
- ### Prompt timing
167
-
168
- Good triggers include completing a meaningful task, achieving a milestone or streak, a positive in-app moment, or several active sessions. Bad triggers include first launch, onboarding, errors, crashes, failed transactions, or direct button-tap pre-screens. Do not gate the prompt behind a "Rate this app?" dialog -- Apple discourages intercepting the system prompt and may reject apps that pre-screen.
169
-
170
- ### Persistent review link
171
-
172
- For a settings screen or "Rate us" option, link directly to the App Store review page using the URL format:
173
-
174
- ```
175
- https://apps.apple.com/app/id{APP_ID}?action=write-review
35
+ ASO has two goals that use different parts of the page:
36
+
37
+ - **Visibility**: appearing for relevant searches. Surfaces: app name,
38
+ subtitle, keyword field, primary category, localizations, ratings and
39
+ reviews, In-App Events when they fit, and custom pages that carry their own
40
+ search keywords.
41
+ - **Conversion**: turning a page view into a download. Surfaces: screenshots,
42
+ app previews, description, promotional text, the message on each Custom
43
+ Product Page, Product Page Optimization tests, and making sure public claims
44
+ and screenshots match the real app.
45
+
46
+ Use this skill for questions about discoverability, keywords, download rate or
47
+ any page element that moves either goal. It assumes the listing already obeys
48
+ `app-store-review` rules. Every plan or division of work names the two goals
49
+ separately.
50
+
51
+ **Who owns what**
52
+
53
+ | Area | Owner |
54
+ |---|---|
55
+ | What the listing says and to whom, which keywords match which message, screenshots, promotional text, custom pages, page tests, per-market listings, how events are pitched, rating strategy, the moment to request a review | This skill |
56
+ | Review compliance, PrivacyInfo.xcprivacy, ATT prompt wording, submission guardrails | `app-store-review` |
57
+ | Purchase code, subscription paywalls, entitlement checks, monetization mechanics | `storekit` |
58
+
59
+ **A complete plan covers**
60
+
61
+ - Visibility: the name and subtitle, the keyword field, the primary category, localizations,
62
+ ratings and reviews, In-App Events if there is real timed content, Custom
63
+ Product Pages and their assigned search keywords.
64
+ - Conversion: the description's opening lines, the first screenshots or the
65
+ preview, promotional text, message fit on each custom page, a test plan, and
66
+ a check that claims and screenshots are accurate.
67
+ - Experiment: one hypothesis, at most three treatments, the localizations in
68
+ the test, the metric, and the rule for calling a winner.
69
+ - Review prompts: the positive moment that triggers them, the moments that
70
+ never do, and a note that StoreKit decides whether anything appears.
71
+
72
+ Always state explicitly: popular but irrelevant keywords are rejected; the
73
+ custom page allowance is 70 per app; a test has up to three treatments; In-App
74
+ Events and ratings are ASO work.
75
+
76
+ Every App Store Connect number in this skill (field lengths, the 70-page
77
+ allowance, three treatments, the 90-day test limit, event media sizes, the
78
+ review-prompt cap) is as Apple's documentation stated it at the time of
79
+ writing. Apple changes these limits, so check App Store Connect Help before
80
+ quoting one as current.
81
+
82
+ ## Name and subtitle
83
+
84
+ Search indexes both the name (30 characters) and the subtitle (30 characters),
85
+ so together they offer 60 indexed characters.
86
+
87
+ | Situation | Pattern |
88
+ |---|---|
89
+ | Brand already known | `Brand - Keyword` |
90
+ | New app competing on category terms | `Keyword - Brand` |
91
+ | Brand already contains a relevant word | A blended name |
92
+
93
+ - A word used in the name is wasted if repeated in the subtitle.
94
+ - The strongest keyword goes first in the field that still has spare room.
95
+ - Filler such as "the", "best" or "app" earns nothing in search.
96
+ - The subtitle states what the app does for the user, not a slogan.
97
+
98
+ ## Keyword field
99
+
100
+ The keyword field holds 100 bytes of comma-separated terms. For Latin script
101
+ that is 100 characters; scripts such as Japanese, Chinese or Korean use more
102
+ bytes per character, so they fit fewer. Formatting rules at submission live in
103
+ `app-store-review`.
104
+
105
+ **Finding candidates**
106
+
107
+ 1. Audit the 5 to 10 strongest apps in the category: which words appear in
108
+ their names, subtitles and descriptions?
109
+ 2. Map the category for related terms those competitors leave out.
110
+ 3. Run Apple Ads discovery campaigns to see real high-intent queries with
111
+ impression and tap data.
112
+ 4. Revisit the set with every release using Apple Ads, App Analytics
113
+ impressions and conversion data.
114
+
115
+ **Ranking candidates.** Relevance carries the most weight, then search volume,
116
+ then competition. Relevance wins every tie: an unrelated high-volume term
117
+ brings impressions that never convert. Think about what the searcher intends
118
+ first and how well the term fits the metadata second. Treat the primary
119
+ category as part of the keyword budget and never spend field space on it.
120
+
121
+ **Packing the field**
122
+
123
+ - Drop anything already in the name or subtitle.
124
+ - Keep one grammatical number per word; singular and plural of the same word
125
+ count as duplicates.
126
+ - Leave out the category name; the primary category already counts.
127
+ - No space after commas; spaces use up bytes.
128
+ - Abbreviations and common misspellings are fine when people really type them.
129
+ - Spend bytes on high-intent, clearly relevant terms, not loosely descriptive
130
+ ones.
131
+
132
+ Scoring, slot allocation and seasonal rotation are in the
133
+ [keyword research reference](references/keyword-research-methodology.md).
134
+
135
+ ## Description
136
+
137
+ Search relevance is computed from the name, the subtitle, the keyword field and
138
+ the primary category, together with how users behave: downloads, ratings,
139
+ reviews. The description exists
140
+ to convert, so do not load it with keywords.
141
+
142
+ 1. **Opening lines.** Only the first one to three lines show before "more". Put
143
+ the strongest benefit or differentiator there; nothing else on the page
144
+ matters as much.
145
+ 2. **Features.** Four to six short lines starting with the Unicode bullet character (U+2022),
146
+ because the store does not render Markdown. Describe outcomes, not internals.
147
+ 3. **Proof.** One or two lines of awards, press quotes, user milestones or
148
+ ratings.
149
+ 4. **Close.** A short line naming the benefit and inviting the download.
150
+
151
+ The store shows plain text only: no Markdown, HTML or rich formatting, so use
152
+ Unicode characters for structure. Keep paragraphs short and separated by blank
153
+ lines; a wall of text loses readers. Each locale gets its own version that
154
+ keeps the structure rather than the literal wording.
155
+
156
+ ## Promotional text
157
+
158
+ Promotional text sits on top of the description, holds up to 170 characters,
159
+ and can be edited whenever you like without shipping a build. Refresh it when a
160
+ feature ships, for a season, after an award or press mention, during a sale,
161
+ and while an In-App Event runs. It
162
+ should never sit unchanged across releases; when nothing is timely, cycle
163
+ through the strongest selling points.
164
+
165
+ ## Screenshots and previews
166
+
167
+ Most visitors look at the first three screenshots and no further.
168
+
169
+ - Open with the main value proposition.
170
+ - Keep onboarding, splash and loading screens out of those three slots.
171
+ - Give each of the three a different benefit.
172
+
173
+ **Captions** describe what the user gets, not the name of the screen:
174
+ "Never miss a deadline" rather than "Calendar View". Keep a two-to-five-word
175
+ headline above the screenshot and at most one short line below, and start with
176
+ a verb such as Plan, Share, Find or Build.
177
+
178
+ **Order**
179
+
180
+ | Slot | Content |
181
+ |---|---|
182
+ | 1 | Main value proposition |
183
+ | 2 | The key differentiator |
184
+ | 3 | The next strongest feature |
185
+ | 4 and later | Supporting features, social proof, edge cases |
186
+
187
+ An app preview video, when present, takes the first position. For viewers with
188
+ autoplay off, its poster frame is all they see, so pick a frame that could stand
189
+ alone as a screenshot. Device sizes and other screenshot requirements are in
190
+ `app-store-review`.
191
+
192
+ ## Asking for reviews in the app
193
+
194
+ Use the SwiftUI environment value `RequestReviewAction` or, from UIKit,
195
+ `AppStore.requestReview(in:)`. The full StoreKit surface is covered in
196
+ `storekit`.
197
+
198
+ ```swift
199
+ import StoreKit
200
+ import SwiftUI
201
+
202
+ struct TripSummaryView: View {
203
+ @Environment(\.requestReview) private var requestReview
204
+ let completedTrips: Int
205
+
206
+ var body: some View {
207
+ TripSummaryContent()
208
+ .onAppear {
209
+ if completedTrips == 5 { requestReview() }
210
+ }
211
+ }
212
+ }
176
213
  ```
177
214
 
178
- This opens the review writing screen directly and is not subject to the 3x/year system limit.
215
+ - The system shows the prompt at most three times in 365 days per device for
216
+ someone who has not rated the app.
217
+ - Calling the API is a request; StoreKit decides whether anything appears.
218
+ - Development builds always show it; TestFlight builds never do.
219
+ - Good moments: a meaningful task just finished, a milestone or streak, a
220
+ visible success, several active sessions.
221
+ - Bad moments: the very first launch, the onboarding flow, any error or crash,
222
+ a purchase that failed, or directly after a button tap.
223
+ - Do not put a "Do you like this app?" dialog in front of the system prompt.
224
+ Apple discourages intercepting it and may reject apps that do.
225
+
226
+ For a permanent "Write a review" row in settings, open
227
+ `https://apps.apple.com/app/id{APP_ID}?action=write-review`. It goes straight
228
+ to the review sheet and does not count against the three-per-year limit.
179
229
 
180
230
  ## Custom Product Pages
181
231
 
182
- Custom Product Pages allow up to 70 variant product pages per app. Each variant can have different screenshots, app preview videos, promotional text, and assigned search keywords -- tailored to a specific audience or acquisition channel.
183
-
184
- When recommending Custom Product Pages, explicitly mention both the 70-page capacity and assigned-keyword search visibility, then map each page to a distinct audience, message, keyword/ad intent, and measurement plan.
185
-
186
- ### Use cases
187
-
188
- Use separate pages for paid search ad groups, social campaigns, feature-specific landings, seasonal campaigns, and other acquisition paths where the first screenshot or promotional text should match a distinct user intent.
189
-
190
- ### Setup
191
-
192
- - Each Custom Product Page gets a unique App Store URL usable in ad campaigns, deep links, and web pages.
193
- - Approved pages can also appear in App Store search for assigned keywords from the latest approved app version.
194
- - Pages can be localized independently.
195
- - Create pages in App Store Connect under the Custom Product Pages tab.
196
- - Name pages descriptively for internal tracking (e.g., "Search-FitnessTracking", "Social-HolidayCampaign").
197
-
198
- **See:** [references/product-page-variants.md](references/product-page-variants.md) for setup details, URL structure, and campaign mapping strategy.
232
+ Each app gets an allowance of 70 Custom Product Pages. A page may swap in its
233
+ own screenshots, preview videos and promotional text, and carry its own search
234
+ keywords.
235
+
236
+ - A recommendation to use them always says two things: the allowance is 70
237
+ pages, and keywords assigned to a page let it surface in search. Map every page to an
238
+ audience, a message, a keyword or ad intent, and a measurement plan.
239
+ - Typical uses: ad groups in Apple Ads, social campaigns, landings for one
240
+ feature, seasonal pushes, and any path that needs a matching first screenshot
241
+ and promotional text.
242
+ - Each page has its own App Store URL for ads, deep links and websites.
243
+ - An approved page can surface in search for its assigned keywords; those are
244
+ chosen from the keywords of the most recently approved app version.
245
+ - Each page can be localized on its own.
246
+ - Create them in App Store Connect on the Custom Product Pages tab, with
247
+ descriptive internal names such as `Search-TrailMaps` or
248
+ `Social-SummerLaunch`.
249
+
250
+ URL format, channel mapping and maintenance are in the
251
+ [page variants reference](references/product-page-variants.md).
199
252
 
200
253
  ## In-App Events
201
254
 
202
- In-app events surface in App Store search results, on the Today tab, and in personalized recommendations. They increase visibility during the event window and can re-engage lapsed users.
203
-
204
- ### Event types
205
-
206
- Choose the Apple event badge that matches the actual in-app experience: Challenge, Competition, Live Event, Major Update, New Season, Premiere, or Special Event. Do not manufacture events without real time-bound content.
207
-
208
- ### Metadata limits
209
-
210
- Event name is 30 characters, short description 50, long description 120, and the event card image is required at 16:9 (1920x1080 or similar).
211
-
212
- ### Strategy
213
-
214
- - Schedule events around feature releases, seasonal moments, or content drops.
215
- - Write the event name and short description with search-result context in mind; they appear on event cards in surfaces such as Search and the Today tab.
216
- - Events appear on the product page and can appear in search results, giving the app a visual card that can increase tap-through rate when the event is timely and relevant.
217
- - Overlap events strategically: end the current event as the next one begins to maintain continuous search visibility.
218
-
219
- **See:** [references/product-page-variants.md](references/product-page-variants.md) for event scheduling templates.
255
+ Events are shown in search, on Today and in recommendations tailored to
256
+ each user. They raise visibility while they run and can bring lapsed
257
+ users back.
258
+
259
+ - Badges (seven): Challenge, Competition, Live Event, Major Update, New
260
+ Season, Premiere, Special Event. Pick the one that matches what actually happens in
261
+ the app, and never create an event without real time-bound content.
262
+ - Text limits in characters: 30 for the name, 50 for the short description,
263
+ 120 for the long one.
264
+ - Media: an event card image or video at 16:9 (1920 x 1080) and an event
265
+ details page image or video at 9:16 (1080 x 1920).
266
+ - Time them with feature releases, seasonal moments and content drops.
267
+ - Write the name and short description for someone scanning search results;
268
+ they appear on the event cards in Search and Today.
269
+ - The card is shown on the product page as well, and a well-timed card lifts
270
+ tap-through.
271
+ - Line events up so a new one starts as the previous one ends, keeping a card
272
+ in search at all times.
220
273
 
221
274
  ## Product Page Optimization
222
275
 
223
- App Store Connect provides native testing for product page elements.
224
-
225
- ### What can be tested
226
-
227
- - App icon (alternate icons)
228
- - Screenshots (order, content, captions)
229
- - App preview video
230
-
231
- Each test can include up to three treatments against the original product page, which serves as the default baseline.
232
-
233
- ### Test design
234
-
235
- - Run tests for a minimum of 7 days to account for day-of-week variation.
236
- - Ensure sufficient traffic for statistical significance -- low-traffic apps may need longer test durations.
237
- - Test one hypothesis at a time as a methodology choice (e.g., screenshot order OR caption copy, not both simultaneously), even when App Store Connect allows multiple treatments.
238
- - Select the localizations included in the test; all supported localizations are selected by default.
239
- - A test runs for up to 90 days or until manually stopped. Results appear in App Analytics after at least five first-time downloads are associated with the test.
240
- - PPO recommendations should name the hypothesis, up to three treatments, selected localizations, target metric, and decision rule.
241
-
242
- ### Interpreting results
243
-
244
- - Focus on conversion rate lift (impressions-to-downloads), not absolute download numbers.
245
- - App Store Connect reports conversion rate, lift, and confidence. Treat 90%+ confidence as the threshold for "Performing Better" or "Performing Worse" decisions.
246
- - After applying a winner, wait before starting the next test to establish a clean baseline.
247
-
248
- ## Ratings and Review Management
249
-
250
- Ratings and reviews appear on the product page and in search results, influence App Store search ranking, and affect conversion. The strategy is to earn more positive, recent feedback by prompting only after successful user moments and by responding constructively to issues.
251
-
252
- ### Review response strategy
253
-
254
- - Respond to negative reviews in App Store Connect -- a professional response improves perceived quality even without changing the rating number.
255
- - Acknowledge the issue, state what is being done (or has been fixed), and keep the tone neutral.
256
- - Use review language as customer research: users often describe their goals, frustrations, and category vocabulary in words that can improve future metadata and screenshot messaging.
257
-
258
- ### Rating reset
259
-
260
- When submitting a new version, you can choose to reset the displayed rating. Use this strategically:
261
-
262
- Reset only when the displayed rating is significantly below the app's current quality after major improvements. Do not reset a strong, representative rating; do not reset for ordinary bug fixes; and wait for stabilization after a risky redesign.
276
+ Product Page Optimization is the built-in App Store Connect A/B test for the
277
+ default product page.
278
+
279
+ - Testable: the app icon (using alternate icons), screenshots (order, content,
280
+ captions) and the preview video.
281
+ - Up to three treatments run against the original page.
282
+ - Plan at least seven days so every weekday is included, and longer for apps
283
+ with little traffic, until the result is significant.
284
+ - Keep a single hypothesis per test, even when using all three treatments.
285
+ - Choose which localizations take part; all supported ones are selected by
286
+ default.
287
+ - The longest a test runs is 90 days; you can end it sooner.
288
+ - App Analytics shows results once the test has been credited with five or
289
+ more first-time downloads.
290
+ - Any test you propose spells out the hypothesis, its (at most three)
291
+ treatments, which localizations take part, the metric, and how a winner is
292
+ declared.
293
+ - Decide on the change in conversion rate from impressions to downloads, never
294
+ on download totals. App Store Connect shows each variant's conversion rate,
295
+ its lift and a confidence level; require at least 90% before accepting a
296
+ "Performing Better" or "Performing Worse" label.
297
+ - Once a winner is applied, pause testing long enough for a fresh baseline.
298
+
299
+ ## Ratings and reviews
300
+
301
+ Star ratings and written reviews are visible on the product page and in
302
+ search, and they move both ranking and conversion.
303
+
304
+ - Earn more recent positive reviews: prompt after successes and answer
305
+ complaints constructively.
306
+ - Answer critical reviews from App Store Connect. A calm, specific reply
307
+ improves how the app looks even when the rating does not change: acknowledge
308
+ the problem, say what is fixed or in progress, keep the tone neutral.
309
+ - Read reviews as research into what users want, what frustrates them and the
310
+ words they use, then feed that into metadata and captions.
311
+ - Submitting a new version offers the option of resetting the summary rating. Do it only
312
+ when the shown rating is far below current quality after major fixes. Keep a
313
+ good rating that reflects the app fairly, skip the reset for routine fixes, and after
314
+ a risky redesign wait until it has settled.
263
315
 
264
316
  ## Localized Metadata Optimization
265
317
 
266
- Localizing ASO is not the same as translating the app UI. Keyword strategy, descriptions, and screenshot captions must be researched and written per market, not machine-translated from the primary locale.
267
-
268
- ### Key principles
269
-
270
- - **Research keywords per market.** The most-searched term for "photo editor" in Japanese is not a direct translation of "photo editor."
271
- - **Rewrite descriptions per locale.** Adapt the hook-features-proof-CTA structure to local conventions and selling points.
272
- - **Localize each metadata surface.** App Store guidance explicitly calls out localized descriptions, keywords, app previews, and screenshots; do not assume direct translations or unsupported cross-locale indexing behavior.
273
- - **Localize screenshot captions.** Captions in the user's language convert better than untranslated English.
274
-
275
- For in-app string localization (String Catalogs, FormatStyle, right-to-left layout), see the `ios-localization` skill.
276
-
277
- ## Common Mistakes
278
-
279
- 1. **Duplicating title/subtitle/category words in the keyword field.**
280
- 2. **Writing feature-descriptive captions instead of benefit-oriented screenshot copy.**
281
- 3. **Translating keywords instead of researching per-market search terms.**
282
- 4. **Prompting for reviews after onboarding, errors, crashes, or failed transactions.**
283
- 5. **Ignoring the first three screenshot slots or leading with onboarding/splash screens.**
284
- 6. **Leaving promotional text static across releases and campaigns.**
285
- 7. **Running PPO tests without enough duration, traffic, or a single clear hypothesis.**
286
- 8. **Adding spaces after commas in the keyword field.**
287
- 9. **Reusing identical assets across all Custom Product Pages.**
288
- 10. **Ignoring negative App Store reviews instead of responding and learning from customer language.**
289
-
290
- ## Review Checklist
291
-
292
- - [ ] Title uses high-value keyword alongside brand name; no words repeated in subtitle
293
- - [ ] Subtitle communicates primary value proposition within 30 characters
294
- - [ ] Keyword field uses all 100 characters; no spaces after commas; no duplicates of title/subtitle words; singular forms only
295
- - [ ] Description follows hook-features-proof-CTA structure; first 3 lines compelling before the fold
296
- - [ ] Promotional text is current and relevant to the latest release or event
297
- - [ ] First 3 screenshots show highest-value screens with benefit-oriented captions
298
- - [ ] App preview video (if present) leads with the core feature in the first 5 seconds
299
- - [ ] `requestReview()` is placed after a positive user moment, not on first launch or after errors
300
- - [ ] Custom Product Pages created for distinct acquisition channels with tailored screenshots
301
- - [ ] In-app events configured for upcoming launches, seasons, or feature releases
302
- - [ ] Metadata localized with per-market keyword research for all supported locales
303
- - [ ] Compliance cross-check: all metadata passes the `app-store-review` skill checklist before submission
318
+ A localized listing is a separate job from translating the app's screens.
319
+ Keywords, descriptions and captions are researched and written per market.
320
+
321
+ - Research keywords in each market. The term people use to find a photo editor
322
+ in Japanese is not a word-for-word translation of the English one.
323
+ - Rewrite the description per locale, adapting opening lines, features, proof
324
+ and close to local expectations.
325
+ - Localize every surface (description, keywords, previews, screenshots), and do
326
+ not count on literal translations or on one locale's keywords being indexed
327
+ elsewhere.
328
+ - Caption screenshots in the market's language; native captions convert better
329
+ than English ones.
330
+ - Localizing strings inside the app (String Catalogs, `FormatStyle`,
331
+ right-to-left layout) is covered by `ios-localization`.
332
+
333
+ ## Mistakes to catch
334
+
335
+ - Words from the name, subtitle or category repeated in the keyword field.
336
+ - Captions that name features instead of promising benefits.
337
+ - Keywords translated instead of researched per market.
338
+ - Review requests fired during onboarding or after an error, crash or failed
339
+ purchase.
340
+ - Weak first three screenshots, or onboarding and splash screens in them.
341
+ - Promotional text that never changes between releases or campaigns.
342
+ - Tests stopped too early, run without enough traffic, or mixing hypotheses.
343
+ - A space typed after each comma in the keyword field.
344
+ - Every Custom Product Page using the same assets.
345
+ - Negative reviews left unanswered and unread.
346
+
347
+ ## Review checklist
348
+
349
+ - [ ] The name pairs the brand with a high-value keyword, and the subtitle
350
+ repeats none of its words.
351
+ - [ ] The subtitle states the main value within 30 characters.
352
+ - [ ] The keyword field uses its full 100 bytes, has no spaces after commas, no
353
+ words from the name or subtitle, and one form per word.
354
+ - [ ] The description follows opening, features, proof, close, and its first
355
+ three lines work before the fold.
356
+ - [ ] Promotional text reflects the latest release or event.
357
+ - [ ] The first three screenshots show the strongest screens with benefit
358
+ captions.
359
+ - [ ] Any preview video shows the core feature within its first five seconds.
360
+ - [ ] `requestReview()` follows a positive moment, never first launch or an
361
+ error.
362
+ - [ ] Each major acquisition channel has a Custom Product Page with its own
363
+ screenshots.
364
+ - [ ] In-App Events are planned for upcoming launches, seasons and releases.
365
+ - [ ] Every supported locale has metadata based on its own keyword research.
366
+ - [ ] Before submitting, every metadata field clears the `app-store-review`
367
+ checklist.
304
368
 
305
369
  ## References
306
370
 
307
- - Keyword research methodology: [references/keyword-research-methodology.md](references/keyword-research-methodology.md)
308
- - Custom Product Pages, A/B testing, and in-app events: [references/product-page-variants.md](references/product-page-variants.md)
371
+ - [Keyword research](references/keyword-research-methodology.md):
372
+ what search indexes, the research process, scoring, slot allocation, seasonal
373
+ rotation, before and after examples.
374
+ - [Page variants](references/product-page-variants.md): custom
375
+ page setup and channel mapping, test patterns and limits, In-App
376
+ Event configuration, caption writing.