Uptime and heartbeats
Know whether the release held with availability checks.
Push Lighthouse runs from CI or your machine. Every run is graded against the budgets you set, and the score, all five categories, the eight timing metrics, and the raw artifact stay beside the commit that caused them.
92
Perf
One connected loop, held on the stage this capability serves. The other stages stay as context so you can see what feeds in and what comes next.
Know whether it held.
Know whether the release held with availability checks.
Keep incident response and customer-facing status context together.
Review Lighthouse report evidence against configured targets.
Investigate test outcomes and flakiness evidence across runs.
Lab runs, graded — not RUM, not APM
This ingests Lighthouse lab runs pushed from CI or your machine. It is not real-user monitoring or application performance monitoring, and it does not crawl your URLs on its own. What it does, it does completely: grade every run against your budgets, keep every metric, and hold the history beside the commit.
Each vital lands on a good → needs-work → poor track with the exact boundaries marked: LCP 2.5s/4.0s, INP 200ms/500ms, CLS 0.10/0.25, FCP 1.8s/3.0s, TBT 200ms/600ms, TTFB 800ms/1800ms.
Every run keeps every metric, so a branch reads straight against your baseline: what it was, what it is now, how far it moved, and whether that counts as a regression.
PR #482 @ 9f3a1c (mobile) vs main @ a20b74
| Metric | Baseline | This run | Δ | Verdict |
|---|---|---|---|---|
| LCP | 2.1s | 1.8s | ▼ 14% | improved |
| INP | 180ms | 240ms | ▲ 33% | regressed |
| CLS | 0.07 | 0.02 | ▼ 71% | improved |
| FCP | 1.6s | 1.5s | ▼ 6% | improved |
| TBT | 190ms | 210ms | ▲ 11% | regressed |
| TTFB | 500ms | 480ms | ▼ 4% | improved |
Because history is stored per page and per metric, the deltas since baseline lay out as a heatmap — severe regressions stand out in pink, wins settle to lime.
| Page | LCP | INP | CLS | FCP | TBT | TTFB |
|---|---|---|---|---|---|---|
| Home | -6% | +2% | -1% | -4% | +3% | 0% |
| Pricing | +4% | +18% | +1% | +2% | +9% | -3% |
| Checkout | +11% | +33% | +6% | +8% | +21% | +2% |
| Dashboard | -8% | -4% | -2% | -5% | -6% | -1% |
| Blog | -12% | -2% | -4% | -9% | -3% | -2% |
Every run is stored, so each vital reads as a distribution across the window: the p75 you report on, and the p50 / p95 / p99 spread that a one-off run can't show.
2.1sp75
260msp75
0.04p75
1.7sp75
230msp75
620msp75
Budgets are the contract
Set a threshold per metric with a comparison operator — lt, lte, gt, gte, or eq — and a severity of warning or failure, scoped to a branch and an environment. Each run rolls up to one verdict: passed, warning, failed, or not evaluated.
Push the raw report from CI or your machine. It is normalized, priced against your budgets, and stored with the artifact — the same logic every time.
Run Lighthouse
CI or local, mobile or desktop
Upload JSON
@lubed/performance-uploader
Normalize
categories, metrics, resources
Grade + store
against your budgets, kept as history
Each vital fills to how much of your budget it spends. A metric over budget flags and pulses; the passing ones settle and stay still.
1.8s/ 2.5s
largest contentful paint
0.02/ 0.10
cumulative layout shift
240ms/ 200ms
interaction to next paint
210ms/ 200ms
total blocking time
Requests reveal staggered left to right in load order, the same way a network panel draws them, so a render-blocking script is easy to spot.
resource waterfall · load order
Every run records accessibility, best practices, SEO, and PWA alongside performance, each scored 0 to 100.
Each metric budget reads as a gauge against its wall. INP and TBT are over; LCP and CLS have room. The verdict is the roll-up of these.
1.8s / 2.5s
240ms / 200ms · over
0.02 / 0.10
210ms / 200ms · over
Every run keeps all five categories, all eight timing metrics, the top opportunities, the largest resources, and the element Lighthouse blamed for LCP — with a lab-variance note, because a single run is a sample.
Top opportunities
Largest resources
LCP element · img.hero__image (hero.webp)
Lab runs vary a little between passes — treat a single number as a sample, not a verdict. Read the trend and percentiles, not one run.
A deterministic digest of the graded run against baseline: the verdict, the metric that moved most, the honest wins, and the recent-run roll-up — summarized from the stored numbers, not generated opinion.
INP regressed +33% on /checkout (mobile).
INP rose to 240ms against a 180ms baseline — past your 200ms budget, so this run fails.
Not everything got worse: CLS improved 71% and LCP dropped 14% on the same page.
The largest render-blocking script is the highest-leverage fix; deferring it recovers about 1.2s of blocking time.
Push one report
The published @lubed/performance-uploader sends upload-lighthouse --target --file --env from CI or your machine, and there's a workflow for authenticated pages: log in inside your CI runner, run Lighthouse, and upload the JSON — lube never needs your app credentials. Runs can also arrive from a GitHub Action.
Push one report and start tracking.