Repository navigation
Releases: phaelor/react-native-app-inspector
Releases · phaelor/react-native-app-inspector
Release list
0.3.0
0.3.0 — 2026-09-29
Added
- Request and response bodies in the network log, with the panel showing
them formatted and a cURL you can copy. Controlled by the newnetwork
prop onInspectorRoot:{ captureBodies, maxBodyBytes, captureHeaders }. - Request and response headers, with
Authorization,Cookieand the
like replaced by[redacted]. - Frozen-frame detection. A gap of 700 ms or more between frames is
reported as an error on the timeline and costs the screen 20 points of its
quality score. - New Architecture support. The native module is now a TurboModule,
generated from a codegen spec, on both platforms. The legacy bridge keeps
working, soreact-native >= 0.72is still supported; the New Architecture
path needs 0.74 or newer. - Automatic tap capture in release builds. Production React never calls
Profiler.onRender, which is what reported the commit a tap was waiting
for, so every auto-captured tap used to be dropped. Import the package at
the top of your entry file (import 'react-native-app-inspector';in
index.js) to get the exact measurement; otherwise a tap ends at the first
frame presented after its work. Per-component render statistics still need
the profiler and stay development-only.
Fixed
- iOS request bodies are read before the upload starts. They were read after
completion, by which point the stream was consumed, so the body was
practically always empty. - Android native network capture works again on recent React Native.
OkHttpClientProvider's private factory field was renamed when it was
rewritten in Kotlin, so the interceptor silently fell back to the JS patch. - Secrets are matched by exact key instead of substring.
pinno longer
redactsshipping, andAccess-Control-Allow-Credentialsis left alone. - Secret query parameters are redacted in headers whose value is a URL
(Location,Content-Location,Referer). A server echoing the request
URL back leaked keys that had already been removed from the entry'surl. maxBodyBytesreaches the native interceptors instead of being capped at a
hardcoded 32 KB.- The panel no longer uses React Native's deprecated
SafeAreaView. It pads
itself from the window insets reported by the native module, which also
fixes the header sitting under the status bar on Android with edge-to-edge. - A long value in a detail row — a request URL, say — wraps in the space left
over instead of overflowing across its label. - The FPS badge returns to its edge when the window is resized. After a
rotation it could end up off-screen, taking the only way into the panel
with it.
Internal
- The example app runs React Native 0.87.1 with the New Architecture.
- CI compiles the module against React Native 0.74, 0.76, 0.81 and 0.87, on
both architectures where the version still supports the legacy one.
v0.2.2 — native capture hardening, Hermes heap
Fixed
- iOS network capture no longer replaces the host's
RCTSetCustomNSURLSessionConfigurationProvider. The interceptor now joins
every default/ephemeral session'sprotocolClassesat load, so it also
survives a host that registers its own provider (SSL pinning, proxies). - iOS interceptor reuses one shared
NSURLSessioninstead of creating one per
request, and logs redirect hops with their 3xx status instead of delivering
the redirect response twice to the client. - Android: if the OkHttp client factory cannot be read reflectively on some
React Native version, the native interceptor is left uninstalled (the host's
factory is never replaced blindly) and JS falls back to the XHR patch via the
newnetworkCaptureAvailablemodule constant. - Android: memory (
Debug.getMemoryInfo, a binder call) and CPU sampling moved
off the main thread so the monitor no longer perturbs the UI FPS it measures. - JS heap is now reported on Hermes (via
HermesInternal.getInstrumentedStats);
previously it was always empty because Hermes lacksperformance.memory.
Internal
- CI compiles the Android and iOS native modules against the example app.
v0.2.1 — tap capture fixes, modules.taps flag
Fixed
- Tap dedup no longer collapses two distinct taps landing within 32 ms of each other — only an auto-captured and an explicit begin of the same touch dedup (the explicit label wins, as before).
AppInspector.beginInteraction()called without a touch timestamp (e.g. after anawaitinside a press handler) adopts the pending auto-captured tap instead of double-counting it, so one tap yields one measurement anchored at the actual touch.- Simultaneous taps (two fingers, two buttons) are now tracked independently: the tap detector keys pending touches by
nativeEvent.identifierinstead of a single slot that dropped both.
Added
modules.tapsflag — automatic tap capture is now switchable through the standard module flags like every other capture module. TheautoCaptureTapsprop onInspectorRootstill works; either switch disables capture.
v0.2.0 — InspectorRoot, native network capture, tap latency, storage inspector
One wrapper now does everything: capture, the draggable FPS badge and the full-screen panel.
<InspectorRoot enabled={__DEV__}>
<App />
</InspectorRoot>Breaking
InspectorPanelwas removed — wrap the app inInspectorRoot(or renderInspectorModalfrom your own trigger). See the changelog for the migration snippet.
Added
- InspectorRoot — single-wrapper integration (config, lifecycle, badge, panel, root profiling, React Navigation tracking via
navigationRef) - Full-screen panel with pill tabs, search, virtualized lists and a Settings tab (pause / share / clear / badge toggle)
- Draggable FPS badge — live JS/UI FPS, CPU, memory
- Native network capture — NSURLProtocol (iOS) / OkHttp interceptor (Android), XHR fallback
- Automatic tap capture — tap→response latency for every pressable, RAIL-coded Taps tab
- Storage tab — browse/search/edit AsyncStorage, MMKV or any custom store (
asyncStorageAdapter,mmkvAdapter) - Copy-as-cURL and copy buttons throughout
Fixed
- Inspector UI inside the profiled subtree no longer loops the render stats ("Maximum update depth exceeded")
- Rounded durations for natively captured requests; podspec tag now matches
v-prefixed tags
Full details in CHANGELOG.md.
v0.1.0
First public release.
react-native-app-inspector is an on-device performance & debug panel for
React Native. It runs inside your QA or staging build — no Metro, USB or
computer required — so a tester can open the panel, see what's slow and why,
and export the session.
Highlights
- Performance Timeline — a time-ordered log of actions, navigation, renders,
network, FPS drops, memory and errors, with automatic cause correlation. - Slow Screen detector — a per-screen profiler that scores every screen
0–100 and lists its concrete problems. - Native metrics — JS + UI-thread FPS, CPU, resident memory (RSS), jank and
JS heap, on iOS and Android. - Automatic capture —
fetch/XMLHttpRequest, uncaught JS errors and
console.error/warn, with no code changes. - Integrations — React Navigation tracker, Redux middleware, and session
persistence (plug in AsyncStorage to survive a crash). - On-device & exportable — a tabbed panel you toggle with a prop; export to
JSON or the native share sheet.
Install
npm install react-native-app-inspectorSee the README
for usage and screenshots.