Skip to content

WIP: feat(core): Add rage tap detection with ui.frustration breadcrumbs#5992

Draft
alwx wants to merge 1 commit intomainfrom
feat/rage-tap-detection
Draft

WIP: feat(core): Add rage tap detection with ui.frustration breadcrumbs#5992
alwx wants to merge 1 commit intomainfrom
feat/rage-tap-detection

Conversation

@alwx
Copy link
Copy Markdown
Contributor

@alwx alwx commented Apr 14, 2026

📢 Type of change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring

📜 Description

Detects rage taps (rapid consecutive taps on the same UI element) and surfaces them as first-class frustration signals across the SDK.

Design decisions

  • Component identity over coordinates — taps are matched by label or component name + file rather than screen coordinates. More robust for shifting layouts and list items, and reuses data already captured by TouchEventBoundary.
  • Breadcrumb-first — emits ui.frustration breadcrumbs.

📝 Checklist

  • I added tests to verify changes
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • All tests passing
  • No breaking changes

Detect rapid consecutive taps on the same UI element and surface them as
frustration signals across the SDK:

- New RageTapDetector class tracks recent taps in a circular buffer and
  matches them by component identity (label or name+file). When N taps
  on the same target occur within a configurable time window, a
  ui.frustration breadcrumb is emitted automatically.

- TouchEventBoundary gains three new props: enableRageTapDetection
  (default: true), rageTapThreshold (default: 3), and rageTapTimeWindow
  (default: 1000ms).

- Native replay breadcrumb converters on both Android (Java) and iOS
  (Objective-C) now handle the ui.frustration category, converting it
  to an RRWeb breadcrumb event so rage taps appear on the session
  replay timeline with the same touch-path message format as regular
  ui.tap events.

- 7 new JS tests cover detection, threshold configuration, time window
  expiry, buffer reset, disabled mode, and component-name fallback.
  Android and iOS converter tests verify the new category is handled
  correctly.
@alwx alwx self-assigned this Apr 14, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

Semver Impact of This PR

None (no version bump detected)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


  • WIP: feat(core): Add rage tap detection with ui.frustration breadcrumbs by alwx in #5992
  • chore(deps): bump follow-redirects from 1.15.11 to 1.16.0 by dependabot in #6004
  • chore: Bump sample app to React Native 0.85.1 by antonis in #5991
  • chore(deps): Bump E2E tests to 0.85.1 by antonis in #5990
  • Add deeplinkIntegration for automatic deep link breadcrumbs by alwx in #5983
  • fix(core): Retry native module resolution to prevent silent event drops by antonis in #5981
  • feat(core): Name navigation spans using dispatched action payload by alwx in #5982
  • ci: Gate size analysis on ready-to-merge label for PRs by antonis in #5963
  • chore(deps): update Android SDK to v8.38.0 by github-actions in #5971
  • chore(deps): update Sentry Android Gradle Plugin to v6.4.0 by github-actions in #5974
  • chore(deps): update Cocoa SDK to v9.10.0 by github-actions in #5972
  • chore(deps): update JavaScript SDK to v10.48.0 by github-actions in #5975
  • chore(deps): bump actions/github-script from 8 to 9 by dependabot in #5980
  • chore(deps): bump actions/create-github-app-token from 3.0.0 to 3.1.1 by dependabot in #5979
  • chore(deps): update Bundler Plugins to v5.2.0 by github-actions in #5968
  • chore(deps): bump axios from 1.13.5 to 1.15.0 by dependabot in #5978
  • chore(deps): bump addressable from 2.8.7 to 2.9.0 in /performance-tests by dependabot in #5969
  • chore(deps): bump basic-ftp from 5.2.0 to 5.2.2 by dependabot in #5977
  • fix(profiling): Fix app start transaction profile timestamp offset by antonis in #5962
  • fix(android): Use componentStack as fallback for missing error stack traces by antonis in #5965
  • chore(deps): bump addressable from 2.8.7 to 2.9.0 in /samples/react-native-macos by dependabot in #5967
  • chore(deps): bump addressable from 2.8.7 to 2.9.0 in /samples/react-native by dependabot in #5966
  • fix(ios): Add SENTRY_PROJECT_ROOT env var for monorepo support by antonis in #5961
  • feat(ios): Add attachAllThreads option by antonis in #5960

Plus 12 more


🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 14, 2026

Fails
🚫 Pull request is not ready for merge, please add the "ready-to-merge" label to the pull request
🚫 Please consider adding a changelog entry for the next release.

Instructions and example for changelog

Please add an entry to CHANGELOG.md to the "Unreleased" section. Make sure the entry includes this PR's number.

Example:

## Unreleased

### Features

- Add rage tap detection with ui.frustration breadcrumbs ([#5992](https://github.com/getsentry/sentry-react-native/pull/5992))

If none of the above apply, you can opt out of this check by adding #skip-changelog to the PR description or adding a skip-changelog label.

Generated by 🚫 dangerJS against 7d06010

@alwx alwx changed the title feat(core): Add rage tap detection with ui.frustration breadcrumbs WIP: feat(core): Add rage tap detection with ui.frustration breadcrumbs Apr 14, 2026
@alwx alwx force-pushed the feat/rage-tap-detection branch from 4cfa1af to 7d06010 Compare April 15, 2026 12:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant