This node module performs a Google PageSpeed Insights analysis on a given webpage and returns the result as an SVG.
npm i -g psi-svg
bun i -g psi-svg
yarn global add psi-svg
The module can be used as a CLI tool or as a web server. Different options can be used to customize the output for each use case.
To use the module as a CLI tool, simply run it with the URL of the webpage to analyze and the path to the output SVG.
Example:
psi-svg https://www.example.com ./out.svg
The following flags can be used to customize the analysis:
Flag | Description | Type | Values |
---|---|---|---|
--strategy or -s |
The strategy to use for the analysis. | desktop | mobile |
mobile |
--categories or -c |
The categories to include in the analysis as CSV. | performance | accessibility | best-practices | seo | pwa |
performance, accessibility, best-practices, seo, pwa |
--legend or -l |
Whether to include the legend in the SVG. | true | false |
true |
The module can also be run without installing it by using npx
:
npx psi-svg https://www.example.com ./out.svg
To run the application as a web server, the --srv
or -s
flag can be used:
psi-svg -s
By default the server will listen on port 3000. To change this, the --port
or -p
option can also be set:
psi-svg -s -p 8080
After the server has been started, an insights SVG can be generated by sending a GET request to the server with the URL to analyze as a query parameter:
curl http://localhost:3000/?url=https://www.example.com > example-insights.svg
The server accepts similar parameters as the CLI tool:
Parameter | Description | Values | Default |
---|---|---|---|
url |
The URL to analyze. | string |
- |
strategy |
The strategy to use for the analysis. | desktop | mobile |
mobile |
categories |
The categories to include in the analysis as CSV. | performance | accessibility | best-practices | seo | pwa |
performance, accessibility, best-practices, seo, pwa |
legend |
Whether to include the legend in the SVG. | true | false |
true |
This GET request for example
curl http://localhost:3000/?url=https://www.example.com\&strategy=desktop\&categories=performance,accessibility,seo\&legend=false > example-insights.svg
will return this SVG
Note: this analysis ran on the 17. November of 2023; the example page may be prone to change and the results may not be accurate anymore.
The following environment variables can be used to customize the application:
Variable | Description | Values | Default |
---|---|---|---|
DOMAIN_WHITELIST |
A comma-separated list of domains to allow requests from. Currently only supports domain name i.e. no wildcards | string |
- |
Setting the DOMAIN_WHITELIST
environment variable to example
for example will allow requests from https://example.com
and https://example.org
. This is especially useful when running the web server in a public environment.
The application can also be run as a Docker container by following the following steps, although this requires docker to be installed.
- Clone the repository
git clone https://www.github.com/nico-i/psi-svg
- Build the image
docker build -t psi-svg .
- Run the image
docker run -p 3000:3000 psi-svg
The application can also be run as a Github Action an example workflow can be found in .github/workflows/pagespeed.yml
. The results of which are visible in docs/img/
. To use the action, simply copy the workflow file to your repository and modify the value of the URL_TO_ANALYZE
and RESULTS_DIR
variables. Also ensure that the Github Action Workers have write access to the repository. You can configure this under Settings > Code and automation > Actions > General > Workflow permissions
.
This project uses Node.js and Typescript for development. To get started, clone the repository and install the dependencies:
git clone https://www.github.com/nico-i/psi-svg
cd psi-svg
npm install
To run the application, use the following command:
npm run start
This will start the web server on port 3000.
For development I recommend using the API testing tool bruno, which you can point to the /.bruno/
directory of this repo. It contains some helpful requests to test the application.
This project is based on ankurparihar's readme-pagespeed-insights.
This project improves the original project in the following ways:
- Added a CLI implementation
- Added Docker compatibility
- Removed unnecessary options which previously bloated the code
- Better SVG generation with individual SVG-files instead of inline SVG strings
- SVG styling CSS moved to an individual file to facilitate intellisense and linting
- Improved the file structure and code coupling with Domain Driven Design (DDD)
- Added the option to disable the legend
- Made Github action independent of running server
- TODO: Added automated tests
See LICENSE.