You'll know before
you merge.
PerfGuard runs Lighthouse on every PR, compares it against main or your budgets, blocks the merge if performance regresses, and explains why.
PerfGuard | Performance Report
| Metric | main | PR | Δ | |
|---|---|---|---|---|
| Performance | 94 | 71 | −23 | ❌ |
| LCP | 1.2s | 3.8s | +2.6s | ❌ |
| TBT | 120ms | 896ms | +776ms | ❌ |
| CLS | 0.02 | 0.04 | +0.02 | ⚠️ |
| FCP | 0.9s | 1.1s | +0.2s | ✅ |
Production performance regressions…
we've all been there.
The innocent PR
You merge a small refactor. LCP jumps from 1.2s to 4.8s. You learn through Sentry alerts. Or a customer tweet.
The post-mortem
You run a post-prod Lighthouse audit. You find the culprit. Now you need a rollback or an emergency fix.
Monitoring isn't enough
You set up RUM. But it only tells you after the fact. The damage is already in production.
Three steps. Zero friction.
Add the GitHub App
Takes 30 seconds. PerfGuard listens to pull_request webhooks on your repos.
Lighthouse on the preview
We detect your staging URL (Vercel, Netlify, Railway…) and run multi-page Lighthouse audits.
Diff posted to the PR
Structured comment + green or red GitHub Check. Regression = merge blocked.
When it regresses,
we tell you why.
Detection is the easy part. The hard part is fixing it before standup. On every regression, our agent reads the diff, the Lighthouse trace, and the fetch waterfall — then writes a Likely cause + Prioritized actions block straight in the PR.
LCP delay caused by loading="lazy" on the hero image
- The LCP element —
<img class="hero-img">— received loading="lazy" in this PR. loading="lazy"bypasses the browser preload scanner, deferring the network fetch until the image enters the viewport.- Since this image IS the above-the-fold viewport, the fetch is delayed by a full layout cycle — directly causing the +3.6s LCP.
- Confirmed in trace: LCP resource fetch begins at 4 210 ms on this PR vs 650 ms on
main.
- 1. Remove
loading="lazy"— never apply it to above-the-fold images. - 2. Add
fetchpriority="high"to explicitly signal the LCP element to the browser. - 3. Pair with
<link rel="preload" as="image" href="/assets/hero.webp">in<head>for maximum fetch priority.
loading="lazy" and adding fetchpriority="high" recovers LCP −3.6s on the homepage. Source-aware
The agent traces the regression back to the actual lines you changed — not a vague Lighthouse hint.
Lighthouse-grounded
Cross-references the Lighthouse trace timings and fetch waterfall before pointing to a cause.
Where you already work
The analysis lands in the PR comment thread. No new dashboard. No Slack. No tab to keep open.
Configure once,
enforced on every PR.
Drop a .perfguard.yml at the root of your repo. Define your staging URL pattern, the pages to audit, and your performance thresholds.
Dynamic URL with {branch} or {pr}. Works with any host.
Audit every critical page, not just the homepage. Each one gets its own report.
Per-metric thresholds. Block only what matters to your team.
# .perfguard.yml staging: # Vercel, Netlify, Railway · any preview URL pattern url: "https://acme-git-{branch}.vercel.app" urls: - path: / name: Homepage - path: /pricing name: Pricing - path: /blog name: Blog budgets: performance: 90 # score / 100 · blocks merge if below lcp: 2500 # ms · Largest Contentful Paint tbt: 200 # ms · Total Blocking Time cls: 0.1 # Cumulative Layout Shift fcp: 1800 # ms · First Contentful Paint ai_analysis: true # root-cause analysis on regressions
Be the first to use PerfGuard.
We're opening access to a small group of early teams. No pricing yet — just a chance to shape the product from day one.
All features unlocked during the beta. No credit card, no commitment.
Direct line to the founders. Your feedback will drive what we build next.
Beta users get early-adopter rates when we launch — well below public pricing.
Ship faster.
Ship without regressions.
Max 5 teams to start. We'll reach out within 48 hours with onboarding instructions and a 30-day Pro trial.