Reference
Experimental
RN debugger, network inspection, and profiling. Powerful but depend on React Native runtime internals — expect occasional drift between RN versions.
Conductor ships a set of commands that depend on React Native runtime internals
(__REACT_DEVTOOLS_GLOBAL_HOOK__, fiber shape, UIManager / nativeFabricUIManager,
renderer.rendererConfig). They work — they're modelled directly on the patterns
used by tools like react-devtools — but RN reorganises these internals occasionally,
so the scripts may need maintenance per RN major version.
If you hit a breakage, the failure mode is usually a clear error ("No React DevTools hook",
"No fiber roots", "rendererConfig.getInspectorDataForViewAtPoint unavailable") and the
underlying Metro / app is unaffected — you can fall back to native inspection.
All three groups below talk to Metro's Chrome DevTools Protocol endpoint (/json on
port 8081 by default). Pass --port <n> to point at a different bundler, --target <n>
to pick a specific debugger target when several are connected.
RN debugger
| Command | What it does |
|---|---|
debug status |
Show Metro target list, connection state, loaded scripts, enabled CDP domains. |
debug evaluate <expr> |
Runtime.evaluate in the app's JS context. Awaits promises. Reads Redux, calls app functions, inspects state. |
debug component-tree |
Walk the React fiber tree, batch-measure on-screen rects via UIManager.measureInWindow (Paper) or nativeFabricUIManager.measure (Fabric). Filters out wrapper noise. |
debug inspect-element <x,y> |
Use renderer.rendererConfig.getInspectorDataForViewAtPoint (React's own inspector) to find the component at a screen point. Walks UP via .return and resolves source via _debugStack / _debugSource. |
debug log-registry |
Summary of recent Metro console output — counts by level and clustering. |
debug reload |
Page.reload over CDP. Same as metro reload. |
Caveats
- Requires Hermes (
__REACT_DEVTOOLS_GLOBAL_HOOK__is registered on Hermes startup). debug component-treeworks on both Fabric and Paper, but the SKIP list of wrapper component names is hard-coded — new RN versions may surface new wrappers we don't filter.debug inspect-elementrequiresgetInspectorDataForViewAtPointon the renderer; this exists on RN 0.70+. Older versions error out.- Source frames come from
_debugStack(RN ≥ 0.76) or_debugSource(@babel/plugin-transform-react-jsx-source). With neither, the frame isnull.
Network inspection
| Command | What it does |
|---|---|
network logs [--limit n] |
Install a fetch/XHR shim into the running app (idempotent — only once per JS context) and read the captured entries. Each entry: { id, kind, method, url, status, durationMs, error, start }. |
network request <url> [--method --body --header k=v] |
Issue an HTTP request from the app's network context. Honours the app's cookies, headers, and TLS pinning. |
Caveats
- Shim only sees
fetchandXMLHttpRequest— apps that use native networking modules directly (e.g.okhttpon Android via a TurboModule) bypass it. - A
metro reloador app reload clears the shim — callnetwork logsonce to reinstall. - The shim's ring buffer caps at ~200 entries; tune by re-installing if needed.
Profiling
| Command | What it does |
|---|---|
profile frames report [--track <s>] |
Android only. Parse dumpsys gfxinfo <pkg> framestats into jank counts, p50–p99 frame times, and a per-phase breakdown of where each frame's time went. Works on release builds and on real Fire TV hardware over adb. --save-baseline / --diff compare runs. |
profile frames reset |
Zero the counters, so the next report covers only what follows. |
profile cpu --duration <s> |
Record a CPU trace. iOS: xcrun xctrace record --template "Time Profiler". Android: adb shell simpleperf record. Writes to --out <path> or a tmp/ file. |
profile cpu --report [--top n] |
Android only. Also runs simpleperf report on-device and returns a ranked symbol table, so an agent gets something readable instead of a binary perf.data. |
profile memory --track <s> |
Poll memory at --interval <ms> (default 1000ms) for track seconds. On Android also reports heap growth over the window and ART GC pause counts / durations scraped from logcat. |
profile js record --duration <s> |
Run the Hermes sampling profiler over the Metro CDP connection. Returns a self/total time ranking by function with file:line, and writes the raw .cpuprofile. |
profile js start / js stop |
The same, bracketing a flow you drive yourself. A detached holder keeps the CDP session open in between. |
profile react start |
Install a React commit-profiler hook via __REACT_DEVTOOLS_GLOBAL_HOOK__.onCommitFiberRoot. --max-commits / --max-components size the buffers. |
profile react stop [--top n] |
Stop the profiler and rank components by self time. --json carries the per-commit timeline; --timeline adds per-commit component detail. |
press-key <key> --measure |
Time the response to an input. Reports focus→move latency (all platforms, with its own resolution as an error bar) and, on Android, the on-device input→frame latency from gfxinfo. --repeat n gives a distribution. |
Caveats
profile cpurequiresxctrace(Xcode) orsimpleperf(Android NDK) onPATH.--reportuses the device's own/system/bin/simpleperf, which resolves against the libraries actually loaded there; a stripped app library still won't symbolize.profile reactis Hermes-only and interceptsonCommitFiberRoot— interaction with other DevTools clients (the standalone React DevTools window, Flipper) is undefined; only run one profiler at a time.profile reactneeds a dev or profiling build. A release build strips React's timing instrumentation, and the command says so rather than reporting zeroes.profile reactcounts a component as having rendered in a commit only when React began work on it in that commit, tracked via anactualStartTimewatermark.selfMsis additive across components;totalMsis subtree-inclusive and double-counts parents by design.profile memoryis a polling shim overmemory— for finer detail use the underlyingconductor memorydirectly. ART only logs collections it considers noteworthy, so a window with no GC lines is a real signal rather than a parse failure.- For which of these work against a Fire TV Stick, a Vega VVD, or an emulator — and how far to trust emulator numbers — see TV performance.
When experimental graduates
Each command above moves to the main Command catalogue once it survives a full RN minor-version cycle without script changes. Until then, expect that an RN upgrade may briefly break one of these and a Conductor patch release will follow.