Beacon

Real Chrome · real Lighthouse · every run kept

One score is an anecdote.

A page audited once tells you how it did that afternoon, on that machine, under whatever load it happened to meet. Beacon keeps every run it has ever taken, so a number arrives with its own history attached — and a fix gets checked against the reading that prompted it, not against memory. Nothing here is estimated or cached; if it's on the page, a browser measured it.

Headless Chrome Core Web Vitals Before / after comparison Excel & PDF
/pricing 3 min ago
94 ▲ 12 since 27 Aug
Performance · last four runs
13 Aug → 3 Sep 4 runs · all clean

Five steps, start to answer

How a before-and-after actually gets made.

The whole loop, as it happens in the app: list your pages, let Beacon measure them, ship your fix, measure again, and read the difference. Scroll to walk through it.

  1. 01 List the pages

    Paste URLs or upload a sheet, then name the run — Iteration 1. The name is what you'll pick from later, so make it mean something.

  2. 02 Let it measure

    Each URL gets a full Lighthouse pass in a real headless Chrome — 15–45 seconds each, one at a time, so they don't skew each other.

  3. 03 Read the report

    Scores and Core Web Vitals for every page in the run. This is your baseline — the thing your fix has to beat.

  4. 04 Ship, then re-run

    Same list, new name — Iteration 2. Nothing else to configure; Beacon keeps both runs side by side.

  5. 05 Compare the two

    Pick both runs in Compare → By Bulk Run. Every URL is matched up and sorted worst regression first, so the page you broke is line one.

Bulk Audit 4 URLs
https://your-site.com/ https://your-site.com/pricing https://your-site.com/search https://your-site.com/checkout
Iteration 1
Label this run (optional) — e.g. Iteration 1, Pre-fix
Run Bulk Audit
Running · Iteration 1 2 of 4
/done94
/pricingdone82
/searchrunning—
/checkoutqueued—
One at a time · a busy machine moves the numbers, so Beacon won't overlap them
Report · Iteration 1 baseline
PagePerfA11yBPSEO
/9410096100
/pricing8210096100
/search809692100
/checkout72989690
/checkout · FCP 2.1s · LCP 3.4s · TBT 410ms — worth a look
Bulk Audit same 4 URLs
https://your-site.com/ https://your-site.com/pricing https://your-site.com/search https://your-site.com/checkout
Iteration 2
After the fix ships · same list, new name
Run Bulk Audit
Compare
By Audit By Bulk Run
Iteration 1 — 27 Aug vs Iteration 2 — 3 Sep
4 of 4 URLs match · sorted worst Performance change first
PageIt 1It 2Δ
/checkout72→58▼ 14
/search80→76▼ 4
/94→95▲ 1
/pricing82→94▲ 12
The fix worked on /pricing — and cost you /checkout

The same run, asked three ways

A stored reading answers more than the day it was taken.

Beacon keeps the whole run — categories, vitals, conditions — so the dashboard can put three different questions to the same data instead of making you audit three times.

Report

Where does this page stand?

Every audited URL with its latest result, and the vitals underneath the headline number — because a score of 94 says less than an LCP of 1.2s.

/pricing · 3 minutes ago
Performance     94    FCP  0.8s
Accessibility  100    LCP  1.2s
Best Practices  96    TBT  40ms
SEO            100    CLS  0.01
History

How did it get here?

Every run ever taken of one URL, newest first, each carrying the conditions it ran under — so a dip you can explain doesn't get mistaken for one you can't.

/pricing · performance
03 Sep   94   ▲ 12   clean
27 Aug   82   ▼  3   clean
20 Aug   85   —  0   noisy · 2 concurrent
13 Aug   85   —      first run
Compare

Did the fix actually work?

Two bulk runs you named yourself, matched URL by URL and ordered worst regression first — so the page that got slower is the first line, not the twelfth.

"Iteration 1" → "Iteration 2" · 15 URLs
/checkout   72 → 58   ▼ 14
/search     80 → 76   ▼  4
/pricing    82 → 94   ▲ 12
/home       91 → 91   —  0

Why the readings hold up

Every reading carries the conditions it was taken under.

Lighthouse numbers drift when the machine running them is busy — that's physics, not a bug. An instrument that hides it is the problem. Beacon records what else was happening and shows you.

Skipped

Measured moments ago

This URL was audited less than a minute back. A second run wouldn't measure anything new, so Beacon declines it and says so — rather than spending a slot to produce a near-duplicate that looks like corroboration.

Noisy

Two others were running

This one shared a CPU with two sibling audits. The figure is genuine, but it's stored as concurrentAudits: 2 and badged in the dashboard, so a contention artefact never gets read as a regression.

Clean

Had the machine to itself

No neighbours, no cache, no shortcuts — one full Lighthouse pass in a browser that was doing nothing else. These are the runs worth comparing against, and Beacon marks which ones they are.

Chrome extension

The audits you'd forget to run.

Bulk runs cover the pages you remember. The extension covers the rest — it audits your own site as you browse it, so the record fills in from normal work rather than from someone remembering to go and measure.

Install it once, paste in your key, and it watches for navigations to your brand's own domains — nothing else. Land on one and it fires an audit against the dashboard; the result is in History by the time you've finished reading the page. There's a button in the popup for auditing the current page on demand too.

It's built narrow on purpose. Manifest V3, no content scripts, no <all_urls> — its host permissions list only the dashboard itself, and each person gets their own API key so revoking one doesn't break anyone else's install.

Unzip, then load it at chrome://extensions with Developer mode on → Load unpacked.

Three ways to start one

However a reading begins, it's taken the same way.

Same cooldown, same contention tracking, same stored shape — so a run someone triggered by hand is still comparable with one the extension fired last Tuesday.

01 — by hand

Manual

One URL, on demand
Straight from the dashboard
15–45s, then it's in History
02 — in bulk

A named run

Paste a list or upload a sheet
Label it — "Iteration 2"
Compare it against any earlier one
03 — on its own

Extension

Chrome, Manifest V3
Fires only on your own domains
Per-person key, scoped permissions