@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,406 @@
|
|
|
1
|
+
# Session Replay — Sentry Android SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `io.sentry:sentry-android:8.33.0`\
|
|
4
|
+
> **Minimum Android API: 26 (Oreo)** — silently disabled on API 21-25\
|
|
5
|
+
> **Status:** Production-ready\
|
|
6
|
+
> **Docs:** https://docs.sentry.io/platforms/android/session-replay/
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ⚠️ API Level Requirement
|
|
11
|
+
|
|
12
|
+
Session Replay requires **Android API 26 (Oreo)** or higher.
|
|
13
|
+
On devices running API 21–25, replay is silently skipped with an `INFO` log — no crash,
|
|
14
|
+
no error, no recording.
|
|
15
|
+
Apps with `minSdk = 21` (covering ~4–5% of devices) have zero replay coverage on those
|
|
16
|
+
devices.
|
|
17
|
+
|
|
18
|
+
```kotlin
|
|
19
|
+
// Guard in ReplayIntegration.kt (line 128):
|
|
20
|
+
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## How Android Replay Works
|
|
26
|
+
|
|
27
|
+
Android Session Replay is **screenshot-based**, not DOM-based:
|
|
28
|
+
|
|
29
|
+
| Dimension | Web Replay | Android Replay |
|
|
30
|
+
| ----------------- | -------------------------- | ----------------------------------------- |
|
|
31
|
+
| Recording method | DOM serialization | Native view hierarchy screenshots |
|
|
32
|
+
| Frame rate | Variable / mutation-driven | ~1 frame per second |
|
|
33
|
+
| Privacy mechanism | CSS-based DOM masking | **Native pixel masking** over screenshots |
|
|
34
|
+
| Touch recording | Full pointer events | Tap breadcrumbs only |
|
|
35
|
+
| Text in replay | Selectable, searchable | Pixel-only — text is in screenshots |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
`sentry-android` bundles session replay — no separate dependency needed:
|
|
42
|
+
|
|
43
|
+
```groovy
|
|
44
|
+
dependencies {
|
|
45
|
+
implementation("io.sentry:sentry-android:8.33.0")
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For a lighter build using explicit modules:
|
|
50
|
+
|
|
51
|
+
```groovy
|
|
52
|
+
dependencies {
|
|
53
|
+
implementation("io.sentry:sentry-android-core:8.33.0")
|
|
54
|
+
implementation("io.sentry:sentry-android-replay:8.33.0")
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
For Jetpack Compose masking support:
|
|
59
|
+
|
|
60
|
+
```groovy
|
|
61
|
+
dependencies {
|
|
62
|
+
implementation("io.sentry:sentry-compose-android:8.33.0")
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Basic Setup
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
SentryAndroid.init(this) { options ->
|
|
72
|
+
options.dsn = "https://YOUR_KEY@sentry.io/YOUR_PROJECT_ID"
|
|
73
|
+
|
|
74
|
+
// Continuous recording — record 10% of all sessions
|
|
75
|
+
options.sessionReplay.sessionSampleRate = 0.1
|
|
76
|
+
|
|
77
|
+
// Error-triggered — buffer 30s and upload when an error occurs
|
|
78
|
+
options.sessionReplay.onErrorSampleRate = 1.0
|
|
79
|
+
|
|
80
|
+
// Production-recommended: both modes together
|
|
81
|
+
options.sessionReplay.sessionSampleRate = 0.05 // 5% continuous baseline
|
|
82
|
+
options.sessionReplay.onErrorSampleRate = 0.75 // 75% on error
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Via AndroidManifest.xml:**
|
|
87
|
+
|
|
88
|
+
```xml
|
|
89
|
+
<meta-data android:name="io.sentry.session-replay.session-sample-rate" android:value="0.1" />
|
|
90
|
+
<meta-data android:name="io.sentry.session-replay.on-error-sample-rate" android:value="1.0" />
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Configuration Reference
|
|
96
|
+
|
|
97
|
+
Accessed via `options.sessionReplay` (Kotlin) or `options.getSessionReplay()` (Java).
|
|
98
|
+
|
|
99
|
+
| Option | Type | Default | Description |
|
|
100
|
+
| ------------------------ | ------------------------ | ---------------------------------------- | -------------------------------------------------------------------- |
|
|
101
|
+
| `sessionSampleRate` | `Double?` | `0.0` | Fraction of all sessions recorded continuously (0.0–1.0) |
|
|
102
|
+
| `onErrorSampleRate` | `Double?` | `0.0` | Fraction captured when an error occurs; buffers 30s prior |
|
|
103
|
+
| `quality` | `SentryReplayQuality` | `MEDIUM` | Video encoding quality preset |
|
|
104
|
+
| `screenshotStrategy` | `ScreenshotStrategyType` | `PIXEL_COPY` | Frame capture method (`PIXEL_COPY` or `CANVAS`) |
|
|
105
|
+
| `maskAllText` | `Boolean` | `true` | Mask all `TextView` subclasses (includes `Button`, `EditText`, etc.) |
|
|
106
|
+
| `maskAllImages` | `Boolean` | `true` | Mask all `ImageView` subclasses |
|
|
107
|
+
| `frameRate` | `Int` | `1` | Frames per second |
|
|
108
|
+
| `errorReplayDuration` | `Long` (ms) | `30_000` | Pre-error ring buffer size (30 seconds) |
|
|
109
|
+
| `sessionSegmentDuration` | `Long` (ms) | `5_000` | How often video segments are uploaded |
|
|
110
|
+
| `sessionDuration` | `Long` (ms) | `3_600_000` | Maximum session length (1 hour) |
|
|
111
|
+
| `networkDetailAllowUrls` | `List<String>` | `[]` | URL prefixes for network request/response capture |
|
|
112
|
+
| `networkDetailDenyUrls` | `List<String>` | `[]` | URL prefixes excluded from network capture |
|
|
113
|
+
| `networkCaptureBodies` | `Boolean` | `true` | Capture HTTP request/response bodies |
|
|
114
|
+
| `networkRequestHeaders` | `List<String>` | `[Content-Type, Content-Length, Accept]` | Request headers to capture |
|
|
115
|
+
| `networkResponseHeaders` | `List<String>` | `[Content-Type, Content-Length, Accept]` | Response headers to capture |
|
|
116
|
+
| `debug` | `Boolean` | `false` | Enable verbose replay diagnostic logging |
|
|
117
|
+
| `trackConfiguration` | `Boolean` | `true` | Track device orientation and configuration changes |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Code Examples
|
|
122
|
+
|
|
123
|
+
### Video Quality
|
|
124
|
+
|
|
125
|
+
```kotlin
|
|
126
|
+
SentryAndroid.init(this) { options ->
|
|
127
|
+
// Choose based on bandwidth/battery vs. fidelity trade-off
|
|
128
|
+
options.sessionReplay.quality = SentryReplayQuality.LOW // 80% res, 50 kbps, JPEG q10
|
|
129
|
+
options.sessionReplay.quality = SentryReplayQuality.MEDIUM // 100% res, 75 kbps, JPEG q30 (default)
|
|
130
|
+
options.sessionReplay.quality = SentryReplayQuality.HIGH // 100% res, 100 kbps, JPEG q50
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Screenshot Strategy
|
|
135
|
+
|
|
136
|
+
```kotlin
|
|
137
|
+
SentryAndroid.init(this) { options ->
|
|
138
|
+
// Default — stable, supports all custom masking
|
|
139
|
+
options.sessionReplay.screenshotStrategy = ScreenshotStrategyType.PIXEL_COPY
|
|
140
|
+
|
|
141
|
+
// Experimental — always masks ALL text and images; custom masking rules are ignored
|
|
142
|
+
options.sessionReplay.screenshotStrategy = ScreenshotStrategyType.CANVAS
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
> **Canvas strategy warning:** When `CANVAS` is active, `addMaskViewClass()`, XML tags,
|
|
147
|
+
> Kotlin extensions, and Compose modifiers are **completely ignored**. Canvas always
|
|
148
|
+
> masks all text and images.
|
|
149
|
+
> Use only when total masking is acceptable.
|
|
150
|
+
|
|
151
|
+
### Development Configuration
|
|
152
|
+
|
|
153
|
+
```kotlin
|
|
154
|
+
SentryAndroid.init(this) { options ->
|
|
155
|
+
if (BuildConfig.DEBUG) {
|
|
156
|
+
options.sessionReplay.sessionSampleRate = 1.0 // record all sessions in dev
|
|
157
|
+
options.sessionReplay.debug = true // verbose diagnostic logging
|
|
158
|
+
} else {
|
|
159
|
+
options.sessionReplay.sessionSampleRate = 0.05
|
|
160
|
+
options.sessionReplay.onErrorSampleRate = 1.0
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Privacy Masking
|
|
168
|
+
|
|
169
|
+
### Default Masked Types
|
|
170
|
+
|
|
171
|
+
These view classes are masked by default:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
android.widget.TextView (+ ALL subclasses: Button, EditText, CheckBox, RadioButton, Switch...)
|
|
175
|
+
android.widget.ImageView
|
|
176
|
+
android.webkit.WebView
|
|
177
|
+
android.widget.VideoView
|
|
178
|
+
androidx.camera.view.PreviewView
|
|
179
|
+
androidx.media3.ui.PlayerView
|
|
180
|
+
com.google.android.exoplayer2.ui.PlayerView
|
|
181
|
+
com.google.android.exoplayer2.ui.StyledPlayerView
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
> **Masking is hierarchical.** Masking `TextView` also masks every subclass
|
|
185
|
+
> automatically.
|
|
186
|
+
|
|
187
|
+
### Disabling Default Masking
|
|
188
|
+
|
|
189
|
+
```kotlin
|
|
190
|
+
// Only if you are certain your UI contains no PII in text or images
|
|
191
|
+
options.sessionReplay.maskAllText = false
|
|
192
|
+
options.sessionReplay.maskAllImages = false
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Class-Based Masking
|
|
196
|
+
|
|
197
|
+
```kotlin
|
|
198
|
+
// Mask custom view class and all subclasses
|
|
199
|
+
options.sessionReplay.addMaskViewClass("com.example.ui.CreditCardInputView")
|
|
200
|
+
options.sessionReplay.addMaskViewClass("com.example.ui.SsnField")
|
|
201
|
+
|
|
202
|
+
// Unmask a subclass whose parent class is masked
|
|
203
|
+
options.sessionReplay.addUnmaskViewClass("com.example.ui.PublicLabelButton")
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Instance-Based Masking via XML
|
|
207
|
+
|
|
208
|
+
```xml
|
|
209
|
+
<!-- Using the standard tag attribute -->
|
|
210
|
+
<View android:tag="sentry-mask" ... />
|
|
211
|
+
<TextView android:tag="sentry-unmask" android:text="@string/public_product_name" />
|
|
212
|
+
|
|
213
|
+
<!-- Using the dedicated Sentry privacy tag (preferred — doesn't conflict with other tag uses) -->
|
|
214
|
+
<View ...>
|
|
215
|
+
<tag android:id="@id/sentry_privacy" android:value="mask" />
|
|
216
|
+
</View>
|
|
217
|
+
|
|
218
|
+
<TextView android:text="@string/safe_label">
|
|
219
|
+
<tag android:id="@id/sentry_privacy" android:value="unmask" />
|
|
220
|
+
</TextView>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Instance-Based Masking via Kotlin Extensions
|
|
224
|
+
|
|
225
|
+
```kotlin
|
|
226
|
+
// On any View instance
|
|
227
|
+
creditCardInputView.sentryReplayMask()
|
|
228
|
+
productTitleLabel.sentryReplayUnmask()
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Jetpack Compose Masking
|
|
232
|
+
|
|
233
|
+
> **Requires:** `io.sentry:sentry-compose-android:8.33.0`\
|
|
234
|
+
> **Compose 1.8+ note:** A masking regression for Compose 1.8+ was fixed in SDK 8.32.x —
|
|
235
|
+
> use SDK ≥ 8.33.0 with Compose 1.8.
|
|
236
|
+
|
|
237
|
+
```kotlin
|
|
238
|
+
// Mask an entire composable subtree
|
|
239
|
+
@Composable
|
|
240
|
+
fun PaymentForm() {
|
|
241
|
+
Column(modifier = Modifier.sentryReplayMask()) {
|
|
242
|
+
CreditCardField() // masked via parent
|
|
243
|
+
CvvField() // masked via parent
|
|
244
|
+
ExpiryDateField() // masked via parent
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Unmask safe elements inside an otherwise-masked region
|
|
249
|
+
@Composable
|
|
250
|
+
fun ProductCard(product: Product) {
|
|
251
|
+
Column(modifier = Modifier.sentryReplayMask()) {
|
|
252
|
+
Text(
|
|
253
|
+
text = product.name,
|
|
254
|
+
modifier = Modifier.sentryReplayUnmask() // product name is safe to show
|
|
255
|
+
)
|
|
256
|
+
Text(
|
|
257
|
+
text = userPaymentInfo,
|
|
258
|
+
// inherits parent mask — sensitive data stays masked
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Masking via Sentry tag modifier (alternative)
|
|
264
|
+
Text(
|
|
265
|
+
text = "Public info",
|
|
266
|
+
modifier = Modifier.sentryTag("sentry-unmask")
|
|
267
|
+
)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
> **Compose + view flattening:** Compose can optimize away wrapper composables.
|
|
271
|
+
> If masking is unexpectedly dropped, verify the composable is not being flattened by
|
|
272
|
+
> the Compose compiler.
|
|
273
|
+
|
|
274
|
+
### Masking Priority Order (first match wins)
|
|
275
|
+
|
|
276
|
+
1. **View-level unmask** — `sentry-unmask` tag / `.sentryReplayUnmask()` / Compose
|
|
277
|
+
`.sentryReplayUnmask()`
|
|
278
|
+
2. **View-level mask** — `sentry-mask` tag / `.sentryReplayMask()` / Compose
|
|
279
|
+
`.sentryReplayMask()`
|
|
280
|
+
3. **Class-level unmask** — `addUnmaskViewClass(className)`
|
|
281
|
+
4. **Class-level mask** — `addMaskViewClass(className)` / `maskAllText` /
|
|
282
|
+
`maskAllImages`
|
|
283
|
+
|
|
284
|
+
> **ViewGroup inheritance:** A masked parent does NOT automatically mask its children.
|
|
285
|
+
> Each child must be independently masked.
|
|
286
|
+
> An unmasked parent does NOT override class-level masks on children.
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Network Capture
|
|
291
|
+
|
|
292
|
+
Requires `SentryOkHttpInterceptor` or `SentryOkHttpEventListener` from
|
|
293
|
+
`sentry-android-okhttp` (or `sentry-okhttp`):
|
|
294
|
+
|
|
295
|
+
```kotlin
|
|
296
|
+
SentryAndroid.init(this) { options ->
|
|
297
|
+
options.sessionReplay.networkDetailAllowUrls = listOf(
|
|
298
|
+
"https://api.myapp.com/v2" // capture details for this prefix
|
|
299
|
+
)
|
|
300
|
+
options.sessionReplay.networkDetailDenyUrls = listOf(
|
|
301
|
+
"https://api.myapp.com/v2/auth", // exclude auth endpoints (tokens)
|
|
302
|
+
"https://api.myapp.com/v2/payment" // exclude payment endpoints
|
|
303
|
+
)
|
|
304
|
+
options.sessionReplay.networkCaptureBodies = true
|
|
305
|
+
options.sessionReplay.networkRequestHeaders = listOf("X-Request-ID", "Accept-Language")
|
|
306
|
+
options.sessionReplay.networkResponseHeaders = listOf("X-Response-Time", "X-Cache")
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
> Retrofit and `HttpURLConnection` apps have no network capture in replay — only OkHttp
|
|
311
|
+
> is supported.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Session Lifecycle
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
App launches / comes to foreground
|
|
319
|
+
│
|
|
320
|
+
▼
|
|
321
|
+
SDK init → ReplayIntegration.start()
|
|
322
|
+
│
|
|
323
|
+
│ [recording at 1 fps, uploading segments every 5s]
|
|
324
|
+
│
|
|
325
|
+
├── app goes background ─────────► pause() + flush current segment
|
|
326
|
+
│ < 30s background
|
|
327
|
+
├── app returns to foreground ───► resume() (SAME replay ID)
|
|
328
|
+
│ > 30s background
|
|
329
|
+
├── app returns to foreground ───► stop() + start() (NEW replay ID)
|
|
330
|
+
│
|
|
331
|
+
├── 60 minutes elapsed ──────────► session ends, new one begins
|
|
332
|
+
│
|
|
333
|
+
└── error occurs (onErrorSampleRate mode)
|
|
334
|
+
│
|
|
335
|
+
└─► last 30s of buffered frames are uploaded
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Debug Masking Overlay
|
|
341
|
+
|
|
342
|
+
During development, enable a colored overlay to visually inspect which regions are
|
|
343
|
+
masked:
|
|
344
|
+
|
|
345
|
+
```kotlin
|
|
346
|
+
// Get the ReplayIntegration instance
|
|
347
|
+
val replay = Sentry.getCurrentScopes().options.integrations
|
|
348
|
+
.filterIsInstance<ReplayIntegration>()
|
|
349
|
+
.firstOrNull()
|
|
350
|
+
|
|
351
|
+
replay?.enableDebugMaskingOverlay() // shows colored rectangles over masked regions
|
|
352
|
+
replay?.disableDebugMaskingOverlay()
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## Best Practices
|
|
358
|
+
|
|
359
|
+
1. **Always set both sample rates for production** — `sessionSampleRate` for baseline
|
|
360
|
+
coverage, `onErrorSampleRate = 1.0` for debugging every error
|
|
361
|
+
2. **Start with `MEDIUM` quality** — then adjust down to `LOW` if bandwidth or battery
|
|
362
|
+
becomes a concern
|
|
363
|
+
3. **Use `maskAllText = true` (default)** — erring on the side of more masking is always
|
|
364
|
+
safer for user privacy
|
|
365
|
+
4. **Use XML `sentry_privacy` tag over `android:tag`** — the dedicated tag doesn’t
|
|
366
|
+
conflict with other usages of `android:tag`
|
|
367
|
+
5. **Use Compose `Modifier.sentryReplayMask()` at the layout level** — mask entire
|
|
368
|
+
sections (payment forms, PII screens) rather than individual fields
|
|
369
|
+
6. **Never enable Canvas strategy in production without testing** — it ignores all
|
|
370
|
+
custom masking rules
|
|
371
|
+
7. **Set `debug = true` during development** — helps verify masking is applied correctly
|
|
372
|
+
before releasing
|
|
373
|
+
8. **Test on an API 26 device** — replay silently does nothing on API 21-25; don’t test
|
|
374
|
+
exclusively on newer devices and assume all users have coverage
|
|
375
|
+
9. **Exclude auth and payment URLs from network capture** — `networkDetailDenyUrls`
|
|
376
|
+
prevents tokens and card data from appearing in replay
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Known Limitations
|
|
381
|
+
|
|
382
|
+
| Limitation | Details |
|
|
383
|
+
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
384
|
+
| API 26+ hard requirement | Silent no-op on API 21-25; no fallback or warning unless `debug = true` |
|
|
385
|
+
| Canvas strategy ignores all masking | `addMaskViewClass`, XML tags, Kotlin extensions, and Compose modifiers have zero effect with `CANVAS` |
|
|
386
|
+
| PixelCopy masking misalignment | Mask overlay can misalign on views with `setTranslationX/Y`, `setScaleX/Y`, or inside `RecyclerView` with `ItemAnimator` |
|
|
387
|
+
| 60-minute session cutoff | Sessions longer than 1 hour are truncated; a new session starts but replay continuity is broken |
|
|
388
|
+
| Compose 1.8 masking regression | Fixed in 8.32.x — requires SDK ≥ 8.33.0 for reliable masking with Compose 1.8+ |
|
|
389
|
+
| OkHttp required for network capture | `networkDetailAllowUrls` / `networkCaptureBodies` only work with Sentry OkHttp integration installed |
|
|
390
|
+
| Trailing frame loss on crash | In-memory frames from the current segment are lost if the app is killed mid-segment; completed segments are persisted to disk |
|
|
391
|
+
| No Retrofit/HttpURLConnection network capture | Only OkHttp-based networking is captured in replay |
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Troubleshooting
|
|
396
|
+
|
|
397
|
+
| Issue | Solution |
|
|
398
|
+
| ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
399
|
+
| No replays appearing in Sentry | Check `sessionSampleRate` or `onErrorSampleRate` > 0; verify device is API 26+ (enable `debug = true` to see skip log on API 21-25) |
|
|
400
|
+
| Masking not applied to custom view | Add class to `addMaskViewClass("com.example.MyView")` or apply `sentry-mask` tag |
|
|
401
|
+
| Masking applied but view content still visible | Check masking priority order; a view-level unmask overrides class-level masks |
|
|
402
|
+
| Compose masking not working | Add `sentry-compose-android` dependency; ensure SDK ≥ 8.33.0 for Compose 1.8+ support |
|
|
403
|
+
| Canvas strategy masking all content | Expected — Canvas strategy masks all text and images regardless of masking configuration |
|
|
404
|
+
| Network requests not captured in replay | Add `SentryOkHttpInterceptor` and add the API base URL to `networkDetailAllowUrls` |
|
|
405
|
+
| High battery drain | Reduce quality to `LOW`; replay runs at 1 fps but PixelCopy is GPU-accelerated |
|
|
406
|
+
| Replay ID not linked to log events | Replay ID is auto-attached to logs and metrics when replay is active; verify both features are enabled |
|