npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mobile-devtools

v1.6.3

Published

Next-Gen Framework-Agnostic In-App Mobile Debugger & Inspector Overlay for Web Applications

Readme

Mobile DevTools

Next-Gen Framework-Agnostic In-App Mobile Debugger & Inspector Overlay for Web Applications

Bundle Size License: MIT TypeScript Turborepo React Vue Svelte Vanilla JS


📌 Table of Contents


📸 Showcase


💡 Motivation & Why Use It?

Debugging mobile web applications or QA staging builds on physical smartphones, tablets, or embedded webviews is historically painful:

  • ❌ Requiring physical USB debugging cables connected to a desktop computer.
  • ❌ Configuring Safari Remote Inspector or Chrome Inspect ports over local WiFi.
  • ❌ Losing console logs when a mobile browser crashes or refreshes.
  • ❌ Inability to inspect network traffic on production staging environments without desktop proxies (Charles / Fiddler / Proxyman).

mobile-devtools eliminates these pain points entirely. It embeds a lightweight, high-performance floating badge and overlay drawer directly inside your web application. You can inspect logs, monitor network calls, browse DOM trees, edit local storage, and inspect device specs anytime, anywhere — directly on screen without external tools or cables.


✨ Core Capabilities

  • ⚡ Ultra-Lightweight & Fast: Small footprint (~32.2 kB gzipped / ~135.9 kB minified) with zero runtime dependencies, ensuring zero impact on page load speed or mobile frame rates.
  • 🌳 DOM Elements Inspector (Elements Tab): Real-time HTML DOM tree browser, node expansion, interactive element picker, box model visualization (margin, border, padding, content), computed CSS styles, and grouped style categories (Layout, Flexbox, Grid, Typography, Colors).
  • 🚀 Quick Bug Exporter: Instant 1-click bug report sharing via Web Share API (navigator.share) to WhatsApp, Telegram, Slack, AirDrop, or Email with text file download and copy fallbacks.
  • 🌐 Network Throttling Simulator: Simulate Slow 3G, Fast 3G, or Offline connection modes directly on mobile devices with synthetic latency injection.
  • ⚡ Cable-Free Mobile Inspection: Debug directly on physical iOS / Android devices, mobile webviews, or mobile Safari/Chrome.
  • 🛡️ Shadow DOM Style Isolation: Rendered inside a Shadow DOM container (<mobile-devtools-root>), guaranteeing zero CSS leaks into your app's global styles and zero style pollution from Tailwind, Bootstrap, or global CSS resets.
  • 📋 Console Tab: Real-time capture of console.log, info, warn, error, and debug with live search, log sorting (Newest, Oldest, Errors, Frequent), JSON tree preview, and unread error badges.
  • 🌐 Network Tab: Live interception of fetch, XMLHttpRequest (XHR), native WebSocket connections, and EventSource (SSE) with HTTP status indicators, latency timing, request/response headers, JSON body previews, WebSocket SVG direction frames, and unified sort & status class filtering (Newest, Oldest, Slowest, Fastest, 2xx Success, 3xx Redirect, 4xx Client Error, 5xx Server Error, 1xx Info, Network Error).
  • 💾 Storage Tab: Real-time inspector and editor for localStorage, sessionStorage, document.cookie, and indexedDB databases and object stores.
  • 💻 System Info Tab: Real-time diagnostic monitor for viewport dimensions, device pixel ratio (DPR), user agent string, memory limit, and screen orientation.
  • 🔌 Pluggable Custom Tabs (customTabs): Easily extend DevTools by adding custom tabs with your own DOM rendering callbacks (render(container)).
  • 🎨 Granular UI Style Overrides (styles): Fine-grained inline CSS style overrides for badge, drawer, overlay, and handle (styles={{ badge: {}, drawer: {}, overlay: {} }}).
  • 🎨 Dynamic Theme Engine: Built-in Light Mode and Dark Mode with auto-contrast luminance detection, accent color swatches, and custom background palettes.
  • 🧪 Comprehensive Test Suite: Tested with 111 Unit Tests (100% Passed) + 21 Playwright E2E Tests (100% Passed) across Desktop Chrome, Mobile Chrome, and Mobile Safari.
  • 🧩 Framework Agnostic: Native support for React 18/19, Vue 3, Svelte 4/5, and Vanilla JS.

🏗️ Technical Architecture

┌─────────────────────────────────────────────────────────────────────────────────┐
│                                 mobile-devtools                                 │
└────────────────────────────────────────┬────────────────────────────────────────┘
                                         │
        ┌───────────────────┬────────────┴───────────┬───────────────────┐
        ▼                   ▼                        ▼                   ▼
   Vanilla JS             React                    Vue 3              Svelte
(mobile-devtools) (mobile-devtools/react)  (mobile-devtools/vue) (mobile-devtools/svelte)
        │                   │                        │                   │
        └───────────────────┴────────────┬───────────┴───────────────────┘
                                         │
                           ┌─────────────▼─────────────┐
                           │   Native Shadow DOM Host  │
                           │   <mobile-devtools-root>  │
                           └─────────────┬─────────────┘
                                         │
            ┌────────────────────────────┴──────────────────┐
            │                                               │
┌───────────▼─────────────────┐   ┌─────────────────────────▼──────────────┐
│      Core Interceptors      │   │               UI Engine                │
├─────────────────────────────┤   ├────────────────────────────────────────┤
│ • Console Interceptor       │   │ • Floating Badge View (floating-badge) │
│ • Fetch / XHR Interceptor   │   │ • Drawer Views & Tabs (drawer)         │
│ • DOM Elements Inspector    │   │ • Pluggable Custom Tabs (customTabs)   │
│ • Storage Inspector         │   │ • Auto Contrast Theme Helper           │
│ • DevTools Store & State    │   │ • Bug Exporter Engine                  │
└─────────────────────────────┘   └────────────────────────────────────────┘

🚀 Framework Quickstart

📦 Installation

npm install mobile-devtools
# or
pnpm add mobile-devtools

⚛️ React Integration

Import from mobile-devtools/react:

import React from 'react';
import { MobileDevTools } from 'mobile-devtools/react';

export default function App() {
  return (
    <>
      <YourAppRoutes />

      {/* Mobile DevTools Overlay */}
      <MobileDevTools
        title="My App Debugger"
        position="bottom-right"
        enabledTabs={['console', 'elements', 'network', 'storage', 'system']}
        theme={{ mode: 'dark', accentColor: '#0070f3' }}
        styles=".devtools-badge { opacity: 0.9; }"
        renderBadge={(container, { unreadErrors }) => {
          container.innerHTML = `<span style="color:#fff;">🐞 My Debugger ${unreadErrors ? `(${unreadErrors})` : ''}</span>`;
        }}
        customTabs={[
          {
            id: 'analytics',
            title: 'Analytics',
            render: (container) => {
              container.innerHTML =
                '<div style="padding:16px;color:#fff;">📊 Custom Event Log</div>';
            },
          },
        ]}
      />
    </>
  );
}

💚 Vue 3 Integration

Import from mobile-devtools/vue:

<script setup>
  import { MobileDevTools } from 'mobile-devtools/vue';

  const customTabs = [
    {
      id: 'analytics',
      title: 'Analytics',
      render: (container) => {
        container.innerHTML = '<div style="padding:16px;color:#fff;">📊 Custom Event Log</div>';
      },
    },
  ];
</script>

<template>
  <YourAppLayout />
  <MobileDevTools
    title="My App Debugger"
    position="bottom-right"
    :enabled-tabs="['console', 'elements', 'network', 'storage', 'system']"
    :theme="{ mode: 'dark', accentColor: '#0070f3' }"
    :custom-tabs="customTabs"
  />
</template>

🔥 Svelte Integration

Import from mobile-devtools/svelte:

<script>
  import { mobileDevTools } from 'mobile-devtools/svelte';
</script>

<div use:mobileDevTools={{
  title: 'My App Debugger',
  position: 'bottom-right',
  shakeToToggle: true,
  theme: { mode: 'dark' }
}}>
  <YourAppLayout />
</div>

🧡 Svelte 4/5 Integration

Import from mobile-devtools/svelte:

<script>
  import { useMobileDevTools } from 'mobile-devtools/svelte';
</script>

<div use:useMobileDevTools={{
  title: 'My App Debugger',
  position: 'bottom-right',
  theme: { mode: 'dark', accentColor: '#0070f3' }
}}>
  <YourAppLayout />
</div>

🍦 Vanilla JS / Legacy Apps

Option A: npm Package Import

import { createMobileDevTools } from 'mobile-devtools';

// Instantiate DevTools overlay
const devtools = createMobileDevTools({
  title: 'My App Debugger',
  position: 'bottom-right',
  enabledTabs: ['console', 'elements', 'network', 'storage', 'system'],
  theme: {
    mode: 'dark',
    accentColor: '#0070f3',
  },
  styles: `.devtools-badge { opacity: 0.9; } .devtools-drawer { max-height: 85vh; }`,
  customTabs: [
    {
      id: 'analytics',
      title: 'Analytics',
      render: (container) => {
        container.innerHTML = '<div style="padding:16px;color:#fff;">📊 Custom Event Log</div>';
      },
    },
  ],
});

Option B: Direct CDN / UNPKG Script Tag (Zero Build Step)

<script type="module">
  import { createMobileDevTools } from 'https://unpkg.com/mobile-devtools';

  // Works out-of-the-box in any static HTML page or legacy app
  createMobileDevTools({
    title: 'My App Debugger',
    position: 'bottom-right',
    theme: { mode: 'dark' },
  });
</script>

⚙️ Full Configuration & Props Reference

Below is the complete reference table for all configuration options supported by <MobileDevTools /> / createMobileDevTools():

| Option / Prop | Type | Default | Description | | :---------------------------------------- | :------------------------------------- | :-------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | enabled | boolean | true (in dev) | Enable or disable the DevTools overlay. Automatically set to false in production builds. | | forceEnable | boolean | false | Force enable DevTools overlay in production builds for QA testing & staging previews. | | showBadge | boolean | true | Show or hide the floating trigger badge on screen. | | renderBadge | (container, props) => void | undefined | Custom render callback function to craft inner floating badge DOM structure while retaining drag & drop gesture handling. | | defaultOpen | boolean | false | Set to true to open drawer automatically on initial page mount. | | shakeToToggle | boolean \| ShakeToToggleConfig | true | Enable physical device shake gesture (shakeToToggle={true}) or customize options (shakeToToggle={{ enabled: true, threshold: 15 }}). | | title | string | 'DevTools' | Label shown on floating badge and drawer header. | | icon | any | undefined | Custom icon (Emoji string like '⚡', SVG markup string, Image URL, or Base64 data URI). | | position | BadgePositionPreset \| BadgePosition | 'bottom-right' | Initial corner/edge preset ('bottom-right', 'bottom-left', 'top-right', 'top-left', 'bottom', 'top', 'left', 'right') or { x, y } object. | | initialTab | DevToolsTabId | 'console' | Default active tab when drawer opens ('console', 'elements', 'network', 'storage', 'system'). | | enabledTabs | DevToolsTabId[] | ['console', 'elements', 'network', 'storage', 'system'] | Filter which built-in tabs are enabled in drawer. | | customTabs | CustomTabDefinition[] | [] | Pluggable consumer tabs array with custom DOM rendering callbacks (render(container)). | | autoSnapBadge | boolean | false | Enable magnetic snapping of badge to nearest screen edge on drag release. | | styles | string | undefined | Custom raw CSS string injected into DevTools Shadow DOM root. | | container | HTMLElement \| null | document.body | Target parent element for Shadow DOM container mounting. | | privacy.mask | string[] | undefined | Sensitive header & body keys to mask in network inspector (e.g. ['token', 'password']). | | theme.mode | 'dark' \| 'light' \| 'auto' | 'dark' | Theme mode setting ('dark', 'light', or 'auto'). | | theme.backgroundColor | string | undefined | Primary drawer & floating badge background color CSS value. | | theme.cardBackgroundColor | string | undefined | Floating cards & list item background color CSS value. | | theme.cardBorderColor | string | undefined | Internal card outline border color CSS value. | | theme.borderColor | string | undefined | Main container & divider line border color CSS value. | | theme.textColor | string | undefined | Primary body text color CSS value. | | theme.textMutedColor | string | undefined | Secondary / muted label text color CSS value. | | theme.accentColor | string | undefined | Primary brand accent color for active tabs, toggles, and highlights. | | theme.errorColor | string | undefined | Error badges & status indicator color CSS value. | | theme.warningColor | string | undefined | Warning badges & status indicator color CSS value. | | theme.successColor | string | undefined | Success status indicator color CSS value. | | theme.fontFamily | string | undefined | Custom font family stack CSS value for all DevTools text inside Shadow DOM. | | interceptors.maxLogLimit | number | 200 | Maximum number of console logs retained in memory. | | interceptors.maxNetworkLimit | number | 100 | Maximum number of network requests retained in memory. | | interceptors.ignoreNetworkUrls | (string \| RegExp)[] | [] | List of URL strings or RegExps to exclude from network interception. | | interceptors.enableConsoleInterceptor | boolean | true | Enable or disable console log/warn/error interception. | | interceptors.enableFetchInterceptor | boolean | true | Enable or disable window.fetch API interception. | | interceptors.enableXhrInterceptor | boolean | true | Enable or disable XMLHttpRequest interception. | | interceptors.enableWebSocketInterceptor | boolean | true | Enable or disable WebSocket frame interception. | | interceptors.enableSSEInterceptor | boolean | true | Enable or disable EventSource (SSE) stream interception. |


🎨 Theme Engine & Customization

mobile-devtools features a built-in theme engine that automatically calculates background brightness to maintain WCAG AAA readable text contrast:

<MobileDevTools
  title="Staging Debugger"
  icon="🚀"
  position="bottom-left"
  theme={{
    mode: 'dark',
    accentColor: '#10b981',
    backgroundColor: '#0c0c0e',
  }}
  styles={`
    .devtools-badge { border-radius: 12px; }
    .devtools-drawer { border-top-left-radius: 20px; border-top-right-radius: 20px; }
  `}
/>

📂 Monorepo Structure

mobile-devtools/
├── apps/
│   └── web/                    # React documentation & live playground app (Port 3000)
├── examples/
│   ├── react/                  # React 19 test harness app (Port 3001)
│   ├── vue/                    # Vue 3 test harness app (Port 3002)
│   ├── svelte/                 # Svelte 5 test harness app (Port 3003)
│   └── vanilla/                # Vanilla JS test harness app (Port 3004)
└── packages/
    ├── mobile-devtools/        # Main unified published npm package (Core + UI + React/Vue/Svelte/Vanilla Adapters)
    └── config/
        ├── eslint/             # Shared ESLint configuration (@mobile-devtools/eslint-config)
        └── typescript/         # Shared TypeScript configuration (@mobile-devtools/tsconfig)

🛠️ Development Setup

Prerequisites: Node.js >= 24.0.0 (v24.4.1+ recommended), pnpm 9.15.0

To build and run the project locally:

# Clone repository
git clone https://github.com/dewasemadi/mobile-devtools.git
cd mobile-devtools

# Install dependencies using pnpm
pnpm install

# Launch all apps & package watchers in dev mode
pnpm dev

# Run unit test suite (65 tests)
pnpm test

# Run unit tests with V8 coverage report
pnpm test:coverage

# Run Playwright E2E tests (21 tests across Chromium & Mobile Webkit)
pnpm test:e2e

# Build production bundles
pnpm build

📄 License

Distributed under the MIT License. See LICENSE for details.