Integrations

Lighthouse CI Integration

Run Lighthouse on every deploy. Catch performance regressions before they hit production.

npm install -g @unlighthouse/cli puppeteer
unlighthouse-ci --site https://staging.example.com --budget 80

If any page scores below 80, the command exits with code 1—failing your CI build.

Why Unlighthouse CI?

Google LHCIUnlighthouse CI
SetupComplex config, URL manifestOne command
PagesManual listAuto-discovers entire site
BudgetsPer-page configSingle threshold for all pages
ReportsJSON/HTMLInteractive dashboard, JSON, CSV

Basic Usage

# Scan site, fail if any page < 75
unlighthouse-ci --site example.com --budget 75

# Generate static HTML report
unlighthouse-ci --site example.com --build-static

# Both: budget check + report
unlighthouse-ci --site example.com --budget 75 --build-static

Already Using LHCI Server?

Keep your existing infrastructure—Unlighthouse uploads to LHCI servers:

unlighthouse-ci --site example.com \
  --reporter lighthouseServer \
  --lhci-host https://lhci.yourcompany.com \
  --lhci-build-token $LHCI_TOKEN

Installation for CI

CI environments need Chrome. Install puppeteer alongside the CLI:

npm install -g @unlighthouse/cli puppeteer

Puppeteer downloads a compatible Chromium binary automatically.

Performance Budgets

Simple: One Number

# Fail if ANY category on ANY page < 75
unlighthouse-ci --site example.com --budget 75

Per-Category Budgets

More control in your config:

// unlighthouse.config.ts
export default defineUnlighthouseConfig({
  site: 'https://example.com',
  ci: {
    budget: {
      'performance': 70, // Performance can be lower
      'accessibility': 95, // Accessibility must be high
      'best-practices': 80,
      'seo': 90,
    },
  },
})

Run with just:

unlighthouse-ci

Report Formats

FormatUse CaseFlag
jsonSimple scores for CI parsing--reporter json
jsonExpandedFull metrics breakdown--reporter jsonExpanded
csvSpreadsheet analysis--reporter csv
csvExpandedFull data in CSV--reporter csvExpanded
lighthouseServerUpload to LHCI server--reporter lighthouseServer
# Generate CSV for stakeholders
unlighthouse-ci --site example.com --reporter csvExpanded

Static Reports

Generate a shareable HTML dashboard:

unlighthouse-ci --site example.com --build-static

Output goes to .unlighthouse/. Upload that folder to any static host.

Live examples:

Configuration

Configuring the CLI can be done either through the CI arguments or through a config file.

CI Options

Options
-v, --versionDisplay version number.
--site <url>Host URL to scan.
--root <path>Define the project root. Useful for changing where the config is read from or setting up sampling.
--config-file <path>Path to config file.
--output-path <path>Path to save the contents of the client and reports to.
--budget <budget>Budget (1-100), the minimum score which can pass.
--reporter <reporter>The report to generate from results. Options: csv, csvExpanded, json, jsonExpanded, lighthouseServer or false. Default: jsonSimple.
--lhci-host <lhci-host>URL of your LHCI server.
--lhci-build-token <lhci-build-token>LHCI build token, used to add data.
--lhci-auth <lhci-auth>Basic auth for your LHCI server.
--build-staticBuild a static website for the reports which can be uploaded.
--cacheEnable the caching.
--no-cacheDisable the caching.
--desktopSimulate device as desktop.
--mobileSimulate device as mobile.
--user-agent <user-agent>Specify a top-level user agent all requests will use.
--router-prefix <path>The URL path prefix for the client and API to run from.
--throttleEnable the throttling.
--samples <samples>Specify the amount of samples to run.
--sitemaps <sitemaps>Comma separated list of sitemaps to use for scanning. Providing these will override any in robots.txt.
--urls <urls>Specify explicit relative paths to scan as a comma-separated list, disabling the link crawler.
--exclude-urls <urls>Relative paths (string or regex) to exclude as a comma-separated list.
--include-urls <urls>Relative paths (string or regex) to include as a comma-separated list.
--enable-javascriptWhen inspecting the HTML wait for the javascript to execute. Useful for SPAs.
--disable-javascriptWhen inspecting the HTML, don't wait for the javascript to execute.
--enable-i18n-pagesEnable scanning pages which use x-default.
--disable-i18n-pagesDisable scanning pages which use x-default.
--disable-robots-txtDisables the robots.txt crawling.
--disable-sitemapDisables the sitemap.xml crawling.
--disable-dynamic-samplingDisables the sampling of paths.
--extra-headers <headers>Extra headers to send with the request. Example: --extra-headers foo=bar,bar=foo
--cookies <cookies>Cookies to send with the request. Example: --cookies foo=bar;bar=foo
--auth <auth>Basic auth to send with the request. Example: --auth username:password
--default-query-params <params>Default query params to send with the request. Example: --default-query-params foo=bar,bar=foo
-d, --debugDebug. Enable debugging in the logger.
-h, --helpDisplay available CLI options

Config File

If you want to configure Unlighthouse, you can create a unlighthouse.config.ts file in your cwd.

import { defineUnlighthouseConfig } from 'unlighthouse/config'

export default defineUnlighthouseConfig({
  site: 'example.com',
  debug: true,
  scanner: {
    device: 'desktop',
  },
})

See the Configuration section for more details and the guides.

GitHub Actions & Netlify Example

This example is for GitHub Actions and deploys a static client build to Netlify.

name: Assertions and static report

on:
  workflow_dispatch:

jobs:
  demo:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Dependencies
        run: npm install -g @unlighthouse/cli puppeteer netlify-cli

      - name: Unlighthouse assertions and client
        run: unlighthouse-ci --site <your-site> --budget 75 --build-static

      - name: Deploy
        run: netlify deploy --dir=.unlighthouse --prod --message="New Release Deploy from GitHub Actions"
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

GitLab CI Example

# .gitlab-ci.yml
lighthouse-audit:
  image: node:20
  script:
    - npm install -g @unlighthouse/cli puppeteer
    - unlighthouse-ci --site $SITE_URL --budget 75
  artifacts:
    paths:
      - .unlighthouse/
    expire_in: 1 week

CircleCI Example

# .circleci/config.yml
version: 2.1
jobs:
  lighthouse:
    docker:
      - image: cimg/node:20.0-browsers
    steps:
      - checkout
      - run: npm install -g @unlighthouse/cli
      - run: unlighthouse-ci --site $SITE_URL --budget 75 --build-static
      - store_artifacts:
          path: .unlighthouse
Did this page help you?