debugging-react-native

Use PROACTIVELY when debugging React Native apps. Reads console logs and executes JavaScript in running apps via Metro bundler. Invoke for: app crashes, state inspection, API debugging, error investigation, or running diagnostic code. Requires Metro running (port 8081).

$ Installer

git clone https://github.com/mikekelly/react-native-debugger ~/.claude/skills/react-native-debugger

// tip: Run this command in your terminal to install the skill


name: debugging-react-native description: "Use PROACTIVELY when debugging React Native apps. Reads console logs and executes JavaScript in running apps via Metro bundler. Invoke for: app crashes, state inspection, API debugging, error investigation, or running diagnostic code. Requires Metro running (port 8081)."

<quick_start> Prerequisite: pip install websocket-client Assume a single app is connected. Just call read_logs.py or execute_in_app.py directly - they auto-select the app when only one is connected (the typical case).

# Read recent logs
python scripts/read_logs.py

# Execute JS in app
python scripts/execute_in_app.py "Date.now()"

Only use discover_apps.py or --app-id when you get an error about multiple apps being connected. </quick_start>

python scripts/read_logs.py [--max-logs 100] [--filter "error|warn"] [--timeout 5]
  • --filter: Regex to filter log messages
  • --timeout: Seconds to collect logs (default: 5)
  • --app-id: Only needed if multiple apps connected
  • --metro-url: Override Metro URL (default: http://localhost:8081)

Errors and warnings include stack trace location.

python scripts/execute_in_app.py "expression" [--no-await] [--timeout 10]

# Or pipe expression
echo "globalThis.myVar" | python scripts/execute_in_app.py
  • --no-await: Don't await Promise results
  • --app-id: Only needed if multiple apps connected
  • --metro-url: Override Metro URL (default: http://localhost:8081)
  • Supports any JS: variable access, function calls, IIFEs, etc.
python scripts/discover_apps.py [--metro-url URL] [--json]

<common_patterns> Check component state:

python scripts/execute_in_app.py "globalThis.__REDUX_DEVTOOLS_EXTENSION__ && globalThis.__REDUX_DEVTOOLS_EXTENSION__.getState()"

Filter for errors:

python scripts/read_logs.py --filter "error|Error|ERROR"

Run diagnostic code:

python scripts/execute_in_app.py "(async () => { const resp = await fetch('http://api.example.com/health'); return resp.status; })()"

</common_patterns>

<success_criteria> Debugging is successful when:

  • Connected to the running app via Metro (no connection errors)
  • Able to read console logs that help identify the issue
  • Able to execute JS to inspect state or run diagnostics
  • Root cause identified or issue reproduced </success_criteria>