deep-linking
Deep links, universal links and app links in React Native. Use when links do not open the app, for apple-app-site-association or assetlinks.json, lost…
Decoding Hermes crashes and minified production stack traces. Use for "address at index.android.bundle" frames, unsymbolicated or badly grouped Sentry events, SIGSEGV in libhermes, ANRs, source maps.
$ npx -y skills add AnilBurcu/claude-code-react-native --skill hermes-crashes --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/hermes-crashesContext preview
The summary Claude sees to decide when to auto-load this skill.
Decoding Hermes crashes and minified production stack traces. Use for "address at index.android.bundle" frames, unsymbolicated or badly grouped Sentry events, SIGSEGV in libhermes, ANRs, source maps.
name: hermes-crashes description: Decoding Hermes crashes and minified production stack traces. Use for "address at index.android.bundle" frames, unsymbolicated or badly grouped Sentry events, SIGSEGV in libhermes, ANRs, source maps. user-invocable: false
Three families, three completely different investigations:
1. **JS error**: a thrown Error, a rejected promise, a render error. Stack frames point into the JS bundle (`index.android.bundle`, `main.jsbundle`). Fix in JS. 2. **Native crash**: SIGSEGV, SIGABRT, EXC_BAD_ACCESS, frames in `libhermes.so` or platform frameworks. The JS code may be the trigger but the defect is in a native module or in JSI usage. 3. **ANR / watchdog kill**: no crash at all, the main thread was blocked. Investigate what ran long, not what threw.
Misclassifying wastes days. A SIGSEGV cannot be fixed by editing JavaScript, and an unhandled rejection will never appear in a tombstone.
That address is an offset into Hermes bytecode, not a line and column in your source. The decoder is metro-symbolicate plus the source map that was generated for that exact build:
# paste the raw stack into a file, then: npx metro-symbolicate path/to/index.android.bundle.map < stack.txt
Rules that make this work:
When events show minified frames instead of source:
1. Current tooling matches bundle and map through Debug IDs injected into both at build time; the usual failure is that the upload step ran locally but not in the release lane. Confirm the CI job actually uploaded artifacts for the build that is crashing. 2. On older release-plus-dist setups, maps must be uploaded per release AND distribution. A dist mismatch fails silently and looks exactly like "sourcemaps don't work". 3. Same for the release name: what the app reports at runtime must equal what the maps were uploaded under. Log both once and compare character by character.
Error monitoring full of events titled `Object captured as exception with keys: code, details, hint, message` means non-Error objects are being thrown or captured. Consequences: useless titles, and worse, wrong grouping, because grouping falls back to the capture callsite instead of the error identity.
Fix it at the boundary: normalize everything to a real Error before capture. Give the Error a meaningful `name` (include an error code when one exists) and keep the original object on `cause`. One small `normalizeError(err)` helper applied at every `captureException` callsite turns a swamp of identical events into distinct, countable issues. Copy-ready implementations of `normalizeError` and the abort filter are in [reference.md](reference.md).
Related hygiene that pays off immediately:
The report shows where the main thread was stuck, which is often innocent framework code waiting on your work. Usual causes worth hunting in JS land: synchronous storage on startup, megabyte JSON.parse on interaction, unbatched bridge/JSI traffic in a hot loop, and dev-only logging left on in release. Reproduce with a release build; debug builds have completely different performance characteristics and will mislead you.
Claude knows React. It doesn't know why your pod install just failed. A Claude Code plugin that adds the React Native knowledge you only get from shipping apps: build failure triage, SDK upgrades that don't eat a weekend, Hermes crash decoding, push
Repo: AnilBurcu/claude-code-react-native
Deep links, universal links and app links in React Native. Use when links do not open the app, for apple-app-site-association or assetlinks.json, lost…
EAS builds, OTA updates and store submission. Use for eas.json profiles, safe OTA publishing, App Store or Play Store submission, store rejections, versioning…
Upgrading Expo SDK and React Native safely. Use when bumping the SDK or react-native, or when the app broke after an upgrade: upgrade order, expo install…
Diagnose and fix a failing iOS or Android build. Use when the build is broken, pod install or Gradle fails, or the user asks to fix a native build error.
In-app purchases and subscriptions with RevenueCat. Use for paywalls, odd sandbox behavior, premium not arriving after purchase, webhook verification, restore…
Working with huge build and device logs. Use when a build prints hundreds of lines, for adb logcat or simulator logs, when the user pastes a wall of log text,…