{"id":13517043,"url":"https://github.com/sitespeedio/browsertime","last_synced_at":"2026-05-01T19:01:04.293Z","repository":{"id":10204689,"uuid":"12298355","full_name":"sitespeedio/browsertime","owner":"sitespeedio","description":"Measure and Optimize Web Performance","archived":false,"fork":false,"pushed_at":"2026-04-30T05:00:57.000Z","size":138276,"stargazers_count":648,"open_issues_count":38,"forks_count":140,"subscribers_count":21,"default_branch":"main","last_synced_at":"2026-04-30T05:16:58.545Z","etag":null,"topics":["chrome","firefox","har","javascript","safari","speedindex","video"],"latest_commit_sha":null,"homepage":"https://www.sitespeed.io/documentation/browsertime/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sitespeedio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"SUPPORT.md","governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["soulgalore"],"patreon":null,"open_collective":"sitespeedio","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2013-08-22T14:00:15.000Z","updated_at":"2026-04-30T05:01:00.000Z","dependencies_parsed_at":"2023-09-24T07:16:43.649Z","dependency_job_id":"6a841ae3-d9ad-455b-b24c-b659b860a4d8","html_url":"https://github.com/sitespeedio/browsertime","commit_stats":{"total_commits":5049,"total_committers":56,"mean_commits":90.16071428571429,"dds":"0.23905723905723908","last_synced_commit":"51b5c8623628a80cd94b644a82b835cc3fbd28db"},"previous_names":["tobli/browsertime","soulgalore/browsertime"],"tags_count":705,"template":false,"template_full_name":null,"purl":"pkg:github/sitespeedio/browsertime","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sitespeedio%2Fbrowsertime","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sitespeedio%2Fbrowsertime/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sitespeedio%2Fbrowsertime/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sitespeedio%2Fbrowsertime/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sitespeedio","download_url":"https://codeload.github.com/sitespeedio/browsertime/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sitespeedio%2Fbrowsertime/sbom","scorecard":{"id":828070,"data":{"date":"2025-08-11","repo":{"name":"github.com/sitespeedio/browsertime","commit":"89c2ec6215d6ab6519a184a91f6b1d38eb2604e7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":1,"reason":"Found 3/30 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/browser-beta.yml:1","Warn: no topLevel permission defined: .github/workflows/browser-dev.yml:1","Warn: no topLevel permission defined: .github/workflows/building-docker.yml:1","Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Warn: no topLevel permission defined: .github/workflows/lint.yml:1","Warn: no topLevel permission defined: .github/workflows/linux-chrome.yml:1","Warn: no topLevel permission defined: .github/workflows/linux-firefox.yml:1","Warn: no topLevel permission defined: .github/workflows/mac-m1.yml:1","Warn: no topLevel permission defined: .github/workflows/mac.yml:1","Warn: no topLevel permission defined: .github/workflows/safari.yml:1","Warn: no topLevel permission defined: .github/workflows/unittests.yml:1","Warn: no topLevel permission defined: .github/workflows/windows.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: docker/webpagereplay/linux/amd64/wpr:1","Warn: binary detected: docker/webpagereplay/linux/arm64/wpr:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/browser-beta.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-beta.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/browser-beta.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-beta.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/browser-beta.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-beta.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/browser-beta.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-beta.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/browser-dev.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-dev.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/browser-dev.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-dev.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/browser-dev.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-dev.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/browser-dev.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/browser-dev.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/building-docker.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/building-docker.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/building-docker.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/building-docker.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/building-docker.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/building-docker.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/building-docker.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/docker.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linux-chrome.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/linux-chrome.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linux-chrome.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/linux-chrome.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linux-firefox.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/linux-firefox.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linux-firefox.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/linux-firefox.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/linux-firefox.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/linux-firefox.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac-m1.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac-m1.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac-m1.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac-m1.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac-m1.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac-m1.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mac.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/mac.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/safari.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/safari.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/safari.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/safari.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/safari.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/safari.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittests.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/unittests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittests.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/unittests.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unittests.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/unittests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/windows.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sitespeedio/browsertime/windows.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating sitespeedio/webbrowsers:chrome-138.0-firefox-140.0-edge-138.0 to sitespeedio/webbrowsers:chrome-138.0-firefox-140.0-edge-138.0@sha256:d8f71bffc625b7b8e00362c11378d5994aec56844b19a32d7f9342ab4f0a89a7","Warn: npmCommand not pinned by hash: Dockerfile:30","Warn: pipCommand not pinned by hash: .github/workflows/browser-beta.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/browser-beta.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/browser-beta.yml:35","Warn: pipCommand not pinned by hash: .github/workflows/browser-beta.yml:39","Warn: pipCommand not pinned by hash: .github/workflows/browser-dev.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/browser-dev.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/browser-dev.yml:35","Warn: pipCommand not pinned by hash: .github/workflows/browser-dev.yml:39","Warn: pipCommand not pinned by hash: .github/workflows/linux-chrome.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/linux-chrome.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/linux-chrome.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/linux-chrome.yml:38","Warn: pipCommand not pinned by hash: .github/workflows/linux-firefox.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/linux-firefox.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/linux-firefox.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/linux-firefox.yml:35","Warn: pipCommand not pinned by hash: .github/workflows/mac-m1.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/mac-m1.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/mac-m1.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/safari.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/safari.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/safari.yml:31","Info:   0 out of  25 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  11 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   9 out of  10 npmCommand dependencies pinned","Info:   0 out of  22 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/building-docker.yml:7"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":4,"reason":"6 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T17:01:15.988Z","repository_id":10204689,"created_at":"2025-08-23T17:01:15.988Z","updated_at":"2025-08-23T17:01:15.988Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32508912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chrome","firefox","har","javascript","safari","speedindex","video"],"created_at":"2024-08-01T05:01:28.972Z","updated_at":"2026-05-01T19:01:04.281Z","avatar_url":"https://github.com/sitespeedio.png","language":"JavaScript","funding_links":["https://github.com/sponsors/soulgalore","https://opencollective.com/sitespeedio"],"categories":["JavaScript","⚙️ Backend \u0026 APIs"],"sub_categories":[],"readme":"# Browsertime\n![Run Docker](https://github.com/sitespeedio/browsertime/actions/workflows/docker.yml/badge.svg?branch=main)\n![Unit tests](https://github.com/sitespeedio/browsertime/actions/workflows/unittests.yml/badge.svg?branch=main)\n![Windows Edge](https://github.com/sitespeedio/browsertime/actions/workflows/windows.yml/badge.svg?branch=main)\n![OSX Safari](https://github.com/sitespeedio/browsertime/actions/workflows/safari.yml/badge.svg?branch=main)\n![Linux browsers](https://github.com/sitespeedio/browsertime/actions/workflows/linux.yml/badge.svg?branch=main)\n[![Downloads][downloads-image]][downloads-url]\n[![Downloads total][downloads-total-image]][downloads-url]\n[![Stars][stars-image]][stars-url]\n\n[Documentation](https://www.sitespeed.io/documentation/browsertime/) | [Changelog](https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md)\n\n![Browsertime](browsertime.png)\n\n# Browsertime: Measure and Optimize Web Performance\n\nBrowsertime is a powerful, open-source Node.js tool designed for engineers who are building their own performance measurement tools. It serves as the core engine of projects like sitespeed.io and is a trusted tool used by Mozilla to measure the performance of Firefox.\n\n# Table of Contents\n1. [Introduction](#browsertime-measure-and-optimize-web-performance)\n2. [Key Features](#key-features)\n3. [Installation](#installation)\n    - [NodeJS](#nodejs)\n    - [Docker](#docker)\n4. [Usage](#usage)\n    - [Basic Usage](#basic-usage)\n    - [Advanced Options](#advanced-options)\n    - [Connectivity](#connectivity)\n    - [Navigate in a script](#navigate-in-a-script)\n    - [Test on your mobile device](#test-on-your-mobile-device)\n    - [Using WebPageReplay](#using-webpagereplay)\n    - [Speed Index and video](#speed-index-and-video)\n5. [Browser Support](#browser-support)\n6. [How does it work](#how-does-it-work)\n7. [Contributing](#contributing)\n9. [Community and Support](#community-and-support)\n9. [License](#license)\n\n## Key Features\n\n- **Robust Performance Testing:** Browsertime allows you to perform comprehensive performance tests on your web pages, including page load times, resource loading, and user interactions.\n\n- **Deep Metrics:** Gain access to a wide range of performance metrics, such as page load times, visual metrics (when things are painted on the screen), largest contentful paint (LCP), and more, helping you pinpoint areas for improvement.\n\n- **Scripting Capabilities:** Customize your tests and user interactions with JavaScript scripting, enabling advanced scenarios and detailed analysis.\n\n- **Docker Support:** Easily integrate Browsertime into your CI/CD pipelines and containerized environments with Docker support.\n##\n\n## Installation\n\nIf you're an engineer working on performance measurement tools or simply want to harness the power of Browsertime for your web performance needs, follow the installation and usage instructions below.\n\n### NodeJS\n```shell\nnpm install -g browsertime\nbrowsertime https://example.com\n```\n\n### Docker\n```shell\ndocker run --rm -v \"$(pwd)\":/browsertime sitespeedio/browsertime https://www.sitespeed.io/\n```\n\n## Usage\nBrowsertime is designed to be straightforward to use, regardless of your experience level. Here's a quick guide on how to get started.\n\n### Basic Usage\n\n```shell\nbrowsertime https://www.example.com --browser chrome\n```\n\nThis command will test https://www.example.com using Chrome.\n\n### Advanced Options\n\nBrowsertime offers various advanced options for more detailed analysis, such as specifying the number of runs, choosing a browser, or setting custom metrics. Here are some examples:\n\n#### Run the test multiple times\n\n```shell\nbrowsertime -n 5 https://www.example.com\n```\n\n#### Specify a different browser\n```shell\nbrowsertime --browser firefox https://www.example.com\n```\n\n#### Custom metrics\n```shell\nbrowsertime --script \"return {'myMetric': window.myApp.customMetric}\" https://www.example.com\n```\n\nFor a full list of options, run \u003ccode\u003e$ browsertime --help\u003c/code\u003e and you can see the configuration options.\n\n#### Connectivity\n\nYou can throttle the connection to make the connectivity slower to make it easier to catch regressions. The best way to do that is to setup a network bridge in Docker or use our connectivity engine Throttle. Read more about how to do that in the [documentation](https://www.sitespeed.io/documentation/sitespeed.io/connectivity/).\n\n#### Navigate in a script\nIf you need a more complicated test scenario, you can define your own (Selenium)test script that will do the testing. Use your own test script when you want to test your page as a logged in user, the login page or if you want to add things to your cart.\n\nWe have a full section in the documentation about [scripting](https://www.sitespeed.io/documentation/sitespeed.io/scripting/).\n\n#### Test on your mobile device\nBrowsertime supports Chrome and Firefox on Android: Collecting SpeedIndex, HAR and video! \n\nYou need to [install adb](https://www.sitespeed.io/documentation/sitespeed.io/mobile-phones/#desktop) and [prepare your phone](https://www.sitespeed.io/documentation/sitespeed.io/mobile-phones/#on-your-phone) before you start.\n\nIf you want to set connectivity you need to use something like [gnirehtet](https://github.com/Genymobile/gnirehtet). Read more information [here](https://www.sitespeed.io/documentation/sitespeed.io/mobile-phones/#connectivity).\n\n\u003cpre\u003e\n$ browsertime --chrome.android.package com.android.chrome https://www.sitespeed.io --video --visualMetrics\n\u003c/pre\u003e\n\n#### Using WebPageReplay\nOur Docker container now includes [WebPageReplay](https://github.com/catapult-project/catapult/blob/main/web_page_replay_go/README.md).\n\nWebPageReplay will let you replay your page locally (getting rid of server latency) and makes it easier to find front end regressions.\n\nIt works like this:\n1. The start script starts WebPageReplay in record mode\n2. Then starts Browsertime accessing the URL you choose one time (so it is recorded)\n3. WebPageReplay is closed down\n4. WebPageReplay in replay mode is started\n5. Browsertime access the URL so many times you choose\n6. WebPageReplay in replay mode is closed down\n\nYou can change latency by setting a Docker environment variable. Use REPLAY to turn on the reply functionality.\n\nDefault browser is Chrome:\n\n```\ndocker run --cap-add=NET_ADMIN --rm -v \"$(pwd)\":/browsertime -e REPLAY=true -e LATENCY=100 sitespeedio/browsertime:20.0.0 https://en.wikipedia.org/wiki/Barack_Obama\n```\n\nUse Firefox:\n\n```shell\ndocker run --cap-add=NET_ADMIN --rm -v \"$(pwd)\":/browsertime -e REPLAY=true -e LATENCY=100 sitespeedio/browsertime:20.0.0 -b firefox -n 11 --firefox.acceptInsecureCerts true https://en.wikipedia.org/wiki/Barack_Obama\n```\n\nAnd Chrome on your Android phone. This will only work on Linux because you need to be able to mount the usb port in Docker:\n\n```shell\ndocker run --privileged -v /dev/bus/usb:/dev/bus/usb -e START_ADB_SERVER=true --cap-add=NET_ADMIN --rm -v “$(pwd)“:/browsertime -e REPLAY=true -e LATENCY=100 sitespeedio/browsertime https://en.m.wikipedia.org/wiki/Barack_Obama --android --chrome.args ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I= -n 11 --chrome.args user-data-dir=/data/tmp/chrome\n```\n\n#### Speed Index and video\nIt's easiest to run [our ready made Docker container](https://hub.docker.com/r/sitespeedio/browsertime/) to be able to record a video and calculate SpeedIndex because then you get all dependencies needed for free to run [VisualMetrics](https://github.com/WPO-Foundation/visualmetrics).\n\nThe default video will include a timer and showing when the metrics happens, but you can turn that off using \u003ccode\u003e--video.addTimer false\u003c/code\u003e.\n\n\u003cimg src=\"https://raw.githubusercontent.com/sitespeedio/sitespeed.io/main/docs/img/video-example.gif\"\u003e\n\n\n## Browser Support\nBrowsertime supports Firefox, Chrome, and Edge (Chromium version) on desktop and Safari on Mac OS. On Android we support Chrome and Firefox. Safari on iOS supports HAR (via `ios_webkit_debug_proxy`) and video / visual metrics (via screen capture over USB). You can also use the Safari simulator on Mac OS.\n\n## How does it work\nBrowsertime uses Selenium NodeJS to drive the browser. It starts the browser, load a URL, executes configurable Javascripts to collect metrics, collect a HAR file.\n\nTo get the HAR from Firefox we use the [HAR Export Trigger](https://github.com/firebug/har-export-trigger) and Chrome we use [Chrome-HAR](https://github.com/sitespeedio/chrome-har) to parse the timeline log and generate the HAR file.\n\n## Contributing\n\nWe welcome contributions from the community! Whether you're fixing a bug, adding a feature, or improving documentation, your help is valuable. Here’s how you can contribute:\n\n1. **Create an Issue**: Create an issue and discuss with us how to implement the issue.\n2. **Fork and Clone**: Fork the repository and clone it locally.\n3. **Create a Branch**: Create a new branch for your feature or bug fix.\n4. **Develop**: Make your changes. Ensure you adhere to the coding standards and write tests if applicable.\n5. **Test**: Run tests to ensure everything works as expected.\n6. **Submit a Pull Request**: Push your changes to your fork and submit a pull request to the main repository.\n\nBefore contributing, please read our [CONTRIBUTING.md](.github/CONTRIBUTING.md) for more detailed information on how to contribute.\n\n### Reporting Issues\nFound a bug or have a feature request? Please use the [GitHub Issues](https://github.com/sitespeedio/browsertime/issues) to report them. Be sure to check existing issues to avoid duplicates.\n\n## Community and Support\n\nJoin our community! Whether you need help, want to share your experience, or discuss potential improvements, there are several ways to get involved:\n\n- **Slack**: Connect with fellow users and the development team on [Slack](https://join.slack.com/t/sitespeedio/shared_invite/zt-296jzr7qs-d6DId2KpEnMPJSQ8_R~WFw).\n- **GitHub Issues**: For technical questions, feature requests, and bug reports, use our [GitHub issues](https://github.com/sitespeedio/browsertime/issues).\n- **RSS/Changelog**: Latest releases and information can always be found in our [RSS feed](https://github.com/sitespeedio/browsertime/releases.atom) and in our [changelog](https://github.com/sitespeedio/browsertime/blob/main/CHANGELOG.md).\n- **Mastodon**: Follow us on Mastodon [https://fosstodon.org/@sitespeedio](https://fosstodon.org/@sitespeedio).\n\nWe're excited to have you in our community and look forward to your contributions and interactions!\n\n\n## License\n[Apache License version 2.0](LICENSE).\n\n[travis-image]: https://img.shields.io/travis/sitespeedio/browsertime.svg?style=flat-square\n[travis-url]: https://travis-ci.org/sitespeedio/browsertime\n[stars-url]: https://github.com/tobli/sitespeedio/stargazers\n[stars-image]: https://img.shields.io/github/stars/sitespeedio/browsertime.svg?style=flat-square\n[downloads-total-image]: https://img.shields.io/npm/dt/browsertime.svg?style=flat-square\n[downloads-image]: https://img.shields.io/npm/dm/browsertime.svg?style=flat-square\n[downloads-url]: https://npmjs.org/package/browsertime\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsitespeedio%2Fbrowsertime","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsitespeedio%2Fbrowsertime","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsitespeedio%2Fbrowsertime/lists"}