Numbers, no narrative.
- ✓Runs Lighthouse on every PR
- ✓Tracks scores over time
- −Never reads your code
- −"LCP regressed" : you go investigate
Kanso runs Lighthouse tests on every PR, cross-references regressions across builds, and uses AI to pinpoint the exact code change that caused the regression.
| 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 | ✅ |
Kanso automates Lighthouse audits on every pull request, reads the diff to isolate what broke, and posts an actionable fix directly in the PR. No extra step in your workflow.
What Kanso reads
Production baseline
Lighthouse on main — or your budgets if defined. Skipped when budgets are set.
PR preview audit
Same Lighthouse run on the deploy preview. Multi-page, auto-detected.
The PR diff
Only what changed — lockfiles, snapshots, and tests excluded.
What gets posted to the PR
- <img src="/hero.webp" class="hero-img" />+ <img src="/hero.webp" class="hero-img" loading="lazy" />
LCP regressed by +2.6s. This PR added loading="lazy" to the hero image — but it's the LCP element. The lazy attribute bypasses the browser preload scanner, deferring the fetch until after layout. Remove it on above-the-fold images, and prefer fetchpriority="high" instead.
Detection is the easy part. The hard part is fixing it. On every regression, our agent reads the diff, the Lighthouse trace, and the fetch waterfall. Then he writes a Likely cause + Code suggestions straight in the PR.
loading="lazy" on the hero image <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. main. loading="lazy" — never apply it to above-the-fold images. fetchpriority="high" to explicitly signal the LCP element to the browser. <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. The agent traces the regression back to the actual lines you changed, not a vague Lighthouse hint.
Cross-references the Lighthouse trace timings and fetch waterfall before pointing to a cause.
The analysis lands in the PR comment thread. No new dashboard. No Slack. No tab to keep open.
It's a great tool, but Lighthouse CI only tells you what regressed, not why.
Kanso auto-detects your preview URL from Vercel, Netlify, Render, Railway, Cloudflare Pages, and AWS Amplify. Manage your configuration through a .kanso.yml file at the root of your repository to define custom pages and 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.
# .kanso.yml # Your production URL base_url: "https://my-domain.com" staging: # optional · auto-detected for Vercel, Netlify, Render, Railway, Cloudflare Pages, Amplify url: "https://acme-git-{branch}.staging.app" urls: - path: / name: Homepage - path: /pricing name: Pricing - path: /blog name: Blog # If your production configuration differs, prefer using budgets 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
The ones we get most often — before they come up in the demo.
Those tools review your code. Kanso reviews what happens when your code runs. We cross-reference Lighthouse audits with your PR diff to name the exact line that regressed a metric — code review tools never run your app.
No. Kanso runs on your preview deploy, separately from your CI. Each PR gets two parallel audits (preview + production/budgets reference) — typically under 2 minutes total. Nothing on your critical path, nothing blocking your merge queue.
Render, Railway, Cloudflare Pages and AWS Amplify are supported out of the box. For any other host, point Kanso at your preview URL pattern with a {branch} or {pr} token in your .kanso.yml.
The agent only fires when Lighthouse confirms a measurable regression (above 10% on a tracked metric). It reads your PR diff plus the Lighthouse trace — not your whole codebase. The output is always grounded in a measurable signal, never in guesswork.
Only the relevant slice of the diff on a failing PR — never your full repo, never your secrets. Lockfiles, snapshots and test files are skipped. A self-hosted option is on the roadmap for teams with stricter isolation requirements.
Max 5 teams to start. We'll reach out within 48 hours.