Lighthouse Monitoring Dashboard & Custom SEO Plugin
Pick a site → run (or view cached) Lighthouse report including the custom Kenyan Schools SEO plugin audits.
██╗ ██╗ ██████╗ ██╗ ██╗████████╗██╗ ██╗ ██████╗ ██╗ ██╗███████╗███████╗
██║ ██║██╔════╝ ██║ ██║╚══██╔══╝██║ ██║██╔═══██╗██║ ██║██╔════╝██╔════╝
██║ ██║██║ ███╗███████║ ██║ ███████║██║ ██║██║ ██║███████╗█████╗
██║ ██║██║ ██║██╔══██║ ██║ ██╔══██║██║ ██║██║ ██║╚════██║██╔══╝
███████╗██║╚██████╔╝██║ ██║ ██║ ██║ ██║╚██████╔╝╚██████╔╝███████║███████╗
╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝Lighthouse Monitoring Dashboard & Custom SEO Plugin
Focus: Run Google Lighthouse on demand, pick from your sites, see full scores + Core Web Vitals + custom domain audits. Includes a production-ready custom Lighthouse plugin you can publish to npm. Everything you need for continuous performance + SEO monitoring.
Why Lighthouse in 2026
Lighthouse is the official automated auditor from the Chrome team. It produces the numbers that power:
- Chrome DevTools
- PageSpeed Insights
- Lighthouse CI (GitHub Action / Vercel)
- Search ranking signals (via Core Web Vitals)
It now covers four scored categories — the PWA category was removed in Lighthouse 12 (May 2024); installability/service-worker checks moved to the Chrome DevTools Application panel and are no longer scored by Lighthouse:
| Category | What it checks | Why it matters for this stack |
|---|---|---|
| Performance | FCP, Speed Index, LCP, TBT, CLS (lab) | User experience + SEO |
| Accessibility | ARIA, contrast, labels, focus | Compliance + reach |
| Best Practices | Security, modern APIs, console errors | Maintainability |
| SEO | Meta, titles, robots, structured data, mobile | Direct ranking impact |
Performance score weights (Lighthouse 10–13)
The Performance score is a weighted blend of five lab metrics — these weights have not changed since Lighthouse 10 (verified against the official scoring doc, 2026-08-23):
| Metric | Weight |
|---|---|
| Total Blocking Time (TBT) | 30% |
| Largest Contentful Paint (LCP) | 25% |
| Cumulative Layout Shift (CLS) | 25% |
| First Contentful Paint (FCP) | 10% |
| Speed Index (SI) | 10% |
Score bands: 90–100 green (good), 50–89 orange, 0–49 red. Note that INP is not part of the lab Performance score — it needs a real user interaction, so it surfaces only as field data (CrUX / PageSpeed Insights), not from a cold lab run.
Core Web Vitals thresholds ("good" measured at the 75th percentile)
| Metric | Good | Needs improvement | Poor |
|---|---|---|---|
| LCP — loading | ≤ 2.5 s | ≤ 4.0 s | > 4.0 s |
| INP — interactivity | ≤ 200 ms | ≤ 500 ms | > 500 ms |
| CLS — visual stability | ≤ 0.1 | ≤ 0.25 | > 0.25 |
INP replaced FID as the responsiveness Core Web Vital on 12 March 2024; FID is fully retired. These are the thresholds the dashboard's mobile CWV panel is graded against.
Versions & tooling (verified 2026-08-23)
| Package | Current | Notes |
|---|---|---|
lighthouse | 13.4.1 | requires Node ≥ 22.19 for the full local runner |
chrome-launcher | 1.2.1 | launches headless Chrome for the --full path |
@lhci/cli | 0.15.1 | the maintained Lighthouse CI package (npm i -D @lhci/cli) |
| PageSpeed Insights API | v5 | https://www.googleapis.com/pagespeedonline/v5/runPagespeed — set PSI_API_KEY for higher quota |
The PSI (default) path only needs Node 18+ (global fetch); the --full Chrome path pulls in lighthouse + chrome-launcher and therefore Node ≥ 22.19.
The Interactive Dashboard (right here)
Use the Site Selector below to pick a known site (e.g. kenyanschools.org or any of your deployed projects). Click Run Audit to simulate (or connect to) a fresh Lighthouse run. You'll see:
- Overall scores (0-100) for all categories
- Key metrics with pass/fail
- Your custom plugin audits (e.g. "Has KSO index", "County geo present", "School JSON-LD")
- Historical runs table
The implementation is a self-contained React component that matches the rest of the tech-stack portal (glass, fresh green accents, tilt cards). In a real setup you would wire the "Run" button to a server route that actually invokes lighthouse + your plugin.
Lighthouse Plugin System
Lighthouse is extensible. A plugin is just a small npm package that adds new audits and a new category to the report.
See the full official guide: https://github.com/GoogleChrome/lighthouse/blob/main/docs/plugins.md
Minimal plugin structure (copy-paste ready)
// lighthouse-plugin-kenyan-schools/plugin.js
export default {
audits: [
{ path: 'lighthouse-plugin-kenyan-schools/audits/school-index-present.js' },
],
category: {
title: 'Kenyan Schools SEO',
auditRefs: [{ id: 'school-index-present', weight: 1 }],
},
};Example custom audit (checks for KSO-XXXX):
// audits/school-index-present.js
import { Audit } from 'lighthouse';
class SchoolIndexPresent extends Audit {
static get meta() {
return {
id: 'school-index-present',
title: 'Page contains unique KSO school index',
requiredArtifacts: ['MainDocumentContent'],
};
}
static audit({ MainDocumentContent }) {
const has = /KSO-\d{4}/i.test(MainDocumentContent);
return { score: has ? 1 : 0, numericValue: has ? 1 : 0 };
}
}
export default SchoolIndexPresent;Usage (local dev):
npx lighthouse https://kenyanschools.org \
--plugins=lighthouse-plugin-kenyan-schools \
--only-categories=lighthouse-plugin-kenyan-schools,seoPublish to npm as lighthouse-plugin-kenyan-schools and anyone can use it.
Pre-built Custom Audits (included)
The dashboard demonstrates these audits that ship with the example plugin:
school-index-present— looks forKSO-XXXXin page contentcounty-geo-data— county name + lat/long mentionsstructured-school-data—@type": "School"JSON-LD presentdescriptive-slugs— human readable URLs (not just IDs)
Site Selector + Stats
The live module below lets you:
- Select a site from your portfolio (or type a custom URL)
- See the latest Lighthouse numbers
- "Re-run" to get fresh (demo) numbers
Connect the Run button to a real endpoint (the original internal run-audit.js + express server from the monorepo is a perfect starting point).
Official Links
- Lighthouse overview & plugins: https://developer.chrome.com/docs/lighthouse
- SEO audits reference: https://developer.chrome.com/docs/lighthouse/seo
- Performance scoring / metric weights: https://developer.chrome.com/docs/lighthouse/performance/performance-scoring
- Core Web Vitals: https://web.dev/articles/vitals
- Lighthouse CI (for CI/CD,
@lhci/cli): https://github.com/GoogleChrome/lighthouse-ci
Live Dashboard (deployed)
This entry ships a live interactive dashboard, not a mock:
- URL: https://tech-stack.codeamanilabs.org/guide/lighthouse
- Pick a site (primary:
kenyanschools.org, plus the portal itself, dev-resources, and other portfolio subdomains) → Run Audit (PSI) for hosted Google PageSpeed Insights data, or Full Chrome Runner locally for a headless-Chrome run. - Real output rendered: category scores, Core Web Vitals, the custom Kenyan-Schools plugin audits, cache insights, opportunities, network summary, third-party, plus recharts radial score gauges and an SEO/Performance trend chart.
- Production data path = PSI (server-side).
?full=trueis a local/CI bonus — on Vercel (no Chrome binary) it falls back to PSI automatically. SetPSI_API_KEYfor higher quota.
Run the same logic from the CLI: node lighthouse/examples/run-audit.js https://kenyanschools.org [--full].
Next.js / Vercel Integration Pattern
// .github/workflows/lighthouse.yml (example)
- name: Lighthouse
uses: treosh/lighthouse-ci-action@v12
with:
urls: |
https://kenyanschools.org
https://kenyanschools.org/schools
configPath: ./lighthouserc.jsonlighthouserc.json can load your custom plugin.
Copy-Paste Templates
See the examples/ directory in this tech-stack entry for:
- Full plugin package skeleton
- Server + UI dashboard (the one powering the selector below)
- GitHub Action that posts scores back to your review system
All files are ready to drop into any project.
Status: Fresh as of 2026-08-23 (lighthouse 13.4, @lhci/cli 0.15, PSI API v5). This entry ships both the measurement tool (dashboard) and the extensibility story (plugin + custom audits) that the rest of the CodeAmani stack relies on for performance gates.