Pulse is a production-grade performance observability layer for React Native, built as a TurboModule-powered SDK (PerfKit) with a real-time visual interface for analyzing application behavior under real-world conditions.
- Demo & Visuals
- Executive Summary
- Why This Exists
- Architecture & System Design
- Technical Deep Dive
- Performance & Metrics
- Real-World Validation (Fintech Case Study)
- Developer Experience & Setup
- Design Decisions & Tradeoffs
- Positioning & Differentiation
![]() |
![]() |
![]() |
![]() |
![]() |
See Pulse in action β a real-time performance observability app powered by PerfKit, showcasing metrics, traces, and runtime insights directly on-device.
Modern mobile applications suffer from invisible performance degradation β slow startup times, UI jank, network bottlenecks β that are difficult to detect without specialized tooling.
Pulse solves this by providing:
- Real-time performance telemetry
- Structured session exports
- Visual debugging interface
- Production-compatible instrumentation
The system enables developers to:
- Identify latency bottlenecks (startup, network, rendering)
- Detect UI instability (frame drops, jank)
- Measure JS thread performance (stall detection)
- Analyze real user sessions rather than synthetic benchmarks
Impact:
- Reduced debugging time for performance issues
- Data-driven optimization decisions
- Production-safe observability layer
Most React Native performance tools are:
- Fragmented (FPS tools, network logs, profiler)
- Dev-only (not usable in production builds)
- Hard to correlate (no unified timeline)
Pulse was engineered as a unified system:
Input β Instrumentation β Aggregation β Visualization β Insight
It acts as both:
- A developer SDK (PerfKit)
- A visual observability interface (Pulse app + viewer)
React Native App
β
@n4zen/perfkit-react-native (TurboModule Layer)
β
@n4zen/perfkit-core (Event Engine)
β
Event Collection (JS + Native)
β
Session Aggregation Engine
β
JSON Export / HUD Overlay (@n4zen/perfkit-hud)
β
Pulse Viewer UI
- JS instrumentation (fetch, navigation, screen spans, JS stalls)
- Native collectors (startup + UI frame/jank)
- Safe-by-default privacy/redaction
- HUD overlay for in-app inspection
- Viewer with waterfall timeline, offenders, budgets, and HTML report export
-
Instrumentation Layer
- Native (Android/iOS)
- JS thread hooks
- Network interceptors (Apisauce)
-
Event Types Captured
- Startup timings
- UI frame metrics
- JS stalls
- Network spans
-
Aggregation Engine
- Percentiles (p50, p90, p95)
- Top offenders
- Timeline reconstruction
-
Output
- Structured JSON session
- Visual dashboard rendering
PerfKit is now available as modular packages on npm:
| Package | Description |
|---|---|
@n4zen/perfkit-core |
Core event engine, aggregation, exports |
@n4zen/perfkit-react-native |
React Native SDK (TurboModule + JS instrumentation) |
@n4zen/perfkit-hud |
In-app HUD overlay for real-time inspection |
Mobile / SDK
- React Native - Expo / Bare RN
- TurboModules (native bridge optimization)
- TypeScript
- Apisauce (network interception)
Build System
- pnpm workspaces
- tsup (bundling)
- Modular package architecture
| PerfKit Version | React Native Support |
|---|---|
@n4zen/perfkit-react-native@1.x |
RN β€ 0.69 |
@n4zen/perfkit-react-native@2.x |
RN β₯ 0.70 |
Dual-version strategy ensures compatibility across fragmented RN ecosystems without forced migrations.
- Native timestamps (
appOnCreate) - RN content render (
rnContent) - Measures Time to Interactive (TTI)
-
Frame duration tracking
-
Jank thresholds:
-
16ms (60fps drop)
-
33ms (visible lag)
-
50ms (major lag)
-
- Interval-based monitoring
- Detects main thread blocking
- Automatic span creation via interceptor
- Captures duration, route, status, metadata
- Startup latency
- Frame consistency (p50/p90/p95)
- Jank frequency
- JS stall duration
- Network latency distribution
Validated in a production-grade fintech mobile application, without altering business logic.
- Network bottlenecks dominate perceived performance
- JS stalls correlate with heavy UI rendering
- Observable improvements after optimization work
Evaluate whether PerfKit (via Pulse) can:
- Accurately capture real-world performance signals
- Identify actionable bottlenecks
- Provide measurable improvements across app versions
- Identified slow endpoints (>2s)
- Detected JS thread blocking spikes (>500ms)
- Highlighted UI jank clusters during heavy network activity
From an actual captured session:
- Multiple concurrent API calls between 700ms β 1000ms
- One critical endpoint (
/activities) peaking at ~2179ms - JS thread stall spikes up to ~576ms
- Frame drops correlated with network bursts
These were identified directly via PerfKit session export:
- Long-tail API calls (>2s) directly impact UI responsiveness
- Parallel requests amplify JS thread pressure
- Large data parsing + rendering β measurable stalls
- Observable via stall tracking (previously invisible)
-
improvements + internal changes reduced:
- Startup time
- Frame instability
- Network overhead impact
For deeper analysis (methodology, raw logs, extended charts):
π View Full Case Study
This is not a synthetic benchmark.
This is:
- Real user flows
- Real API latency
- Real UI behavior
npm install @n4zen/perfkit-react-nativeimport { installPerfKit } from "@n4zen/perfkit-react-native"
installPerfKit()Use Pulse to explore real performance sessions and visualizations.
- Pulse v1.0.x β PerfKit Demo App
- Includes:
- Full PerfKit integration
- Real session playback
- HUD + viewer interface
π Download APK:
https://github.com/n4zen-dev-studio/pulse/releases?q=pulse-v1
- React Native β₯ 0.70
- Tested with bare React Native
- Tested with Expo
npm install @n4zen/perfkit-core@2.0.1 @n4zen/perfkit-react-native@2.0.1 @n4zen/perfkit-hud@2.0.1 - PerfKit v2.0.x β React Native β₯ 0.70
- TurboModules + new architecture support
π View Releases:
https://github.com/n4zen-dev-studio/pulse/releases?q=perfkit-v2
- PerfKit v1.0.x β React Native β€ 0.69
- Legacy bridge compatibility
- React Native β€ 0.69
- Tested with bare React Native
- Tested with Expo
npm install @n4zen/perfkit-core@1 @n4zen/perfkit-react-native@1 @n4zen/perfkit-hud@1π View Releases:
https://github.com/n4zen-dev-studio/pulse/releases?q=perfkit-v1
import {
Perf,
installPerfKitReactNative,
installNativeCollectors,
} from "@n4zen/perfkit-react-native"
Perf.init({
enabled: true,
app: { name: "demo" },
sampling: { spanSampleRate: 1, eventSampleRate: 1, sampleSampleRate: 1 },
})
installPerfKitReactNative({
enableFetch: true,
enableJSStalls: true,
})
installNativeCollectors({
startup: true,
uiFrames: true,
pollIntervalMs: 1000,
})import { Perf } from "@n4zen/perfkit-core"
const session = await Perf.exportSession()import { installApisauceTracker } from "@n4zen/perfkit-react-native"
installApisauceTracker(apiInstance)- Works with Expo Dev Client
- Compatible with bare React Native
- No Expo dependency required
- Lightweight
- Non-blocking
- Safe for production builds
- Reduced bridge overhead
- Lower latency for high-frequency events
- Portable
- Replayable
- Decouples SDK from UI
- Clear separation of concerns
- Smaller bundle sizes
- Flexible adoption
Pulse is not just a performance tool.
It is:
- A system-level observability layer
- A visual debugging interface
- A production-safe telemetry pipeline
| Feature | Pulse | Traditional Tools |
|---|---|---|
| Production Ready | β | β |
| Unified Timeline | β | β |
| JS + Native + Network | β | β |
| Visual Dashboard | β | β |
MIT License β feel free to use





