v0.2.0 — agent fix loop · LLM-first signals

The first perf tool an
LLM agent can actually fix
your site with.

Real-Chromium Core Web Vitals on your hardware. Closed agent fix loop with Mann-Whitney U statistical proof, not vibes. ~99% cross-origin iframe coverage via per-frame CDPSession. MCP-native for Claude · OpenCode · Cursor.

Hit Measure and pick CLI · Chrome extension · MCP server on the next screen — no backend required to start.

ohmyperf · live demo

Real CLI output from tradeit.gg — verified 2026-05-21

16

MCP tools

9

Surfaces

387

Tests passing

~99%

OOPIF coverage

The killer loop

measure → propose_patch → verify_fix

One conversation turn. Mann-Whitney U at α=0.05 proves the patch improved the metric — or it doesn’t, and the agent knows.

measure

Real CWV · trustScore · servability

propose_patch

Ranked, applicability-aware fixPlan

verify_fix

Mann-Whitney U at α=0.05

Why this exists

Lighthouse measures in a datacenter. OhMyPerf measures where users live.

Concern
Lighthouse / PSI
OhMyPerf
Where measurement runs
Synthetic CPU in a Google datacenter
Your hardware, your browser, your network
Cross-origin iframes
Network-only — opaque inside
Per-frame CDPSession · ~99% coverage
Agent-callable
None
16 MCP tools — Claude, OpenCode, Cursor
Statistical proof of fix
Threshold gates (flake-prone)
Mann-Whitney U at α=0.05 · per metric
First-party vs CDN classification
Eyeball the host column
originClass + same-org tier · OHMYPERF_ORG_DOMAINS
Bot-challenge detection
Treats interstitials as real pages
servability: bot-challenge-suspected
Honest about variance
One number, take or leave
trustScore + per-metric CoV + recommendedAction
INP in CI
Field-only (real interactions)
Synthetic Input.dispatchMouseEvent · CDP trusted-event

Capabilities

Every metric is structured. Every signal is actionable.

Chromium 148

Real Chromium, real hardware

Playwright + raw CDP. No synthetic CPU throttle, no datacenter detour. Numbers match what your users feel.

CDP

~99% cross-origin iframe coverage

Target.setAutoAttach + per-frame CDPSession. Lighthouse goes opaque inside OOPIFs — we go all the way in.

v0.2.0

Closed agent fix loop

measure → propose_patch → verify_fix in one conversation turn. Mann-Whitney U at α=0.05 proves the fix worked.

v0.2.0

LLM-first report signals

trustScore, fixPlan, servability, originClass precomputed. Agents act in one tool call instead of multi-hop reasoning.

INP measurable in CI

Synthetic Input.dispatchMouseEvent over CDP fires a trusted-event pipeline. INP attribution lands without humans.

partial

Source-map source location

longestScript.sourceLocation lifts script URLs back to repo paths. Stage-2 VLQ decode in v0.3.

Honest about variance

CoV > 20% triggers trustScore: low + recommendedAction. We do not pretend 3-run measurements are precise.

Plugin-first engine

Every metric, audit, reporter is a plugin. cwv, axe-core, third-parties built-in. Bring your own custom-metric plugin.

v0.2.0

7 CWV-linked ESLint rules

@ohmyperf/eslint-plugin catches no-document-write, no-sync-xhr, prefer-loading-lazy at editor-save time.

Static viewer · zero upload

Drag report.json onto /viewer — full LCP/INP/CLS breakdown rendered in browser. No backend required.

v0.2.0

Bot-challenge detection

servability classifies real-page vs bot-challenge-suspected vs error-page. Agents skip un-actionable measurements.

Two budget modes

real for honest variance, ci-stable for cross-runner comparability (pre-flight CPU calibration + Fast 4G throttle).

Nine surfaces, one engine

CLI, MCP, SDK, browser ext, editor ext, static viewer, share-server, ESLint plugin, fixer SDK.

All powered by frozen @ohmyperf/core 1.0.0 — 45 exports, Playwright + raw CDP, plugin runtime, calibration, outlier rejection, diff.

CLI

@ohmyperf/cli

Single binary. Run on your laptop, in CI, or via npx for zero-install probes.

npx -y @ohmyperf/cli@latest run https://example.com

MCP server

@ohmyperf/mcp-server

16 tools — measure, propose_patch, verify_fix, get_fix_plan and more. Drop into Claude / OpenCode / Cursor.

npx -y @ohmyperf/mcp-server@latest

SDK

@ohmyperf/core

Frozen 1.0.0 public API. Import { runEngine, measure } and embed in your own tooling.

import { runEngine } from "@ohmyperf/core"

Chrome extension

apps/extension-chrome

chrome.debugger driver. Click the toolbar icon on any tab to measure the current page.

VSCode extension

ohmyperf-vscode

Cmd+Shift+P → "OhMyPerf: Measure URL". Reports stream into the editor.

Static viewer

apps/website /viewer

Drag report.json onto the page. Full breakdown rendered in browser. No upload, no signup.

Open viewer →

ESLint plugin

@ohmyperf/eslint-plugin

7 CWV-linked rules: no-document-write, prefer-loading-lazy, prefer-fetchpriority, more.

npm i -D @ohmyperf/eslint-plugin @typescript-eslint/parser

Fixers SDK

@ohmyperf/fixers

Archetype registry + proposePatches() engine. 4 archetypes shipped, more in v0.3.

import { proposePatches } from "@ohmyperf/fixers"

Share server

@ohmyperf/share-server

Cloudflare Workers + R2 + D1, or Node + S3-compatible + SQLite. Self-host or use ours.

Get started in 30 seconds

No signup. No telemetry. Apache-2.0.

# CLI
npm install -g @ohmyperf/cli
ohmyperf run https://your-site.com

# MCP server — drop into Claude / OpenCode / Cursor
npx -y @ohmyperf/mcp-server@latest

# Zero-install one-off
npx -y @ohmyperf/cli@latest run https://your-site.com

Requires Node ≥ 22. Playwright Chromium auto-downloads on first run (~150 MB).