@danieljvdm/dev-kit 1.0.1 → 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 (330) hide show
  1. package/README.md +6 -6
  2. package/package.json +1 -1
  3. package/skill-sources.jsonc +6 -29
  4. package/skill-sources.lock.json +23 -109
  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 +11 -115
  45. package/skills/open-pull-request/agents/openai.yaml +3 -3
  46. package/skills/open-pull-request/references/evidence.md +22 -0
  47. package/skills/open-pull-request/references/explanation.md +21 -0
  48. package/skills/open-pull-request/references/publication.md +21 -0
  49. package/skills/sentry/LICENSE +202 -0
  50. package/skills/sentry/LICENSE-UPSTREAM +21 -0
  51. package/skills/sentry/NOTICE +14 -0
  52. package/skills/sentry/SKILL.md +33 -0
  53. package/skills/sentry/references/alert-payloads.md +105 -0
  54. package/skills/sentry/references/alerts.md +17 -0
  55. package/skills/sentry/references/artifacts.md +25 -0
  56. package/skills/sentry/references/auth-token.md +65 -0
  57. package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
  58. package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
  59. package/skills/sentry/references/concepts/crons.md +50 -0
  60. package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
  61. package/skills/sentry/references/concepts/errors.md +40 -0
  62. package/skills/sentry/references/concepts/logging.md +85 -0
  63. package/skills/sentry/references/concepts/metrics.md +49 -0
  64. package/skills/sentry/references/concepts/monitors.md +78 -0
  65. package/skills/sentry/references/concepts/profiling.md +38 -0
  66. package/skills/sentry/references/concepts/reduce-volume.md +49 -0
  67. package/skills/sentry/references/concepts/releases.md +43 -0
  68. package/skills/sentry/references/concepts/session-replay.md +35 -0
  69. package/skills/sentry/references/concepts/tracing.md +54 -0
  70. package/skills/sentry/references/concepts/user-feedback.md +36 -0
  71. package/skills/sentry/references/debug-artifacts/android.md +68 -0
  72. package/skills/sentry/references/debug-artifacts/apple.md +96 -0
  73. package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
  74. package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
  75. package/skills/sentry/references/debug-artifacts/index.md +75 -0
  76. package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
  77. package/skills/sentry/references/debug-artifacts/matching.md +73 -0
  78. package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
  79. package/skills/sentry/references/first-error-setup.md +25 -0
  80. package/skills/sentry/references/instrumentation.md +30 -0
  81. package/skills/sentry/references/issues.md +32 -0
  82. package/skills/sentry/references/new-project.md +17 -0
  83. package/skills/sentry/references/otel-exporter.md +30 -0
  84. package/skills/sentry/references/release-workflow.md +31 -0
  85. package/skills/sentry/references/releases/ci-pipeline.md +214 -0
  86. package/skills/sentry/references/releases/index.md +93 -0
  87. package/skills/sentry/references/releases/suspect-commits.md +155 -0
  88. package/skills/sentry/references/releases/tagging.md +131 -0
  89. package/skills/sentry/references/releases/troubleshooting.md +67 -0
  90. package/skills/sentry/references/sdks/android/crons.md +305 -0
  91. package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
  92. package/skills/sentry/references/sdks/android/index.md +748 -0
  93. package/skills/sentry/references/sdks/android/integrations.md +48 -0
  94. package/skills/sentry/references/sdks/android/logging.md +374 -0
  95. package/skills/sentry/references/sdks/android/metrics.md +288 -0
  96. package/skills/sentry/references/sdks/android/profiling.md +397 -0
  97. package/skills/sentry/references/sdks/android/session-replay.md +406 -0
  98. package/skills/sentry/references/sdks/android/tracing.md +861 -0
  99. package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
  100. package/skills/sentry/references/sdks/browser/index.md +714 -0
  101. package/skills/sentry/references/sdks/browser/logging.md +315 -0
  102. package/skills/sentry/references/sdks/browser/profiling.md +236 -0
  103. package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
  104. package/skills/sentry/references/sdks/browser/tracing.md +561 -0
  105. package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
  106. package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
  107. package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
  108. package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
  109. package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
  110. package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
  111. package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
  112. package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
  113. package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
  114. package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
  115. package/skills/sentry/references/sdks/cocoa/index.md +497 -0
  116. package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
  117. package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
  118. package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
  119. package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
  120. package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
  121. package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
  122. package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
  123. package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
  124. package/skills/sentry/references/sdks/dotnet/index.md +614 -0
  125. package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
  126. package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
  127. package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
  128. package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
  129. package/skills/sentry/references/sdks/elixir/crons.md +371 -0
  130. package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
  131. package/skills/sentry/references/sdks/elixir/index.md +383 -0
  132. package/skills/sentry/references/sdks/elixir/logging.md +239 -0
  133. package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
  134. package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
  135. package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
  136. package/skills/sentry/references/sdks/flutter/index.md +728 -0
  137. package/skills/sentry/references/sdks/flutter/logging.md +387 -0
  138. package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
  139. package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
  140. package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
  141. package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
  142. package/skills/sentry/references/sdks/go/crons.md +270 -0
  143. package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
  144. package/skills/sentry/references/sdks/go/index.md +324 -0
  145. package/skills/sentry/references/sdks/go/logging.md +354 -0
  146. package/skills/sentry/references/sdks/go/metrics.md +273 -0
  147. package/skills/sentry/references/sdks/go/profiling.md +46 -0
  148. package/skills/sentry/references/sdks/go/tracing.md +366 -0
  149. package/skills/sentry/references/sdks/index.md +41 -0
  150. package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
  151. package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
  152. package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
  153. package/skills/sentry/references/sdks/nestjs/index.md +699 -0
  154. package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
  155. package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
  156. package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
  157. package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
  158. package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
  159. package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
  160. package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
  161. package/skills/sentry/references/sdks/nextjs/index.md +491 -0
  162. package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
  163. package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
  164. package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
  165. package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
  166. package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
  167. package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
  168. package/skills/sentry/references/sdks/node/crons.md +432 -0
  169. package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
  170. package/skills/sentry/references/sdks/node/index.md +942 -0
  171. package/skills/sentry/references/sdks/node/logging.md +380 -0
  172. package/skills/sentry/references/sdks/node/metrics.md +278 -0
  173. package/skills/sentry/references/sdks/node/profiling.md +373 -0
  174. package/skills/sentry/references/sdks/node/tracing.md +878 -0
  175. package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
  176. package/skills/sentry/references/sdks/php/crons.md +265 -0
  177. package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
  178. package/skills/sentry/references/sdks/php/index.md +362 -0
  179. package/skills/sentry/references/sdks/php/laravel.md +542 -0
  180. package/skills/sentry/references/sdks/php/logging.md +242 -0
  181. package/skills/sentry/references/sdks/php/metrics.md +193 -0
  182. package/skills/sentry/references/sdks/php/profiling.md +115 -0
  183. package/skills/sentry/references/sdks/php/symfony.md +552 -0
  184. package/skills/sentry/references/sdks/php/tracing.md +516 -0
  185. package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
  186. package/skills/sentry/references/sdks/python/crons.md +218 -0
  187. package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
  188. package/skills/sentry/references/sdks/python/index.md +361 -0
  189. package/skills/sentry/references/sdks/python/logging.md +234 -0
  190. package/skills/sentry/references/sdks/python/metrics.md +154 -0
  191. package/skills/sentry/references/sdks/python/profiling.md +120 -0
  192. package/skills/sentry/references/sdks/python/tracing.md +364 -0
  193. package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
  194. package/skills/sentry/references/sdks/react/index.md +492 -0
  195. package/skills/sentry/references/sdks/react/logging.md +364 -0
  196. package/skills/sentry/references/sdks/react/profiling.md +322 -0
  197. package/skills/sentry/references/sdks/react/react-features.md +1272 -0
  198. package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
  199. package/skills/sentry/references/sdks/react/tracing.md +1415 -0
  200. package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
  201. package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
  202. package/skills/sentry/references/sdks/react-native/index.md +1030 -0
  203. package/skills/sentry/references/sdks/react-native/logging.md +444 -0
  204. package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
  205. package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
  206. package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
  207. package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
  208. package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
  209. package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
  210. package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
  211. package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
  212. package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
  213. package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
  214. package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
  215. package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
  216. package/skills/sentry/references/sdks/ruby/crons.md +184 -0
  217. package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
  218. package/skills/sentry/references/sdks/ruby/index.md +297 -0
  219. package/skills/sentry/references/sdks/ruby/logging.md +168 -0
  220. package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
  221. package/skills/sentry/references/sdks/ruby/migration.md +321 -0
  222. package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
  223. package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
  224. package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
  225. package/skills/sentry/references/sdks/svelte/index.md +467 -0
  226. package/skills/sentry/references/sdks/svelte/logging.md +344 -0
  227. package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
  228. package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
  229. package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
  230. package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
  231. package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
  232. package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
  233. package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
  234. package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
  235. package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
  236. package/skills/sentry/references/search-query-language.md +226 -0
  237. package/skills/sentry/references/semantics/angular.md +7 -0
  238. package/skills/sentry/references/semantics/app.md +28 -0
  239. package/skills/sentry/references/semantics/art.md +17 -0
  240. package/skills/sentry/references/semantics/aws.md +43 -0
  241. package/skills/sentry/references/semantics/browser.md +34 -0
  242. package/skills/sentry/references/semantics/cache.md +12 -0
  243. package/skills/sentry/references/semantics/client.md +8 -0
  244. package/skills/sentry/references/semantics/cloud.md +12 -0
  245. package/skills/sentry/references/semantics/cloudflare.md +23 -0
  246. package/skills/sentry/references/semantics/code.md +11 -0
  247. package/skills/sentry/references/semantics/culture.md +11 -0
  248. package/skills/sentry/references/semantics/db.md +21 -0
  249. package/skills/sentry/references/semantics/device.md +43 -0
  250. package/skills/sentry/references/semantics/error.md +7 -0
  251. package/skills/sentry/references/semantics/event.md +8 -0
  252. package/skills/sentry/references/semantics/exception.md +10 -0
  253. package/skills/sentry/references/semantics/faas.md +19 -0
  254. package/skills/sentry/references/semantics/file.md +8 -0
  255. package/skills/sentry/references/semantics/flag.md +7 -0
  256. package/skills/sentry/references/semantics/gcp.md +16 -0
  257. package/skills/sentry/references/semantics/gen_ai.md +53 -0
  258. package/skills/sentry/references/semantics/general.md +11 -0
  259. package/skills/sentry/references/semantics/graphql.md +9 -0
  260. package/skills/sentry/references/semantics/grpc.md +19 -0
  261. package/skills/sentry/references/semantics/http.md +34 -0
  262. package/skills/sentry/references/semantics/index.md +63 -0
  263. package/skills/sentry/references/semantics/jsonrpc.md +8 -0
  264. package/skills/sentry/references/semantics/jvm.md +12 -0
  265. package/skills/sentry/references/semantics/koa.md +7 -0
  266. package/skills/sentry/references/semantics/logger.md +7 -0
  267. package/skills/sentry/references/semantics/mcp.md +37 -0
  268. package/skills/sentry/references/semantics/mdc.md +7 -0
  269. package/skills/sentry/references/semantics/messaging.md +23 -0
  270. package/skills/sentry/references/semantics/middleware.md +7 -0
  271. package/skills/sentry/references/semantics/navigation.md +9 -0
  272. package/skills/sentry/references/semantics/nel.md +11 -0
  273. package/skills/sentry/references/semantics/network.md +17 -0
  274. package/skills/sentry/references/semantics/os.md +15 -0
  275. package/skills/sentry/references/semantics/otel.md +10 -0
  276. package/skills/sentry/references/semantics/params.md +7 -0
  277. package/skills/sentry/references/semantics/process.md +14 -0
  278. package/skills/sentry/references/semantics/react.md +7 -0
  279. package/skills/sentry/references/semantics/remix.md +7 -0
  280. package/skills/sentry/references/semantics/resource.md +7 -0
  281. package/skills/sentry/references/semantics/rpc.md +10 -0
  282. package/skills/sentry/references/semantics/score.md +10 -0
  283. package/skills/sentry/references/semantics/sentry.md +69 -0
  284. package/skills/sentry/references/semantics/server.md +8 -0
  285. package/skills/sentry/references/semantics/service.md +8 -0
  286. package/skills/sentry/references/semantics/session.md +7 -0
  287. package/skills/sentry/references/semantics/state.md +7 -0
  288. package/skills/sentry/references/semantics/thread.md +8 -0
  289. package/skills/sentry/references/semantics/timber.md +7 -0
  290. package/skills/sentry/references/semantics/trpc.md +8 -0
  291. package/skills/sentry/references/semantics/ui.md +18 -0
  292. package/skills/sentry/references/semantics/url.md +15 -0
  293. package/skills/sentry/references/semantics/user.md +17 -0
  294. package/skills/sentry/references/semantics/user_agent.md +7 -0
  295. package/skills/sentry/references/semantics/vercel.md +42 -0
  296. package/skills/sentry/references/setup-verification.md +39 -0
  297. package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
  298. package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
  299. package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
  300. package/skills/sentry/references/snapshots/index.md +19 -0
  301. package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
  302. package/skills/sentry/references/snapshots/snapshots.md +123 -0
  303. package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
  304. package/skills/testing/LICENSE +21 -0
  305. package/skills/testing/NOTICE +7 -0
  306. package/skills/testing/SKILL.md +13 -19
  307. package/skills/testing/agents/openai.yaml +1 -2
  308. package/skills/testing/references/selection.md +23 -0
  309. package/skills/testing/references/tdd.md +19 -0
  310. package/skills/testing/references/test-design.md +17 -0
  311. package/src/catalog.ts +1 -7
  312. package/skills/build-effect-apis/SKILL.md +0 -81
  313. package/skills/build-effect-apis/agents/openai.yaml +0 -4
  314. package/skills/build-effect-clis/SKILL.md +0 -92
  315. package/skills/build-effect-clis/agents/openai.yaml +0 -4
  316. package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
  317. package/skills/effect-atom-state/SKILL.md +0 -97
  318. package/skills/effect-atom-state/agents/openai.yaml +0 -4
  319. package/skills/effect-ts/SKILL.md +0 -35
  320. package/skills/effect-ts/agents/openai.yaml +0 -4
  321. /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
  322. /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
  323. /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
  324. /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
  325. /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
  326. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
  327. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
  328. /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
  329. /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
  330. /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
@@ -0,0 +1,800 @@
1
+ # Error Monitoring & Crash Reporting — Sentry Android SDK
2
+
3
+ > **Minimum SDK:** `io.sentry:sentry-android` ≥ 7.0.0 (≥ 8.0.0 recommended) **NDK
4
+ > support:** `io.sentry:sentry-android-ndk` (included in `sentry-android` BOM)
5
+ > **Languages:** Kotlin and Java — all examples in Kotlin with Java equivalents where
6
+ > they differ
7
+
8
+ Android error monitoring covers three crash layers: **Java/Kotlin exceptions** (JVM),
9
+ **ANR (Application Not Responding)** events, and **native C/C++ crashes** via NDK. All
10
+ three are handled automatically after initialization.
11
+
12
+ ---
13
+
14
+ ## Table of Contents
15
+
16
+ 1. [Core Capture APIs](#1-core-capture-apis)
17
+ 2. [Automatic Crash Handling](#2-automatic-crash-handling)
18
+ 3. [ANR Detection](#3-anr-detection)
19
+ 4. [NDK / Native Crash Capture](#4-ndk--native-crash-capture)
20
+ 5. [Scope Management](#5-scope-management)
21
+ 6. [Context Enrichment — Tags, User, Breadcrumbs](#6-context-enrichment--tags-user-breadcrumbs)
22
+ 7. [Event Filtering — beforeSend, beforeBreadcrumb](#7-event-filtering--beforesend-beforebreadcrumb)
23
+ 8. [Fingerprinting & Grouping](#8-fingerprinting--grouping)
24
+ 9. [Attachments — Screenshots & View Hierarchy](#9-attachments--screenshots--view-hierarchy)
25
+ 10. [Release Health & Sessions](#10-release-health--sessions)
26
+ 11. [Configuration Reference](#11-configuration-reference)
27
+ 12. [Troubleshooting](#12-troubleshooting)
28
+
29
+ ---
30
+
31
+ ## 1. Core Capture APIs
32
+
33
+ All methods are static on `io.sentry.Sentry`. Returns a `SentryId` that can be
34
+ referenced for user feedback.
35
+
36
+ ### `Sentry.captureException()`
37
+
38
+ ```kotlin
39
+ import io.sentry.Sentry
40
+ import io.sentry.SentryLevel
41
+
42
+ // Basic capture
43
+ try {
44
+ aMethodThatMightFail()
45
+ } catch (e: Exception) {
46
+ Sentry.captureException(e)
47
+ }
48
+
49
+ // With local scope (applies only to this event)
50
+ try {
51
+ processPayment(order)
52
+ } catch (e: Exception) {
53
+ Sentry.captureException(e) { scope ->
54
+ scope.setTag("component", "payment")
55
+ scope.setLevel(SentryLevel.FATAL)
56
+ scope.setTransaction("CheckoutFlow")
57
+ }
58
+ }
59
+ ```
60
+
61
+ Java equivalent:
62
+
63
+ ```java
64
+ Sentry.captureException(e, scope -> {
65
+ scope.setTag("component", "payment");
66
+ scope.setLevel(SentryLevel.FATAL);
67
+ });
68
+ ```
69
+
70
+ ### `Sentry.captureMessage()`
71
+
72
+ ```kotlin
73
+ // Default level is INFO
74
+ Sentry.captureMessage("User completed onboarding")
75
+
76
+ // Explicit level: DEBUG | INFO | WARNING | ERROR | FATAL
77
+ Sentry.captureMessage("Payment provider unreachable", SentryLevel.WARNING)
78
+ Sentry.captureMessage("Database connection pool exhausted", SentryLevel.FATAL)
79
+ ```
80
+
81
+ ### `Sentry.captureEvent()`
82
+
83
+ For fully constructed `SentryEvent` objects — advanced use cases:
84
+
85
+ ```kotlin
86
+ import io.sentry.SentryEvent
87
+ import io.sentry.protocol.Message
88
+
89
+ val event = SentryEvent()
90
+ event.level = SentryLevel.WARNING
91
+ val msg = Message()
92
+ msg.message = "Custom structured event"
93
+ event.message = msg
94
+ event.setTag("build_type", BuildConfig.BUILD_TYPE)
95
+ Sentry.captureEvent(event)
96
+ ```
97
+
98
+ ### `Sentry.captureUserFeedback()`
99
+
100
+ ```kotlin
101
+ import io.sentry.UserFeedback
102
+
103
+ val feedback = UserFeedback(Sentry.lastEventId)
104
+ feedback.name = "Jane Smith"
105
+ feedback.email = "jane@example.com"
106
+ feedback.comments = "The app froze when I tapped the submit button."
107
+ Sentry.captureUserFeedback(feedback)
108
+ ```
109
+
110
+ ### Error Levels
111
+
112
+ | Level | Android use case |
113
+ | --------- | ------------------------------------ |
114
+ | `FATAL` | App crash, unrecoverable state |
115
+ | `ERROR` | Feature broken, user action failed |
116
+ | `WARNING` | Degraded state, non-critical failure |
117
+ | `INFO` | Informational, notable events |
118
+ | `DEBUG` | Development diagnostics |
119
+
120
+ ---
121
+
122
+ ## 2. Automatic Crash Handling
123
+
124
+ The SDK installs `UncaughtExceptionHandlerIntegration` at init time, which wraps
125
+ `Thread.defaultUncaughtExceptionHandler`.
126
+
127
+ ### How it works
128
+
129
+ ```
130
+ Unhandled exception thrown
131
+
132
+
133
+ UncaughtExceptionHandlerIntegration.uncaughtException()
134
+ ├── wraps throwable in ExceptionMechanismException (mechanism: "AppExitReason")
135
+ ├── creates SentryEvent at FATAL level
136
+ ├── captures event and BLOCKS until flushed to disk
137
+ └── calls original defaultUncaughtExceptionHandler (re-throws to Android runtime)
138
+ ```
139
+
140
+ Crashes are persisted to disk immediately and transmitted on the **next app launch**.
141
+ This ensures crash data is never lost even when the process dies.
142
+
143
+ ### Startup crash handling
144
+
145
+ If the app crashes within ~2 seconds of SDK init, `SentryAndroid.init()` blocks for up
146
+ to 5 seconds to flush the crash before the process exits:
147
+
148
+ ```kotlin
149
+ SentryAndroid.init(this) { options ->
150
+ options.startupCrashFlushTimeoutMillis = 5_000L // default: 5 s
151
+ }
152
+ ```
153
+
154
+ ### Disable uncaught exception handler
155
+
156
+ ```kotlin
157
+ options.isEnableUncaughtExceptionHandler = false
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 3. ANR Detection
163
+
164
+ ANR (Application Not Responding) events fire when the main thread is blocked for more
165
+ than 5 seconds.
166
+
167
+ ### How it works
168
+
169
+ `AnrIntegration` runs a watchdog thread (`ANRWatchDog`) that posts a `Runnable` to the
170
+ main `Looper` every 500 ms.
171
+ If the main thread hasn’t processed the runnable within `anrTimeoutIntervalMillis`, an
172
+ ANR event is reported.
173
+
174
+ ```
175
+ ANRWatchDog (background thread)
176
+ ├── Posts Runnable to MainLooper every 500 ms
177
+ └── If (now - lastResponseTime) > anrTimeoutIntervalMillis
178
+ → Captures ANR event with mechanism type "ANR"
179
+ → Background ANRs use mechanism "anr_background"
180
+ ```
181
+
182
+ ### Configuration
183
+
184
+ ```kotlin
185
+ SentryAndroid.init(this) { options ->
186
+ options.isAnrEnabled = true // default: true
187
+ options.anrTimeoutIntervalMillis = 5_000L // default: 5000 ms
188
+ options.isAnrReportInDebug = false // default: false (suppress during development)
189
+ options.isAttachAnrThreadDump = true // attach thread dump as text attachment
190
+ }
191
+ ```
192
+
193
+ Via `AndroidManifest.xml`:
194
+
195
+ ```xml
196
+ <meta-data android:name="io.sentry.anr.enable" android:value="true" />
197
+ <meta-data android:name="io.sentry.anr.timeout-interval-millis" android:value="5000" />
198
+ <meta-data android:name="io.sentry.anr.report-debug" android:value="false" />
199
+ ```
200
+
201
+ ### ANR v2 — ApplicationExitInfo (Android 11+)
202
+
203
+ On API 30+, the SDK reads `ActivityManager.getHistoricalProcessExitReasons()` to report
204
+ ANRs from the previous app run that the watchdog couldn’t capture in real-time:
205
+
206
+ ```kotlin
207
+ options.isReportHistoricalAnrs = true // default: false — report previous-run ANRs
208
+ ```
209
+
210
+ ---
211
+
212
+ ## 4. NDK / Native Crash Capture
213
+
214
+ Native crashes (SIGSEGV, SIGABRT, C++ exceptions) are captured by `sentry-android-ndk`,
215
+ which wraps the `sentry-native` C SDK.
216
+
217
+ ### Dependency
218
+
219
+ ```kotlin
220
+ // build.gradle.kts — included automatically with the BOM
221
+ dependencies {
222
+ implementation(platform("io.sentry:sentry-bom:8.33.0"))
223
+ implementation("io.sentry:sentry-android") // includes ndk
224
+ }
225
+ ```
226
+
227
+ ### How it works
228
+
229
+ 1. `SentryNdk.init()` loads native libs on a background thread (2 s timeout)
230
+ 2. Registers native signal handlers via `sentry-native`
231
+ 3. On crash: writes crash report to disk
232
+ 4. On next app launch: `sentry-android-core` reads and transmits the report
233
+
234
+ ### NDK Scope Sync
235
+
236
+ Java scope changes (user, tags, breadcrumbs) are propagated to the native layer so NDK
237
+ crashes include the same context as Java events:
238
+
239
+ ```kotlin
240
+ options.isEnableScopeSync = true // default: true
241
+ ```
242
+
243
+ ### Native tombstones (Android 11+)
244
+
245
+ ```kotlin
246
+ options.isTombstoneEnabled = true // report native tombstones via ApplicationExitInfo
247
+ ```
248
+
249
+ Via manifest:
250
+
251
+ ```xml
252
+ <meta-data android:name="io.sentry.tombstone.enable" android:value="true" />
253
+ ```
254
+
255
+ ### Disable NDK
256
+
257
+ ```kotlin
258
+ options.isEnableNdk = false
259
+ ```
260
+
261
+ ---
262
+
263
+ ## 5. Scope Management
264
+
265
+ Sentry uses a three-layer scope hierarchy.
266
+ Data merges in order: **Global → Isolation → Current** (current takes precedence for
267
+ single-value fields).
268
+
269
+ | Scope | Lifespan | How to access |
270
+ | ------------- | ------------------- | --------------------------------------------- |
271
+ | **Global** | Entire app lifetime | `Sentry.configureScope(ScopeType.GLOBAL) { }` |
272
+ | **Isolation** | Per-request/session | `Sentry.configureScope { }` (default) |
273
+ | **Current** | Block-level | `Sentry.withScope { }` |
274
+
275
+ ### `Sentry.configureScope()` — persist across events
276
+
277
+ ```kotlin
278
+ import io.sentry.Sentry
279
+ import io.sentry.protocol.User
280
+
281
+ // Set data for all subsequent events in this session
282
+ Sentry.configureScope { scope ->
283
+ scope.setTag("app.variant", BuildConfig.FLAVOR)
284
+
285
+ val user = User().apply {
286
+ id = "42"
287
+ email = "jane@example.com"
288
+ username = "jane_doe"
289
+ }
290
+ scope.setUser(user)
291
+ }
292
+
293
+ // Clear user on logout
294
+ Sentry.configureScope { scope ->
295
+ scope.setUser(null)
296
+ }
297
+ ```
298
+
299
+ ### `Sentry.withScope()` — temporary, discarded after block
300
+
301
+ ```kotlin
302
+ // Tags/context here do NOT affect events outside this block
303
+ Sentry.withScope { scope ->
304
+ scope.setTag("transaction_id", orderId)
305
+ scope.setLevel(SentryLevel.WARNING)
306
+ Sentry.captureMessage("Order processing failed")
307
+ }
308
+ // scope is discarded — subsequent events are unaffected
309
+ ```
310
+
311
+ ### `Sentry.pushScope()` — try-with-resources (Java)
312
+
313
+ ```java
314
+ try (ISentryLifecycleToken ignored = Sentry.pushScope()) {
315
+ Sentry.configureScope(scope -> scope.setTag("local", "value"));
316
+ Sentry.captureMessage("Event with local tag");
317
+ } // scope is automatically popped
318
+ ```
319
+
320
+ ### Shorthand static methods
321
+
322
+ ```kotlin
323
+ Sentry.setUser(user) // → configureScope { scope.setUser(user) }
324
+ Sentry.setTag("key", "value") // → configureScope { scope.setTag(...) }
325
+ Sentry.removeTag("key")
326
+ Sentry.setExtra("key", "value") // deprecated — use setContexts
327
+ Sentry.setFingerprint(listOf("my-key"))
328
+ Sentry.setTransaction("CheckoutFlow")
329
+ ```
330
+
331
+ ---
332
+
333
+ ## 6. Context Enrichment — Tags, User, Breadcrumbs
334
+
335
+ ### Tags — indexed and searchable
336
+
337
+ Tags are key/value string pairs indexed in Sentry, enabling full-text search and
338
+ filtering.
339
+
340
+ **Constraints:** key ≤ 32 chars; value ≤ 200 chars; no newlines in values.
341
+
342
+ ```kotlin
343
+ Sentry.configureScope { scope ->
344
+ scope.setTag("app.variant", "google-play")
345
+ scope.setTag("feature.flag", "checkout_v2")
346
+ scope.setTag("subscription.tier", "premium")
347
+ }
348
+
349
+ // Or static shorthand
350
+ Sentry.setTag("server.region", "eu-west-1")
351
+ ```
352
+
353
+ ### User identity
354
+
355
+ ```kotlin
356
+ import io.sentry.protocol.User
357
+
358
+ val user = User().apply {
359
+ id = "12345"
360
+ username = "jane_doe"
361
+ email = "jane@example.com"
362
+ ipAddress = "{{auto}}" // Sentry resolves from request
363
+ data = mapOf(
364
+ "subscription" to "premium",
365
+ "region" to "eu"
366
+ )
367
+ }
368
+ Sentry.setUser(user)
369
+
370
+ // Clear on logout
371
+ Sentry.setUser(null)
372
+ ```
373
+
374
+ ### Custom contexts (structured, non-searchable)
375
+
376
+ ```kotlin
377
+ // Use for rich structured data; use tags for searchable data
378
+ Sentry.configureScope { scope ->
379
+ scope.setContexts("order", mapOf(
380
+ "id" to "ORD-9821",
381
+ "total" to 129.99,
382
+ "item_count" to 3
383
+ ))
384
+ scope.setContexts("device_capability", mapOf(
385
+ "has_nfc" to true,
386
+ "ram_gb" to 4
387
+ ))
388
+ }
389
+ ```
390
+
391
+ > **Note:** The key `"type"` is reserved — don’t use it as a context key.
392
+
393
+ ### Breadcrumbs — event trail
394
+
395
+ Breadcrumbs buffer until the next event is captured.
396
+ They do not create Sentry issues on their own.
397
+
398
+ ```kotlin
399
+ import io.sentry.Breadcrumb
400
+ import io.sentry.SentryLevel
401
+
402
+ // Manual breadcrumb
403
+ val breadcrumb = Breadcrumb().apply {
404
+ category = "auth"
405
+ message = "User authenticated: ${user.email}"
406
+ level = SentryLevel.INFO
407
+ type = "user"
408
+ setData("method", "biometric")
409
+ }
410
+ Sentry.addBreadcrumb(breadcrumb)
411
+
412
+ // Simple string
413
+ Sentry.addBreadcrumb("Tapped checkout button")
414
+
415
+ // String with category
416
+ Sentry.addBreadcrumb("Database query completed", "db")
417
+ ```
418
+
419
+ **Breadcrumb fields:**
420
+
421
+ | Field | Type | Description |
422
+ | ---------- | ------------------ | ------------------------------------------------------- |
423
+ | `message` | `String` | Human-readable description |
424
+ | `category` | `String` | Dot-separated origin (e.g., `ui.click`, `http`, `auth`) |
425
+ | `level` | `SentryLevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `FATAL` |
426
+ | `type` | `String` | `default`, `http`, `navigation`, `user`, `error` |
427
+ | `data` | `Map<String, Any>` | Arbitrary additional metadata |
428
+
429
+ ### Automatic breadcrumbs (Android-specific)
430
+
431
+ The SDK automatically collects these breadcrumbs — all enabled by default:
432
+
433
+ | Source | Category | What it records |
434
+ | ------------------------- | --------------- | --------------------------------------------------------- |
435
+ | Activity lifecycle | `ui.lifecycle` | Created, started, resumed, paused, stopped, destroyed |
436
+ | App foreground/background | `app.lifecycle` | Foreground, background transitions |
437
+ | System events | `device.*` | Battery, screen on/off, network, locale, timezone changes |
438
+ | Network connectivity | `network.event` | Connected, disconnected, type changes |
439
+ | User interactions | `ui.click` | Touch events on views (if enabled) |
440
+ | OkHttp requests | `http` | URL, method, status code (with `SentryOkHttpInterceptor`) |
441
+
442
+ Disable individual sources:
443
+
444
+ ```kotlin
445
+ options.isEnableActivityLifecycleBreadcrumbs = false
446
+ options.isEnableAppLifecycleBreadcrumbs = false
447
+ options.isEnableSystemEventBreadcrumbs = false
448
+ options.isEnableNetworkEventBreadcrumbs = false
449
+ options.enableAllAutoBreadcrumbs(false) // disable all at once
450
+ ```
451
+
452
+ Via manifest:
453
+
454
+ ```xml
455
+ <meta-data android:name="io.sentry.breadcrumbs.activity-lifecycle" android:value="false" />
456
+ <meta-data android:name="io.sentry.breadcrumbs.app-lifecycle" android:value="false" />
457
+ <meta-data android:name="io.sentry.breadcrumbs.system-events" android:value="false" />
458
+ <meta-data android:name="io.sentry.breadcrumbs.network-events" android:value="false" />
459
+ ```
460
+
461
+ **Max breadcrumbs** (default: 100):
462
+
463
+ ```kotlin
464
+ options.maxBreadcrumbs = 50
465
+ ```
466
+
467
+ ---
468
+
469
+ ## 7. Event Filtering — `beforeSend`, `beforeBreadcrumb`
470
+
471
+ ### `beforeSend` — filter/mutate error events
472
+
473
+ Called immediately before an error event is transmitted.
474
+ Return `null` to drop.
475
+
476
+ > **Important:** `beforeSend` only applies to Java/Kotlin events.
477
+ > Native NDK crashes bypass this hook entirely.
478
+
479
+ ```kotlin
480
+ SentryAndroid.init(this) { options ->
481
+ options.beforeSend = SentryOptions.BeforeSendCallback { event, hint ->
482
+ // Drop events from test/CI environments
483
+ if (event.environment == "test") return@BeforeSendCallback null
484
+
485
+ // Fingerprint based on throwable type
486
+ if (event.throwable is SQLiteException) {
487
+ event.fingerprints = listOf("database-error")
488
+ }
489
+
490
+ // Scrub PII before sending
491
+ event.user?.email = null
492
+
493
+ // Attach build metadata
494
+ event.setTag("build_number", BuildConfig.VERSION_CODE.toString())
495
+
496
+ event
497
+ }
498
+ }
499
+ ```
500
+
501
+ Java equivalent:
502
+
503
+ ```java
504
+ options.setBeforeSend((event, hint) -> {
505
+ if ("test".equals(event.getEnvironment())) return null;
506
+ return event;
507
+ });
508
+ ```
509
+
510
+ ### `beforeSendTransaction` — filter performance transactions
511
+
512
+ ```kotlin
513
+ options.beforeSendTransaction = SentryOptions.BeforeSendTransactionCallback { tx, hint ->
514
+ // Drop health check transactions
515
+ if (tx.transaction == "/health") return@BeforeSendTransactionCallback null
516
+ tx
517
+ }
518
+ ```
519
+
520
+ ### `beforeBreadcrumb` — filter/mutate breadcrumbs
521
+
522
+ ```kotlin
523
+ options.beforeBreadcrumb = SentryOptions.BeforeBreadcrumbCallback { breadcrumb, hint ->
524
+ // Drop noisy logger breadcrumbs
525
+ if (breadcrumb.category == "com.third_party.SpammyLib") return@BeforeBreadcrumbCallback null
526
+
527
+ // Scrub sensitive URLs
528
+ breadcrumb.data?.let { data ->
529
+ (data["url"] as? String)?.let { url ->
530
+ data["url"] = url.replace(Regex("token=[^&]*"), "token=REDACTED")
531
+ }
532
+ }
533
+
534
+ breadcrumb
535
+ }
536
+ ```
537
+
538
+ ### `ignoreErrors` (ignored exception types)
539
+
540
+ ```kotlin
541
+ options.addIgnoredError("android.os.NetworkOnMainThreadException")
542
+ options.addIgnoredError("java.net.UnknownHostException")
543
+ ```
544
+
545
+ ---
546
+
547
+ ## 8. Fingerprinting & Grouping
548
+
549
+ Fingerprinting controls how Sentry groups events into issues.
550
+ Default grouping is by stack trace.
551
+
552
+ ### SDK-level fingerprinting
553
+
554
+ ```kotlin
555
+ // Static fingerprint via scope (all matching events → one issue)
556
+ Sentry.configureScope { scope ->
557
+ scope.setFingerprint(listOf("database-connection-error"))
558
+ }
559
+ Sentry.setFingerprint(listOf("database-connection-error"))
560
+
561
+ // Dynamic fingerprinting in beforeSend
562
+ options.beforeSend = SentryOptions.BeforeSendCallback { event, hint ->
563
+ when (event.throwable) {
564
+ is SQLiteException -> event.fingerprints = listOf("db-error", "sqlite")
565
+ is IOException -> event.fingerprints = listOf("io-error", "{{ default }}")
566
+ }
567
+ event
568
+ }
569
+
570
+ // Per-capture fingerprint
571
+ Sentry.captureException(e) { scope ->
572
+ scope.setFingerprint(listOf("payment-gateway-error", "stripe"))
573
+ }
574
+ ```
575
+
576
+ ### Fingerprint variables
577
+
578
+ | Variable | Resolves to |
579
+ | ------------------- | --------------------------------- |
580
+ | `{{ default }}` | Sentry’s default stack-trace hash |
581
+ | `{{ error.type }}` | Exception class name |
582
+ | `{{ error.value }}` | Exception message |
583
+ | `{{ transaction }}` | Current transaction name |
584
+ | `{{ level }}` | Event severity |
585
+
586
+ ### Server-side rules (Sentry project settings)
587
+
588
+ ```
589
+ # Group all DB errors together
590
+ error.type:SQLiteException -> database-error
591
+ error.type:IOException -> io-error, {{ transaction }}
592
+ ```
593
+
594
+ ---
595
+
596
+ ## 9. Attachments — Screenshots & View Hierarchy
597
+
598
+ ### Screenshots
599
+
600
+ Captures a PNG of the current UI when an error occurs.
601
+ **Disabled by default** (may contain PII).
602
+
603
+ ```kotlin
604
+ options.isAttachScreenshot = true
605
+ ```
606
+
607
+ Via manifest:
608
+
609
+ ```xml
610
+ <meta-data android:name="io.sentry.attach-screenshot" android:value="true" />
611
+ ```
612
+
613
+ Fine-grained control (SDK ≥ 6.24.0):
614
+
615
+ ```kotlin
616
+ options.setBeforeScreenshotCaptureCallback { event, hint, debounce ->
617
+ // Always capture for crashes; respect debounce for other events
618
+ if (event.isCrashed) return@setBeforeScreenshotCaptureCallback true
619
+ if (debounce) return@setBeforeScreenshotCaptureCallback false
620
+ event.level == SentryLevel.FATAL
621
+ }
622
+ ```
623
+
624
+ ### View hierarchy
625
+
626
+ Captures a JSON representation of the Android view tree when an error occurs.
627
+
628
+ ```kotlin
629
+ options.isAttachViewHierarchy = true
630
+ ```
631
+
632
+ Via manifest:
633
+
634
+ ```xml
635
+ <meta-data android:name="io.sentry.attach-view-hierarchy" android:value="true" />
636
+ ```
637
+
638
+ Fine-grained control:
639
+
640
+ ```kotlin
641
+ options.setBeforeViewHierarchyCaptureCallback { event, hint, debounce ->
642
+ if (event.isCrashed) true
643
+ else if (debounce) false
644
+ else event.level == SentryLevel.FATAL
645
+ }
646
+ ```
647
+
648
+ > **Debounce:** View hierarchy is captured at most once every 2 seconds (max 3 times per
649
+ > window) to prevent overhead during rapid error cascades.
650
+
651
+ ### Jetpack Compose node names
652
+
653
+ Add the Sentry Kotlin Compiler Plugin to include composable function names in view
654
+ hierarchy JSON:
655
+
656
+ ```kotlin
657
+ // build.gradle.kts
658
+ plugins {
659
+ id("io.sentry.kotlin.compiler.gradle") version "6.1.0"
660
+ }
661
+ ```
662
+
663
+ ### Manual file attachments
664
+
665
+ ```kotlin
666
+ Sentry.captureException(e) { scope ->
667
+ scope.addAttachment(Attachment(
668
+ logContents.toByteArray(),
669
+ "debug.log",
670
+ "text/plain"
671
+ ))
672
+ scope.addAttachment(Attachment(
673
+ File(context.filesDir, "config.json")
674
+ ))
675
+ }
676
+ ```
677
+
678
+ ---
679
+
680
+ ## 10. Release Health & Sessions
681
+
682
+ Session tracking enables crash-free rate metrics per release version.
683
+
684
+ ```kotlin
685
+ SentryAndroid.init(this) { options ->
686
+ options.release = "${BuildConfig.APPLICATION_ID}@${BuildConfig.VERSION_NAME}+${BuildConfig.VERSION_CODE}"
687
+ options.isEnableAutoSessionTracking = true // default: true
688
+ options.sessionTrackingIntervalMillis = 30_000L // default: 30 s background threshold
689
+ }
690
+ ```
691
+
692
+ Sessions are sent automatically.
693
+ No additional API calls required.
694
+
695
+ A session ends when the app goes to the background for longer than
696
+ `sessionTrackingIntervalMillis`. Each session maps to a release, so Sentry can compute:
697
+
698
+ - **Crash-free session rate** — % of sessions without a fatal crash
699
+ - **Crash-free user rate** — % of users without a crash per release
700
+
701
+ ---
702
+
703
+ ## 11. Configuration Reference
704
+
705
+ ### `SentryAndroid.init()` — common options
706
+
707
+ ```kotlin
708
+ SentryAndroid.init(this) { options ->
709
+ // ── Core ──────────────────────────────────────────────────────────────
710
+ options.dsn = "https://publicKey@o0.ingest.sentry.io/0"
711
+ options.environment = "production"
712
+ options.release = "com.myapp@1.2.3+456"
713
+ options.dist = "456" // build number
714
+ options.isDebug = false
715
+
716
+ // ── Sampling ─────────────────────────────────────────────────────────
717
+ options.sampleRate = 1.0 // error event sample rate (0.0–1.0)
718
+
719
+ // ── Crash handling ────────────────────────────────────────────────────
720
+ options.isEnableUncaughtExceptionHandler = true // default
721
+ options.startupCrashFlushTimeoutMillis = 5_000L
722
+
723
+ // ── ANR ──────────────────────────────────────────────────────────────
724
+ options.isAnrEnabled = true
725
+ options.anrTimeoutIntervalMillis = 5_000L
726
+ options.isAnrReportInDebug = false
727
+ options.isAttachAnrThreadDump = false
728
+ options.isReportHistoricalAnrs = false // Android 11+
729
+
730
+ // ── NDK ──────────────────────────────────────────────────────────────
731
+ options.isEnableNdk = true
732
+ options.isEnableScopeSync = true
733
+ options.isTombstoneEnabled = false // Android 11+
734
+
735
+ // ── Enrichment ────────────────────────────────────────────────────────
736
+ options.isAttachScreenshot = false // PII risk — disabled by default
737
+ options.isAttachViewHierarchy = false
738
+ options.isAttachThreads = false // all thread dumps on every event
739
+ options.isAttachStacktrace = true // stack traces on captureMessage
740
+
741
+ // ── Breadcrumbs ───────────────────────────────────────────────────────
742
+ options.maxBreadcrumbs = 100
743
+ options.isEnableActivityLifecycleBreadcrumbs = true
744
+ options.isEnableAppLifecycleBreadcrumbs = true
745
+ options.isEnableSystemEventBreadcrumbs = true
746
+ options.isEnableNetworkEventBreadcrumbs = true
747
+
748
+ // ── Filtering ────────────────────────────────────────────────────────
749
+ options.beforeSend = SentryOptions.BeforeSendCallback { event, _ -> event }
750
+ options.beforeBreadcrumb = SentryOptions.BeforeBreadcrumbCallback { crumb, _ -> crumb }
751
+
752
+ // ── Sessions ─────────────────────────────────────────────────────────
753
+ options.isEnableAutoSessionTracking = true
754
+ options.sessionTrackingIntervalMillis = 30_000L
755
+ }
756
+ ```
757
+
758
+ ### `AndroidManifest.xml` — key meta-data entries
759
+
760
+ | Key | Type | Default | Description |
761
+ | ------------------------------------------ | ------- | ------- | ----------------------------- |
762
+ | `io.sentry.dsn` | String | — | DSN (required for auto-init) |
763
+ | `io.sentry.environment` | String | — | Environment name |
764
+ | `io.sentry.release` | String | — | Release version string |
765
+ | `io.sentry.debug` | Boolean | `false` | Enable SDK debug logging |
766
+ | `io.sentry.sample-rate` | Float | — | Error event sample rate |
767
+ | `io.sentry.enabled` | Boolean | `true` | Master on/off switch |
768
+ | `io.sentry.auto-init` | Boolean | `true` | Auto-init via ContentProvider |
769
+ | `io.sentry.anr.enable` | Boolean | `true` | ANR watchdog |
770
+ | `io.sentry.anr.timeout-interval-millis` | Integer | `5000` | ANR threshold |
771
+ | `io.sentry.anr.report-debug` | Boolean | `false` | Report ANR during debug |
772
+ | `io.sentry.ndk.enable` | Boolean | `true` | NDK crash capture |
773
+ | `io.sentry.ndk.scope-sync.enable` | Boolean | `true` | NDK scope sync |
774
+ | `io.sentry.attach-screenshot` | Boolean | `false` | Screenshot on error |
775
+ | `io.sentry.attach-view-hierarchy` | Boolean | `false` | View hierarchy on error |
776
+ | `io.sentry.breadcrumbs.activity-lifecycle` | Boolean | `true` | Activity breadcrumbs |
777
+ | `io.sentry.breadcrumbs.app-lifecycle` | Boolean | `true` | App lifecycle breadcrumbs |
778
+ | `io.sentry.breadcrumbs.system-events` | Boolean | `true` | System event breadcrumbs |
779
+ | `io.sentry.breadcrumbs.network-events` | Boolean | `true` | Network breadcrumbs |
780
+
781
+ ---
782
+
783
+ ## 12. Troubleshooting
784
+
785
+ | Issue | Cause | Solution |
786
+ | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
787
+ | Events not appearing in Sentry | DSN incorrect or SDK not initialized | Verify DSN; set `options.isDebug = true`; check Logcat for `[Sentry]` output |
788
+ | Crash events missing | UncaughtExceptionHandler disabled | Ensure `isEnableUncaughtExceptionHandler = true`; check for competing crash handlers (Firebase, Crashlytics) |
789
+ | NDK crashes not reported | NDK module not included or `isEnableNdk = false` | Add `sentry-android-ndk` dependency; confirm `isEnableNdk = true` |
790
+ | ANR events missing in release builds | On Android 11+ the SDK uses ANR v2 (`ApplicationExitInfo`), which reports ANRs on the **next app launch** rather than in real time, and by default reports only the most recent ANR | Verify `isAnrEnabled = true`, relaunch the app so the SDK can read `ApplicationExitInfo`, and set `isReportHistoricalAnrs = true` to also report older ANRs from the exit-reasons history |
791
+ | `beforeSend` not filtering native crashes | `beforeSend` only applies to JVM events | NDK crashes bypass `beforeSend`; to suppress NDK entirely: `isEnableNdk = false` |
792
+ | Screenshots are blank or black | Activity window not attached at crash time | Best-effort capture; ensure crash occurs with an active `Activity` |
793
+ | View hierarchy missing composable names | Sentry Kotlin Compiler Plugin not added | Add `io.sentry.kotlin.compiler.gradle` plugin to `build.gradle.kts` |
794
+ | Duplicate events | Multiple `SentryAndroid.init()` calls | Call `init()` once in `Application.onCreate()` only |
795
+ | ANR not firing in debug session | Debugger pauses the main thread, which blocks the watchdog | `isAnrReportInDebug` defaults to `false`; this is expected behavior |
796
+ | Session tracking not working | `release` not set | `isEnableAutoSessionTracking` requires a non-null `release` to be meaningful |
797
+ | `captureException` returns zero-ID | SDK not initialized or `enabled = false` | Verify `SentryAndroid.init()` was called in `Application.onCreate()` before the crash |
798
+ | Historical ANRs not reported | Feature not enabled | Set `isReportHistoricalAnrs = true`; requires Android 11+ (API 30) |
799
+ | Tags or user missing from NDK crashes | Scope sync disabled | Ensure `isEnableScopeSync = true` (default) |
800
+ | Events rejected with HTTP 413 | Payload too large | Reduce attachment sizes; avoid large context objects; limit `maxBreadcrumbs` |