GitHub App · Lighthouse · CI/CD

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.

30s setup
Zero CI changes
Auto preview detection
PG
perfguard[bot] bot 2 min ago

PerfGuard | Performance Report

feature/new-hero main · Vercel Preview detected automatically
Metric main PR Δ
Performance9471−23
LCP1.2s3.8s+2.6s
TBT120ms896ms+776ms
CLS0.020.04+0.02⚠️
FCP0.9s1.1s+0.2s
🤖 Regression detected · Agent analysis in progress…
perfguard
— Performance regression detected
Details

Production performance regressions…
we've all been there.

01

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.

02

The post-mortem

You run a post-prod Lighthouse audit. You find the culprit. Now you need a rollback or an emergency fix.

03

Monitoring isn't enough

You set up RUM. But it only tells you after the fact. The damage is already in production.

How it works

Three steps. Zero friction.

01 — Install

Add the GitHub App

Takes 30 seconds. PerfGuard listens to pull_request webhooks on your repos.

02 — Audit

Lighthouse on the preview

We detect your staging URL (Vercel, Netlify, Railway…) and run multi-page Lighthouse audits.

03 — Enforce

Diff posted to the PR

Structured comment + green or red GitHub Check. Regression = merge blocked.

AI Agent · Root-cause Analysis

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.

PR #142 · perf/hero-lazy-load · AI Analysis
live · 4.2s
Detected impact
Perf −28
9163
LCP +3.6s
1.2s4.8s
SI +2.7s
1.4s4.1s
✷ Likely cause

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.
↳ Prioritized actions
  • 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.
index.html
head.html
view raw ↗
24<!-- hero section -->
25<section class="hero">
26   <img src="/assets/hero.webp"
27alt="PerfGuard dashboard"
28class="hero-img">
26+   <img src="/assets/hero.webp"
27+alt="PerfGuard dashboard"
28+class="hero-img"
29+loading="lazy">
30   <h1>Catch regressions before they ship</h1>
31</section>
32
33/* — agent suggestion — */
29loading="lazy">
29+fetchpriority="high">
Suggested fix — removing loading="lazy" and adding fetchpriority="high" recovers LCP −3.6s on the homepage.
confidence · 97%
Reads the diff

Source-aware

The agent traces the regression back to the actual lines you changed — not a vague Lighthouse hint.

Reads the trace

Lighthouse-grounded

Cross-references the Lighthouse trace timings and fetch waterfall before pointing to a cause.

Posts to the PR

Where you already work

The analysis lands in the PR comment thread. No new dashboard. No Slack. No tab to keep open.

Zero setup · Fully configurable

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.

staging

Dynamic URL with {branch} or {pr}. Works with any host.

urls

Audit every critical page, not just the homepage. Each one gets its own report.

budgets

Per-metric thresholds. Block only what matters to your team.

yml.perfguard.yml
# .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
Beta Access

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.

Full access, free

All features unlocked during the beta. No credit card, no commitment.

🎯
Shape the roadmap

Direct line to the founders. Your feedback will drive what we build next.

🔒
Lock in your pricing

Beta users get early-adopter rates when we launch — well below public pricing.

Currently in private beta

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.

© 2026 PerfGuard · Built for the engineers who actually care about p75
Private beta