@ulpi/browse

Performance Audit

Web Vitals, stack detection, coverage, resource analysis, and actionable recommendations

4 commands

perf-audit

browse perf-audit [url] [flags]

Full performance audit: Core Web Vitals, LCP critical path, layout shift attribution, long task analysis, resource breakdown, render-blocking detection, image/font audit, DOM complexity, stack detection, third-party impact, JS/CSS coverage, correlation engine, and prioritized recommendations

Flags

--no-coverageSkip JS/CSS coverage collection (faster)
--no-detectSkip framework/SaaS/infrastructure detection
--jsonOutput as structured JSON

Full audit on current page

$ browse perf-audit
Core Web Vitals:
  TTFB         580ms    good
  FCP          696ms    good
  LCP          696ms    good
  CLS          0.015    good
  TBT          599ms    needs improvement

LCP Analysis:
  Element:        <img src='hero.webp'>
  Critical path:  TTFB(580ms) -> CSS(styles.css) -> JS(vendor.js) -> LCP(696ms)

Top Recommendations:
  1. Add fetchpriority="high" to LCP image
  2. Add font-display:swap to fallback fonts

Audit completed in 13.2s

Audit a URL with JSON output

$ browse perf-audit https://example.com --json

Quick audit without coverage

$ browse perf-audit --no-coverage --no-detect

detect

browse detect

Tech stack fingerprint: 108 frameworks (React, Vue, Angular, Next.js, Laravel, WordPress, Magento, etc.), 55 SaaS platforms (Shopify, Wix, Squarespace, etc.), infrastructure (CDN, protocol, compression, caching), DOM complexity, and third-party inventory

Detect tech stack

$ browse detect
Stack:
  meta-framework     Next.js (production), router: app, rsc: true
  css-framework      Tailwind CSS

Infrastructure:
  CDN:          Amazon CloudFront
  Protocol:     h2 (64%)
  Cache rate:   74% (134/180)
  DOM:          4,476 nodes, depth 23

Third-Party (4.4MB total):
  www.youtube.com          3.0MB   45 reqs   video
  www.googletagmanager.com  331KB    3 reqs   analytics

coverage

browse coverage <start|stop>

JS/CSS code coverage analysis. Start collection, navigate pages, then stop to see per-file used/unused bytes sorted by waste

Collect coverage

$ browse coverage start
browse goto https://example.com
browse coverage stop
JavaScript:
  vendor.js        680KB   used: 218KB (32%)   wasted: 462KB
  analytics.js      84KB   used: 46KB  (55%)   wasted: 38KB

CSS:
  styles.css       120KB   used: 58KB  (48%)   wasted: 62KB

Grand Total: 884KB   used: 322KB (36%)   wasted: 562KB

initscript

browse initscript <set|show|clear> [code]

Inject JavaScript that runs before every page load via context.addInitScript(). Useful for mocking APIs, injecting polyfills, or setting up performance observers

Inject a pre-navigation script

$ browse initscript set "window.__TEST = true"
Init script set. Will run before every page load.

Show current script

$ browse initscript show

Remove script

$ browse initscript clear

On this page