@danieljvdm/dev-kit 1.0.2 → 2.0.0

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 (329) hide show
  1. package/README.md +6 -6
  2. package/package.json +1 -1
  3. package/skill-sources.jsonc +2 -33
  4. package/skill-sources.lock.json +15 -117
  5. package/skills/animate/LICENSE +21 -0
  6. package/skills/animate/NOTICE +10 -0
  7. package/skills/animate/SKILL.md +34 -0
  8. package/skills/animate/references/gestures.md +27 -0
  9. package/skills/animate/references/glossary.md +136 -0
  10. package/skills/animate/references/implementation.md +22 -0
  11. package/skills/animate/references/opportunities.md +18 -0
  12. package/skills/animate/references/principles.md +48 -0
  13. package/skills/animate/references/review.md +19 -0
  14. package/skills/cloudflare-workers/LICENSE +202 -0
  15. package/skills/cloudflare-workers/NOTICE +9 -0
  16. package/skills/cloudflare-workers/SKILL.md +26 -0
  17. package/skills/cloudflare-workers/references/durable-objects.md +68 -0
  18. package/skills/cloudflare-workers/references/sandbox.md +48 -0
  19. package/skills/cloudflare-workers/references/workers.md +63 -0
  20. package/skills/cloudflare-workers/references/wrangler.md +56 -0
  21. package/skills/design-ui/LICENSE +21 -0
  22. package/skills/design-ui/NOTICE +8 -0
  23. package/skills/design-ui/SKILL.md +29 -0
  24. package/skills/design-ui/references/appearance.md +22 -0
  25. package/skills/design-ui/references/components.md +33 -0
  26. package/skills/design-ui/references/exploration.md +50 -0
  27. package/skills/design-ui/references/libraries.md +39 -0
  28. package/skills/design-ui/references/themes.md +23 -0
  29. package/skills/dev-kit/SKILL.md +19 -38
  30. package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
  31. package/skills/dev-kit/references/skills.md +2 -2
  32. package/skills/effect-development/SKILL.md +27 -0
  33. package/skills/effect-development/agents/openai.yaml +4 -0
  34. package/skills/effect-development/references/api/index.md +32 -0
  35. package/skills/effect-development/references/api/schema-codecs.md +15 -0
  36. package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
  37. package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
  38. package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
  39. package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
  40. package/skills/effect-development/references/atom/index.md +40 -0
  41. package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
  42. package/skills/effect-development/references/cli/index.md +39 -0
  43. package/skills/effect-development/references/setup.md +15 -0
  44. package/skills/open-pull-request/SKILL.md +10 -70
  45. package/skills/open-pull-request/references/evidence.md +22 -0
  46. package/skills/open-pull-request/references/explanation.md +21 -0
  47. package/skills/open-pull-request/references/publication.md +21 -0
  48. package/skills/sentry/LICENSE +202 -0
  49. package/skills/sentry/LICENSE-UPSTREAM +21 -0
  50. package/skills/sentry/NOTICE +14 -0
  51. package/skills/sentry/SKILL.md +33 -0
  52. package/skills/sentry/references/alert-payloads.md +105 -0
  53. package/skills/sentry/references/alerts.md +17 -0
  54. package/skills/sentry/references/artifacts.md +25 -0
  55. package/skills/sentry/references/auth-token.md +65 -0
  56. package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
  57. package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
  58. package/skills/sentry/references/concepts/crons.md +50 -0
  59. package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
  60. package/skills/sentry/references/concepts/errors.md +40 -0
  61. package/skills/sentry/references/concepts/logging.md +85 -0
  62. package/skills/sentry/references/concepts/metrics.md +49 -0
  63. package/skills/sentry/references/concepts/monitors.md +78 -0
  64. package/skills/sentry/references/concepts/profiling.md +38 -0
  65. package/skills/sentry/references/concepts/reduce-volume.md +49 -0
  66. package/skills/sentry/references/concepts/releases.md +43 -0
  67. package/skills/sentry/references/concepts/session-replay.md +35 -0
  68. package/skills/sentry/references/concepts/tracing.md +54 -0
  69. package/skills/sentry/references/concepts/user-feedback.md +36 -0
  70. package/skills/sentry/references/debug-artifacts/android.md +68 -0
  71. package/skills/sentry/references/debug-artifacts/apple.md +96 -0
  72. package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
  73. package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
  74. package/skills/sentry/references/debug-artifacts/index.md +75 -0
  75. package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
  76. package/skills/sentry/references/debug-artifacts/matching.md +73 -0
  77. package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
  78. package/skills/sentry/references/first-error-setup.md +25 -0
  79. package/skills/sentry/references/instrumentation.md +30 -0
  80. package/skills/sentry/references/issues.md +32 -0
  81. package/skills/sentry/references/new-project.md +17 -0
  82. package/skills/sentry/references/otel-exporter.md +30 -0
  83. package/skills/sentry/references/release-workflow.md +31 -0
  84. package/skills/sentry/references/releases/ci-pipeline.md +214 -0
  85. package/skills/sentry/references/releases/index.md +93 -0
  86. package/skills/sentry/references/releases/suspect-commits.md +155 -0
  87. package/skills/sentry/references/releases/tagging.md +131 -0
  88. package/skills/sentry/references/releases/troubleshooting.md +67 -0
  89. package/skills/sentry/references/sdks/android/crons.md +305 -0
  90. package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
  91. package/skills/sentry/references/sdks/android/index.md +748 -0
  92. package/skills/sentry/references/sdks/android/integrations.md +48 -0
  93. package/skills/sentry/references/sdks/android/logging.md +374 -0
  94. package/skills/sentry/references/sdks/android/metrics.md +288 -0
  95. package/skills/sentry/references/sdks/android/profiling.md +397 -0
  96. package/skills/sentry/references/sdks/android/session-replay.md +406 -0
  97. package/skills/sentry/references/sdks/android/tracing.md +861 -0
  98. package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
  99. package/skills/sentry/references/sdks/browser/index.md +714 -0
  100. package/skills/sentry/references/sdks/browser/logging.md +315 -0
  101. package/skills/sentry/references/sdks/browser/profiling.md +236 -0
  102. package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
  103. package/skills/sentry/references/sdks/browser/tracing.md +561 -0
  104. package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
  105. package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
  106. package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
  107. package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
  108. package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
  109. package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
  110. package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
  111. package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
  112. package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
  113. package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
  114. package/skills/sentry/references/sdks/cocoa/index.md +497 -0
  115. package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
  116. package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
  117. package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
  118. package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
  119. package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
  120. package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
  121. package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
  122. package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
  123. package/skills/sentry/references/sdks/dotnet/index.md +614 -0
  124. package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
  125. package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
  126. package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
  127. package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
  128. package/skills/sentry/references/sdks/elixir/crons.md +371 -0
  129. package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
  130. package/skills/sentry/references/sdks/elixir/index.md +383 -0
  131. package/skills/sentry/references/sdks/elixir/logging.md +239 -0
  132. package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
  133. package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
  134. package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
  135. package/skills/sentry/references/sdks/flutter/index.md +728 -0
  136. package/skills/sentry/references/sdks/flutter/logging.md +387 -0
  137. package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
  138. package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
  139. package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
  140. package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
  141. package/skills/sentry/references/sdks/go/crons.md +270 -0
  142. package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
  143. package/skills/sentry/references/sdks/go/index.md +324 -0
  144. package/skills/sentry/references/sdks/go/logging.md +354 -0
  145. package/skills/sentry/references/sdks/go/metrics.md +273 -0
  146. package/skills/sentry/references/sdks/go/profiling.md +46 -0
  147. package/skills/sentry/references/sdks/go/tracing.md +366 -0
  148. package/skills/sentry/references/sdks/index.md +41 -0
  149. package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
  150. package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
  151. package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
  152. package/skills/sentry/references/sdks/nestjs/index.md +699 -0
  153. package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
  154. package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
  155. package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
  156. package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
  157. package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
  158. package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
  159. package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
  160. package/skills/sentry/references/sdks/nextjs/index.md +491 -0
  161. package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
  162. package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
  163. package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
  164. package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
  165. package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
  166. package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
  167. package/skills/sentry/references/sdks/node/crons.md +432 -0
  168. package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
  169. package/skills/sentry/references/sdks/node/index.md +942 -0
  170. package/skills/sentry/references/sdks/node/logging.md +380 -0
  171. package/skills/sentry/references/sdks/node/metrics.md +278 -0
  172. package/skills/sentry/references/sdks/node/profiling.md +373 -0
  173. package/skills/sentry/references/sdks/node/tracing.md +878 -0
  174. package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
  175. package/skills/sentry/references/sdks/php/crons.md +265 -0
  176. package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
  177. package/skills/sentry/references/sdks/php/index.md +362 -0
  178. package/skills/sentry/references/sdks/php/laravel.md +542 -0
  179. package/skills/sentry/references/sdks/php/logging.md +242 -0
  180. package/skills/sentry/references/sdks/php/metrics.md +193 -0
  181. package/skills/sentry/references/sdks/php/profiling.md +115 -0
  182. package/skills/sentry/references/sdks/php/symfony.md +552 -0
  183. package/skills/sentry/references/sdks/php/tracing.md +516 -0
  184. package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
  185. package/skills/sentry/references/sdks/python/crons.md +218 -0
  186. package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
  187. package/skills/sentry/references/sdks/python/index.md +361 -0
  188. package/skills/sentry/references/sdks/python/logging.md +234 -0
  189. package/skills/sentry/references/sdks/python/metrics.md +154 -0
  190. package/skills/sentry/references/sdks/python/profiling.md +120 -0
  191. package/skills/sentry/references/sdks/python/tracing.md +364 -0
  192. package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
  193. package/skills/sentry/references/sdks/react/index.md +492 -0
  194. package/skills/sentry/references/sdks/react/logging.md +364 -0
  195. package/skills/sentry/references/sdks/react/profiling.md +322 -0
  196. package/skills/sentry/references/sdks/react/react-features.md +1272 -0
  197. package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
  198. package/skills/sentry/references/sdks/react/tracing.md +1415 -0
  199. package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
  200. package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
  201. package/skills/sentry/references/sdks/react-native/index.md +1030 -0
  202. package/skills/sentry/references/sdks/react-native/logging.md +444 -0
  203. package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
  204. package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
  205. package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
  206. package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
  207. package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
  208. package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
  209. package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
  210. package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
  211. package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
  212. package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
  213. package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
  214. package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
  215. package/skills/sentry/references/sdks/ruby/crons.md +184 -0
  216. package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
  217. package/skills/sentry/references/sdks/ruby/index.md +297 -0
  218. package/skills/sentry/references/sdks/ruby/logging.md +168 -0
  219. package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
  220. package/skills/sentry/references/sdks/ruby/migration.md +321 -0
  221. package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
  222. package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
  223. package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
  224. package/skills/sentry/references/sdks/svelte/index.md +467 -0
  225. package/skills/sentry/references/sdks/svelte/logging.md +344 -0
  226. package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
  227. package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
  228. package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
  229. package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
  230. package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
  231. package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
  232. package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
  233. package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
  234. package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
  235. package/skills/sentry/references/search-query-language.md +226 -0
  236. package/skills/sentry/references/semantics/angular.md +7 -0
  237. package/skills/sentry/references/semantics/app.md +28 -0
  238. package/skills/sentry/references/semantics/art.md +17 -0
  239. package/skills/sentry/references/semantics/aws.md +43 -0
  240. package/skills/sentry/references/semantics/browser.md +34 -0
  241. package/skills/sentry/references/semantics/cache.md +12 -0
  242. package/skills/sentry/references/semantics/client.md +8 -0
  243. package/skills/sentry/references/semantics/cloud.md +12 -0
  244. package/skills/sentry/references/semantics/cloudflare.md +23 -0
  245. package/skills/sentry/references/semantics/code.md +11 -0
  246. package/skills/sentry/references/semantics/culture.md +11 -0
  247. package/skills/sentry/references/semantics/db.md +21 -0
  248. package/skills/sentry/references/semantics/device.md +43 -0
  249. package/skills/sentry/references/semantics/error.md +7 -0
  250. package/skills/sentry/references/semantics/event.md +8 -0
  251. package/skills/sentry/references/semantics/exception.md +10 -0
  252. package/skills/sentry/references/semantics/faas.md +19 -0
  253. package/skills/sentry/references/semantics/file.md +8 -0
  254. package/skills/sentry/references/semantics/flag.md +7 -0
  255. package/skills/sentry/references/semantics/gcp.md +16 -0
  256. package/skills/sentry/references/semantics/gen_ai.md +53 -0
  257. package/skills/sentry/references/semantics/general.md +11 -0
  258. package/skills/sentry/references/semantics/graphql.md +9 -0
  259. package/skills/sentry/references/semantics/grpc.md +19 -0
  260. package/skills/sentry/references/semantics/http.md +34 -0
  261. package/skills/sentry/references/semantics/index.md +63 -0
  262. package/skills/sentry/references/semantics/jsonrpc.md +8 -0
  263. package/skills/sentry/references/semantics/jvm.md +12 -0
  264. package/skills/sentry/references/semantics/koa.md +7 -0
  265. package/skills/sentry/references/semantics/logger.md +7 -0
  266. package/skills/sentry/references/semantics/mcp.md +37 -0
  267. package/skills/sentry/references/semantics/mdc.md +7 -0
  268. package/skills/sentry/references/semantics/messaging.md +23 -0
  269. package/skills/sentry/references/semantics/middleware.md +7 -0
  270. package/skills/sentry/references/semantics/navigation.md +9 -0
  271. package/skills/sentry/references/semantics/nel.md +11 -0
  272. package/skills/sentry/references/semantics/network.md +17 -0
  273. package/skills/sentry/references/semantics/os.md +15 -0
  274. package/skills/sentry/references/semantics/otel.md +10 -0
  275. package/skills/sentry/references/semantics/params.md +7 -0
  276. package/skills/sentry/references/semantics/process.md +14 -0
  277. package/skills/sentry/references/semantics/react.md +7 -0
  278. package/skills/sentry/references/semantics/remix.md +7 -0
  279. package/skills/sentry/references/semantics/resource.md +7 -0
  280. package/skills/sentry/references/semantics/rpc.md +10 -0
  281. package/skills/sentry/references/semantics/score.md +10 -0
  282. package/skills/sentry/references/semantics/sentry.md +69 -0
  283. package/skills/sentry/references/semantics/server.md +8 -0
  284. package/skills/sentry/references/semantics/service.md +8 -0
  285. package/skills/sentry/references/semantics/session.md +7 -0
  286. package/skills/sentry/references/semantics/state.md +7 -0
  287. package/skills/sentry/references/semantics/thread.md +8 -0
  288. package/skills/sentry/references/semantics/timber.md +7 -0
  289. package/skills/sentry/references/semantics/trpc.md +8 -0
  290. package/skills/sentry/references/semantics/ui.md +18 -0
  291. package/skills/sentry/references/semantics/url.md +15 -0
  292. package/skills/sentry/references/semantics/user.md +17 -0
  293. package/skills/sentry/references/semantics/user_agent.md +7 -0
  294. package/skills/sentry/references/semantics/vercel.md +42 -0
  295. package/skills/sentry/references/setup-verification.md +39 -0
  296. package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
  297. package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
  298. package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
  299. package/skills/sentry/references/snapshots/index.md +19 -0
  300. package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
  301. package/skills/sentry/references/snapshots/snapshots.md +123 -0
  302. package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
  303. package/skills/testing/LICENSE +21 -0
  304. package/skills/testing/NOTICE +7 -0
  305. package/skills/testing/SKILL.md +13 -19
  306. package/skills/testing/agents/openai.yaml +1 -2
  307. package/skills/testing/references/selection.md +23 -0
  308. package/skills/testing/references/tdd.md +19 -0
  309. package/skills/testing/references/test-design.md +17 -0
  310. package/src/catalog.ts +1 -7
  311. package/skills/build-effect-apis/SKILL.md +0 -81
  312. package/skills/build-effect-apis/agents/openai.yaml +0 -4
  313. package/skills/build-effect-clis/SKILL.md +0 -92
  314. package/skills/build-effect-clis/agents/openai.yaml +0 -4
  315. package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
  316. package/skills/effect-atom-state/SKILL.md +0 -97
  317. package/skills/effect-atom-state/agents/openai.yaml +0 -4
  318. package/skills/effect-ts/SKILL.md +0 -35
  319. package/skills/effect-ts/agents/openai.yaml +0 -4
  320. /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
  321. /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
  322. /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
  323. /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
  324. /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
  325. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
  326. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
  327. /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
  328. /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
  329. /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
@@ -0,0 +1,704 @@
1
+ # Session Replay — Sentry React Native SDK
2
+
3
+ > **Minimum SDK:** `@sentry/react-native` ≥ **6.5.0**\
4
+ > **Status:** Generally Available on all Sentry plans\
5
+ > **Key difference from web:** Screenshot-based capture, NOT DOM recording
6
+
7
+ ---
8
+
9
+ ## How Mobile Replay Differs from Web Replay
10
+
11
+ Mobile Session Replay is **fundamentally different** from web replay.
12
+ Understanding this distinction prevents surprises:
13
+
14
+ | Dimension | Web Session Replay | Mobile Session Replay |
15
+ | --------------------- | --------------------------------------- | ---------------------------------------------------------------- |
16
+ | **Recording method** | DOM serialization (HTML/CSS snapshots) | **Screenshot-based** (native view hierarchy snapshots) |
17
+ | **Frame rate** | Variable (mutation-driven, often 60fps) | **~1 frame per second** (screenshot on change) |
18
+ | **Fidelity** | Pixel-perfect DOM reconstruction | Compressed video segments from screenshots |
19
+ | **Text in replay** | ✅ Selectable, searchable text | ❌ Pixel-only — text is in screenshots |
20
+ | **CSS inspection** | ✅ Available | ❌ Not available |
21
+ | **Privacy mechanism** | CSS-based DOM masking | **Native-layer pixel masking** |
22
+ | **Offline support** | ✅ Both session and error modes | ❌ **Error mode only** (`sessionSampleRate` unsupported offline) |
23
+ | **Touch recording** | Full pointer/mouse events | Tap breadcrumbs only (no gesture paths) |
24
+ | **Rage clicks** | ✅ Detected | ❌ Not supported |
25
+ | **Network bodies** | ✅ Optional capture | ✅ Captured for allow-listed URLs (XHR only, SDK ≥8.13.0) |
26
+ | **Scroll positions** | ✅ Precise | ⚠️ Approximate (from screenshots) |
27
+
28
+ Mobile replay captures **native view hierarchy snapshots + a screenshot** within the
29
+ same frame, compresses them into video segments, and streams them to Sentry alongside
30
+ trace IDs, breadcrumbs, and debug info.
31
+
32
+ ---
33
+
34
+ ## Minimum SDK Versions
35
+
36
+ | Platform / Feature | Minimum Version |
37
+ | --------------------------------------------------- | -------------------------- |
38
+ | React Native (basic replay) | **6.5.0** |
39
+ | `maskAllVectors` option | 5.36.0 / 6.3.0+ |
40
+ | `Sentry.Mask` / `Sentry.Unmask` components | **6.4.0-beta.1** |
41
+ | Manually-initialized native SDK masking | **6.15.1** (Cocoa 8.52.1+) |
42
+ | `screenshotStrategy` option (Android) | **7.5.0** |
43
+ | `includedViewClasses` / `excludedViewClasses` (iOS) | **7.9.0** |
44
+ | iOS native SDK | Cocoa 8.43.0+ |
45
+ | Android native SDK | 7.20.0+ |
46
+
47
+ ---
48
+
49
+ ## Installation
50
+
51
+ No separate package needed — `mobileReplayIntegration()` is bundled in
52
+ `@sentry/react-native`:
53
+
54
+ ```bash
55
+ npm install @sentry/react-native
56
+ # or
57
+ yarn add @sentry/react-native
58
+ ```
59
+
60
+ > **Android bundle size note:** The replay module adds ~40 KB compressed / ~80 KB
61
+ > uncompressed. To exclude it entirely if you don’t use replay:
62
+ >
63
+ > ```gradle
64
+ > // android/build.gradle (root level)
65
+ > subprojects {
66
+ > configurations.all {
67
+ > exclude group: 'io.sentry', module: 'sentry-android-replay'
68
+ > }
69
+ > }
70
+ > ```
71
+
72
+ ---
73
+
74
+ ## Basic Setup
75
+
76
+ ```javascript
77
+ import * as Sentry from "@sentry/react-native";
78
+
79
+ Sentry.init({
80
+ dsn: "YOUR_DSN_HERE",
81
+
82
+ // Session sampling — set both for comprehensive coverage
83
+ replaysSessionSampleRate: 0.1, // 10% of ALL sessions recorded immediately
84
+ replaysOnErrorSampleRate: 1.0, // 100% of sessions where an error occurs
85
+
86
+ integrations: [Sentry.mobileReplayIntegration()],
87
+ });
88
+ ```
89
+
90
+ > **During development:** Use `replaysSessionSampleRate: 1.0` so every session is
91
+ > recorded. Lower it in production while keeping `replaysOnErrorSampleRate: 1.0`.
92
+
93
+ ---
94
+
95
+ ## Sample Rates
96
+
97
+ ### `replaysSessionSampleRate`
98
+
99
+ - Records the **entire user session** starting from SDK initialization / app foreground
100
+ entry
101
+ - Range: `0.0` – `1.0`
102
+ - **Not supported in offline mode**
103
+
104
+ ### `replaysOnErrorSampleRate`
105
+
106
+ - Only activates when an **error occurs**
107
+ - SDK maintains a rolling **1-minute pre-error buffer** in memory
108
+ - Captures that buffer + everything after the error, giving you full context
109
+ - Range: `0.0` – `1.0`
110
+ - ✅ Supported in offline mode — segments stored to disk, sent on reconnect
111
+
112
+ ### Recommended Production Values
113
+
114
+ | Strategy | `replaysSessionSampleRate` | `replaysOnErrorSampleRate` |
115
+ | ------------------------------ | -------------------------- | -------------------------- |
116
+ | Errors-only (minimal overhead) | `0` | `1.0` |
117
+ | Balanced | `0.05` | `1.0` |
118
+ | High visibility | `0.1` | `1.0` |
119
+
120
+ ### Per-Error Filtering with `beforeErrorSampling`
121
+
122
+ ```javascript
123
+ Sentry.mobileReplayIntegration({
124
+ beforeErrorSampling: (event, hint) => {
125
+ // Only capture replays for UNHANDLED errors
126
+ const isHandled = event.exception?.values?.some(
127
+ (exception) => exception.mechanism?.handled === true,
128
+ );
129
+ return !isHandled; // returning false skips replay capture for this error
130
+ },
131
+ });
132
+ ```
133
+
134
+ ---
135
+
136
+ ## All Configuration Options
137
+
138
+ ### `mobileReplayIntegration()` Options
139
+
140
+ | Option | Type | Default | Min SDK | Description |
141
+ | ------------------------ | --------------------------- | ------------- | --------------- | ---------------------------------------------------------------------------------------------- |
142
+ | `maskAllText` | `boolean` | `true` | — | Masks all text in screenshots |
143
+ | `maskAllImages` | `boolean` | `true` | — | Masks all images |
144
+ | `maskAllVectors` | `boolean` | `true` | 5.36.0 / 6.3.0+ | Masks vector graphics |
145
+ | `screenshotStrategy` | `'pixelCopy'` \| `'canvas'` | `'pixelCopy'` | 7.5.0 (Android) | Screenshot capture method |
146
+ | `includedViewClasses` | `string[]` | — | 7.9.0 (iOS) | Allowlist of native class names to traverse |
147
+ | `excludedViewClasses` | `string[]` | — | 7.9.0 (iOS) | Blocklist; takes precedence over `includedViewClasses` |
148
+ | `beforeErrorSampling` | `(event, hint) => boolean` | — | — | Return `false` to skip replay for a specific error |
149
+ | `networkDetailAllowUrls` | `(string \| RegExp)[]` | `[]` | 8.13.0+ | URLs to enrich with headers (and bodies, when `networkCaptureBodies` is on) |
150
+ | `networkDetailDenyUrls` | `(string \| RegExp)[]` | `[]` | 8.13.0+ | URLs to never enrich, even if they match the allow list |
151
+ | `networkCaptureBodies` | `boolean` | `true` | 8.13.0+ | Capture request/response bodies for allow-listed URLs (changed to `true` in 8.17.0) |
152
+ | `networkRequestHeaders` | `string[]` | `[]` | 8.13.0+ | Extra request headers to capture (beyond defaults: `Content-Type`, `Content-Length`, `Accept`) |
153
+ | `networkResponseHeaders` | `string[]` | `[]` | 8.13.0+ | Extra response headers to capture |
154
+
155
+ ### Top-Level `Sentry.init()` Options
156
+
157
+ | Option | Type | Default | Description |
158
+ | -------------------------- | --------------------------------- | ---------- | --------------------------------------------------- |
159
+ | `replaysSessionSampleRate` | `number` (0–1) | — | Fraction of all sessions to record |
160
+ | `replaysOnErrorSampleRate` | `number` (0–1) | — | Fraction of error sessions to record |
161
+ | `replaysSessionQuality` | `'low'` \| `'medium'` \| `'high'` | `'medium'` | Screenshot quality — affects CPU, memory, bandwidth |
162
+
163
+ ---
164
+
165
+ ## Privacy & Masking
166
+
167
+ > ⚠️ **Production warning:** Always verify your masking config before enabling in
168
+ > production. Default settings aggressively mask everything, but any modifications
169
+ > require thorough testing with your actual app UI. If you discover unmasked PII, open a
170
+ > GitHub issue and disable Session Replay until resolved.
171
+
172
+ ### Default Behavior
173
+
174
+ The SDK masks **all text, images, vectors, webviews, and user input** by default.
175
+ Masked areas are replaced with a filled block using the most predominant color of the
176
+ masked element.
177
+
178
+ ### Disable All Masking
179
+
180
+ Use only if your app contains absolutely no sensitive data:
181
+
182
+ ```javascript
183
+ Sentry.mobileReplayIntegration({
184
+ maskAllText: false,
185
+ maskAllImages: false,
186
+ maskAllVectors: false,
187
+ });
188
+ ```
189
+
190
+ > Requires SDK **5.36.0** / **6.3.0+**. If using manually initialized native SDKs,
191
+ > requires **6.15.1+** (Cocoa **8.52.1+**).
192
+
193
+ ### `Sentry.Mask` and `Sentry.Unmask` Components
194
+
195
+ Requires SDK **6.4.0-beta.1+**. These are React Native components for fine-grained,
196
+ per-screen masking control:
197
+
198
+ ```jsx
199
+ import * as Sentry from "@sentry/react-native";
200
+
201
+ const ProfileScreen = () => (
202
+ <View>
203
+ {/* Unmask non-sensitive sections to see them clearly in replay */}
204
+ <Sentry.Unmask>
205
+ <Text>Welcome back!</Text> {/* ✅ visible in replay */}
206
+ <Text>Public username: johndoe</Text> {/* ✅ visible in replay */}
207
+ </Sentry.Unmask>
208
+
209
+ {/* Mask sensitive sections regardless of global config */}
210
+ <Sentry.Mask>
211
+ <Text>Credit card: 4111-****-****-1111</Text> {/* 🔒 masked */}
212
+ <TextInput value={ssn} /> {/* 🔒 masked */}
213
+ </Sentry.Mask>
214
+ </View>
215
+ );
216
+ ```
217
+
218
+ ### Masking Rules & Priority
219
+
220
+ **`Sentry.Unmask` only unmasks direct children:**
221
+
222
+ ```jsx
223
+ <Sentry.Unmask>
224
+ <Text>
225
+ Unmasked line {/* ✅ direct child — visible */}
226
+ <Text>Nested text</Text> {/* 🔒 indirect child — still masked */}
227
+ </Text>
228
+ <Text>Also unmasked</Text> {/* ✅ direct child — visible */}
229
+ </Sentry.Unmask>
230
+ ```
231
+
232
+ **`Sentry.Mask` masks ALL descendants:**
233
+
234
+ ```jsx
235
+ <Sentry.Mask>
236
+ <Text>
237
+ Masked {/* 🔒 */}
238
+ <Text>Also masked</Text> {/* 🔒 */}
239
+ </Text>
240
+ </Sentry.Mask>
241
+ ```
242
+
243
+ **`Mask` always wins — `Unmask` cannot override it:**
244
+
245
+ ```jsx
246
+ {
247
+ /* Unmask inside Mask — Mask still wins */
248
+ }
249
+ <Sentry.Mask>
250
+ <Sentry.Unmask>
251
+ <Text>Still masked</Text> {/* 🔒 Unmask has no effect inside Mask */}
252
+ </Sentry.Unmask>
253
+ </Sentry.Mask>;
254
+
255
+ {
256
+ /* Mask inside Unmask — Mask still takes effect */
257
+ }
258
+ <Sentry.Unmask>
259
+ <Sentry.Mask>
260
+ <Text>Masked</Text> {/* 🔒 */}
261
+ </Sentry.Mask>
262
+ </Sentry.Unmask>;
263
+ ```
264
+
265
+ ### Implementation Notes
266
+
267
+ - `Mask` and `Unmask` are **native components** on both iOS and Android
268
+ - Compatible with both **New Architecture** and **Legacy Architecture**
269
+ - They behave as standard React Native `View` components (passthrough layout)
270
+
271
+ ---
272
+
273
+ ## React Native View Flattening — Critical Privacy Gotcha
274
+
275
+ React Native’s [View Flattening](https://reactnative.dev/architecture/view-flattening)
276
+ optimization removes “Layout Only” views from the native hierarchy — and this **includes
277
+ your `Mask`/`Unmask` wrappers**.
278
+
279
+ > ⚠️ **View Flattening may cause `Mask`/`Unmask` to not work as expected, accidentally
280
+ > exposing sensitive data.** Always test masking thoroughly on physical devices before
281
+ > shipping.
282
+
283
+ **Diagnosis:** If `Sentry.Unmask` isn’t unmasking content more than one level deep,
284
+ check whether the wrapper appears in the actual native view hierarchy (use the React
285
+ Native Inspector or Xcode View Hierarchy Debugger).
286
+ If the wrapper is absent, it’s been flattened away.
287
+
288
+ **Mitigation:** Add `collapsable={false}` to prevent flattening of critical mask
289
+ wrappers:
290
+
291
+ ```jsx
292
+ <Sentry.Mask collapsable={false}>
293
+ <Text>Sensitive content</Text>
294
+ </Sentry.Mask>
295
+ ```
296
+
297
+ ---
298
+
299
+ ## Android: Screenshot Strategies
300
+
301
+ Requires SDK **7.5.0+**. Configured via `screenshotStrategy`:
302
+
303
+ | | `'pixelCopy'` (default) | `'canvas'` (experimental) |
304
+ | -------------------------- | ---------------------------- | -------------------------------------------------------- |
305
+ | **API** | Android PixelCopy API | Custom Canvas redraw |
306
+ | **Performance** | Lower overhead | Higher overhead |
307
+ | **Masking accuracy** | Can have pixel misalignments | Reliable, always correct |
308
+ | **Mask options respected** | ✅ Yes | ❌ **No — ignores all options; always masks everything** |
309
+ | **When to use** | Default; works for most apps | When masking misalignment is a concern |
310
+
311
+ ```javascript
312
+ Sentry.mobileReplayIntegration({
313
+ screenshotStrategy: "canvas", // or "pixelCopy" (default)
314
+ });
315
+ ```
316
+
317
+ > **Canvas caveat:** When `screenshotStrategy: "canvas"` is set, `maskAllText`,
318
+ > `maskAllImages`, `maskAllVectors`, and `Sentry.Unmask` are all **ignored**. Everything
319
+ > is always fully masked — no selective unmasking is possible.
320
+
321
+ ---
322
+
323
+ ## iOS: View Hierarchy Traversal
324
+
325
+ On iOS, the SDK traverses the native view hierarchy to capture screenshots.
326
+ Some custom or third-party view classes can cause crashes or artifacts during traversal.
327
+ Use these options (SDK **7.9.0+**) to control which classes are included:
328
+
329
+ ```javascript
330
+ Sentry.mobileReplayIntegration({
331
+ // Only traverse these specific native classes
332
+ includedViewClasses: ["UILabel", "UIView", "MyCustomView"],
333
+
334
+ // Never traverse these (even if listed in includedViewClasses)
335
+ excludedViewClasses: ["WKWebView", "UIWebView", "ThirdPartyVideoView"],
336
+ });
337
+ ```
338
+
339
+ **Priority:** `excludedViewClasses` always wins over `includedViewClasses`. Use
340
+ `excludedViewClasses` to exclude problematic classes one at a time rather than
341
+ rebuilding a full allowlist.
342
+
343
+ ---
344
+
345
+ ## iOS 26.0 / Liquid Glass — Critical Warning
346
+
347
+ > 🚨 **Potential PII leak on iOS 26.0+**
348
+ >
349
+ > Apple’s **Liquid Glass** rendering in iOS 26.0 introduces masking vulnerabilities —
350
+ > masked areas may be rendered through the glass effect, potentially revealing content
351
+ > that should be hidden.
352
+ > **Thoroughly test Session Replay on iOS 26+ before enabling in production.** Track the
353
+ > fix at [sentry-cocoa #6390](https://github.com/getsentry/sentry-cocoa/issues/6390).
354
+
355
+ ---
356
+
357
+ ## Touch / Gesture Recording
358
+
359
+ Touch interactions are recorded as **breadcrumb events** (discrete tap events), not raw
360
+ gesture streams. The replay UI overlays touch indicators at tap locations.
361
+
362
+ - **What’s captured:** Tap position, tapped view, timestamp
363
+ - **What’s NOT captured:** Swipe paths, gesture velocity, multi-touch sequences,
364
+ pressure
365
+ - **Display:** Touch indicators overlaid on the replay video at breadcrumb timestamps
366
+
367
+ ---
368
+
369
+ ## Network Request Capture
370
+
371
+ Network requests are **automatically captured** and displayed in the replay Network
372
+ panel. By default, only basic metadata is captured (URL, method, status, duration).
373
+ Starting with SDK **8.13.0+**, you can opt in to capturing request/response headers and
374
+ bodies.
375
+
376
+ ### Default Capture (all SDK versions)
377
+
378
+ | Captured automatically | Requires opt-in |
379
+ | --------------------------------- | ------------------------ |
380
+ | URL, HTTP method | Request/response bodies |
381
+ | Status code | Request/response headers |
382
+ | Request duration | |
383
+ | Failed requests (highlighted red) | |
384
+
385
+ ### Opt-In: Request/Response Headers and Bodies (SDK ≥8.13.0)
386
+
387
+ **Minimum SDK:** `@sentry/react-native` ≥ **8.13.0**\
388
+ **Protocol support:** XHR only (covers `axios` and most HTTP clients; native `fetch`
389
+ support coming in a future release)
390
+
391
+ Add these options to `mobileReplayIntegration()` to enrich allow-listed URLs with
392
+ headers and/or bodies:
393
+
394
+ ```javascript
395
+ Sentry.init({
396
+ dsn: "YOUR_DSN_HERE",
397
+ integrations: [
398
+ Sentry.mobileReplayIntegration({
399
+ // URLs to enrich with headers (and bodies, when networkCaptureBodies is true)
400
+ networkDetailAllowUrls: [
401
+ "api.example.com", // substring match
402
+ /^https:\/\/cdn\./, // regex match
403
+ ],
404
+
405
+ // URLs to never enrich, even if they match the allow list
406
+ networkDetailDenyUrls: [/\/auth\//],
407
+
408
+ // Capture request/response bodies for allow-listed URLs (default: true; set false to disable)
409
+ networkCaptureBodies: true,
410
+
411
+ // Extra request headers to capture (in addition to defaults)
412
+ networkRequestHeaders: ["X-My-Header"],
413
+
414
+ // Extra response headers to capture (in addition to defaults)
415
+ networkResponseHeaders: ["X-Response-Header"],
416
+ }),
417
+ ],
418
+ });
419
+ ```
420
+
421
+ | Option | Type | Default | Description |
422
+ | ------------------------ | ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------- |
423
+ | `networkDetailAllowUrls` | `(string \| RegExp)[]` | `[]` | URLs to enrich with headers (and bodies, when `networkCaptureBodies` is on). Strings use substring match; regexes use `.test(url)`. |
424
+ | `networkDetailDenyUrls` | `(string \| RegExp)[]` | `[]` | URLs to **never** enrich, even if they match the allow list. |
425
+ | `networkCaptureBodies` | `boolean` | `true` | Capture request/response bodies for allow-listed URLs. Set `false` to disable. |
426
+ | `networkRequestHeaders` | `string[]` | `[]` | Extra request headers to capture, in addition to the defaults (`Content-Type`, `Content-Length`, `Accept`). |
427
+ | `networkResponseHeaders` | `string[]` | `[]` | Extra response headers to capture, in addition to the defaults. |
428
+
429
+ **Privacy:**
430
+
431
+ - Authorization-like headers (`Authorization`, `Cookie`, `Set-Cookie`, `X-API-Key`,
432
+ `X-Auth-Token`, `Proxy-Authorization`) are **always stripped**, regardless of
433
+ configuration.
434
+ - Request/response bodies are truncated at **150 KB**.
435
+ - Binary payloads (`Blob`, `ArrayBuffer`, typed arrays) are replaced with a placeholder
436
+ (`UNPARSEABLE_BODY_TYPE` warning).
437
+ - Bodies and headers are PII-scrubbed server-side, but you should still be deliberate
438
+ about which URLs you allow-list.
439
+
440
+ ---
441
+
442
+ ## What the Replay UI Shows
443
+
444
+ | Panel | Content |
445
+ | --------------- | --------------------------------------------------------------------------------------------------------- |
446
+ | **Video** | Compressed screenshot sequence at ~1 fps |
447
+ | **Breadcrumbs** | User taps, navigation events, foreground/background transitions, battery/orientation/connectivity changes |
448
+ | **Timeline** | Scrubbable view with event markers and zoom |
449
+ | **Network** | All network requests; failed ones highlighted in red |
450
+ | **Console** | Custom logs, Logcat output (Android), Timber logs |
451
+ | **Errors** | All errors in the session linked to Sentry issues |
452
+ | **Tags** | OS version, device specs, release, user info, custom tags |
453
+ | **Trace** | All distributed traces occurring during the replay |
454
+
455
+ ---
456
+
457
+ ## Performance Overhead
458
+
459
+ Performance benchmarks on real production apps (Pocket Casts, release builds, 10
460
+ iterations).
461
+
462
+ ### iOS (iPhone 14 Pro)
463
+
464
+ | Metric | SDK Only | SDK + Replay | Delta |
465
+ | ----------------- | ---------- | ------------ | ---------- |
466
+ | FPS | 55 | 53 | **-2 fps** |
467
+ | Memory | 102 MB | 121 MB | **+19 MB** |
468
+ | CPU | 4% | 13% | **+9%** |
469
+ | Cold Startup | 1264.80 ms | 1265 ms | Negligible |
470
+ | Network Bandwidth | — | ~10 KB/s | — |
471
+
472
+ ### Android (Pixel 2XL)
473
+
474
+ | Metric | SDK Only | SDK + Replay | Delta |
475
+ | ----------------- | ---------- | ------------ | ---------- |
476
+ | FPS | 55 | 54 | **-1 fps** |
477
+ | Memory | 255 MB | 265 MB | **+10 MB** |
478
+ | CPU | 36% | 42% | **+6%** |
479
+ | Cold Startup | 1533.35 ms | 1539.55 ms | Negligible |
480
+ | Network Bandwidth | — | ~7 KB/s | — |
481
+
482
+ > ⚠️ **Older devices (iPhone 8 and earlier):** Replay can cause **visible scrolling
483
+ > stutter and dropped frames** during UI animations.
484
+ > Test on your minimum supported device before enabling.
485
+
486
+ ### Reducing Performance Impact
487
+
488
+ ```javascript
489
+ Sentry.init({
490
+ replaysSessionSampleRate: 0.05, // Lower session recording rate
491
+ replaysSessionQuality: "low", // ← Key setting for performance
492
+ replaysOnErrorSampleRate: 1.0, // Keep error capture at 100%
493
+ integrations: [Sentry.mobileReplayIntegration()],
494
+ });
495
+ ```
496
+
497
+ `replaysSessionQuality` options:
498
+
499
+ - `'low'` — Lower CPU, memory, and bandwidth; reduced screenshot fidelity
500
+ - `'medium'` (default) — Balanced
501
+ - `'high'` — Best fidelity; highest resource usage
502
+
503
+ ---
504
+
505
+ ## Session Lifecycle
506
+
507
+ | Event | Effect |
508
+ | ----------------------------------------------- | ----------------------------------------- |
509
+ | SDK initializes / app enters foreground | New session starts |
510
+ | App goes to background | Session pauses |
511
+ | App returns to foreground within **30 seconds** | Same session continues (same `replay_id`) |
512
+ | App returns to foreground after **30+ seconds** | New session starts |
513
+ | Session reaches **60 minutes** | Session terminates |
514
+ | App crashes / closes in background | Session terminates abnormally |
515
+
516
+ ---
517
+
518
+ ## Offline Support
519
+
520
+ | Mode | Offline Support |
521
+ | -------------------------- | -------------------------------------------------- |
522
+ | `replaysOnErrorSampleRate` | ✅ Segments stored to disk, sent on reconnect |
523
+ | `replaysSessionSampleRate` | ❌ Not supported — session replays require network |
524
+
525
+ ---
526
+
527
+ ## Error Coverage
528
+
529
+ Session Replay links replays to all error types:
530
+
531
+ - ✅ Handled exceptions
532
+ - ✅ Unhandled exceptions
533
+ - ✅ ANRs (App Not Responding) / App Hangs
534
+ - ✅ Native (NDK) crashes
535
+
536
+ ---
537
+
538
+ ## Expo Compatibility
539
+
540
+ `mobileReplayIntegration()` uses native modules for screenshot capture and the
541
+ `Mask`/`Unmask` components.
542
+
543
+ | Environment | Replay Support |
544
+ | ------------------------------- | -------------------------------------------------------- |
545
+ | **Expo Go** | ❌ Native modules not supported — replay will not work |
546
+ | **Expo with `expo-dev-client`** | ✅ Supported — development builds include native modules |
547
+ | **EAS Build** | ✅ Fully supported |
548
+ | **Expo bare workflow** | ✅ Fully supported |
549
+
550
+ For managed Expo workflow, use `expo-dev-client` or EAS Build — not Expo Go.
551
+
552
+ ---
553
+
554
+ ## Metro Config — Component Names in Replay UI
555
+
556
+ Enable human-readable React component names in the replay UI (shows `<ProfileCard>`
557
+ instead of `<View>`):
558
+
559
+ ```js
560
+ // metro.config.js
561
+ const { getDefaultConfig } = require("@react-native/metro-config");
562
+ const { withSentryConfig } = require("@sentry/react-native/metro");
563
+
564
+ module.exports = withSentryConfig(getDefaultConfig(__dirname), {
565
+ annotateReactComponents: true,
566
+ });
567
+ ```
568
+
569
+ This works with Hermes builds.
570
+ The annotation happens at the native layer, not the JS thread.
571
+
572
+ ---
573
+
574
+ ## Known Limitations vs. Web Replay
575
+
576
+ | Capability | Web Replay | Mobile Replay |
577
+ | ---------------------------- | ---------------------------- | -------------------------------------------- |
578
+ | Recording fidelity | DOM-exact reproduction | Screenshot video (~1 fps) |
579
+ | Text in replay | ✅ Selectable, searchable | ❌ Pixel-only |
580
+ | CSS inspection | ✅ | ❌ |
581
+ | Rage click detection | ✅ | ❌ (taps only) |
582
+ | Scroll positions | ✅ Precise | ⚠️ Approximate |
583
+ | Offline session recording | ✅ | ❌ (error mode only) |
584
+ | Canvas / WebGL | ✅ | ⚠️ Captured as screenshot |
585
+ | Network request bodies | ✅ Optional | ✅ Captured for allow-listed URLs (XHR only) |
586
+ | Unmask → nested children | ✅ All descendants | ⚠️ Direct children only |
587
+ | View Flattening interference | N/A | ⚠️ Can remove Mask/Unmask wrappers |
588
+ | iOS 26.0 Liquid Glass | N/A | ⚠️ Potential PII leak (unfixed) |
589
+ | Android canvas strategy | N/A | ⚠️ Forces all-masked (experimental) |
590
+ | Lazy loading | ✅ `Sentry.addIntegration()` | ❌ Must be in `Sentry.init()` |
591
+ | DOM mutation tracking | ✅ | ❌ Screenshot-based only |
592
+
593
+ ---
594
+
595
+ ## Production-Ready Setup Example
596
+
597
+ ```javascript
598
+ // App entry point (App.tsx / _layout.tsx)
599
+ import * as Sentry from "@sentry/react-native";
600
+
601
+ Sentry.init({
602
+ dsn: "YOUR_DSN_HERE",
603
+
604
+ // Replay sampling
605
+ replaysSessionSampleRate: 0.05, // 5% of all sessions
606
+ replaysOnErrorSampleRate: 1.0, // 100% of error sessions
607
+ replaysSessionQuality: "medium", // 'low' | 'medium' | 'high'
608
+
609
+ integrations: [
610
+ Sentry.mobileReplayIntegration({
611
+ // Privacy — defaults shown explicitly for clarity
612
+ maskAllText: true,
613
+ maskAllImages: true,
614
+ maskAllVectors: true,
615
+
616
+ // Android screenshot strategy (SDK 7.5.0+)
617
+ screenshotStrategy: "pixelCopy", // or 'canvas' (experimental, always masks)
618
+
619
+ // iOS view traversal safety (SDK 7.9.0+)
620
+ excludedViewClasses: ["WKWebView", "UIWebView"],
621
+
622
+ // Selective replay — only for unhandled errors
623
+ beforeErrorSampling: (event, hint) => {
624
+ const isHandled = event.exception?.values?.some((exc) => exc.mechanism?.handled === true);
625
+ return !isHandled;
626
+ },
627
+ }),
628
+ ],
629
+ });
630
+ ```
631
+
632
+ ```jsx
633
+ // Fine-grained masking in screens
634
+ import * as Sentry from "@sentry/react-native";
635
+
636
+ const PaymentScreen = () => (
637
+ <View>
638
+ {/* Unmask non-sensitive summary info */}
639
+ <Sentry.Unmask>
640
+ <Text>Order Summary</Text>
641
+ <Text>Total: $42.00</Text>
642
+ </Sentry.Unmask>
643
+
644
+ {/* Always mask payment details */}
645
+ <Sentry.Mask>
646
+ <TextInput placeholder="Card number" />
647
+ <TextInput placeholder="CVV" />
648
+ <Text>Billing address...</Text>
649
+ </Sentry.Mask>
650
+ </View>
651
+ );
652
+ ```
653
+
654
+ ```js
655
+ // metro.config.js — human-readable component names in replay UI
656
+ const { getDefaultConfig } = require("@react-native/metro-config");
657
+ const { withSentryConfig } = require("@sentry/react-native/metro");
658
+
659
+ module.exports = withSentryConfig(getDefaultConfig(__dirname), {
660
+ annotateReactComponents: true,
661
+ });
662
+ ```
663
+
664
+ ---
665
+
666
+ ## Quick Reference
667
+
668
+ ```
669
+ Minimum RN SDK: 6.5.0
670
+ Recording method: Screenshots (~1 fps), NOT DOM recording
671
+ Pre-error buffer: 60 seconds
672
+ Session timeout: 30s background / 60 min max
673
+ Offline support: Error mode only
674
+ Default masking: ALL text, images, vectors, webviews — fully masked
675
+ Unmask scope: Direct children only (not descendants)
676
+ Mask priority: Always wins — Unmask cannot override
677
+ View flattening: Can silently remove Mask/Unmask — test thoroughly!
678
+ Android strategies: pixelCopy (default) | canvas (experimental, always-masks)
679
+ iOS view safety: excludedViewClasses / includedViewClasses (SDK 7.9.0+)
680
+ iOS 26 warning: Liquid Glass masking bug — test before production!
681
+ Component names: metro.config.js → annotateReactComponents: true
682
+ Quality setting: low | medium (default) | high
683
+ Expo Go: ❌ Not supported — use expo-dev-client or EAS Build
684
+ ```
685
+
686
+ ---
687
+
688
+ ## Troubleshooting
689
+
690
+ | Issue | Solution |
691
+ | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
692
+ | Replay not recording at all | Verify `mobileReplayIntegration()` is in the `integrations` array in `Sentry.init()` and sample rates are > 0 |
693
+ | All content masked even after setting `maskAllText: false` | Check SDK version ≥ 5.36.0 / 6.3.0+. If using manually initialized native SDK, requires 6.15.1+ (Cocoa 8.52.1+) |
694
+ | `Sentry.Mask` / `Sentry.Unmask` not working | Requires SDK 6.4.0-beta.1+. Also check for React Native View Flattening — add `collapsable={false}` to wrapper |
695
+ | Sensitive data visible despite masking | View Flattening may have removed `Mask` wrappers. Verify wrapper appears in native view hierarchy. Use `collapsable={false}` |
696
+ | Replay works in debug but not production | Confirm sample rates in production config; check DSN is correct for environment |
697
+ | Expo Go — replay not working | Expected — native modules not supported in Expo Go. Use `expo-dev-client` or EAS Build |
698
+ | Android: masking visually misaligned | Try `screenshotStrategy: "canvas"` — more accurate but everything becomes masked |
699
+ | iOS: crash during replay capture | A native class is causing traversal issues. Add it to `excludedViewClasses` (SDK 7.9.0+) |
700
+ | High CPU / memory on older devices | Set `replaysSessionQuality: "low"` and lower `replaysSessionSampleRate`. Disable on affected device models if needed |
701
+ | Pre-error buffer not appearing | Check available memory — the rolling 60-second buffer is held in RAM. Low-memory devices may truncate it |
702
+ | iOS 26: masked content visible through UI | Known Liquid Glass bug — disable Session Replay on iOS 26+ until [sentry-cocoa #6390](https://github.com/getsentry/sentry-cocoa/issues/6390) is resolved |
703
+ | Error replay count differs from issue count | Expected — rate limiting, manual deletions, or network failures can cause discrepancies |
704
+ | `beforeErrorSampling` not being called | Confirm `replaysOnErrorSampleRate` > 0; the callback only fires when error sampling is active |