@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.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +6 -29
- package/skill-sources.lock.json +23 -109
- package/skills/animate/LICENSE +21 -0
- package/skills/animate/NOTICE +10 -0
- package/skills/animate/SKILL.md +34 -0
- package/skills/animate/references/gestures.md +27 -0
- package/skills/animate/references/glossary.md +136 -0
- package/skills/animate/references/implementation.md +22 -0
- package/skills/animate/references/opportunities.md +18 -0
- package/skills/animate/references/principles.md +48 -0
- package/skills/animate/references/review.md +19 -0
- package/skills/cloudflare-workers/LICENSE +202 -0
- package/skills/cloudflare-workers/NOTICE +9 -0
- package/skills/cloudflare-workers/SKILL.md +26 -0
- package/skills/cloudflare-workers/references/durable-objects.md +68 -0
- package/skills/cloudflare-workers/references/sandbox.md +48 -0
- package/skills/cloudflare-workers/references/workers.md +63 -0
- package/skills/cloudflare-workers/references/wrangler.md +56 -0
- package/skills/design-ui/LICENSE +21 -0
- package/skills/design-ui/NOTICE +8 -0
- package/skills/design-ui/SKILL.md +29 -0
- package/skills/design-ui/references/appearance.md +22 -0
- package/skills/design-ui/references/components.md +33 -0
- package/skills/design-ui/references/exploration.md +50 -0
- package/skills/design-ui/references/libraries.md +39 -0
- package/skills/design-ui/references/themes.md +23 -0
- package/skills/dev-kit/SKILL.md +19 -38
- package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
- package/skills/dev-kit/references/skills.md +2 -2
- package/skills/effect-development/SKILL.md +27 -0
- package/skills/effect-development/agents/openai.yaml +4 -0
- package/skills/effect-development/references/api/index.md +32 -0
- package/skills/effect-development/references/api/schema-codecs.md +15 -0
- package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
- package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
- package/skills/effect-development/references/atom/index.md +40 -0
- package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
- package/skills/effect-development/references/cli/index.md +39 -0
- package/skills/effect-development/references/setup.md +15 -0
- package/skills/open-pull-request/SKILL.md +11 -115
- package/skills/open-pull-request/agents/openai.yaml +3 -3
- package/skills/open-pull-request/references/evidence.md +22 -0
- package/skills/open-pull-request/references/explanation.md +21 -0
- package/skills/open-pull-request/references/publication.md +21 -0
- package/skills/sentry/LICENSE +202 -0
- package/skills/sentry/LICENSE-UPSTREAM +21 -0
- package/skills/sentry/NOTICE +14 -0
- package/skills/sentry/SKILL.md +33 -0
- package/skills/sentry/references/alert-payloads.md +105 -0
- package/skills/sentry/references/alerts.md +17 -0
- package/skills/sentry/references/artifacts.md +25 -0
- package/skills/sentry/references/auth-token.md +65 -0
- package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
- package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
- package/skills/sentry/references/concepts/crons.md +50 -0
- package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
- package/skills/sentry/references/concepts/errors.md +40 -0
- package/skills/sentry/references/concepts/logging.md +85 -0
- package/skills/sentry/references/concepts/metrics.md +49 -0
- package/skills/sentry/references/concepts/monitors.md +78 -0
- package/skills/sentry/references/concepts/profiling.md +38 -0
- package/skills/sentry/references/concepts/reduce-volume.md +49 -0
- package/skills/sentry/references/concepts/releases.md +43 -0
- package/skills/sentry/references/concepts/session-replay.md +35 -0
- package/skills/sentry/references/concepts/tracing.md +54 -0
- package/skills/sentry/references/concepts/user-feedback.md +36 -0
- package/skills/sentry/references/debug-artifacts/android.md +68 -0
- package/skills/sentry/references/debug-artifacts/apple.md +96 -0
- package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
- package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
- package/skills/sentry/references/debug-artifacts/index.md +75 -0
- package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
- package/skills/sentry/references/debug-artifacts/matching.md +73 -0
- package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
- package/skills/sentry/references/first-error-setup.md +25 -0
- package/skills/sentry/references/instrumentation.md +30 -0
- package/skills/sentry/references/issues.md +32 -0
- package/skills/sentry/references/new-project.md +17 -0
- package/skills/sentry/references/otel-exporter.md +30 -0
- package/skills/sentry/references/release-workflow.md +31 -0
- package/skills/sentry/references/releases/ci-pipeline.md +214 -0
- package/skills/sentry/references/releases/index.md +93 -0
- package/skills/sentry/references/releases/suspect-commits.md +155 -0
- package/skills/sentry/references/releases/tagging.md +131 -0
- package/skills/sentry/references/releases/troubleshooting.md +67 -0
- package/skills/sentry/references/sdks/android/crons.md +305 -0
- package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
- package/skills/sentry/references/sdks/android/index.md +748 -0
- package/skills/sentry/references/sdks/android/integrations.md +48 -0
- package/skills/sentry/references/sdks/android/logging.md +374 -0
- package/skills/sentry/references/sdks/android/metrics.md +288 -0
- package/skills/sentry/references/sdks/android/profiling.md +397 -0
- package/skills/sentry/references/sdks/android/session-replay.md +406 -0
- package/skills/sentry/references/sdks/android/tracing.md +861 -0
- package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
- package/skills/sentry/references/sdks/browser/index.md +714 -0
- package/skills/sentry/references/sdks/browser/logging.md +315 -0
- package/skills/sentry/references/sdks/browser/profiling.md +236 -0
- package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
- package/skills/sentry/references/sdks/browser/tracing.md +561 -0
- package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
- package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
- package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
- package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
- package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
- package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
- package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
- package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
- package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
- package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
- package/skills/sentry/references/sdks/cocoa/index.md +497 -0
- package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
- package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
- package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
- package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
- package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
- package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
- package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
- package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
- package/skills/sentry/references/sdks/dotnet/index.md +614 -0
- package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
- package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
- package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
- package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
- package/skills/sentry/references/sdks/elixir/crons.md +371 -0
- package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
- package/skills/sentry/references/sdks/elixir/index.md +383 -0
- package/skills/sentry/references/sdks/elixir/logging.md +239 -0
- package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
- package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
- package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
- package/skills/sentry/references/sdks/flutter/index.md +728 -0
- package/skills/sentry/references/sdks/flutter/logging.md +387 -0
- package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
- package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
- package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
- package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
- package/skills/sentry/references/sdks/go/crons.md +270 -0
- package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
- package/skills/sentry/references/sdks/go/index.md +324 -0
- package/skills/sentry/references/sdks/go/logging.md +354 -0
- package/skills/sentry/references/sdks/go/metrics.md +273 -0
- package/skills/sentry/references/sdks/go/profiling.md +46 -0
- package/skills/sentry/references/sdks/go/tracing.md +366 -0
- package/skills/sentry/references/sdks/index.md +41 -0
- package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
- package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
- package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
- package/skills/sentry/references/sdks/nestjs/index.md +699 -0
- package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
- package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
- package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
- package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
- package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
- package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
- package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
- package/skills/sentry/references/sdks/nextjs/index.md +491 -0
- package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
- package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
- package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
- package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
- package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
- package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
- package/skills/sentry/references/sdks/node/crons.md +432 -0
- package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
- package/skills/sentry/references/sdks/node/index.md +942 -0
- package/skills/sentry/references/sdks/node/logging.md +380 -0
- package/skills/sentry/references/sdks/node/metrics.md +278 -0
- package/skills/sentry/references/sdks/node/profiling.md +373 -0
- package/skills/sentry/references/sdks/node/tracing.md +878 -0
- package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
- package/skills/sentry/references/sdks/php/crons.md +265 -0
- package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
- package/skills/sentry/references/sdks/php/index.md +362 -0
- package/skills/sentry/references/sdks/php/laravel.md +542 -0
- package/skills/sentry/references/sdks/php/logging.md +242 -0
- package/skills/sentry/references/sdks/php/metrics.md +193 -0
- package/skills/sentry/references/sdks/php/profiling.md +115 -0
- package/skills/sentry/references/sdks/php/symfony.md +552 -0
- package/skills/sentry/references/sdks/php/tracing.md +516 -0
- package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
- package/skills/sentry/references/sdks/python/crons.md +218 -0
- package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
- package/skills/sentry/references/sdks/python/index.md +361 -0
- package/skills/sentry/references/sdks/python/logging.md +234 -0
- package/skills/sentry/references/sdks/python/metrics.md +154 -0
- package/skills/sentry/references/sdks/python/profiling.md +120 -0
- package/skills/sentry/references/sdks/python/tracing.md +364 -0
- package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
- package/skills/sentry/references/sdks/react/index.md +492 -0
- package/skills/sentry/references/sdks/react/logging.md +364 -0
- package/skills/sentry/references/sdks/react/profiling.md +322 -0
- package/skills/sentry/references/sdks/react/react-features.md +1272 -0
- package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
- package/skills/sentry/references/sdks/react/tracing.md +1415 -0
- package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
- package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
- package/skills/sentry/references/sdks/react-native/index.md +1030 -0
- package/skills/sentry/references/sdks/react-native/logging.md +444 -0
- package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
- package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
- package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
- package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
- package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
- package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
- package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
- package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
- package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
- package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
- package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
- package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
- package/skills/sentry/references/sdks/ruby/crons.md +184 -0
- package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
- package/skills/sentry/references/sdks/ruby/index.md +297 -0
- package/skills/sentry/references/sdks/ruby/logging.md +168 -0
- package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
- package/skills/sentry/references/sdks/ruby/migration.md +321 -0
- package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
- package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
- package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
- package/skills/sentry/references/sdks/svelte/index.md +467 -0
- package/skills/sentry/references/sdks/svelte/logging.md +344 -0
- package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
- package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
- package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
- package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
- package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
- package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
- package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
- package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
- package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
- package/skills/sentry/references/search-query-language.md +226 -0
- package/skills/sentry/references/semantics/angular.md +7 -0
- package/skills/sentry/references/semantics/app.md +28 -0
- package/skills/sentry/references/semantics/art.md +17 -0
- package/skills/sentry/references/semantics/aws.md +43 -0
- package/skills/sentry/references/semantics/browser.md +34 -0
- package/skills/sentry/references/semantics/cache.md +12 -0
- package/skills/sentry/references/semantics/client.md +8 -0
- package/skills/sentry/references/semantics/cloud.md +12 -0
- package/skills/sentry/references/semantics/cloudflare.md +23 -0
- package/skills/sentry/references/semantics/code.md +11 -0
- package/skills/sentry/references/semantics/culture.md +11 -0
- package/skills/sentry/references/semantics/db.md +21 -0
- package/skills/sentry/references/semantics/device.md +43 -0
- package/skills/sentry/references/semantics/error.md +7 -0
- package/skills/sentry/references/semantics/event.md +8 -0
- package/skills/sentry/references/semantics/exception.md +10 -0
- package/skills/sentry/references/semantics/faas.md +19 -0
- package/skills/sentry/references/semantics/file.md +8 -0
- package/skills/sentry/references/semantics/flag.md +7 -0
- package/skills/sentry/references/semantics/gcp.md +16 -0
- package/skills/sentry/references/semantics/gen_ai.md +53 -0
- package/skills/sentry/references/semantics/general.md +11 -0
- package/skills/sentry/references/semantics/graphql.md +9 -0
- package/skills/sentry/references/semantics/grpc.md +19 -0
- package/skills/sentry/references/semantics/http.md +34 -0
- package/skills/sentry/references/semantics/index.md +63 -0
- package/skills/sentry/references/semantics/jsonrpc.md +8 -0
- package/skills/sentry/references/semantics/jvm.md +12 -0
- package/skills/sentry/references/semantics/koa.md +7 -0
- package/skills/sentry/references/semantics/logger.md +7 -0
- package/skills/sentry/references/semantics/mcp.md +37 -0
- package/skills/sentry/references/semantics/mdc.md +7 -0
- package/skills/sentry/references/semantics/messaging.md +23 -0
- package/skills/sentry/references/semantics/middleware.md +7 -0
- package/skills/sentry/references/semantics/navigation.md +9 -0
- package/skills/sentry/references/semantics/nel.md +11 -0
- package/skills/sentry/references/semantics/network.md +17 -0
- package/skills/sentry/references/semantics/os.md +15 -0
- package/skills/sentry/references/semantics/otel.md +10 -0
- package/skills/sentry/references/semantics/params.md +7 -0
- package/skills/sentry/references/semantics/process.md +14 -0
- package/skills/sentry/references/semantics/react.md +7 -0
- package/skills/sentry/references/semantics/remix.md +7 -0
- package/skills/sentry/references/semantics/resource.md +7 -0
- package/skills/sentry/references/semantics/rpc.md +10 -0
- package/skills/sentry/references/semantics/score.md +10 -0
- package/skills/sentry/references/semantics/sentry.md +69 -0
- package/skills/sentry/references/semantics/server.md +8 -0
- package/skills/sentry/references/semantics/service.md +8 -0
- package/skills/sentry/references/semantics/session.md +7 -0
- package/skills/sentry/references/semantics/state.md +7 -0
- package/skills/sentry/references/semantics/thread.md +8 -0
- package/skills/sentry/references/semantics/timber.md +7 -0
- package/skills/sentry/references/semantics/trpc.md +8 -0
- package/skills/sentry/references/semantics/ui.md +18 -0
- package/skills/sentry/references/semantics/url.md +15 -0
- package/skills/sentry/references/semantics/user.md +17 -0
- package/skills/sentry/references/semantics/user_agent.md +7 -0
- package/skills/sentry/references/semantics/vercel.md +42 -0
- package/skills/sentry/references/setup-verification.md +39 -0
- package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
- package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
- package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
- package/skills/sentry/references/snapshots/index.md +19 -0
- package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
- package/skills/sentry/references/snapshots/snapshots.md +123 -0
- package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
- package/skills/testing/LICENSE +21 -0
- package/skills/testing/NOTICE +7 -0
- package/skills/testing/SKILL.md +13 -19
- package/skills/testing/agents/openai.yaml +1 -2
- package/skills/testing/references/selection.md +23 -0
- package/skills/testing/references/tdd.md +19 -0
- package/skills/testing/references/test-design.md +17 -0
- package/src/catalog.ts +1 -7
- package/skills/build-effect-apis/SKILL.md +0 -81
- package/skills/build-effect-apis/agents/openai.yaml +0 -4
- package/skills/build-effect-clis/SKILL.md +0 -92
- package/skills/build-effect-clis/agents/openai.yaml +0 -4
- package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
- package/skills/effect-atom-state/SKILL.md +0 -97
- package/skills/effect-atom-state/agents/openai.yaml +0 -4
- package/skills/effect-ts/SKILL.md +0 -35
- package/skills/effect-ts/agents/openai.yaml +0 -4
- /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
- /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
- /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 |
|