@danieljvdm/dev-kit 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +2 -33
- package/skill-sources.lock.json +15 -117
- 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 +10 -70
- 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,586 @@
|
|
|
1
|
+
# Session Replay — Sentry Browser SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/browser` ≥7.27.0\
|
|
4
|
+
> `replayCanvasIntegration` available since SDK ≥7.50.0\
|
|
5
|
+
> `beforeAddRecordingEvent` available since SDK ≥7.53.0\
|
|
6
|
+
> `beforeErrorSampling` available since SDK ≥7.56.0\
|
|
7
|
+
> Node 12+ required; browsers newer than IE11
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Basic Setup
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
import * as Sentry from "@sentry/browser";
|
|
15
|
+
|
|
16
|
+
Sentry.init({
|
|
17
|
+
dsn: "___PUBLIC_DSN___",
|
|
18
|
+
replaysSessionSampleRate: 0.1, // 10% of all sessions recorded in full
|
|
19
|
+
replaysOnErrorSampleRate: 1.0, // 100% of sessions with errors buffered and sent
|
|
20
|
+
integrations: [Sentry.replayIntegration()],
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Sampling Rates
|
|
27
|
+
|
|
28
|
+
### `replaysSessionSampleRate` vs. `replaysOnErrorSampleRate`
|
|
29
|
+
|
|
30
|
+
| Option | Default | Behavior |
|
|
31
|
+
| -------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
32
|
+
| `replaysSessionSampleRate` | `0` | Percentage of sessions to record **in full** from start to end. `1.0` = 100%, `0` = none. |
|
|
33
|
+
| `replaysOnErrorSampleRate` | `0` | Percentage of sessions to record **when an error occurs**. Buffers up to 60 seconds before the error, then continues until the session ends. |
|
|
34
|
+
|
|
35
|
+
### How Sampling Works
|
|
36
|
+
|
|
37
|
+
1. `replaysSessionSampleRate` is checked first at session start.
|
|
38
|
+
- If sampled → full session recording starts immediately, sent to Sentry in real-time
|
|
39
|
+
chunks (**Session mode**).
|
|
40
|
+
- If not sampled → recording is buffered in memory (last 60 seconds only) (**Buffer
|
|
41
|
+
mode**).
|
|
42
|
+
2. If an error occurs in a buffered session:
|
|
43
|
+
- `replaysOnErrorSampleRate` is checked.
|
|
44
|
+
- If sampled → 60-second buffer + rest of session is sent to Sentry.
|
|
45
|
+
- If not sampled → buffer is discarded.
|
|
46
|
+
|
|
47
|
+
**When data leaves the browser:**
|
|
48
|
+
|
|
49
|
+
| Scenario | Data Sent |
|
|
50
|
+
| -------------------------------------- | ------------------------------------------- |
|
|
51
|
+
| Selected for session sampling | Immediately (real-time chunks) |
|
|
52
|
+
| Not selected, no error | Never (buffer discarded) |
|
|
53
|
+
| Not selected, error occurs and sampled | After error (60s buffer + everything after) |
|
|
54
|
+
|
|
55
|
+
**Recommended rates by traffic volume:**
|
|
56
|
+
|
|
57
|
+
| Traffic | `replaysSessionSampleRate` | `replaysOnErrorSampleRate` |
|
|
58
|
+
| --------------------- | -------------------------- | -------------------------- |
|
|
59
|
+
| High (100k+/day) | `0.01` (1%) | `1.0` |
|
|
60
|
+
| Medium (10k–100k/day) | `0.1` (10%) | `1.0` |
|
|
61
|
+
| Low (<10k/day) | `0.25` (25%) | `1.0` |
|
|
62
|
+
|
|
63
|
+
> **Tip:** Keep `replaysOnErrorSampleRate` at `1.0` — error sessions provide the most
|
|
64
|
+
> debugging value.\
|
|
65
|
+
> **Dev tip:** Set `replaysSessionSampleRate: 1.0` during development to capture every
|
|
66
|
+
> session.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## `replayIntegration()` — Configuration Reference
|
|
71
|
+
|
|
72
|
+
### General Options
|
|
73
|
+
|
|
74
|
+
| Option | Type | Default | Description |
|
|
75
|
+
| -------------------------- | -------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
76
|
+
| `stickySession` | `boolean` | `true` | Track the user across page refreshes. Closing a tab ends the session; multiple tabs = multiple sessions. |
|
|
77
|
+
| `mutationLimit` | `number` | `10000` | Upper bound of DOM mutations before replay stops recording (protects performance). |
|
|
78
|
+
| `mutationBreadcrumbLimit` | `number` | `750` | Threshold at which a breadcrumb warning is emitted for large mutations. |
|
|
79
|
+
| `minReplayDuration` | `number` | `5000` (ms) | Minimum replay length before sending. Max configurable: 15000ms. |
|
|
80
|
+
| `maxReplayDuration` | `number` | `3600000` (ms = 1 hr) | Maximum replay length. Max value: 3600000ms. |
|
|
81
|
+
| `workerUrl` | `string` | `undefined` | URL for a self-hosted compression worker (avoids CSP issues, reduces bundle size). |
|
|
82
|
+
| `beforeAddRecordingEvent` | `(event) => event \| null` | identity fn | Filter or modify console log and network recording events before they are sent. Return `null` to drop. |
|
|
83
|
+
| `beforeErrorSampling` | `(event) => boolean` | `() => true` | In buffer mode only — return `false` to skip error-based sampling for a specific error event. |
|
|
84
|
+
| `slowClickIgnoreSelectors` | `string[]` | `[]` | CSS selectors for elements where slow/rage click detection should be disabled. |
|
|
85
|
+
|
|
86
|
+
### Privacy Options
|
|
87
|
+
|
|
88
|
+
| Option | Type | Default | Description |
|
|
89
|
+
| --------------- | -------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
90
|
+
| `maskAllText` | `boolean` | `true` | Mask all text content (replaced with `*` characters). |
|
|
91
|
+
| `maskAllInputs` | `boolean` | `true` | Mask all `<input>` element values. |
|
|
92
|
+
| `blockAllMedia` | `boolean` | `true` | Block all media: `img`, `svg`, `video`, `object`, `picture`, `embed`, `map`, `audio`. |
|
|
93
|
+
| `mask` | `string[]` | `[".sentry-mask", "[data-sentry-mask]"]` | Additional CSS selectors to mask. Appended to defaults. |
|
|
94
|
+
| `unmask` | `string[]` | `[]` | CSS selectors to unmask (overrides `maskAllText`). |
|
|
95
|
+
| `block` | `string[]` | `[".sentry-block", "[data-sentry-block]"]` | Additional CSS selectors to block (replaced with same-size empty placeholder). |
|
|
96
|
+
| `unblock` | `string[]` | `[]` | CSS selectors to unblock (overrides `blockAllMedia`). |
|
|
97
|
+
| `ignore` | `string[]` | `[".sentry-ignore", "[data-sentry-ignore]"]` | Input fields whose events are ignored (no keystroke recording). |
|
|
98
|
+
| `maskFn` | `(text: string) => string` | `(s) => "*".repeat(s.length)` | Custom text masking function. |
|
|
99
|
+
|
|
100
|
+
### Network Options
|
|
101
|
+
|
|
102
|
+
| Option | Type | Default | Description |
|
|
103
|
+
| ------------------------ | ---------------------- | ------- | ---------------------------------------------------------------------------------------------------- |
|
|
104
|
+
| `networkDetailAllowUrls` | `(string \| RegExp)[]` | `[]` | URLs/patterns for which request/response details are captured (opt-in, SDK ≥7.50.0). |
|
|
105
|
+
| `networkDetailDenyUrls` | `(string \| RegExp)[]` | `[]` | URLs/patterns to exclude from network capture. Takes precedence over `networkDetailAllowUrls`. |
|
|
106
|
+
| `networkCaptureBodies` | `boolean` | `true` | Whether to capture request/response bodies for allowed URLs. |
|
|
107
|
+
| `networkRequestHeaders` | `string[]` | `[]` | Additional request headers to capture. Default captured: `Content-Type`, `Content-Length`, `Accept`. |
|
|
108
|
+
| `networkResponseHeaders` | `string[]` | `[]` | Additional response headers to capture. |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Privacy & Masking
|
|
113
|
+
|
|
114
|
+
### Three Privacy Methods
|
|
115
|
+
|
|
116
|
+
| Method | Effect | Default Trigger |
|
|
117
|
+
| ---------- | -------------------------------------------------------- | ---------------------------------------- |
|
|
118
|
+
| **Mask** | Replaces text with `*` characters (preserving length) | `.sentry-mask`, `[data-sentry-mask]` |
|
|
119
|
+
| **Block** | Replaces entire element with same-size empty placeholder | `.sentry-block`, `[data-sentry-block]` |
|
|
120
|
+
| **Ignore** | Stops recording input events on matched fields | `.sentry-ignore`, `[data-sentry-ignore]` |
|
|
121
|
+
|
|
122
|
+
### HTML Attribute Usage
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<!-- Mask text content -->
|
|
126
|
+
<p class="sentry-mask">Sensitive user data</p>
|
|
127
|
+
<p data-sentry-mask>Sensitive user data</p>
|
|
128
|
+
|
|
129
|
+
<!-- Block entire element (credit card form, PII section) -->
|
|
130
|
+
<div class="sentry-block">
|
|
131
|
+
<input type="text" placeholder="Credit card number" />
|
|
132
|
+
</div>
|
|
133
|
+
<div data-sentry-block>Blocked content</div>
|
|
134
|
+
|
|
135
|
+
<!-- Ignore input events (no keystrokes recorded) -->
|
|
136
|
+
<input class="sentry-ignore" type="password" />
|
|
137
|
+
<input data-sentry-ignore type="text" placeholder="SSN" />
|
|
138
|
+
|
|
139
|
+
<!-- Unmask when maskAllText=true -->
|
|
140
|
+
<p class="sentry-unmask">Safe to show in replay</p>
|
|
141
|
+
<p data-sentry-unmask>Safe to show</p>
|
|
142
|
+
|
|
143
|
+
<!-- Unblock media when blockAllMedia=true -->
|
|
144
|
+
<img class="sentry-unblock" src="product-image.png" alt="Product" />
|
|
145
|
+
<img data-sentry-unblock src="logo.svg" alt="Logo" />
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Configuration Examples
|
|
149
|
+
|
|
150
|
+
**Disable all default masking (show everything):**
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
Sentry.replayIntegration({
|
|
154
|
+
maskAllText: false,
|
|
155
|
+
blockAllMedia: false,
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Mask and block specific selectors:**
|
|
160
|
+
|
|
161
|
+
```javascript
|
|
162
|
+
Sentry.replayIntegration({
|
|
163
|
+
mask: [".user-pii", "[data-sensitive]", "#account-details"],
|
|
164
|
+
unmask: [".replay-safe"],
|
|
165
|
+
block: ["#payment-form", ".credit-card-widget"],
|
|
166
|
+
unblock: [".product-image"],
|
|
167
|
+
ignore: [".password-field", "[type='password']"],
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Custom masking function:**
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
Sentry.replayIntegration({
|
|
175
|
+
maskFn: (text) => text.replace(/\S/g, "X"), // Replace non-whitespace with X
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Custom recording event filter:**
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
Sentry.replayIntegration({
|
|
183
|
+
beforeAddRecordingEvent: (event) => {
|
|
184
|
+
// Drop any event tagged "foo"
|
|
185
|
+
if (event.data.tag === "foo") return null;
|
|
186
|
+
|
|
187
|
+
// Only capture network events for 500 errors
|
|
188
|
+
if (
|
|
189
|
+
event.data.tag === "performanceSpan" &&
|
|
190
|
+
(event.data.payload.op === "resource.fetch" || event.data.payload.op === "resource.xhr") &&
|
|
191
|
+
event.data.payload.data.statusCode !== 500
|
|
192
|
+
) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return event;
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Network Capture
|
|
204
|
+
|
|
205
|
+
By default, Session Replay captures basic information about all outgoing fetch and XHR
|
|
206
|
+
requests (URL, size, method, status code).
|
|
207
|
+
|
|
208
|
+
Request/response **bodies and additional headers require explicit opt-in** (SDK
|
|
209
|
+
≥7.50.0):
|
|
210
|
+
|
|
211
|
+
```javascript
|
|
212
|
+
Sentry.replayIntegration({
|
|
213
|
+
networkDetailAllowUrls: [window.location.origin],
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Advanced — multiple patterns with custom headers:**
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
Sentry.replayIntegration({
|
|
221
|
+
networkDetailAllowUrls: [
|
|
222
|
+
window.location.origin,
|
|
223
|
+
"api.example.com",
|
|
224
|
+
/^https:\/\/api\.example\.com/,
|
|
225
|
+
],
|
|
226
|
+
networkCaptureBodies: true, // default: true — capture request/response bodies
|
|
227
|
+
networkRequestHeaders: ["Cache-Control", "X-Request-ID"],
|
|
228
|
+
networkResponseHeaders: ["Referrer-Policy", "X-Trace-ID"],
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Constraints:**
|
|
233
|
+
|
|
234
|
+
- Bodies are truncated to **150,000 characters** maximum
|
|
235
|
+
- `networkDetailDenyUrls` takes precedence over `networkDetailAllowUrls`
|
|
236
|
+
- Set `networkCaptureBodies: false` to keep header capture while disabling body capture
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Canvas Recording
|
|
241
|
+
|
|
242
|
+
Canvas elements are not captured by default.
|
|
243
|
+
Add `replayCanvasIntegration()` to enable:
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
import * as Sentry from "@sentry/browser";
|
|
247
|
+
|
|
248
|
+
Sentry.init({
|
|
249
|
+
dsn: "___PUBLIC_DSN___",
|
|
250
|
+
replaysSessionSampleRate: 0.1,
|
|
251
|
+
replaysOnErrorSampleRate: 1.0,
|
|
252
|
+
integrations: [Sentry.replayIntegration(), Sentry.replayCanvasIntegration()],
|
|
253
|
+
});
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
> ⚠️ **There is currently no PII scrubbing in canvas recordings.** Review canvas content
|
|
257
|
+
> carefully before enabling.
|
|
258
|
+
|
|
259
|
+
### 3D / WebGL Canvases — Manual Snapshot Mode
|
|
260
|
+
|
|
261
|
+
For WebGL or 3D canvases, use manual snapshotting to optimize performance:
|
|
262
|
+
|
|
263
|
+
```javascript
|
|
264
|
+
Sentry.replayCanvasIntegration({
|
|
265
|
+
enableManualSnapshot: true,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Call in your render loop to capture the canvas
|
|
269
|
+
function paint() {
|
|
270
|
+
const canvasRef = document.querySelector("#my-canvas");
|
|
271
|
+
Sentry.getClient()?.getIntegrationByName("ReplayCanvas")?.snapshot(canvasRef);
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### WebGPU Canvases
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
Sentry.replayCanvasIntegration({
|
|
279
|
+
enableManualSnapshot: true,
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
function paint() {
|
|
283
|
+
const canvasRef = document.querySelector("#my-canvas");
|
|
284
|
+
const canvasIntegration = Sentry.getClient()?.getIntegrationByName("ReplayCanvas");
|
|
285
|
+
|
|
286
|
+
canvasIntegration?.snapshot(canvasRef, {
|
|
287
|
+
skipRequestAnimationFrame: true,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Lazy Loading
|
|
295
|
+
|
|
296
|
+
Defer loading the Replay bundle to avoid impacting initial page load:
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
// Initialize Sentry without Replay
|
|
300
|
+
Sentry.init({
|
|
301
|
+
dsn: "___PUBLIC_DSN___",
|
|
302
|
+
integrations: [],
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Lazy-load Replay later (e.g., after user interaction or route change)
|
|
306
|
+
import("@sentry/browser").then((lazySentry) => {
|
|
307
|
+
Sentry.addIntegration(
|
|
308
|
+
lazySentry.replayIntegration({
|
|
309
|
+
maskAllText: true,
|
|
310
|
+
blockAllMedia: true,
|
|
311
|
+
}),
|
|
312
|
+
);
|
|
313
|
+
});
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**For Loader Script users** (CDN), use `lazyLoadIntegration`:
|
|
317
|
+
|
|
318
|
+
```javascript
|
|
319
|
+
window.sentryOnLoad = function () {
|
|
320
|
+
Sentry.init({ dsn: "___PUBLIC_DSN___" });
|
|
321
|
+
|
|
322
|
+
Sentry.lazyLoadIntegration("replayIntegration")
|
|
323
|
+
.then((replayIntegration) => {
|
|
324
|
+
Sentry.addIntegration(replayIntegration());
|
|
325
|
+
})
|
|
326
|
+
.catch(() => {
|
|
327
|
+
// Network error — Replay not enabled
|
|
328
|
+
});
|
|
329
|
+
};
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Session Modes & Manual Control
|
|
335
|
+
|
|
336
|
+
### Session Initialization Modes
|
|
337
|
+
|
|
338
|
+
| Configuration | Mode | Behavior |
|
|
339
|
+
| ---------------------------------------------------- | ---------------- | ---------------------------------------------------------- |
|
|
340
|
+
| `replaysSessionSampleRate > 0` and sampled | **Session mode** | Records continuously; uploads data in real time |
|
|
341
|
+
| Not sampled, `replaysOnErrorSampleRate > 0` | **Buffer mode** | Records but keeps only last 60 seconds in memory (~2–5 MB) |
|
|
342
|
+
| Both rates = `0`, or integration added without rates | **Inactive** | Nothing recorded until manually started |
|
|
343
|
+
|
|
344
|
+
**Session mode:** sessions end after **15 minutes of inactivity** or **60 minutes
|
|
345
|
+
maximum duration**, then reinitialize.
|
|
346
|
+
|
|
347
|
+
**Buffer mode:** stores ~2–5 MB in memory (lightweight DOM event logs: clicks, scrolls,
|
|
348
|
+
mutations — not video files).
|
|
349
|
+
On sampled error, the 60-second buffer + subsequent recording are uploaded.
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
### Manual Session Control API
|
|
354
|
+
|
|
355
|
+
```javascript
|
|
356
|
+
Sentry.init({
|
|
357
|
+
dsn: "___PUBLIC_DSN___",
|
|
358
|
+
replaysSessionSampleRate: 0,
|
|
359
|
+
replaysOnErrorSampleRate: 0,
|
|
360
|
+
integrations: [Sentry.replayIntegration()],
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const replay = Sentry.getReplay();
|
|
364
|
+
|
|
365
|
+
replay.start(); // Start recording in session mode
|
|
366
|
+
replay.startBuffering(); // Start recording in buffer mode
|
|
367
|
+
|
|
368
|
+
await replay.flush(); // Upload pending data (keeps recording active)
|
|
369
|
+
await replay.stop(); // Flush data and end session permanently
|
|
370
|
+
|
|
371
|
+
const replayId = replay.getReplayId(); // Get current replay ID for external linking
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
### Deferred Initialization (External Sampling Service)
|
|
377
|
+
|
|
378
|
+
Use when you want to determine sampling rates via an external feature flag service
|
|
379
|
+
before starting the SDK:
|
|
380
|
+
|
|
381
|
+
```javascript
|
|
382
|
+
async function initReplay(sessionSampleRate, errorSampleRate) {
|
|
383
|
+
const client = Sentry.getClient();
|
|
384
|
+
const options = client.getOptions();
|
|
385
|
+
options.replaysSessionSampleRate = sessionSampleRate;
|
|
386
|
+
options.replaysOnErrorSampleRate = errorSampleRate;
|
|
387
|
+
|
|
388
|
+
const replay = Sentry.replayIntegration({
|
|
389
|
+
maskAllText: true,
|
|
390
|
+
blockAllMedia: true,
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
client.addIntegration(replay);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Call after fetching remote config
|
|
397
|
+
fetchFeatureFlags().then((flags) => {
|
|
398
|
+
initReplay(flags.replaySessionRate, flags.replayErrorRate);
|
|
399
|
+
});
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
### Custom Sampling Patterns
|
|
405
|
+
|
|
406
|
+
**Employee-only recordings:**
|
|
407
|
+
|
|
408
|
+
Force a full recording for a specific cohort (e.g. internal employees) after they
|
|
409
|
+
authenticate. Because `flush()` only uploads _already-active_ recording data, guard on
|
|
410
|
+
`replay.getReplayId()`: if a replay is already active (session mode, or buffer mode when
|
|
411
|
+
`replaysOnErrorSampleRate > 0`) flush it to send immediately and keep recording;
|
|
412
|
+
otherwise call `replay.start()` to begin a new session-mode recording.
|
|
413
|
+
`replay.start()` records regardless of sample rate and is a safe no-op if a session is
|
|
414
|
+
already running.
|
|
415
|
+
|
|
416
|
+
```javascript
|
|
417
|
+
Sentry.init({
|
|
418
|
+
dsn: "___PUBLIC_DSN___",
|
|
419
|
+
replaysSessionSampleRate: 0.1,
|
|
420
|
+
replaysOnErrorSampleRate: 1.0,
|
|
421
|
+
integrations: [Sentry.replayIntegration()],
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
// After authentication, always record a replay for internal employees
|
|
425
|
+
if (loggedInUser.isEmployee) {
|
|
426
|
+
const replay = Sentry.getReplay();
|
|
427
|
+
|
|
428
|
+
if (replay.getReplayId()) {
|
|
429
|
+
// A replay is already active (session or buffer mode):
|
|
430
|
+
// flush uploads the pending data and continues recording.
|
|
431
|
+
replay.flush();
|
|
432
|
+
} else {
|
|
433
|
+
// Nothing recording yet: start a full session-mode recording.
|
|
434
|
+
replay.start();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**URL-specific recording:**
|
|
440
|
+
|
|
441
|
+
```javascript
|
|
442
|
+
Sentry.init({
|
|
443
|
+
dsn: "___PUBLIC_DSN___",
|
|
444
|
+
replaysSessionSampleRate: 0,
|
|
445
|
+
replaysOnErrorSampleRate: 0,
|
|
446
|
+
integrations: [Sentry.replayIntegration()],
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
navigation.addEventListener("navigate", (event) => {
|
|
450
|
+
const url = new URL(event.destination.url);
|
|
451
|
+
const replay = Sentry.getReplay();
|
|
452
|
+
if (url.pathname.startsWith("/checkout/")) {
|
|
453
|
+
replay.start();
|
|
454
|
+
} else {
|
|
455
|
+
replay.stop();
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
**Error filtering in buffer mode:**
|
|
461
|
+
|
|
462
|
+
```javascript
|
|
463
|
+
Sentry.replayIntegration({
|
|
464
|
+
beforeErrorSampling: (event) => {
|
|
465
|
+
// Skip replay capture for this specific error type
|
|
466
|
+
return !event.exception?.values?.[0]?.value?.includes("drop me");
|
|
467
|
+
},
|
|
468
|
+
});
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
### Support Widget Integration
|
|
474
|
+
|
|
475
|
+
Link replay sessions to support tickets:
|
|
476
|
+
|
|
477
|
+
```javascript
|
|
478
|
+
Sentry.init({
|
|
479
|
+
dsn: "___PUBLIC_DSN___",
|
|
480
|
+
replaysSessionSampleRate: 0.1,
|
|
481
|
+
replaysOnErrorSampleRate: 0.5,
|
|
482
|
+
integrations: [Sentry.replayIntegration()],
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
MySupportWidget.on("open", async () => {
|
|
486
|
+
const replay = Sentry.getReplay();
|
|
487
|
+
await replay.flush();
|
|
488
|
+
const replayId = replay.getReplayId();
|
|
489
|
+
|
|
490
|
+
MySupportWidget.setTag("replayId", replayId);
|
|
491
|
+
// Replay URL format:
|
|
492
|
+
// https://<org-slug>.sentry.io/replays/<replay-id>/
|
|
493
|
+
});
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## Performance Impact
|
|
499
|
+
|
|
500
|
+
### Buffer Mode is Lightweight
|
|
501
|
+
|
|
502
|
+
Buffer mode stores ~2–5 MB in memory — these are DOM event logs (clicks, scrolls,
|
|
503
|
+
mutations), not video files.
|
|
504
|
+
The real-time encoding is handled by a WebWorker.
|
|
505
|
+
|
|
506
|
+
### Mutation Limits
|
|
507
|
+
|
|
508
|
+
Protect against performance degradation from excessive DOM mutations:
|
|
509
|
+
|
|
510
|
+
```javascript
|
|
511
|
+
Sentry.replayIntegration({
|
|
512
|
+
mutationBreadcrumbLimit: 1000, // Emit breadcrumb warning at this threshold
|
|
513
|
+
mutationLimit: 1500, // Stop recording at this threshold
|
|
514
|
+
});
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### Custom Compression Worker
|
|
518
|
+
|
|
519
|
+
Reduces bundle size and avoids CSP violations by self-hosting the compression worker:
|
|
520
|
+
|
|
521
|
+
```javascript
|
|
522
|
+
Sentry.replayIntegration({
|
|
523
|
+
workerUrl: "/assets/sentry-replay-worker.min.js",
|
|
524
|
+
});
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
**Bundler plugin optimization** (excludes worker from main bundle):
|
|
528
|
+
|
|
529
|
+
```javascript
|
|
530
|
+
sentryVitePlugin({
|
|
531
|
+
bundleSizeOptimizations: {
|
|
532
|
+
excludeReplayWorker: true,
|
|
533
|
+
},
|
|
534
|
+
});
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### Content Security Policy
|
|
538
|
+
|
|
539
|
+
Session Replay uses a WebWorker for compression.
|
|
540
|
+
Add to your CSP:
|
|
541
|
+
|
|
542
|
+
```
|
|
543
|
+
worker-src 'self' blob:;
|
|
544
|
+
child-src 'self' blob:;
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
> Safari ≤15.4 requires `child-src`. Use a self-hosted `workerUrl` as an alternative.
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
## Best Practices
|
|
552
|
+
|
|
553
|
+
- **Keep `replaysOnErrorSampleRate` at `1.0`** — error sessions are the highest value
|
|
554
|
+
for debugging.
|
|
555
|
+
- **Use `maskAllText: true` in production** — default behavior, protects PII. Only
|
|
556
|
+
disable for internal tools.
|
|
557
|
+
- **Opt-in to network details explicitly** — set `networkDetailAllowUrls` only for your
|
|
558
|
+
own API origins, not third-party services.
|
|
559
|
+
- **Never enable `replayCanvasIntegration` without reviewing canvas content** — there is
|
|
560
|
+
no automatic PII scrubbing for canvas.
|
|
561
|
+
- **Test masking before deploying** — use `replaysSessionSampleRate: 1.0` in staging and
|
|
562
|
+
review replays to verify PII is hidden.
|
|
563
|
+
- **Use `workerUrl` to self-host the compression worker** if you have strict CSP or want
|
|
564
|
+
to reduce bundle size.
|
|
565
|
+
- **Use `beforeAddRecordingEvent`** to filter out high-frequency recording events that
|
|
566
|
+
don’t add debugging value.
|
|
567
|
+
- **Set `minReplayDuration`** to avoid sending trivially short sessions (default: 5s is
|
|
568
|
+
usually fine).
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## Troubleshooting
|
|
573
|
+
|
|
574
|
+
| Issue | Solution |
|
|
575
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
576
|
+
| Replay not recording | Check that `replaysSessionSampleRate` or `replaysOnErrorSampleRate` is > 0. Confirm `replayIntegration()` is in the `integrations` array. |
|
|
577
|
+
| CSP errors blocking worker | Add `worker-src 'self' blob:; child-src 'self' blob:;` to your CSP, or use `workerUrl` to self-host the worker. |
|
|
578
|
+
| Replay stops after mutation spike | The `mutationLimit` (default: 10000) was hit. Increase it or reduce DOM mutation frequency in your app. |
|
|
579
|
+
| Sensitive data visible in replays | Add `.sentry-mask` / `.sentry-block` to elements, or use `mask`/`block` selector options. Verify with `replaysSessionSampleRate: 1.0` in staging. |
|
|
580
|
+
| Canvas not recorded | Add `replayCanvasIntegration()` alongside `replayIntegration()`. Requires SDK ≥7.50.0. |
|
|
581
|
+
| Network request bodies not captured | Set `networkDetailAllowUrls` to include your API origin. Bodies are opt-in by default. |
|
|
582
|
+
| Replay ID unavailable | Call `replay.getReplayId()` only after `replay.start()` or `replay.startBuffering()` has been called. |
|
|
583
|
+
| Error replays missing the 60-second buffer | Ensure `replaysOnErrorSampleRate > 0` and the replay integration is initialized before the error occurs. |
|
|
584
|
+
| Large bundle size from replay | Use the bundler plugin option `excludeReplayWorker: true` and self-host the worker via `workerUrl`. |
|
|
585
|
+
| `beforeErrorSampling` not firing | Only runs in **buffer mode** (when the session was not selected for full session recording). |
|
|
586
|
+
| Safari CSP issues | Safari ≤15.4 requires `child-src` in addition to `worker-src`. Use `workerUrl` as an alternative. |
|