Skip to content
usefy

MemoryMonitor

ComponentsMemory devtool

React component for real-time browser memory monitoring

Live demo

Install

$ npm install @usefy/memory-monitor

Quick start

MemoryMonitor.tsx
import { MemoryMonitor } from "@usefy/memory-monitor";

function App() {
  return (
    <div>
      <YourApp />
      {/* Add at the root of your app */}
      <MemoryMonitor />
    </div>
  );
}

API reference

Props

Core Configuration

PropTypeDefaultDescription
mode'development' | 'production' | 'always' | 'headless' | 'never''development'When to render the panel. See Mode Options below
defaultOpenbooleanfalseInitial open state
position'left' | 'right''right'Panel slide-in position
zIndexnumber9999Panel z-index
disableInProductionbooleanfalseDisable all features in production
Mode Options

The mode prop controls when the Memory Monitor UI is rendered:

ModeDevelopmentProductionUse Case
'development'UI visibleUI hiddenDefault. Debug during development only
'production'UI hiddenUI visibleShow only in production (rare)
'always'UI visibleUI visibleAlways show regardless of environment
'headless'UI hiddenUI hiddenNo UI, but monitoring + callbacks still run
'never'UI hiddenUI hiddenCompletely disabled (no monitoring)

Note: Environment detection uses process.env.NODE_ENV. If unavailable, it falls back to hostname check (localhost, 127.0.0.1, etc.).

Common patterns:

// Default: Only visible during local development
<MemoryMonitor />

// Always visible (e.g., for internal tools or debugging pages)
<MemoryMonitor mode="always" />

// Production monitoring with callbacks, no UI
<MemoryMonitor
  mode="headless"
  onWarning={(data) => analytics.track('memory_warning', data)}
  onCritical={(data) => errorReporter.capture(data)}
/>

// Environment-based switching
<MemoryMonitor
  mode={process.env.NODE_ENV === 'development' ? 'always' : 'headless'}
/>

Monitoring Options

PropTypeDefaultDescription
intervalnumber1000Polling interval in milliseconds
enableHistorybooleantrueEnable memory history tracking
historySizenumber50Maximum history entries
trackDOMNodesbooleantrueTrack DOM node count
trackEventListenersbooleantrueTrack event listener count

Threshold Configuration

PropTypeDefaultDescription
warningThresholdnumber70Warning threshold percentage (0-100)
criticalThresholdnumber90Critical threshold percentage (0-100)
autoGCThresholdnumber | nullnullAuto-GC trigger threshold (null to disable)
enableAutoGCbooleanfalseEnable automatic GC trigger

Leak Detection

PropTypeDefaultDescription
enableLeakDetectionbooleantrueEnable memory leak detection
leakSensitivity'low' | 'medium' | 'high''medium'Leak detection sensitivity

UI Customization

PropTypeDefaultDescription
triggerContentReactNode-Custom trigger button content
triggerPosition{ top?: number; right?: number; bottom?: number; left?: number }{ bottom: 20, right: 20 }Trigger button position
defaultWidthnumber420Initial panel width (px)
minWidthnumber320Minimum panel width (px)
maxWidthnumber600Maximum panel width (px)
theme'system' | 'light' | 'dark''system'Theme setting
classNamestring-Additional CSS class
showTriggerbooleantrueShow floating trigger button

Callbacks

PropTypeDescription
onOpenChange(open: boolean) => voidCalled when panel opens/closes
onWarning(data: MemoryWarningData) => voidCalled when warning threshold exceeded
onCritical(data: MemoryCriticalData) => voidCalled when critical threshold exceeded
onLeakDetected(analysis: LeakAnalysis) => voidCalled when leak is detected
onAutoGC(event: AutoGCEventData) => voidCalled when auto-GC triggers
onUpdate(memory: MemoryInfo) => voidCalled on each memory update

Advanced

PropTypeDefaultDescription
shortcutstring'ctrl+shift+m'Keyboard shortcut to toggle
persistSettingsbooleantruePersist settings to LocalStorage
storageKeystring'memory-monitor-panel-settings'LocalStorage key

Types

// Severity levels
type Severity = "normal" | "warning" | "critical";

// Theme settings
type ThemeSetting = "system" | "light" | "dark";

// Leak sensitivity
type LeakSensitivity = "low" | "medium" | "high";

// Memory trend
type Trend = "stable" | "increasing" | "decreasing";

// Panel snapshot
interface PanelSnapshot {
  id: string;
  label: string;
  timestamp: number;
  heapUsed: number;
  heapTotal: number;
  heapLimit: number;
  domNodes?: number;
  eventListeners?: number;
  isAuto?: boolean;
  analysisContext?: SnapshotAnalysisContext;
}

// Snapshot analysis context
interface SnapshotAnalysisContext {
  trend: Trend;
  leakProbability: number;
  severity: Severity;
  usagePercentage: number;
}

// Leak analysis result
interface LeakAnalysis {
  isLeaking: boolean;
  probability: number;
  trend: Trend;
  recommendation?: string;
}

// Memory warning data
interface MemoryWarningData {
  memory: MemoryInfo;
  usagePercentage: number;
  threshold: number;
  timestamp: number;
}

// Auto-GC event data
interface AutoGCEventData {
  threshold: number;
  usage: number;
  timestamp: number;
}

Go deeper

This page is the quick reference. For every example, prop, and edge case, read the full README — or open Storybook to change props live.

More in components