Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-26 10:09 UTC

sitespeedio / browsertime

Measure and Optimize Web Performance

JavaScriptApache-2.0★ 649 stars⑂ 141 forkssince Aug 2013View on GitHub ↗

sitespeedio/browsertime holds a health index of 73 out of 100, placing it in the Good band. It scores highest on Vitality (86/100) and lowest on Security (54/100). It was last updated today. A single contributor accounts for most of its recent work.

73
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

73
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

sitespeed.ioOrganization
112 followers45 public repossince Oct 2013

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
npmbrowsertime28.2.023,2337206 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

86Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
19.4/36Commit cadence — 28/52 weeks with commits
18/18Commit volume — 271 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year271
human_commit_share0.96
days_since_last_push0
active_weeks_last_year28
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 6 days ago
27/27Release cadence — a release every ~8.5 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count100
latest_release_tagv28.2.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases8.5

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

76Good · 18% of overall
How it's scored
45.6/60Stars — 649 stars
17.9/25Forks — 141 forks
7.1/15Watchers — 20 watchers
Inputs used
forks141
stars649
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

85Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno
How it's scored
58.2/80Monthly downloads — 23,233 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesbrowsertime
dependents
ecosystemsnpm
total_downloads
monthly_downloads23,233
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

68Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
4.2/22.5Commit distribution — top contributor authored 81% of commits
13.5/13.5Contributor breadth — 54 contributors
10/10OpenSSF Scorecard: Contributors — project has 9 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled54
top_contributor_share0.814
How it's scored
44.1/46.8Issue resolution — 94% of issues closed
35.1/38.3PR acceptance — 1,742/1,897 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs1,742
open_issues35
closed_issues594
issue_closed_ratio0.944
closed_unmerged_prs155
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
14.8/25Owner reach — 112 followers of sitespeedio
24.1/25Track record — 45 public repos, account ~12 yr old
Inputs used
followers112
owner_typeOrganization
is_verified
owner_loginsitespeedio
public_repos45
account_age_days4,666
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 6 days ago
20/20Version history — 720 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesbrowsertime
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Engineering Quality

Are baseline engineering and documentation practices in place?

76Good · 20% of overall
How it's scored
24/24CI workflows — 14 workflow(s)
24/24Tests present
16/16Linter config — .eslintrc, .eslintrc.json, eslint.config.mjs
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

65Moderate
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — https://www.sitespeed.io/documentation/browsertime/
10/10Repository description
10/10Topics — 7 topics
0/10Wiki
Inputs used
topicsjavascript, har, chrome, firefox, speedindex, video, safari
has_wikino
homepagehttps://www.sitespeed.io/documentation/browsertime/
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

54Moderate · 16% of overall
How it's scored
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — no data
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 9 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
3.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.7
Excluded from scoring (no data or not applicable): branch_protection. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
8.4/25Indirect dependencies free of known advisories — 2 affected: brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)
40/40No advisories left outstanding — no advisory has been public longer than 90 days
Inputs used
sourceosv
advisories7
affected_packages2
assessed_packages187
unassessed_packages0
affected_by_severityhigh 2
direct_affected_packages0
Matched the npm:browsertime@28.2.0 runtime dependency closure — what installing the published package pulls in — 187 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

57Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 74 of 96 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.771
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .eslintrc, .eslintrc.json, eslint.config.mjs
11/11Static type checking — tsconfig.json
10/10Reproducible environment — Dockerfile, lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
7/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
27/45Type-checkable code — JavaScript with type-check config (tsconfig.json)
54.7/55Manageable file sizes — 2/380 source files over 60KB
Inputs used
primary_languageJavaScript
largest_source_bytes84,345
source_files_sampled380
oversized_source_files2

Key facts

649GitHub stars
54contributors
271commits, last 12 months
0days since last push
100releases
1bus factor
35open issues
npm, PyPIpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

More detail

Star and fork history 0 ★ / 141 ⇿
0Stars
141Forks
98Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

025507510012515013342015-012020-102026-07
Major 10Minor 46Patch 42

Each point covers 11 days.

OpenSSF Scorecard 4.7 / 10
4.7aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-26 10:08 UTC

7Binary-Artifactsbinaries present in source code
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 9 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
7Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 7
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
Direct dependencies 13
RegistryPackageVersion constraintManifest
npm@devicefarmer/adbkit3.3.8package.json
npm@sitespeed.io/chromedriver149.0.7827package.json
npm@sitespeed.io/edgedriver149.0.4022package.json
npm@sitespeed.io/geckodriver0.36.2package.json
npm@sitespeed.io/log2.0.0package.json
npm@sitespeed.io/throttle6.0.1package.json
npmchrome-har1.3.1package.json
npmchrome-remote-interface0.34.0package.json
npmexeca9.6.1package.json
npmfast-stats0.0.7package.json
npmff-test-bidi-har-export0.0.22package.json
npmselenium-webdriver4.44.0package.json
npmyargs18.0.0package.json
All dependencies 514

Full resolved dependency set from the GitHub dependency graph: 15 direct and 499 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
npm@devicefarmer/adbkit3.3.8direct
npm@sitespeed.io/chromedriver149.0.7827direct
npm@sitespeed.io/edgedriver149.0.4022direct
npm@sitespeed.io/geckodriver0.36.2direct
npm@sitespeed.io/log2.0.0direct
npm@sitespeed.io/throttle6.0.1direct
npmchrome-har1.3.1direct
npmchrome-remote-interface0.34.0direct
npmexeca5.1.1direct
npmexeca9.6.1direct
npmfast-stats0.0.7direct
npmff-test-bidi-har-export0.0.22direct
npmselenium-webdriver4.44.0direct
npmyargs17.7.2direct
npmyargs18.0.0direct
npm@aashutoshrathi/word-wrap1.2.6indirect
npm@babel/helper-validator-identifier7.28.5indirect
npm@babel/parser7.23.6indirect
npm@bazel/runfiles6.5.0indirect
npm@borewit/text-codec0.2.2indirect
npm@devicefarmer/adbkit-logcat2.1.3indirect
npm@devicefarmer/adbkit-monkey1.2.1indirect
npm@eslint-community/eslint-utils4.9.1indirect
npm@eslint-community/regexpp4.12.2indirect
npm@eslint/config-array0.23.5indirect
npm@eslint/config-helpers0.6.0indirect
npm@eslint/core1.2.1indirect
npm@eslint/js10.0.1indirect
npm@eslint/object-schema3.0.5indirect
npm@eslint/plugin-kit0.7.1indirect
npm@humanfs/core0.19.1indirect
npm@humanfs/node0.16.6indirect
npm@humanwhocodes/module-importer1.0.1indirect
npm@humanwhocodes/retry0.3.1indirect
npm@humanwhocodes/retry0.4.3indirect
npm@isaacs/cliui8.0.2indirect
npm@isaacs/fs-minipass4.0.1indirect
npm@jimp/core1.6.1indirect
npm@jimp/diff1.6.1indirect
npm@jimp/file-ops1.6.1indirect
npm@jimp/js-bmp1.6.1indirect
npm@jimp/js-gif1.6.1indirect
npm@jimp/js-jpeg1.6.1indirect
npm@jimp/js-png1.6.1indirect
npm@jimp/js-tiff1.6.1indirect
npm@jimp/plugin-blit1.6.1indirect
npm@jimp/plugin-blur1.6.1indirect
npm@jimp/plugin-circle1.6.1indirect
npm@jimp/plugin-color1.6.1indirect
npm@jimp/plugin-contain1.6.1indirect
npm@jimp/plugin-cover1.6.1indirect
npm@jimp/plugin-crop1.6.1indirect
npm@jimp/plugin-displace1.6.1indirect
npm@jimp/plugin-dither1.6.1indirect
npm@jimp/plugin-fisheye1.6.1indirect
npm@jimp/plugin-flip1.6.1indirect
npm@jimp/plugin-hash1.6.1indirect
npm@jimp/plugin-mask1.6.1indirect
npm@jimp/plugin-print1.6.1indirect
npm@jimp/plugin-quantize1.6.1indirect
npm@jimp/plugin-resize1.6.1indirect
npm@jimp/plugin-rotate1.6.1indirect
npm@jimp/plugin-threshold1.6.1indirect
npm@jimp/types1.6.1indirect
npm@jimp/utils1.6.1indirect
npm@jridgewell/gen-mapping0.3.3indirect
npm@jridgewell/resolve-uri3.1.1indirect
npm@jridgewell/set-array1.1.2indirect
npm@jridgewell/source-map0.3.5indirect
npm@jridgewell/sourcemap-codec1.4.15indirect
npm@jridgewell/trace-mapping0.3.20indirect
npm@jsdoc/salty0.2.7indirect
npm@mapbox/node-pre-gyp2.0.0indirect
npm@nodelib/fs.scandir2.1.5indirect
npm@nodelib/fs.stat2.0.5indirect
npm@nodelib/fs.walk1.2.8indirect
npm@pkgjs/parseargs0.11.0indirect
npm@pkgr/core0.2.9indirect
npm@rollup/pluginutils5.2.0indirect
npm@sec-ant/readable-stream0.4.1indirect
npm@serialport/binding-mock10.2.2indirect
npm@serialport/bindings-cpp12.0.1indirect
npm@serialport/bindings-interface1.2.2indirect
npm@serialport/parser-byte-length12.0.0indirect
npm@serialport/parser-cctalk12.0.0indirect
npm@serialport/parser-delimiter11.0.0indirect
npm@serialport/parser-delimiter12.0.0indirect
npm@serialport/parser-inter-byte-timeout12.0.0indirect
npm@serialport/parser-packet-length12.0.0indirect
npm@serialport/parser-readline11.0.0indirect
npm@serialport/parser-readline12.0.0indirect
npm@serialport/parser-ready12.0.0indirect
npm@serialport/parser-regex12.0.0indirect
npm@serialport/parser-slip-encoder12.0.0indirect
npm@serialport/parser-spacepacket12.0.0indirect
npm@serialport/stream12.0.0indirect
npm@sindresorhus/merge-streams2.3.0indirect
npm@sindresorhus/merge-streams4.0.0indirect
npm@tokenizer/inflate0.4.1indirect
npm@tokenizer/token0.3.0indirect
npm@types/esrecurse4.3.1indirect
npm@types/estree1.0.9indirect
npm@types/json-schema7.0.15indirect
npm@types/linkify-it5.0.0indirect
npm@types/markdown-it14.1.1indirect
npm@types/mdurl2.0.0indirect
npm@types/node16.9.1indirect
npm@types/node20.10.6indirect
npm@types/selenium-webdriver4.35.5indirect
npm@types/w3c-web-usb1.0.10indirect
npm@types/ws8.5.10indirect
npm@vercel/nft0.29.4indirect
npm@zeit/schemas2.36.0indirect
npmabbrev3.0.1indirect
npmacorn8.16.0indirect
npmacorn-import-attributes1.9.5indirect
npmacorn-jsx5.3.2indirect
npmacorn-walk8.3.4indirect
npmagent-base7.1.3indirect
npmajv6.15.0indirect
npmajv8.18.0indirect
npmansi-align3.0.1indirect
npmansi-regex5.0.1indirect
npmansi-regex6.1.0indirect
npmansi-styles4.3.0indirect
npmansi-styles6.2.1indirect
npmany-base1.1.0indirect
npmarch2.2.0indirect
npmarg5.0.2indirect
npmargparse1.0.10indirect
npmargparse2.0.1indirect
npmarray-find-index1.0.2indirect
npmarrgv1.0.2indirect
npmarrify3.0.0indirect
npmasync-sema3.1.1indirect
npmava6.4.1indirect
npmawait-to-js3.0.0indirect
npmbalanced-match1.0.0indirect
npmbalanced-match4.0.4indirect
npmbaseline-browser-mapping2.10.31indirect
npmbindings1.5.0indirect
npmbluebird3.7.2indirect
npmblueimp-md52.19.0indirect
npmbmp-ts1.0.9indirect
npmboxen7.0.0indirect
npmbrace-expansion1.1.14indirect
npmbrace-expansion2.1.0indirect
npmbrace-expansion5.0.6indirect
npmbraces3.0.3indirect
npmbrowserslist4.28.2indirect
npmbuffer-from1.1.2indirect
npmbuiltin-modules5.0.0indirect
npmbytes3.0.0indirect
npmbytes3.1.2indirect
npmcallsites4.2.0indirect
npmcamel-case4.1.2indirect
npmcamelcase7.0.0indirect
npmcaniuse-lite1.0.30001793indirect
npmcatharsis0.9.0indirect
npmcbor10.0.11indirect
npmchalk4.1.2indirect
npmchalk5.0.1indirect
npmchalk5.4.1indirect
npmchalk-template0.4.0indirect
npmchange-case5.4.4indirect
npmchownr3.0.0indirect
npmchunkd2.0.1indirect
npmci-info4.4.0indirect
npmci-parallel-vars1.0.1indirect
npmclean-css5.3.3indirect
npmclean-jsdoc-theme4.3.2indirect
npmclean-regexp1.0.0indirect
npmcli-boxes3.0.0indirect
npmcli-truncate4.0.0indirect
npmclipboardy3.0.0indirect
npmcliui8.0.1indirect
npmcliui9.0.1indirect
npmcode-excerpt4.0.0indirect
npmcolor-convert2.0.1indirect
npmcolor-name1.1.4indirect
npmcommander10.0.1indirect
npmcommander2.11.0indirect
npmcommander2.20.3indirect
npmcommander9.5.0indirect
npmcommon-path-prefix3.0.0indirect
npmcompressible2.0.18indirect
npmcompression1.8.1indirect
npmconcat-map0.0.1indirect
npmconcordance5.0.4indirect
npmconsola3.4.2indirect
npmcontent-disposition0.5.2indirect
npmconvert-to-spaces2.0.1indirect
npmcore-js-compat3.49.0indirect
npmcore-util-is1.0.3indirect
npmcrc-full1.1.0indirect
npmcross-spawn7.0.6indirect
npmcurrently-unhandled0.4.1indirect
npmdate-time3.1.0indirect
npmdebug2.6.9indirect
npmdebug4.3.4indirect
npmdebug4.4.3indirect
npmdeep-extend0.6.0indirect
npmdeep-is0.1.4indirect
npmdetect-libc2.0.4indirect
npmdot-case3.0.4indirect
npmeastasianwidth0.2.0indirect
npmelectron-to-chromium1.5.360indirect
npmemittery1.2.0indirect
npmemoji-regex10.3.0indirect
npmemoji-regex10.4.0indirect
npmemoji-regex8.0.0indirect
npmemoji-regex9.2.2indirect
npmentities4.5.0indirect
npmescalade3.2.0indirect
npmescape-string-regexp1.0.5indirect
npmescape-string-regexp2.0.0indirect
npmescape-string-regexp4.0.0indirect
npmescape-string-regexp5.0.0indirect
npmeslint10.4.0indirect
npmeslint-config-prettier10.1.8indirect
npmeslint-plugin-prettier5.5.5indirect
npmeslint-plugin-unicorn64.0.0indirect
npmeslint-scope9.1.2indirect
npmeslint-visitor-keys3.4.3indirect
npmeslint-visitor-keys5.0.1indirect
npmespree11.2.0indirect
npmesprima4.0.1indirect
npmesquery1.7.0indirect
npmesrecurse4.3.0indirect
npmestraverse5.3.0indirect
npmestree-walker2.0.2indirect
npmesutils2.0.3indirect
npmexif-parser0.1.12indirect
npmfast-deep-equal3.1.3indirect
npmfast-diff1.2.0indirect
npmfast-glob3.3.3indirect
npmfast-json-stable-stringify2.1.0indirect
npmfast-levenshtein2.0.6indirect
npmfast-uri3.1.2indirect
npmfastq1.19.1indirect
npmfigures6.1.0indirect
npmfile-entry-cache8.0.0indirect
npmfile-type21.3.4indirect
npmfile-uri-to-path1.0.0indirect
npmfill-range7.1.1indirect
npmfind-up5.0.0indirect
npmfind-up-simple1.0.1indirect
npmflat-cache4.0.1indirect
npmflatted3.4.2indirect
npmforeground-child3.3.1indirect
npmfs-extra10.1.0indirect
npmget-caller-file2.0.5indirect
npmget-east-asian-width1.2.0indirect
npmget-stream6.0.1indirect
npmget-stream9.0.1indirect
npmgifwrap0.10.1indirect
npmglob10.5.0indirect
npmglob-parent5.1.2indirect
npmglob-parent6.0.2indirect
npmglobals17.6.0indirect
npmglobby14.1.0indirect
npmgraceful-fs4.2.11indirect
npmhas-flag4.0.0indirect
npmhtml-minifier-terser7.2.0indirect
npmhttps-proxy-agent7.0.6indirect
npmhuman-signals2.1.0indirect
npmhuman-signals8.0.1indirect
npmieee7541.2.1indirect
npmignore5.3.2indirect
npmignore7.0.4indirect
npmignore-by-default2.1.0indirect
npmimage-q4.0.0indirect
npmimmediate3.0.6indirect
npmimurmurhash0.1.4indirect
npmindent-string5.0.0indirect
npminherits2.0.4indirect
npmini1.3.8indirect
npmirregular-plurals3.3.0indirect
npmis-builtin-module5.0.0indirect
npmis-docker2.2.1indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point3.0.0indirect
npmis-fullwidth-code-point4.0.0indirect
npmis-glob4.0.3indirect
npmis-number7.0.0indirect
npmis-plain-obj4.1.0indirect
npmis-plain-object5.0.0indirect
npmis-port-reachable4.0.0indirect
npmis-promise4.0.0indirect
npmis-stream2.0.1indirect
npmis-stream4.0.1indirect
npmis-unicode-supported2.0.0indirect
npmis-wsl2.2.0indirect
npmisarray1.0.0indirect
npmisexe2.0.0indirect
npmjackspeak3.4.3indirect
npmjimp1.6.1indirect
npmjpeg-js0.4.4indirect
npmjs-string-escape1.0.1indirect
npmjs-yaml3.14.2indirect
npmjs2xmlparser4.0.2indirect
npmjsdoc4.0.5indirect
npmjsesc3.1.0indirect
npmjson-buffer3.0.1indirect
npmjson-schema-traverse0.4.1indirect
npmjson-schema-traverse1.0.0indirect
npmjson-stable-stringify-without-jsonify1.0.1indirect
npmjsonfile6.1.0indirect
npmjszip3.10.1indirect
npmkeyv4.5.4indirect
npmklaw3.0.0indirect
npmklaw-sync6.0.0indirect
npmlevn0.4.1indirect
npmlie3.3.0indirect
npmlinkify-it5.0.0indirect
npmload-json-file7.0.1indirect
npmlocate-path6.0.0indirect
npmlodash4.18.1indirect
npmlower-case2.0.2indirect
npmlru-cache10.4.3indirect
npmmarkdown-it14.1.1indirect
npmmarkdown-it-anchor8.6.7indirect
npmmarked4.3.0indirect
npmmatcher5.0.0indirect
npmmd5-hex3.0.1indirect
npmmdurl2.0.0indirect
npmmemoize10.1.0indirect
npmmerge-stream2.0.0indirect
npmmerge21.4.1indirect
npmmicromatch4.0.8indirect
npmmime3.0.0indirect
npmmime-db1.33.0indirect
npmmime-db1.54.0indirect
npmmime-types2.1.18indirect
npmmimic-fn2.1.0indirect
npmmimic-function5.0.1indirect
npmminimatch10.2.5indirect
npmminimatch3.1.5indirect
npmminimatch9.0.9indirect
npmminimist1.2.8indirect
npmminipass7.1.3indirect
npmminizlib3.1.0indirect
npmmkdirp1.0.4indirect
npmms2.0.0indirect
npmms2.1.2indirect
npmms2.1.3indirect
npmnatural-compare1.4.0indirect
npmnegotiator0.6.4indirect
npmno-case3.0.4indirect
npmnode-addon-api3.2.1indirect
npmnode-addon-api7.0.0indirect
npmnode-addon-api7.1.0indirect
npmnode-fetch2.6.12indirect
npmnode-forge1.4.0indirect
npmnode-gyp-build4.6.0indirect
npmnode-gyp-build4.8.0indirect
npmnode-hid3.0.0indirect
npmnode-releases2.0.44indirect
npmnode-stream-zip1.15.0indirect
npmnofilter3.1.0indirect
npmnopt8.1.0indirect
npmnpm-run-path4.0.1indirect
npmnpm-run-path6.0.0indirect
npmomggif1.0.10indirect
npmon-headers1.1.0indirect
npmonetime5.1.2indirect
npmoptionator0.9.3indirect
npmp-limit3.1.0indirect
npmp-locate5.0.0indirect
npmp-map7.0.3indirect
npmpackage-config5.0.0indirect
npmpackage-json-from-dist1.0.1indirect
npmpako1.0.11indirect
npmparam-case3.0.4indirect
npmparse-bmfont-ascii1.0.6indirect
npmparse-bmfont-binary1.0.6indirect
npmparse-bmfont-xml1.1.6indirect
npmparse-ms4.0.0indirect
npmpascal-case3.1.2indirect
npmpath-exists4.0.0indirect
npmpath-is-inside1.0.2indirect
npmpath-key3.1.1indirect
npmpath-key4.0.0indirect
npmpath-scurry1.11.1indirect
npmpath-to-regexp3.3.0indirect
npmpath-type6.0.0indirect
npmpicocolors1.1.1indirect
npmpicomatch2.3.2indirect
npmpicomatch4.0.4indirect
npmpixelmatch5.3.0indirect
npmpkg-prebuilds0.2.1indirect
npmplur5.1.0indirect
npmpluralize8.0.0indirect
npmpngjs6.0.0indirect
npmpngjs7.0.0indirect
npmprelude-ls1.2.1indirect
npmprettier3.8.3indirect
npmprettier-linter-helpers1.0.1indirect
npmpretty-ms9.2.0indirect
npmprocess-nextick-args2.0.1indirect
npmpunycode2.3.1indirect
npmpunycode.js2.3.1indirect
npmqueue-microtask1.2.3indirect
npmrange-parser1.2.0indirect
npmrc1.2.8indirect
npmreadable-stream2.3.8indirect
npmregexp-tree0.1.27indirect
npmregistry-auth-token3.3.2indirect
npmregistry-url3.1.0indirect
npmregjsparser0.13.1indirect
npmrelateurl0.2.7indirect
npmrequire-directory2.1.1indirect
npmrequire-from-string2.0.2indirect
npmrequizzle0.2.4indirect
npmresolve-cwd3.0.0indirect
npmresolve-from5.0.0indirect
npmreusify1.1.0indirect
npmrun-parallel1.2.0indirect
npmsafe-buffer5.1.2indirect
npmsafe-buffer5.2.1indirect
npmsax1.6.0indirect
npmsemver7.8.0indirect
npmserialize-error7.0.1indirect
npmserialport12.0.0indirect
npmserve14.2.6indirect
npmserve-handler6.1.7indirect
npmsetimmediate1.0.5indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmshowdown2.1.0indirect
npmsignal-exit3.0.7indirect
npmsignal-exit4.1.0indirect
npmsimple-xml-to-json1.2.7indirect
npmslash5.1.0indirect
npmslice-ansi5.0.0indirect
npmsource-map0.6.1indirect
npmsource-map-support0.5.21indirect
npmsplit1.0.1indirect
npmsprintf-js1.0.3indirect
npmstack-utils2.0.6indirect
npmstring-width4.2.3indirect
npmstring-width5.1.2indirect
npmstring-width7.0.0indirect
npmstring-width7.2.0indirect
npmstring_decoder1.1.1indirect
npmstrip-ansi6.0.1indirect
npmstrip-ansi7.1.0indirect
npmstrip-final-newline2.0.0indirect
npmstrip-final-newline4.0.0indirect
npmstrip-indent4.1.1indirect
npmstrip-json-comments2.0.1indirect
npmstrip-json-comments3.1.1indirect
npmstrtok310.3.5indirect
npmsupertap3.0.1indirect
npmsupports-color7.2.0indirect
npmsynckit0.11.12indirect
npmtar7.5.15indirect
npmtemp-dir3.0.0indirect
npmterser5.26.0indirect
npmthrough2.3.8indirect
npmtime-zone1.0.0indirect
npmtinycolor21.6.0indirect
npmtldts6.1.86indirect
npmtldts-core6.1.86indirect
npmtmp0.2.5indirect
npmto-regex-range5.0.1indirect
npmtoken-types6.1.2indirect
npmtough-cookie5.1.2indirect
npmtr460.0.3indirect
npmtslib2.6.2indirect
npmtype-check0.4.0indirect
npmtype-fest0.13.1indirect
npmtype-fest2.19.0indirect
npmtypescript5.9.3indirect
npmuc.micro2.1.0indirect
npmuint8array-extras1.5.0indirect
npmunderscore1.13.8indirect
npmundici-types5.26.5indirect
npmunicorn-magic0.3.0indirect
npmuniversalify2.0.1indirect
npmupdate-browserslist-db1.2.3indirect
npmupdate-check1.5.4indirect
npmuri-js4.4.1indirect
npmusb2.12.1indirect
npmusb-power-profiling1.6.0indirect
npmutif24.1.0indirect
npmutil-deprecate1.0.2indirect
npmvary1.1.2indirect
npmwebidl-conversions3.0.1indirect
npmwell-known-symbols2.0.0indirect
npmwhatwg-url5.0.0indirect
npmwhich2.0.2indirect
npmwidest-line4.0.1indirect
npmwrap-ansi7.0.0indirect
npmwrap-ansi8.1.0indirect
npmwrap-ansi9.0.0indirect
npmwrite-file-atomic6.0.0indirect
npmws7.5.10indirect
npmws8.20.1indirect
npmxml-parse-from-string1.0.1indirect
npmxml2js0.5.0indirect
npmxmlbuilder11.0.1indirect
npmxmlcreate2.0.4indirect
npmy18n5.0.8indirect
npmyallist5.0.0indirect
npmyargs-parser21.1.1indirect
npmyargs-parser22.0.0indirect
npmyocto-queue0.1.0indirect
npmyoctocolors2.1.1indirect
npmzod3.25.76indirect
PyPInumpyindirect
PyPIopencv-pythonindirect
PyPIpillowindirect
PyPIpyssimindirect
Dependency advisories 2

Installing npm:browsertime@28.2.0 pulls in 187 packages, direct and transitive: 2 carry known advisories, of which 0 are direct dependencies.

PackageVersionRelationSeverityAdvisoriesFixed in
brace-expansion1.1.16indirecthigh15.0.8
tar7.5.15indirecthigh67.5.21

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "javascript",
        "har",
        "chrome",
        "firefox",
        "speedindex",
        "video",
        "safari"
      ],
      "is_fork": false,
      "size_kb": 139229,
      "has_wiki": false,
      "homepage": "https://www.sitespeed.io/documentation/browsertime/",
      "languages": {
        "CSS": 25,
        "HTML": 3029,
        "Shell": 6942,
        "Python": 84519,
        "Dockerfile": 1558,
        "JavaScript": 945530,
        "TypeScript": 950,
        "Objective-C": 11813
      },
      "pushed_at": "2026-07-26T05:53:11Z",
      "created_at": "2013-08-22T14:00:15Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T05:53:13Z",
      "description": "Measure and Optimize Web Performance",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://www.sitespeed.io/",
      "name": "sitespeed.io",
      "type": "Organization",
      "login": "sitespeedio",
      "company": null,
      "location": null,
      "followers": 112,
      "avatar_url": "https://avatars.githubusercontent.com/u/5693541?v=4",
      "created_at": "2013-10-15T17:38:27Z",
      "is_verified": null,
      "public_repos": 45,
      "account_age_days": 4666
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v28.2.0",
          "kind": "minor",
          "published_at": "2026-07-20T08:24:45Z"
        },
        {
          "tag": "v28.1.0",
          "kind": "minor",
          "published_at": "2026-07-17T15:41:16Z"
        },
        {
          "tag": "v27.5.0",
          "kind": "minor",
          "published_at": "2026-06-07T05:06:19Z"
        },
        {
          "tag": "v27.4.1",
          "kind": "patch",
          "published_at": "2026-05-25T13:19:40Z"
        },
        {
          "tag": "v27.4.0",
          "kind": "minor",
          "published_at": "2026-05-24T09:40:51Z"
        },
        {
          "tag": "v27.3.0",
          "kind": "minor",
          "published_at": "2026-05-20T12:08:51Z"
        },
        {
          "tag": "v27.2.0",
          "kind": "minor",
          "published_at": "2026-05-12T11:04:53Z"
        },
        {
          "tag": "v27.1.0",
          "kind": "minor",
          "published_at": "2026-05-06T14:51:49Z"
        },
        {
          "tag": "v27.0.4",
          "kind": "patch",
          "published_at": "2026-05-05T11:31:27Z"
        },
        {
          "tag": "v27.0.3",
          "kind": "patch",
          "published_at": "2026-05-04T09:49:39Z"
        },
        {
          "tag": "v27.0.2",
          "kind": "patch",
          "published_at": "2026-05-02T20:27:03Z"
        },
        {
          "tag": "v27.0.1",
          "kind": "patch",
          "published_at": "2026-05-02T09:12:55Z"
        },
        {
          "tag": "v27.0.0",
          "kind": "major",
          "published_at": "2026-05-01T17:37:38Z"
        },
        {
          "tag": "v26.3.2",
          "kind": "patch",
          "published_at": "2026-01-24T12:30:03Z"
        },
        {
          "tag": "v26.3.1",
          "kind": "patch",
          "published_at": "2026-01-11T14:12:37Z"
        },
        {
          "tag": "v26.3.0",
          "kind": "minor",
          "published_at": "2026-01-09T21:34:53Z"
        },
        {
          "tag": "v26.2.0",
          "kind": "minor",
          "published_at": "2025-12-18T08:58:39Z"
        },
        {
          "tag": "v26.1.0",
          "kind": "minor",
          "published_at": "2025-12-11T18:07:19Z"
        },
        {
          "tag": "v26.0.1",
          "kind": "patch",
          "published_at": "2025-12-10T18:22:45Z"
        },
        {
          "tag": "v26.0.0",
          "kind": "major",
          "published_at": "2025-12-10T17:55:20Z"
        },
        {
          "tag": "v25.4.0",
          "kind": "minor",
          "published_at": "2025-11-02T14:18:35Z"
        },
        {
          "tag": "v25.3.1",
          "kind": "patch",
          "published_at": "2025-10-24T13:54:27Z"
        },
        {
          "tag": "v25.3.0",
          "kind": "minor",
          "published_at": "2025-10-17T21:22:50Z"
        },
        {
          "tag": "v25.2.0",
          "kind": "minor",
          "published_at": "2025-10-12T14:00:34Z"
        },
        {
          "tag": "v25.1.0",
          "kind": "minor",
          "published_at": "2025-09-05T06:58:13Z"
        },
        {
          "tag": "v25.0.0",
          "kind": "major",
          "published_at": "2025-07-16T12:54:41Z"
        },
        {
          "tag": "v24.9.0",
          "kind": "minor",
          "published_at": "2025-06-30T08:51:36Z"
        },
        {
          "tag": "v24.8.1",
          "kind": "patch",
          "published_at": "2025-06-01T04:39:26Z"
        },
        {
          "tag": "v24.8.0",
          "kind": "minor",
          "published_at": "2025-05-30T15:16:12Z"
        },
        {
          "tag": "v24.7.0",
          "kind": "minor",
          "published_at": "2025-05-13T05:22:01Z"
        },
        {
          "tag": "v24.6.0",
          "kind": "minor",
          "published_at": "2025-05-05T05:05:14Z"
        },
        {
          "tag": "v24.5.3",
          "kind": "patch",
          "published_at": "2025-04-30T04:05:25Z"
        },
        {
          "tag": "v24.5.2",
          "kind": "patch",
          "published_at": "2025-03-20T22:13:36Z"
        },
        {
          "tag": "v24.5.1",
          "kind": "patch",
          "published_at": "2025-03-18T19:00:02Z"
        },
        {
          "tag": "v24.5.0",
          "kind": "minor",
          "published_at": "2025-03-13T15:13:03Z"
        },
        {
          "tag": "v24.4.0",
          "kind": "minor",
          "published_at": "2025-03-11T18:33:53Z"
        },
        {
          "tag": "v24.3.0",
          "kind": "minor",
          "published_at": "2025-03-03T18:02:06Z"
        },
        {
          "tag": "v24.2.0",
          "kind": "minor",
          "published_at": "2025-02-05T14:15:49Z"
        },
        {
          "tag": "v24.1.1",
          "kind": "patch",
          "published_at": "2025-01-29T06:22:20Z"
        },
        {
          "tag": "v24.1.0",
          "kind": "minor",
          "published_at": "2025-01-27T06:33:52Z"
        },
        {
          "tag": "v24.0.1",
          "kind": "patch",
          "published_at": "2025-01-21T13:45:22Z"
        },
        {
          "tag": "v24.0.0",
          "kind": "major",
          "published_at": "2025-01-20T19:01:15Z"
        },
        {
          "tag": "v23.5.0",
          "kind": "minor",
          "published_at": "2024-12-23T21:16:37Z"
        },
        {
          "tag": "v23.4.5",
          "kind": "patch",
          "published_at": "2024-12-20T08:09:14Z"
        },
        {
          "tag": "v23.4.4",
          "kind": "patch",
          "published_at": "2024-12-18T11:52:42Z"
        },
        {
          "tag": "v23.4.3",
          "kind": "patch",
          "published_at": "2024-12-11T16:07:08Z"
        },
        {
          "tag": "v23.4.2",
          "kind": "patch",
          "published_at": "2024-12-10T09:34:20Z"
        },
        {
          "tag": "v23.4.1",
          "kind": "patch",
          "published_at": "2024-11-23T06:14:49Z"
        },
        {
          "tag": "v23.4.0",
          "kind": "minor",
          "published_at": "2024-11-22T22:12:56Z"
        },
        {
          "tag": "v23.3.3",
          "kind": "patch",
          "published_at": "2024-11-22T12:32:32Z"
        },
        {
          "tag": "v23.3.2",
          "kind": "patch",
          "published_at": "2024-11-21T04:37:43Z"
        },
        {
          "tag": "v23.3.1",
          "kind": "patch",
          "published_at": "2024-11-14T07:23:06Z"
        },
        {
          "tag": "v23.3.0",
          "kind": "minor",
          "published_at": "2024-11-12T22:34:08Z"
        },
        {
          "tag": "v23.2.0",
          "kind": "minor",
          "published_at": "2024-10-19T22:40:46Z"
        },
        {
          "tag": "v23.1.2",
          "kind": "patch",
          "published_at": "2024-10-11T14:01:39Z"
        },
        {
          "tag": "v23.1.1",
          "kind": "patch",
          "published_at": "2024-10-08T18:22:17Z"
        },
        {
          "tag": "v23.1.0",
          "kind": "minor",
          "published_at": "2024-10-08T05:56:40Z"
        },
        {
          "tag": "v23.0.0",
          "kind": "major",
          "published_at": "2024-09-23T05:23:22Z"
        },
        {
          "tag": "v22.10.2",
          "kind": "patch",
          "published_at": "2024-09-13T05:59:13Z"
        },
        {
          "tag": "v22.10.1",
          "kind": "patch",
          "published_at": "2024-09-04T12:36:58Z"
        },
        {
          "tag": "v22.10.0",
          "kind": "minor",
          "published_at": "2024-09-03T05:42:52Z"
        },
        {
          "tag": "v22.9.0",
          "kind": "minor",
          "published_at": "2024-08-26T16:58:54Z"
        },
        {
          "tag": "v22.8.0",
          "kind": "minor",
          "published_at": "2024-07-30T03:33:14Z"
        },
        {
          "tag": "v22.7.0",
          "kind": "minor",
          "published_at": "2024-07-25T06:03:35Z"
        },
        {
          "tag": "v22.6.0",
          "kind": "minor",
          "published_at": "2024-07-15T04:23:49Z"
        },
        {
          "tag": "v22.5.5",
          "kind": "patch",
          "published_at": "2024-07-07T04:57:22Z"
        },
        {
          "tag": "v22.5.4",
          "kind": "patch",
          "published_at": "2024-07-06T07:26:57Z"
        },
        {
          "tag": "v22.5.3",
          "kind": "patch",
          "published_at": "2024-06-25T19:35:36Z"
        },
        {
          "tag": "v22.5.2",
          "kind": "patch",
          "published_at": "2024-06-24T09:48:30Z"
        },
        {
          "tag": "v22.5.1",
          "kind": "patch",
          "published_at": "2024-06-24T07:40:56Z"
        },
        {
          "tag": "v22.5.0",
          "kind": "minor",
          "published_at": "2024-06-14T05:53:55Z"
        },
        {
          "tag": "v22.4.1",
          "kind": "patch",
          "published_at": "2024-06-07T04:39:05Z"
        },
        {
          "tag": "v22.4.0",
          "kind": "minor",
          "published_at": "2024-06-06T04:27:47Z"
        },
        {
          "tag": "v22.3.0",
          "kind": "minor",
          "published_at": "2024-06-04T13:53:30Z"
        },
        {
          "tag": "v22.2.0",
          "kind": "minor",
          "published_at": "2024-05-24T14:05:00Z"
        },
        {
          "tag": "v22.1.0",
          "kind": "minor",
          "published_at": "2024-05-20T12:34:12Z"
        },
        {
          "tag": "v22.0.0",
          "kind": "major",
          "published_at": "2024-05-16T12:02:26Z"
        },
        {
          "tag": "v21.7.1",
          "kind": "patch",
          "published_at": "2024-05-05T09:47:23Z"
        },
        {
          "tag": "v21.7.0",
          "kind": "minor",
          "published_at": "2024-04-03T05:32:22Z"
        },
        {
          "tag": "v21.6.1",
          "kind": "patch",
          "published_at": "2024-03-22T14:13:02Z"
        },
        {
          "tag": "v21.6.0",
          "kind": "minor",
          "published_at": "2024-03-20T13:29:34Z"
        },
        {
          "tag": "v21.5.4",
          "kind": "patch",
          "published_at": "2024-03-13T14:06:45Z"
        },
        {
          "tag": "v21.5.3",
          "kind": "patch",
          "published_at": "2024-03-13T05:46:23Z"
        },
        {
          "tag": "v21.5.2",
          "kind": "patch",
          "published_at": "2024-03-12T15:16:03Z"
        },
        {
          "tag": "v21.5.1",
          "kind": "patch",
          "published_at": "2024-03-12T11:34:16Z"
        },
        {
          "tag": "v21.5.0",
          "kind": "minor",
          "published_at": "2024-03-12T05:42:56Z"
        },
        {
          "tag": "v21.4.0",
          "kind": "minor",
          "published_at": "2024-03-08T06:41:33Z"
        },
        {
          "tag": "v21.3.1",
          "kind": "patch",
          "published_at": "2024-02-26T13:27:05Z"
        },
        {
          "tag": "v21.3.0",
          "kind": "minor",
          "published_at": "2024-02-21T06:35:12Z"
        },
        {
          "tag": "v21.2.1",
          "kind": "patch",
          "published_at": "2024-02-11T10:19:32Z"
        },
        {
          "tag": "v21.2.0",
          "kind": "minor",
          "published_at": "2024-02-11T09:30:32Z"
        },
        {
          "tag": "v21.1.0",
          "kind": "minor",
          "published_at": "2024-01-24T05:01:38Z"
        },
        {
          "tag": "v21.0.0",
          "kind": "major",
          "published_at": "2024-01-07T14:16:46Z"
        },
        {
          "tag": "v20.0.0",
          "kind": "major",
          "published_at": "2023-12-22T04:46:02Z"
        },
        {
          "tag": "v19.3.1",
          "kind": "patch",
          "published_at": "2023-12-18T08:56:16Z"
        },
        {
          "tag": "v19.3.0",
          "kind": "minor",
          "published_at": "2023-12-18T05:30:08Z"
        },
        {
          "tag": "v19.2.0",
          "kind": "minor",
          "published_at": "2023-12-11T14:55:58Z"
        },
        {
          "tag": "v19.1.0",
          "kind": "minor",
          "published_at": "2023-11-27T11:27:57Z"
        },
        {
          "tag": "v19.0.0",
          "kind": "major",
          "published_at": "2023-11-15T15:27:26Z"
        },
        {
          "tag": "v18.0.0",
          "kind": "major",
          "published_at": "2023-11-07T12:17:03Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "1b7bde646c6c0ac4ca5bb7698b3eb9180f24717d",
          "body": "The proxy helpers were destructured from the string 'selenium-webdriver/proxy.js' instead of imported from it, so any Edge run using --proxy.* crashed with \"pac is not a function\".\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib964de21724a63db26852b9d7cd89c326fcb1959",
          "is_bot": false,
          "headline": "Fix broken proxy support for Edge (#2543)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-26T05:53:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb1789e18fd6f3ca635bd0d3243beaee2bf6fab1",
          "body": "Both options only took effect when --requestheader was also set: the BiDi header work in #2108 accidentally moved the previously independent blocks inside the requestheader branch. Chrome handles the same options independently, so Firefox runs silently blocked nothing.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I49ce3ee89010a998681b264ef39eafca1480f217",
          "is_bot": false,
          "headline": "ix Firefox --block and --appendToUserAgent being ignored (#2542)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-26T05:52:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b64bc498506b5daa701619830cfb9533b8dc5ad",
          "body": "Chrome 152 ships navigator.cpuPerformance, the browser's own coarse device rating (1 to 4, or 0 when unknown). It is a useful piece of test-environment context: the same page measured on a fast laptop and a slow CI runner is not really the same test, and recording the device tier alongside the exist\n[…]\n absent rather than zero, and nothing downstream has to change to stay correct.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com\nChange-Id: I37e3a965cb45a73b5bd4c82e03d706321a04d57f",
          "is_bot": false,
          "headline": "Collect the browser's CPU Performance API device rating (#2540)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-24T07:17:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4655ede4c6a4c0713cc7972b50da889e10336a58",
          "body": "Read the paint via the method when present and fall back to the old property\nso both current and older Chrome keep working.\n\nCo-authored-by: Claude Opus 4.8 (1M context) noreply@anthropic.com\nChange-Id: I6f0bfaac1646524e9dd52bfdfdce1dcce78f0c73",
          "is_bot": false,
          "headline": "Fix soft-navigation LCP for Chromium 151+ (#2538)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-22T05:43:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86c5a2f29867bc7bb165eb0d137e167575ed9544",
          "body": null,
          "is_bot": true,
          "headline": "new release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T08:24:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69bd401b54e8fdc089da3128f2fdd7223e2bebcc",
          "body": null,
          "is_bot": true,
          "headline": "28.2.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T08:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0cddc6ffaf858bddeeda62f95827a5a4ae186ab",
          "body": "Change-Id: Ifec55d00d4c70dd538ddba904ab6120912570e74",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T08:19:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e847277939d166b32b6ea84c03c3f665e7529f41",
          "body": "When the visual progress curve dips back below a threshold — a real\nbrowser behaviour where the page momentarily un-completes and repaints\n— the crossed milestones are meant to be invalidated and re-found at\nthe later time the page climbs back up. Two copy-paste typos reset\nVisualComplete95 twice in\n[…]\ny wrong for every dashboard and report that reads\nit. Adds the first unit test for this file.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I9038fe3147788dddafc0805cf661fc39b0c2c7fc",
          "is_bot": false,
          "headline": "Reset VisualComplete99 when the page repaints backward (#2537)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "045141954fffef8268d662550ccaf7b420b55695",
          "body": "compare() is the hot path of frame processing — every\nduplicate-elimination, render-start and orange-frame check runs\nthrough it for every frame pair. It only needs the number of\ndiffering pixels, but argwhere materializes an index array of every\nmatching pixel, which is most of the frame on every c\n[…]\nurns the same number with no\nallocation. Verified byte-identical metrics on a real recording.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I2e5f31ee03f7c556d14a13937a659c2ebba58fe9",
          "is_bot": false,
          "headline": "Count differing pixels without materializing them (#2536)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:06:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f610b8c76bf296605be347f75de76a94a8ab7ee2",
          "body": "Every visual metrics install has been pulling in OpenCV and pyssim,\nbut OpenCV is only used by --contentful and pyssim only by\n--perceptual — opt-in metrics most users never enable. The\ndependency check now fails on a missing module only when the flags\nthat need it are in play, so a default setup ru\n[…]\nDocker image keeps installing everything so --contentful\nand --perceptual keep working there.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I649a4e4beeed67a1bcd5ac3bded3ffed71c04cad",
          "is_bot": false,
          "headline": "Only require OpenCV and pyssim when their metrics are requested (#2535)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:06:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa21aab7cee149b13b30dbaa59128fdbe8f275b8",
          "body": "Per-frame diffs answer \"what changed in this frame\", but the question\nthat cost us days on a recent Last Visual Change hunt was \"which\nparts of the page keep changing\" — invisible re-rasterization noise\nlooks exactly like real churn until you see it accumulated. The diff\nloop already walks every adj\n[…]\ns track restlessness\nover time. Everything rides the existing videoParams.filmstripDiff\nflag.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I7022eb7f85d235adb8fff95838296f2107c2a520",
          "is_bot": false,
          "headline": "Add a visual instability heatmap to the frame diffs (#2533)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T06:21:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "747a00695b6cf0d450dda06be4ce60f6e0cd3774",
          "body": "The repo carried two visual metrics scripts, but only the portable\none is invoked or shipped in the npm package — the old\nImageMagick-based visualmetrics.py has been unreachable for years and\nits 2 600 lines kept showing up in searches and audits as if they\nwere live code. The portable script itself\n[…]\nuite and a full end-to-end run on\na recorded video produce identical output before and after.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3688b38c986644f4dacc7def8bc61b50e4cf84bb",
          "is_bot": false,
          "headline": "Remove dead code from visual metrics (#2534)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T06:21:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0241d7e926e0c7dfecf6232515f2616d26d3ba78",
          "body": "* Add opt-in noise tolerance to Visual Metrics frame elimination\n\nBrowsers can re-rasterize the whole page long after it is visually\ndone, leaving invisible sub-pixel noise on glyph edges. Duplicate\nframe elimination allows only a handful of differing pixels, so on a\npage-sized frame the noise count\n[…]\n entirely, so exist\ninstances that see the noise can opt ia\ncase while a real change as small as 2.\n\nCo-authored-by: Claude Fable 5 noreply\n\n* fix\n\nChange-Id: I1e97119695bddbda48df1c14218f26ccc21eb059",
          "is_bot": false,
          "headline": "Add opt-in noise tolerance to Visual Metrics frame elimination (#2528)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:51:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7838727818efec812b18a5e16a5c31816df42e8c",
          "body": "Report UIs cannot read frame pixels when a result is opened from\nfile:// — the canvas is tainted and fetch is blocked — so an exact\n\"what changed in this frame\" view was impossible exactly where people\ndebug local results. Visual metrics already walks every adjacent\nframe pair with Pillow in hand, s\n[…]\ne stored. PNG on purpose — mostly white\nplus sparse red compresses far below the frame JPEGs.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I469edacc66efa9386d20867d9d8cf08953337115",
          "is_bot": false,
          "headline": "Precompute filmstrip frame diffs in visual metrics (#2531)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:44:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4fbdc1337051a07d4291d1a806faf1e6a703473",
          "body": "The Speed Index, visual progress and visual change math in\nvisualmetrics-portable.py had no test coverage at all: the existing\ntest file imported the mozilla-central Python packaging of the old\nscript, which does not exist in this repo, so it could never run.\nAny change to the metric calculations wo\n[…]\nin either order. A\nnew dedicated GitHub Action runs the suite; it finishes in under a\nsecond.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I625e90cf2b0edea9786ddf1d46bf7a69b240bc13",
          "is_bot": false,
          "headline": "Test the visual metrics calculations in CI (#2532)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:35:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f3e529eabf381095507dba4d1c5d57348054b77",
          "body": "* Split style invalidations at first paint\n\nThe invalidation counts lump the page being built together with churn\non a page the user is already looking at, so consumers guess from\nreason categories — and guess wrong: post-paint \"Added to layout\"\nevents hide inside the construction-dominated totals.\n\n[…]\n\nthe output backward compatible.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I4f20f7ba702cbfcd9e5ef2ec9679e968724bbe0b\n\n* fix\n\nChange-Id: I5584a5a8b390f6f2b8287b61b0cd468c4730f78e",
          "is_bot": false,
          "headline": "Split style invalidations at first paint/lcp (#2530)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-19T18:02:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e03efec5ff1a7eb8734e7cbdec8bbe3879d2062",
          "body": null,
          "is_bot": true,
          "headline": "new release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T15:40:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9566372c4e6711fb67e8e9b6049d59875612ab28",
          "body": null,
          "is_bot": true,
          "headline": "28.1.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T15:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6da7a856c9f06ba8cfe52a84ecff2b8f2cbde694",
          "body": "Change-Id: I186e9cd9f88dcef71ec58217214475c1f4c91d72",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T15:36:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64039c498e9507afd1b2777815b58d73f7e79941",
          "body": "labelForUrl assumed a page has one general bundle (no only= parameter) and gave it the bare load.php[scripts] label. Real pages lazy-load several general batches over time, so the bare label collides as soon as there is more than one — on en.wikipedia.org the page bundle and the popups batch became \n[…]\nformat now is safe: 28.1 is unreleased, so no time series depend on the bare batch label yet.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I8d4d30a7242b1914b88b6817de27a3892c1ae38d",
          "is_bot": false,
          "headline": "Label every multi-module load.php batch with its first module (#2527)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:59:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec86283dd222e30764fd2bc43aebe39900df829a",
          "body": "On MediaWiki sites several frames can all blame the same giant load.php URL, which makes the culprit list unactionable — three identical rows with different numbers. The scripts now get the same label treatment as cpu.urls (load.php[startup] and friends), applied Node-side after each URL. Additive field only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5d11ea7936d9b61699539b0fe00b01fda200eb71",
          "is_bot": false,
          "headline": "Resolve LoAF script URLs to ResourceLoader module labels (#2525)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:39:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8ffacc41d1ccc91107ce0c938c1da49f4defaa5",
          "body": "executionStart reveals queue/compile delay before a script ran (executionStart - startTime), and pauseDuration separates a script that computed the whole time from one that sat in a synchronous pause like alert or sync XHR. With these the LoAF data carries every per-script field the API exposes, so \n[…]\nript diagnosis downstream never has to wait for another engine release. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5100834932fc443b9be7544ca80f44fcf0be2c6a",
          "is_bot": false,
          "headline": "Ship the remaining LoAF per-script fields (#2526)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:36:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a582e8ce98bcf012580febf705ae6057a5cffd97",
          "body": "The loaf pageinfo script deliberately ships only the 10 frames with the most blocking, so any total computed from it understates busy pages and users compare a lower bound against TBT without knowing it. The new pageinfo.loafSummary key carries frame count, total blocking and total duration over all frames, computed before the cut. A sibling key keeps the existing loaf array untouched.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0b9788a79d8b637d3e500c00151d5fc2d26ac93d",
          "is_bot": false,
          "headline": "Add a LoAF summary with totals over every long animation frame (#2524)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5c8a307777fb1101a5fb5c71c2d1e315cc02ae4",
          "body": "…ata (#2523)\n\nThe frames are sorted by blocking time, so without a timestamp there is no way to tell render-critical pre-LCP work from harmless post-load churn — the single biggest triage question. firstUIEventTimestamp also says whether an input was waiting during the frame, which is the INP connection the docs currently only assert in prose. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0c27f60b409f5e9b83a5c2f00bf881a781c8a2d8",
          "is_bot": false,
          "headline": "Ship frame startTime and firstUIEventTimestamp in the LoAF pageinfo d…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5856eabae849d183f91ebc920e38ae1ea196f4dd",
          "body": "Without them a frame's blocking time can only be credited to every script that ran in the frame, so downstream tools (the sitespeed.io report) show competing heuristics instead of an answer to \"which script do I fix\". With start and duration per script, blocking can be attributed proportionally to actual run time. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I42dd752ecc6c55f81f9703389eff20293a37a8b6",
          "is_bot": false,
          "headline": "Ship per-script startTime and duration in the LoAF pageinfo data (#2522)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e198409d6543825d69de3340165b6cfab4c0c73",
          "body": "Change-Id: I2cba34d0ed50de9803e760f8369d2da87d2380d9",
          "is_bot": false,
          "headline": "28.0.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T12:12:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db7666a3219d6bb64e6a76fa035ee5e7bd1e2dd9",
          "body": "Change-Id: Ic4a739dae4195af3e1b5789d8bd28c2fba3143d6",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T11:57:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3821eebb2a909ff9b410e2a9d0859c11c062a13f",
          "body": "The invalidation source list attributed DOM churn to URLs, which on bundled sites collapses into one giant load.php row — 1,680 invalidations from \"the big bundle\" names no owner. Sources are now aggregated per module when the coverage bundle resolvers are available, using the same position join as \n[…]\nl sites, so the row splits into the modules whose code actually invalidates style and layout.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ieec4807d1d7a37c9e96dc297f543ebf174b8666f",
          "is_bot": false,
          "headline": "Resolve invalidation sources to their ResourceLoader module (#2521)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T11:26:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f52c655df09010c0a0cd1c4d6fcde163b73f5c27",
          "body": "The new timer list identifies each timer by its install position, but on bundled sites a position like load.php[scripts]:418 says nothing about whose code it is. Install sites inside concatenated bundles are now resolved to the owning module via the coverage-path resolvers, the same join module and \n[…]\nurns out to be jquery's deferred machinery, an answer the line number alone could never give.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I25d76517408ac4b4c3206293ced65603a56d4f85",
          "is_bot": false,
          "headline": "Resolve timer install sites to their ResourceLoader module (#2520)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:53:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6615261f5d026b45763ebd1d5257b06aec6276bf",
          "body": "The timer pressure summary said a script installed 47 timers costing 70 ms but not which timers — and timer callbacks are usually anonymous, so the reader had nowhere to go next. cpu.timers now includes the timers themselves, grouped by install site (installer source position, timeout and kind), so \n[…]\nr with its install count, fire count and fire time instead of disappearing into an aggregate.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I6f5aa53c2e862b9a2bb2995d51ef382ea4f60830",
          "is_bot": false,
          "headline": "List the individual timers behind the per-script totals (#2519)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:17:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "516e182322354ba1d03059a4eb37661c276b5950",
          "body": "…2518)\n\nTimer callbacks are usually anonymous, so timer-heavy pages showed the cost under setTimeout with no owner. cpu.timers joins TimerInstall events with the cost of the TimerFire tasks — already chained back to the installer by the task tree — per script: installs, fires, main-thread fire time, plus timeout-0 and recurring counts that expose oversliced work and polling loops.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3d7d5765137615952dcfaed25a241f802c698ef5",
          "is_bot": false,
          "headline": "Attribute setTimeout/setInterval pressure to the installing script (#…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:03:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0469219ad001feb0bc4fcb174d36d759b58c48b9",
          "body": "Style and layout often dominates main-thread blocking but nothing said which selectors the recalc time went to. The profile run now also enables Chrome's SelectorStats category and the trace parser aggregates it into cpu.selectorStats: the slowest selectors by elapsed matching time, and the wasteful\n[…]\nvable cost. The extra category only runs on the profile run so measured runs stay unaffected.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ia849a4498e1fe85981b180148b6f01a536d8cc9d",
          "is_bot": false,
          "headline": "Surface CSS selector matching cost from the profile run (#2517)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:01:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e0a149b9ab0b04287f38dd93a7a084a5b293895",
          "body": "The invalidation-tracking trace category has been collected with --chrome.timeline for years without being parsed, so the recalculate-style totals could say how much invalidation work happened but never why. cpu.styleInvalidations now aggregates those events by reason, by trigger (which class or att\n[…]\nng \"style is expensive\" into \"this script toggles this attribute hundreds of times per load\".\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5fcde67f541b76745d2df3b13d0f7e65859af688",
          "is_bot": false,
          "headline": "Parse the style invalidation tracking already in every trace (#2516)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T09:57:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4162adf718047b88af26e666edcab011fa5276a4",
          "body": "The slowest-functions table could show that MediaWiki's runScript had a small self time but a huge total, and nothing more — the reader couldn't tell where the total went. Each cpu.functionCosts row now carries the top callees its non-self time was spent in, derived from the sampled call tree's edge\n[…]\nnScript → jquery, ext.wikimediaEvents, …), which is the answer the total alone couldn't give.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I1ef213cbb34ad36dd30c42b1675b67f6f9db7264",
          "is_bot": false,
          "headline": "Break orchestrator function totals down by callee (#2515)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T08:31:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e28480cc26996cd7768fb9623818295247c3650d",
          "body": "cpu.nonCompositedAnimations reported a raw compositeFailed bitmask, and Chrome often omits the unsupportedProperties list — so consumers could only say \"an animation failed\" with no way to tell a harmless case from a real problem. The bitmask is now decoded into failureReasons strings using Blink's \n[…]\n visible change\" — benign — which is exactly the distinction the raw number couldn't express.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ic1e405105610767cfb5c5483f5042fe25055d8df",
          "is_bot": false,
          "headline": "Decode why animations could not be composited (#2514)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T08:13:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c5a6f8096aeb0341c83d0b5837441808a51f0e3",
          "body": "Almost a fifth of cpu.categories landed in 'other', which reads as mystery time. Measuring real Wikipedia traces showed 90% of it is Chrome's task-scheduling overhead (RunTask self time) and most of the rest is document body-loading and V8 interrupt events the classifier didn't know. Those now go to\n[…]\n so what remains in 'other' really is scheduling overhead and consumers can label it as such.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Iff3c9ea38bbce022b6b71d9eb67eb8421986828a",
          "is_bot": false,
          "headline": "Classify document-loading and V8 housekeeping out of 'other' (#2513)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T07:37:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eadbfb6c2b5e2be7255464a03f253da636217769",
          "body": "The per-script blocking attribution answered \"which script blocked\" but a page blocked by parsing its own large HTML or by style/layout showed up as an anonymous 'unknown' row — and the fix for parse or layout blocking is completely different from the fix for script blocking. Each blocking task's su\n[…]\ning-time.js only, keeping the main-thread task walker byte-equivalent for cpu.urls consumers.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I812e10a1369a127d1f22308cd7a6b57e0114c9f0",
          "is_bot": false,
          "headline": "Split blocking time by kind of work and name the HTML document (#2512)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T07:31:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a5bcd4033bbe804a1245d81e6700aa5cb188604",
          "body": "The extra run made by --enableProfileRun has always collected V8 sampling-profiler data in the trace, but the only way to use it was to open the trace by hand in DevTools. Parsing it into cpu.functionCosts lets consumers like sitespeed.io answer the question the existing per-URL and per-module numbe\n[…]\nhp URLs; truncated URLs are recovered by unique prefix match so the output stays consistent weCosts.\n\nCo-authored-by: Fable 5 noreply@anthropic.com\nChange-Id: I290ea518d6ac295d5eb9ee5602c2dbce85a6b367",
          "is_bot": false,
          "headline": "Surface slow JS functions from the profile run (Chrome) (#2511)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T05:38:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d93607ea9260149c0080e9b84ca0475fa2716e67",
          "body": "Node 20 reaches end of life and the TypeScript scripting support already needs a newer runtime, so the floor moves to 22: the engines field, the CLI's runtime version check and the lockfile's root entry. CI already tests on 22 and 24, so the matrix is unchanged.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib345e8d4f532014d9122664a238dbe17ecc71e60",
          "is_bot": false,
          "headline": "Require Node.js 22 (#2510)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T15:27:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eda1d273950adcb0f5c29e1b2452b4f90418e72",
          "body": "CSS coverage keyed inline stylesheets by whatever sourceURL Chrome reported: parser-inserted style tags carry the document's own URL and JS-injected ones an empty string, so on Wikipedia the report collapsed into two anonymous buckets and nobody could see which template ships the dead CSS. The ownin\n[…]\ne untouched. JS-injected ResourceLoader style batches carry no attributes and stay unlabeled.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Idaf1e42e222becf1ceaa19910457626d41a227ea",
          "is_bot": false,
          "headline": "Attribute inline CSS coverage to MediaWiki TemplateStyles (#2509)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T14:00:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "174a075f67b9364683e7066b3bdd3bf38d9048c9",
          "body": "To the CLI, enableProfileRun means \"make one extra profile run\", but inside the engine the same flag means \"this run IS the profile run\": it renames traces to trace-N-extra-run.json and suppresses the result log line. Because the flag leaked into the measured runs' engine, combining --cpu with --ena\n[…]\ne extra engine, so measured traces keep their names and both trace sets survive side by side.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I817c3a7b664cf08578560fa7379b14781a1cb67e",
          "is_bot": false,
          "headline": "Keep measured runs unaffected by --enableProfileRun (#2508)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T13:54:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "371df91110337a3fa2ab4873ba7abb0edcf9911f",
          "body": "Every other URL-keyed surface (cpu.urls, cpu.blocking, scriptCosts, coverage files) carries the deploy-stable ResourceLoader label, but the per-module CPU bundles did not, so consumers had to rebuild display names by cross-referencing cpu.urls for the same URL. The bundles now get the same additive label field from the same labeler.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Iced4e721c511c8fa7426589d636b285f2edb4202",
          "is_bot": false,
          "headline": "Stamp stable labels on cpu.moduleCosts bundles (#2507)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T13:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7597e49ffcdd97fb1b9b980f0c644bff4f8689c9",
          "body": "Jank and smoothness regressions are invisible in load metrics: a page can hold its LCP while starting to drop frames. The frame events were already in the trace (disabled-by-default-devtools.timeline.frame) but never parsed. The new cpu.frames key reports presented/partial/dropped frame counts, effe\n[…]\n dropped-frame counts are dominated by harmless no-damage frames. Additive, Chrome/Edge only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I1908504c3b3253cdc4fb0e6dcdeb94741229e6bd",
          "is_bot": false,
          "headline": "Add frame stability metrics from the Chrome trace (#2506)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:42:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24acb17e022aa78281f1205c078eae76b195c67c",
          "body": "… modules (#2505)\n\ncpu.urls can say a load.php bundle used 267 ms of main thread, but a bundle concatenates dozens of modules owned by different teams, so nobody knows which module to fix. When both a Chrome trace and coverage are collected, the coverage path already has each bundle's source; the mo\n[…]\nhe analysis runs where trace and coverage meet and only detects bundle URLs and delegates.\n\n  Co-authored-by: Claude Fable 5 noreply@anthropic.com\n\nChange-Id: I55f4d39e50e4303e5762a080ac9e04bd0a056944",
          "is_bot": false,
          "headline": "Attribute main-thread CPU time to individual MediaWiki ResourceLoader…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:34:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcf103a208321917517ac87cf0a1c3a206bc5195",
          "body": "…ata (#2504)\n\nOn MediaWiki sites every URL-keyed metric (cpu.urls, cpu.blocking, scriptCosts, forcedReflows, coverage files) keys on load.php URLs that are over a thousand characters long and embed a version= parameter that changes on every deploy. A dashboard trending a per-bundle series gets a bra\n[…]\noutput. All MediaWiki-specific logic stays isolated in lib/chrome/mediawikiResourceLoader.js.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib655d37d9b11067d957024415d542a85c894af61",
          "is_bot": false,
          "headline": "Stable labels for MediaWiki ResourceLoader URLs in CPU and coverage d…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:23:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a4c7dc8daf94626b316200abade9d9754ed7789",
          "body": "cpu.urls says which script uses the most main-thread time overall, but not which one blocks the page when it matters. The new cpu.blocking key answers \"which script should I fix first\" by attributing long-task blocking time (the over-50 ms portion) per URL, both for the whole trace and inside the na\n[…]\nkeys under result.cpu, Chrome/Edge only, derived from the trace already collected with --cpu.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib308398c5c4d0286eee669983b8ec0e63860b9a0",
          "is_bot": false,
          "headline": "Attribute main-thread blocking time to scripts and domains (#2503)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:48:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3cb935404a3aad60e06742317f412fb359c99ad9",
          "body": "The beforeFCP/beforeLCP totals (elements affected, time spent) can't distinguish one massive style invalidation cascading through most of the DOM from thousands of small forced recalcs caused by JS interleaving style reads and writes — two problems with opposite fixes. The number of events, and the size of the largest one, tell you which regime you're in without opening the trace.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I7a486ec382bf155fe3865b5ffc6a481c6c34807f",
          "is_bot": false,
          "headline": "Add event count and largest event to recalculate style summary (#2496)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:31:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f19a925e96828b7bacdd5ba9a7f796185a89a62",
          "body": "MediaWiki sites serve tens of JS modules concatenated into single load.php responses, so V8 coverage keyed everything on one giant bundle URL and a dead-code or size regression could never be traced to the module that caused it. Each module in the bundle is delimited by an mw.loader.impl call carryi\n[…]\non the existing per-file entry, so non-MediaWiki sites and existing consumers are unaffected.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0d14728a881e3fc15ac5058ad4fa4fbd893ce67f",
          "is_bot": false,
          "headline": "Per-module coverage for MediaWiki ResourceLoader bundles (#2502)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:24:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cce2b99cc74c6240156fa43355dd8fe9d5b5ba2",
          "body": "…(#2501)\n\nWhen --enableProfileRun fills in coverage, the sample comes from one extra side iteration and is not tied to any measured run. Publishing it as a one-element array made it look keyed by iteration, and consumers indexing by run number (like the sitespeed.io coverage tab picking the median r\n[…]\nell the two cases apart. Per-iteration coverage from --chrome.coverage keeps its array shape.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I8c9ff3810895cd9ec2d5b374abb3b5e7f049e402",
          "is_bot": false,
          "headline": "Mark profile run coverage as a single sample, not an iteration array …",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:24:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "145086e60f3bd996cb3516a75f95c378b0eda126",
          "body": "When testing CDN-fronted sites, response headers of the main HTML document decide how to interpret every metric of the run: x-cache / x-cache-status tells you whether the run was a front-cache hit, age how warm the object was, and server-timing often carries A/B experiment enrollment. Until now they\n[…]\n two can never drift, which means there is no privacy footgun in enabling it unconditionally.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3e090516b25bedf0fded49fb3ae4cf7c1aac97de",
          "is_bot": false,
          "headline": "Surface main document response headers in the result JSON (#2500)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:03:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e4c8ce9e7940dc77d7494bd81a201a06fd01f2b",
          "body": "Change-Id: Id894d497757b928f1cf6a08abf0607f6f126d1bf",
          "is_bot": false,
          "headline": "Update to throttle 6.0.1 (#2499)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T07:55:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7cf37761a0d10cd7246dd25247e8050f8981204",
          "body": "Change-Id: I1a823ec33c8ac206147f225d31f7be1c05b78488",
          "is_bot": false,
          "headline": "Correct license in package.json",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-10T02:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9639d5e0d0c535b2abb2d07e95289b5471f24974",
          "body": "Change-Id: I7593bf275646b19b19a773733b4f458a2534f519",
          "is_bot": false,
          "headline": "Correct tags",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-10T02:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee9cefd40ec71fa1800d245dee054bfd613a146",
          "body": "Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I2fa553b3cb3141328cba8ca95dfb1e7318460089",
          "is_bot": false,
          "headline": "Run releases via GitHub Actions with npm provenance and SBOM (#2491)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-09T18:40:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d478bb8d0392b56b519c48132b2d5c8ff29a443b",
          "body": "Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I206631516b2e2749bc3655e02d24d8459d286b2b",
          "is_bot": false,
          "headline": "Bump step-security/harden-runner to v2.19.4 (#2490)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-09T18:20:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fb30078cc7b23d5cbc8fa765ea12dc5d9430602",
          "body": "Change-Id: Ib3dea5672ce6633d3f0b4ec8ead752a7d01ea932",
          "is_bot": false,
          "headline": "27.5.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:05:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "861ec275c496a8336ae783bd0437a21c88758727",
          "body": "Change-Id: I5ce3d2ce867daf5798946d719966cf89cb6779e9",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:05:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0445ebc976c05239b22431aaade426bf1624de5d",
          "body": "Change-Id: I339e53b17e6d29a6fdade4d154234bb2251a7ffd",
          "is_bot": false,
          "headline": "Include URL and iteration number in failure messages (#2489)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:02:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "038320521e97f044ad9780bd2dfae502f61cee63",
          "body": "Change-Id: Ifdbd3d8a40f89d19e4fea4d7297b29cf8f4c23e8",
          "is_bot": false,
          "headline": "Edge 149 (#2488)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "270107464a701557836ab4544d4eabbd14caf708",
          "body": "Change-Id: Ibbe67c193a568c7d8d32d0bd69a971044787a94b",
          "is_bot": false,
          "headline": "Update chrome and edgedriver to 149 (#2487)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4be879d06b59743376a923fb1c432cac7cedfee7",
          "body": "Change-Id: Iabe44e0d68429c8e03a89ee1f445dacca0b2a1f4",
          "is_bot": false,
          "headline": "It's been a while since we updated (#2486)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:06:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a3bc371fc195948ced3b058f53d101bbd3e8a86",
          "body": "Change-Id: I62e683809bb95306de6302479118ed756f515783",
          "is_bot": false,
          "headline": "27.4.1",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T13:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb273959c23aabcd30b9b86dd120dd58807b61e",
          "body": "Change-Id: I6ab0ae3030b336c5f159879e26a2e500dac27b22",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T13:18:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa94b4ccfacd0920d97a0ae4bdb7e1e19c223e7c",
          "body": "…484)\n\n--chrome.coverage ships V8's detailed (block-level) coverage data, but the JS used-bytes calculation took the union of every range whose count was\n  greater than zero. V8 returns nested ranges: an outer range over the function body and inner ranges over sub-blocks. If a function ran at all, i\n[…]\nrns flat, non-overlapping ranges and continues to use unionLength unchanged.\n\n  Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\n\nChange-Id: I847673d9859f0e2aec1164c045d7f0b47c4816b5",
          "is_bot": false,
          "headline": "coverage: count dead branches inside executed functions as unused (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T10:22:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "176fafc54d8304c25dfe2bf9acd2425d3b388b50",
          "body": "Change-Id: I296bddf42b955d4c03e08021b41cdca8afb27b01",
          "is_bot": false,
          "headline": "27.4.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:39:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72cd0903e573718d0ffb228ec126c26e309b9a25",
          "body": "Change-Id: Iee8299b48ce687aa825f6df0d58ea367536f7de2",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18a6e17db8fbd96fbd3cbf6a88bd60454ecab180",
          "body": "Coverage is exposed two ways. --chrome.coverage runs it on every\n  iteration for users who want the data and accept that detailed V8\n  coverage deoptimizes scripts and will skew their timing metrics.\n  --enableProfileRun also turns coverage on for Chrome, alongside the\n  existing trace, so users who\n[…]\nercent), so the\n  \"which file should I tree-shake\" question is answerable from the\n  main JSON alone.\n\nCo-authored-by: Claude noreply@anthropic.com\nChange-Id: I28526039a799d0efa5f1f4da81d6dfa66d1ec8c3",
          "is_bot": false,
          "headline": "Add JS/CSS coverage collection for Chrome (#2480)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:31:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33d17635b46f8209d2fd4d36a93fc6040a561ed2",
          "body": "Occasionally a HAR contains a page object whose pageref has no matching\n  entries — typically a navigation that didn't produce any requests, or\n  an extension-injected page. Three places in lib/support/har/index.js\n  treated this shape as impossible: getDocumentRequests dereferenced the\n  result of \n[…]\ntry/catch in\n  getMainDocumentTimings stays as a safety net; the existing unit tests\n  still pass.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I5c6f2d7445bfdf1159c883f7dfc8f70d10bd3b32",
          "is_bot": false,
          "headline": "har: skip pages with no matching entries instead of throwing (#2483)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T06:38:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d5108b4e3c12fe715dcd59670bc6b3b4d49e1182",
          "body": "Change-Id: Ib67c73badb7f9a265348170777b1e834a34da533",
          "is_bot": false,
          "headline": "Bump geckodriver with ARM-64 support (#2482)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T06:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c49464308380a56ae46c3ac19c7a3cd4d860d2d9",
          "body": "* Make the Safari CI workflow use the local test server and pin Mac OS",
          "is_bot": false,
          "headline": "Make the Safari CI workflow use the local test server (#2481)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-23T15:47:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06d5288d1066dd0b44d6a651f50a9907c3d11cea",
          "body": "Change-Id: If897909a2c75469050ee2d9b3bacd2d6cdc3eaeb",
          "is_bot": false,
          "headline": "27.3.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:08:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1823d8b95fcee8221908e0043add446fb951edad",
          "body": "Change-Id: I73d9ff4a93c2d4b774b598e13229d7771c5514c9",
          "is_bot": false,
          "headline": "types",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22390055536590654dab4870eeb49fcb7bf85224",
          "body": "Change-Id: I28df6067ed9f307bfb94b5207512332189262035",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa9672f9160610aad560a1f3769fdffada1a3523",
          "body": "Change-Id: I961434a74d427d79d3b7e91f8619110280fd1de5",
          "is_bot": false,
          "headline": "Audit fix",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3fcadeac22d561a113e5399304930d581f632fc",
          "body": "commands.mouse was an anonymous object literal, so every parameter\n  showed up as any in IntelliSense and hover. Replace the inline\n  @type {Object} placeholder with a real shape so selector is typed\n  as string and singleClick's options surface their waitForNavigation\n  flag instead of any.\n\n  meas\n[…]\n as Promise<unknown> so callers have to acknowledge the result\n  shape rather than inheriting any.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I176fd306ee24324f3792663341845b281d9087e0",
          "is_bot": false,
          "headline": "Tighten types on the mouse and measure surfaces (#2479)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T07:25:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f946c1392c14e7a88ceb6bd7c84e8a9c0ce193e4",
          "body": "The two arguments script authors always touch — context.options and\n  context.result — were typed as bare Object, so \"context.options.\"\n  returned no completions in any editor. Re-type them (and the taskData\n  scratch space) as Record<string, any>, which keeps the runtime behavior\n  unchanged but le\n[…]\nkes effect, and drop a couple of\n  @typedef blocks that had been parked inside a constructor body.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I079355e096d366c6cc328ee2c2cb23491f4250a6",
          "is_bot": false,
          "headline": "Give the Context script API meaningful types (#2478)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T06:33:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f86fd61700c81dd5fe0de5c5d8564498702cf5a",
          "body": "Move scripting.d.ts to the repo root so it sits next to package.json\n  instead of inside the tsc outDir, where a future include-glob change\n  could clobber it. Swap the order under exports so \"types\" comes before\n  \"import\", which matches TypeScript's documented resolution rules and\n  removes a haza\n[…]\nmmon package.json mistakes fail before a release\n  goes out instead of being discovered by a user.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I4bcc7cc7fdd604f6977b850dcfc9430bdf1daa92",
          "is_bot": false,
          "headline": "Tighten how Browsertime publishes its TypeScript types (#2477)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T06:31:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "132ee83a9d60b077d32522f9fcfea852e3a1aa23",
          "body": "The high-level helpers added to commands (navigate, find, getText,\n  fill, hover, press, getTitle, waitForUrl, …) were annotated with\n  @type {Function}, which overrode the JSDoc @param/@returns and\n  emitted Function — effectively any — in the generated .d.ts. As a\n  result, none of those very comm\n[…]\nth context and commands\n  typed in one line, without spelling out the two underlying type\n  names.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I1f6f7d9110e5caf695de063745b5d16bef25ab24",
          "is_bot": false,
          "headline": "Improve IntelliSense for commands and script entry point (#2476)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:48:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01599e06a3857d8f1d747442a2df7646c6f1b652",
          "body": "Routine dependency refresh to pick up upstream fixes and stay current\n  with Chrome DevTools Protocol and WebDriver releases.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Ib16dfeb9336a29ea74c261b61e503e02ed3023b4",
          "is_bot": false,
          "headline": "Bump chrome-remote-interface and selenium-webdriver (#2475)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:26:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51e736fd1d6bf6320dd4e8ea13e80a436e05e0ed",
          "body": "…… (#2474)\n\n* Use setup-ffmpeg action in Linux CI instead of fetching from johnvansickle\n\n  The static ffmpeg binary fetched from johnvansickle.com was a workaround\n  from when newer ffmpeg releases broke browsertime's video pipeline. That\n  compatibility issue is resolved now, and the third-party d\n[…]\nntained source for the ffmpeg binary.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Id1f5477ecb48b3e6133b971056a895ea99d109e9\n\n* fix\n\nChange-Id: I18e76fd71d870d8c1fca641942690ce24cf0fcea",
          "is_bot": false,
          "headline": "Use setup-ffmpeg action in Linux CI instead of fetching from johnvans…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:20:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7397d5a596f64dd4b38c76799a98ac4627555a52",
          "body": "The eslint 10 and unicorn 64 majors ship several new strict rules\n  (preserve-caught-error, no-useless-assignment, unicorn/no-immediate-mutation)\n  that flag long-standing patterns across the codebase. Disabling them in the\n  config keeps the upgrade narrow — fixing them properly is a separate clean\n[…]\n/ pragma in the Safari\n  inspector client is dropped now that WebSocket is a built-in Node global.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Ic11598e9434169fd0662f0538dc9671b50b3e631",
          "is_bot": false,
          "headline": "Bump eslint to 10 and eslint-plugin-unicorn to 64 (#2473)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:03:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57f21256162577358f4bb96697fe4febe4d6eae8",
          "body": "…472)\n\nChange-Id: Ia5c0bd45b74ed4d79a9ac6992aee77c742150354",
          "is_bot": false,
          "headline": "Bump chromedriver, edgedriver and updated package for geckodriver (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T03:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7b704b66d913f4c5bcb6c19cebf96d5d84d535f",
          "body": "Change-Id: I9e466f2eb74b5571e19c65fb3db4f51bcda34127",
          "is_bot": false,
          "headline": "Update to log 2.0 (#2471)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T20:37:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cb5f88263fac159745db263db69b00e7ac75f2f",
          "body": "Browsertime --help dumps every option from all 13 topic groups in one\n  screen, which is overwhelming for new users and slow to skim. Adopt\n  the curl/ffmpeg pattern: show a small curated subset by default, let\n  users drill into one topic at a time, and keep the full reference one\n  flag away for s\n[…]\nopic-to-keys map by wrapping yargs's .option()\n  call -- no changes to the 1400-line option chain.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I5d79c91617c5c9a06497b8306deff854c83ec5e2",
          "is_bot": false,
          "headline": "Make --help easier to navigate with topic-filtered views (#2467)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T19:11:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "959f0533a4a51af7c54e00bde1a8bb523c96c01d",
          "body": "Finishes the lodash unbundling here the same way sitespeed.io did\n  (soulgalore/sitespeed.io#4742): a 40-line merge() in\n  lib/support/util.js alongside the existing getProperty/setProperty\n  helpers, no new file. The helper matches lodash's actual semantics —\n  arrays merged by index, undefined sou\n[…]\ntime no longer pulls lodash.merge\n  itself; eslint still brings it in transitively, which is fine.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I00e4737b05c626d56a5c90ae80fb544482141dad",
          "is_bot": false,
          "headline": "Replace lodash.merge with a small local helper (#2468)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T19:10:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afde22c65a1c028267790b5da47eb761734bdab4",
          "body": "Change-Id: I4fdf23a1105b6b54ceb3dc806c98d067db64264e",
          "is_bot": false,
          "headline": "Chrome HAR 1.3.1 (#2469)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T13:57:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59dd64149c8a120160a1d80518ab808811256750",
          "body": "Change-Id: I24f92d1a8b63b165e14bb11f52d0bf607bd00260",
          "is_bot": false,
          "headline": "27.2.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T11:04:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d9399df7ad23d6f192fa8d6e7760749ecdc652f",
          "body": "Change-Id: If7e64f03cff03da24b7e313904bf919868d00099",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T11:03:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "055278486354b96726bbccee07e0225ca95de404",
          "body": "The recalculate-style summary that powers \"Elements that needed\n  recalculate style before FCP\" in the HTML report has been\n  trapped inside browsertime.json — every HAR-only consumer\n  (compare.sitespeed.io, third-party tooling) has had to either\n  crack open browsertime.json or do without. Per-req\n[…]\n-request map stays\n  where it already lives so the page payload stays small.\n\n  Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\n\nChange-Id: I35e1239c0912cbef42f1f5e3872869ae6ba8b784",
          "is_bot": false,
          "headline": "Surface page-level renderBlocking summary in the HAR (#2466)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T05:50:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ac300f4b9dc4a97fdaa76d7332d14348055bf25",
          "body": "…2464)\n\nThe 14 scripting tutorials lived in jsdoc/tutorials/ and were rendered\nby clean-jsdoc-theme alongside the auto-generated class API docs. The\nsitespeed.io repo has now imported those markdown sources directly so\nthey render with the rest of the site's docs (default layout, native\nTOC, syntax \n[…]\neeps generating\nexactly as before, into the same path in the sitespeed.io repo.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I9a5a736e126ef33386e1610d939b2df2344ef091",
          "is_bot": false,
          "headline": "Drop tutorials from jsdoc — they live natively in sitespeed.io now (#…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-07T20:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "632f2a09c9f5bac71f0d9e5a2529cc88e0f02e8d",
          "body": "Change-Id: I1c95cd59ec1c7364d8b9c7ded2b47e87a6ac252e",
          "is_bot": false,
          "headline": "27.1.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:51:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aa8bb2553f993a6e3fca8f299bbde1cd0a906c5",
          "body": "Change-Id: I4f4fe468feddaa59fcc20b80bceff1526733d833",
          "is_bot": false,
          "headline": "fix",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:50:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1c9d731c7d7afed92b341726cb1f26f62009933",
          "body": "Change-Id: I5e9408bd492940461423891a29537db6edcbbc46",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:50:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3889b1d11747c052e376a2a215d54f13afe9916",
          "body": "Change-Id: I4ab15e44f2a780aa7afce61c074bf109885e5add",
          "is_bot": false,
          "headline": "Throttle 6.0 (#2463)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1097674966afcbe4c00f828d45b5220eb9edb1f3",
          "body": "Change-Id: If371f2a503e57ccb292cb6fe3cb2bf6a1e281ebd",
          "is_bot": false,
          "headline": "Update to Chrome HAR 1.3.0 (#2462)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:23:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d34fa8c98d770c4f2bb3a32ef31c26d56057a54",
          "body": "…w analyses (#2461)\n\n- Replace the unmaintained @sitespeed.io/tracium dependency (extracted from Lighthouse circa 2017, last release 0.3.3) with an\nin-tree ESM port at lib/chrome/trace/. computeMainThreadTasks is byte-equivalent so existing result.cpu.{categories,events,urls}\nconsumers see no change\n[…]\nnts whose compositeFailed bitmask is non-zero, with the unsupported properties.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I085d3ef2bd32bcf663c6b764d1551c59a544a165",
          "is_bot": false,
          "headline": "Inline the trace parser, modernise the event classifier, add three ne…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:17:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d93a5dcff83c54c820ef9ab0c7d19f0b5ee9078",
          "body": "waterfall-tools and other downstream HAR consumers tint cross-origin request labels by comparing\neach entry's URL origin against the document URL of the page. The signal they read is\nentries[0]._documentURL, which the renderer needs in order to know what counts as same-origin in the\nfirst place. Unt\n[…]\n) with the URL the iteration was asked to load, which is what consumers expect.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I464b018cf5cf5be2e2e89c43437b3e32a8ebeb0c",
          "is_bot": false,
          "headline": "Add _documentURL to the first entry of each HAR page (#2460)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T11:50:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e6cbcc97dcbf8bde72926101528ce965e29a0be",
          "body": "Change-Id: I250c1667884b1be7267ebd5cc6c297496d2efb7a",
          "is_bot": false,
          "headline": "bump the year",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T16:50:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eb071813099bf0d23189ec7be625a46d700da6a",
          "body": "…459)\n\nThis reverts commit 362236d4ba98eb5d94600e5fdde9621ba2e5f467.",
          "is_bot": false,
          "headline": "Revert \"Only prime QuickTime once per Safari iOS session (#2458)\" (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T13:46:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362236d4ba98eb5d94600e5fdde9621ba2e5f467",
          "body": "The QuickTime \"wake the iPhone for cmiod\" step ran on every iteration\nand every page, which was noisy (\"Opening QuickTime Player to wake the\niPhone…\" once per iteration) and did unnecessary work — once cmiod\nhas enumerated the device it stays enumerated for the rest of the\nsession, so iterations 2+ \n[…]\ne), so multi-iteration and multi-page Safari iOS runs only open\nQuickTime once.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I0734761484f157bf91b2ac94ad5143c6019ba44b",
          "is_bot": false,
          "headline": "Only prime QuickTime once per Safari iOS session (#2458)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T13:41:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 271,
      "latest_release_at": "2026-07-20T08:24:45Z",
      "latest_release_tag": "v28.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 28,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 8.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "browsertime",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/browsertime",
          "is_deprecated": false,
          "latest_version": "28.2.0",
          "repository_url": "https://github.com/sitespeedio/browsertime",
          "versions_count": 720,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 4,
          "monthly_downloads": 23233,
          "first_published_at": "2014-10-28T19:15:22.290000Z",
          "latest_published_at": "2026-07-20T08:24:40.606000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 141,
      "stars": 649,
      "watchers": 20,
      "fork_history": {
        "days": [
          {
            "date": "2015-01-27",
            "count": 1
          },
          {
            "date": "2015-02-22",
            "count": 1
          },
          {
            "date": "2015-03-28",
            "count": 1
          },
          {
            "date": "2015-05-27",
            "count": 1
          },
          {
            "date": "2015-10-13",
            "count": 1
          },
          {
            "date": "2015-11-08",
            "count": 2
          },
          {
            "date": "2015-11-25",
            "count": 1
          },
          {
            "date": "2015-12-07",
            "count": 1
          },
          {
            "date": "2016-01-19",
            "count": 1
          },
          {
            "date": "2016-01-28",
            "count": 1
          },
          {
            "date": "2016-02-14",
            "count": 1
          },
          {
            "date": "2016-03-18",
            "count": 1
          },
          {
            "date": "2016-03-29",
            "count": 1
          },
          {
            "date": "2016-06-01",
            "count": 1
          },
          {
            "date": "2016-06-02",
            "count": 1
          },
          {
            "date": "2016-06-07",
            "count": 1
          },
          {
            "date": "2016-06-08",
            "count": 1
          },
          {
            "date": "2016-07-06",
            "count": 1
          },
          {
            "date": "2016-07-28",
            "count": 1
          },
          {
            "date": "2016-09-25",
            "count": 1
          },
          {
            "date": "2016-10-30",
            "count": 1
          },
          {
            "date": "2016-11-06",
            "count": 1
          },
          {
            "date": "2016-11-22",
            "count": 1
          },
          {
            "date": "2016-12-09",
            "count": 1
          },
          {
            "date": "2016-12-28",
            "count": 1
          },
          {
            "date": "2017-01-03",
            "count": 1
          },
          {
            "date": "2017-01-18",
            "count": 1
          },
          {
            "date": "2017-01-25",
            "count": 1
          },
          {
            "date": "2017-02-11",
            "count": 1
          },
          {
            "date": "2017-02-28",
            "count": 1
          },
          {
            "date": "2017-03-03",
            "count": 1
          },
          {
            "date": "2017-04-05",
            "count": 2
          },
          {
            "date": "2017-04-06",
            "count": 1
          },
          {
            "date": "2017-04-19",
            "count": 1
          },
          {
            "date": "2017-06-02",
            "count": 1
          },
          {
            "date": "2017-10-16",
            "count": 1
          },
          {
            "date": "2017-11-02",
            "count": 1
          },
          {
            "date": "2017-11-16",
            "count": 1
          },
          {
            "date": "2017-11-18",
            "count": 1
          },
          {
            "date": "2018-01-25",
            "count": 1
          },
          {
            "date": "2018-02-28",
            "count": 1
          },
          {
            "date": "2018-03-02",
            "count": 1
          },
          {
            "date": "2018-03-07",
            "count": 1
          },
          {
            "date": "2018-03-24",
            "count": 1
          },
          {
            "date": "2018-04-03",
            "count": 1
          },
          {
            "date": "2018-04-05",
            "count": 1
          },
          {
            "date": "2018-05-21",
            "count": 1
          },
          {
            "date": "2018-05-24",
            "count": 1
          },
          {
            "date": "2018-06-18",
            "count": 1
          },
          {
            "date": "2018-06-21",
            "count": 1
          },
          {
            "date": "2018-07-27",
            "count": 1
          },
          {
            "date": "2018-08-03",
            "count": 1
          },
          {
            "date": "2018-08-22",
            "count": 1
          },
          {
            "date": "2018-09-30",
            "count": 1
          },
          {
            "date": "2018-10-06",
            "count": 1
          },
          {
            "date": "2018-11-13",
            "count": 1
          },
          {
            "date": "2018-12-04",
            "count": 1
          },
          {
            "date": "2018-12-06",
            "count": 1
          },
          {
            "date": "2019-02-12",
            "count": 1
          },
          {
            "date": "2019-02-13",
            "count": 2
          },
          {
            "date": "2019-02-16",
            "count": 1
          },
          {
            "date": "2019-02-26",
            "count": 1
          },
          {
            "date": "2019-04-11",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 1
          },
          {
            "date": "2019-04-19",
            "count": 1
          },
          {
            "date": "2019-05-13",
            "count": 1
          },
          {
            "date": "2019-09-27",
            "count": 1
          },
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-10-19",
            "count": 1
          },
          {
            "date": "2020-01-16",
            "count": 1
          },
          {
            "date": "2020-02-07",
            "count": 1
          },
          {
            "date": "2020-03-26",
            "count": 1
          },
          {
            "date": "2020-04-20",
            "count": 1
          },
          {
            "date": "2020-04-21",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-06-30",
            "count": 1
          },
          {
            "date": "2020-07-03",
            "count": 1
          },
          {
            "date": "2020-07-10",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-08-27",
            "count": 1
          },
          {
            "date": "2020-09-16",
            "count": 1
          },
          {
            "date": "2020-10-24",
            "count": 1
          },
          {
            "date": "2020-11-03",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 1
          },
          {
            "date": "2020-12-17",
            "count": 1
          },
          {
            "date": "2021-02-17",
            "count": 1
          },
          {
            "date": "2021-02-22",
            "count": 1
          },
          {
            "date": "2021-03-06",
            "count": 1
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-05-11",
            "count": 1
          },
          {
            "date": "2021-05-14",
            "count": 1
          },
          {
            "date": "2021-05-25",
            "count": 1
          },
          {
            "date": "2021-07-16",
            "count": 1
          },
          {
            "date": "2021-07-30",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-25",
            "count": 1
          },
          {
            "date": "2021-10-16",
            "count": 1
          },
          {
            "date": "2021-12-17",
            "count": 1
          },
          {
            "date": "2022-02-14",
            "count": 1
          },
          {
            "date": "2022-03-31",
            "count": 1
          },
          {
            "date": "2022-05-06",
            "count": 1
          },
          {
            "date": "2022-08-03",
            "count": 1
          },
          {
            "date": "2022-09-20",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 1
          },
          {
            "date": "2023-01-24",
            "count": 1
          },
          {
            "date": "2023-02-17",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-03-11",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 1
          },
          {
            "date": "2023-03-21",
            "count": 1
          },
          {
            "date": "2023-03-30",
            "count": 1
          },
          {
            "date": "2023-05-19",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-06-23",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-04-25",
            "count": 1
          },
          {
            "date": "2024-05-25",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-06",
            "count": 1
          },
          {
            "date": "2025-04-03",
            "count": 1
          },
          {
            "date": "2025-05-28",
            "count": 1
          },
          {
            "date": "2025-07-16",
            "count": 1
          },
          {
            "date": "2025-11-16",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 133,
        "total_forks": 141
      },
      "star_history": null,
      "open_issues_and_prs": 54
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 84345,
      "source_files_sampled": 380,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.16",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-mh99-v99m-4gvg"
            ],
            "fixed_version": "5.0.8",
            "advisory_count": 1,
            "oldest_advisory_days": 1
          },
          {
            "name": "tar",
            "direct": false,
            "version": "7.5.15",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-23hp-3jrh-7fpw",
              "GHSA-8x88-c5mf-7j5w",
              "GHSA-gvwx-54wh-qm9j",
              "GHSA-r292-9mhp-454m",
              "GHSA-vmf3-w455-68vh",
              "GHSA-w8wr-v893-vjvp"
            ],
            "fixed_version": "7.5.21",
            "advisory_count": 6,
            "oldest_advisory_days": 40
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 2
        },
        "advisory_count": 7,
        "affected_count": 2,
        "assessed_count": 187,
        "malicious_count": 0,
        "assessed_package": "npm:browsertime@28.2.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@devicefarmer/adbkit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.8"
        },
        {
          "name": "@sitespeed.io/chromedriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "149.0.7827"
        },
        {
          "name": "@sitespeed.io/edgedriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "149.0.4022"
        },
        {
          "name": "@sitespeed.io/geckodriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.36.2"
        },
        {
          "name": "@sitespeed.io/log",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "2.0.0"
        },
        {
          "name": "@sitespeed.io/throttle",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "6.0.1"
        },
        {
          "name": "chrome-har",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.3.1"
        },
        {
          "name": "chrome-remote-interface",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.34.0"
        },
        {
          "name": "execa",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "9.6.1"
        },
        {
          "name": "fast-stats",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.0.7"
        },
        {
          "name": "ff-test-bidi-har-export",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.0.22"
        },
        {
          "name": "selenium-webdriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.44.0"
        },
        {
          "name": "yargs",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "18.0.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@devicefarmer/adbkit",
            "direct": true,
            "version": "3.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/chromedriver",
            "direct": true,
            "version": "149.0.7827",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/edgedriver",
            "direct": true,
            "version": "149.0.4022",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/geckodriver",
            "direct": true,
            "version": "0.36.2",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/log",
            "direct": true,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/throttle",
            "direct": true,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-har",
            "direct": true,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-remote-interface",
            "direct": true,
            "version": "0.34.0",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": true,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": true,
            "version": "9.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "fast-stats",
            "direct": true,
            "version": "0.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "ff-test-bidi-har-export",
            "direct": true,
            "version": "0.0.22",
            "ecosystem": "npm"
          },
          {
            "name": "selenium-webdriver",
            "direct": true,
            "version": "4.44.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": true,
            "version": "17.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": true,
            "version": "18.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@aashutoshrathi/word-wrap",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.23.6",
            "ecosystem": "npm"
          },
          {
            "name": "@bazel/runfiles",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@borewit/text-codec",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@devicefarmer/adbkit-logcat",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@devicefarmer/adbkit-monkey",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.23.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.6",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/cliui",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/fs-minipass",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/core",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/diff",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/file-ops",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-bmp",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-gif",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-jpeg",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-png",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-tiff",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-blit",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-blur",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-circle",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-color",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-contain",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-cover",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-crop",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-displace",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-dither",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-fisheye",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-flip",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-hash",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-mask",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-print",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-quantize",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-resize",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-rotate",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-threshold",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/types",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/utils",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/set-array",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/source-map",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.4.15",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.20",
            "ecosystem": "npm"
          },
          {
            "name": "@jsdoc/salty",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "@mapbox/node-pre-gyp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.scandir",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.stat",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.walk",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgjs/parseargs",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgr/core",
            "direct": false,
            "version": "0.2.9",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/pluginutils",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sec-ant/readable-stream",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/binding-mock",
            "direct": false,
            "version": "10.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/bindings-cpp",
            "direct": false,
            "version": "12.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/bindings-interface",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-byte-length",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-cctalk",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-delimiter",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-delimiter",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-inter-byte-timeout",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-packet-length",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-readline",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-readline",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-ready",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-regex",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-slip-encoder",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-spacepacket",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/stream",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/merge-streams",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/merge-streams",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tokenizer/inflate",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@tokenizer/token",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/esrecurse",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/markdown-it",
            "direct": false,
            "version": "14.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "16.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "20.10.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/selenium-webdriver",
            "direct": false,
            "version": "4.35.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/w3c-web-usb",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@types/ws",
            "direct": false,
            "version": "8.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "@vercel/nft",
            "direct": false,
            "version": "0.29.4",
            "ecosystem": "npm"
          },
          {
            "name": "@zeit/schemas",
            "direct": false,
            "version": "2.36.0",
            "ecosystem": "npm"
          },
          {
            "name": "abbrev",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-import-attributes",
            "direct": false,
            "version": "1.9.5",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-walk",
            "direct": false,
            "version": "8.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "agent-base",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-align",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "6.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "any-base",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arch",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "arg",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "array-find-index",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arrgv",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arrify",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "async-sema",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ava",
            "direct": false,
            "version": "6.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "await-to-js",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.10.31",
            "ecosystem": "npm"
          },
          {
            "name": "bindings",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "bluebird",
            "direct": false,
            "version": "3.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "blueimp-md5",
            "direct": false,
            "version": "2.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "bmp-ts",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "boxen",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.2",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "builtin-modules",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "camel-case",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001793",
            "ecosystem": "npm"
          },
          {
            "name": "catharsis",
            "direct": false,
            "version": "0.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "cbor",
            "direct": false,
            "version": "10.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "5.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "chalk-template",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "change-case",
            "direct": false,
            "version": "5.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "chownr",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "chunkd",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ci-info",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "ci-parallel-vars",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "clean-css",
            "direct": false,
            "version": "5.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "clean-jsdoc-theme",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "clean-regexp",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-boxes",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-truncate",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "clipboardy",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "code-excerpt",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.20.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "9.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "common-path-prefix",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "compressible",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "npm"
          },
          {
            "name": "compression",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "concordance",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "consola",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "content-disposition",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "convert-to-spaces",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "core-js-compat",
            "direct": false,
            "version": "3.49.0",
            "ecosystem": "npm"
          },
          {
            "name": "core-util-is",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "crc-full",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "currently-unhandled",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "date-time",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "2.6.9",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "deep-extend",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "dot-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "eastasianwidth",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.360",
            "ecosystem": "npm"
          },
          {
            "name": "emittery",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "9.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-config-prettier",
            "direct": false,
            "version": "10.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-prettier",
            "direct": false,
            "version": "5.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-unicorn",
            "direct": false,
            "version": "64.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "9.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "11.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "esprima",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "exif-parser",
            "direct": false,
            "version": "0.1.12",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-diff",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-glob",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "fastq",
            "direct": false,
            "version": "1.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "figures",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-type",
            "direct": false,
            "version": "21.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "file-uri-to-path",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up-simple",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "foreground-child",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "fs-extra",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-east-asian-width",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "gifwrap",
            "direct": false,
            "version": "0.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "10.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "17.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "globby",
            "direct": false,
            "version": "14.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "html-minifier-terser",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "https-proxy-agent",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ieee754",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ignore-by-default",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "image-q",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "immediate",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "indent-string",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ini",
            "direct": false,
            "version": "1.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "irregular-plurals",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-builtin-module",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-docker",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-obj",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-port-reachable",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-promise",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-unicode-supported",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-wsl",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "isarray",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jackspeak",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "jimp",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "jpeg-js",
            "direct": false,
            "version": "0.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "js-string-escape",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "3.14.2",
            "ecosystem": "npm"
          },
          {
            "name": "js2xmlparser",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "jsdoc",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jsonfile",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "jszip",
            "direct": false,
            "version": "3.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "klaw",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "klaw-sync",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lie",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "load-json-file",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lower-case",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "10.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-it",
            "direct": false,
            "version": "14.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-it-anchor",
            "direct": false,
            "version": "8.6.7",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "matcher",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "md5-hex",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "memoize",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge2",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "mime",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.33.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.54.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "2.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-fn",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-function",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "9.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "minimist",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "minipass",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "minizlib",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mkdirp",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "0.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "no-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-fetch",
            "direct": false,
            "version": "2.6.12",
            "ecosystem": "npm"
          },
          {
            "name": "node-forge",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-gyp-build",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-gyp-build",
            "direct": false,
            "version": "4.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-hid",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.44",
            "ecosystem": "npm"
          },
          {
            "name": "node-stream-zip",
            "direct": false,
            "version": "1.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "nofilter",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "nopt",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "omggif",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "on-headers",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "onetime",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-map",
            "direct": false,
            "version": "7.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "package-config",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "package-json-from-dist",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pako",
            "direct": false,
            "version": "1.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "param-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-ascii",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-binary",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-xml",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-ms",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pascal-case",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-is-inside",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-type",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pixelmatch",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-prebuilds",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "plur",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "pluralize",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pngjs",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pngjs",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "3.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "prettier-linter-helpers",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-ms",
            "direct": false,
            "version": "9.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "process-nextick-args",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode.js",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "queue-microtask",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "range-parser",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "rc",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "regexp-tree",
            "direct": false,
            "version": "0.1.27",
            "ecosystem": "npm"
          },
          {
            "name": "registry-auth-token",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "registry-url",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsparser",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "relateurl",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "requizzle",
            "direct": false,
            "version": "0.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-cwd",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "reusify",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "run-parallel",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "sax",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "serialize-error",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "serialport",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "serve",
            "direct": false,
            "version": "14.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "serve-handler",
            "direct": false,
            "version": "6.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "setimmediate",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "showdown",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "simple-xml-to-json",
            "direct": false,
            "version": "1.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "slash",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "slice-ansi",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.21",
            "ecosystem": "npm"
          },
          {
            "name": "split",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "sprintf-js",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "stack-utils",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "string_decoder",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-indent",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strtok3",
            "direct": false,
            "version": "10.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "supertap",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "synckit",
            "direct": false,
            "version": "0.11.12",
            "ecosystem": "npm"
          },
          {
            "name": "tar",
            "direct": false,
            "version": "7.5.15",
            "ecosystem": "npm"
          },
          {
            "name": "temp-dir",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "5.26.0",
            "ecosystem": "npm"
          },
          {
            "name": "through",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "time-zone",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinycolor2",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tmp",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "token-types",
            "direct": false,
            "version": "6.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "2.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "uc.micro",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "uint8array-extras",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "underscore",
            "direct": false,
            "version": "1.13.8",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "5.26.5",
            "ecosystem": "npm"
          },
          {
            "name": "unicorn-magic",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "universalify",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "update-check",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "usb",
            "direct": false,
            "version": "2.12.1",
            "ecosystem": "npm"
          },
          {
            "name": "usb-power-profiling",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "utif2",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "util-deprecate",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "vary",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "webidl-conversions",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "well-known-symbols",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-url",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "widest-line",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "write-file-atomic",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "7.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.20.1",
            "ecosystem": "npm"
          },
          {
            "name": "xml-parse-from-string",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "xml2js",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "xmlbuilder",
            "direct": false,
            "version": "11.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "xmlcreate",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "21.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "22.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yoctocolors",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": false,
            "version": "3.25.76",
            "ecosystem": "npm"
          },
          {
            "name": "numpy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "opencv-python",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyssim",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 514,
        "direct_count": 15,
        "indirect_count": 499
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 19,
        "merged_prs": 1742,
        "open_issues": 35,
        "closed_ratio": 0.944,
        "closed_issues": 594,
        "closed_unmerged_prs": 155
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "soulgalore",
          "commits": 4653,
          "avatar_url": "https://avatars.githubusercontent.com/u/540757?v=4"
        },
        {
          "type": "User",
          "login": "tobli",
          "commits": 833,
          "avatar_url": "https://avatars.githubusercontent.com/u/540266?v=4"
        },
        {
          "type": "User",
          "login": "gmierz",
          "commits": 47,
          "avatar_url": "https://avatars.githubusercontent.com/u/10966989?v=4"
        },
        {
          "type": "User",
          "login": "beenanner",
          "commits": 36,
          "avatar_url": "https://avatars.githubusercontent.com/u/723985?v=4"
        },
        {
          "type": "User",
          "login": "dpalmeiro",
          "commits": 27,
          "avatar_url": "https://avatars.githubusercontent.com/u/37376204?v=4"
        },
        {
          "type": "User",
          "login": "ncalexan",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/1097182?v=4"
        },
        {
          "type": "User",
          "login": "sefeng211",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/8703745?v=4"
        },
        {
          "type": "User",
          "login": "cliu55",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/25144627?v=4"
        },
        {
          "type": "User",
          "login": "acreskeyMoz",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/44072237?v=4"
        },
        {
          "type": "User",
          "login": "brennie",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/199381236?v=4"
        }
      ],
      "contributors_sampled": 54,
      "top_contributor_share": 0.814
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "browser-beta.yml",
        "browser-dev.yml",
        "building-docker.yml",
        "docker.yml",
        "lint.yml",
        "linux-chrome.yml",
        "linux-firefox.yml",
        "mac-m1.yml",
        "mac.yml",
        "release.yml",
        "safari.yml",
        "unittests.yml",
        "visualmetrics.yml",
        "windows.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".eslintrc",
        ".eslintrc.json",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 7,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 9 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 7,
            "reason": "dependency not pinned by hash detected -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "1b7bde646c6c0ac4ca5bb7698b3eb9180f24717d",
        "ran_at": "2026-07-26T10:08:37Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T06:04:29Z",
      "oldest_open_prs": [
        {
          "number": 1794,
          "created_at": "2022-05-20T11:47:38Z",
          "last_comment_at": "2022-06-02T19:33:13Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2314,
          "created_at": "2025-07-17T20:08:15Z",
          "last_comment_at": "2025-07-31T08:32:02Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2485,
          "created_at": "2026-05-28T02:56:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2492,
          "created_at": "2026-06-12T17:23:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2493,
          "created_at": "2026-06-17T19:01:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2494,
          "created_at": "2026-06-22T06:36:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2539,
          "created_at": "2026-07-24T01:11:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2541,
          "created_at": "2026-07-25T09:50:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2544,
          "created_at": "2026-07-26T05:28:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2545,
          "created_at": "2026-07-26T05:28:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2546,
          "created_at": "2026-07-26T05:29:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2547,
          "created_at": "2026-07-26T05:30:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2548,
          "created_at": "2026-07-26T05:31:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2549,
          "created_at": "2026-07-26T05:32:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2550,
          "created_at": "2026-07-26T05:39:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2551,
          "created_at": "2026-07-26T05:40:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2552,
          "created_at": "2026-07-26T05:41:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2553,
          "created_at": "2026-07-26T05:42:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2554,
          "created_at": "2026-07-26T05:43:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-26T05:53:09Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 953,
          "created_at": "2019-10-03T09:40:55Z",
          "last_comment_at": "2023-12-17T04:57:39Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1222,
          "created_at": "2020-03-19T10:16:06Z",
          "last_comment_at": "2024-01-09T04:35:23Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1337,
          "created_at": "2020-08-18T08:47:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1487,
          "created_at": "2021-02-09T09:53:18Z",
          "last_comment_at": "2021-02-10T10:26:49Z",
          "last_comment_author": "eserte"
        },
        {
          "number": 1523,
          "created_at": "2021-03-26T14:24:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1566,
          "created_at": "2021-04-30T20:38:53Z",
          "last_comment_at": "2023-12-17T06:42:40Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1622,
          "created_at": "2021-08-12T13:26:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1637,
          "created_at": "2021-09-15T08:03:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1746,
          "created_at": "2022-03-31T14:29:06Z",
          "last_comment_at": "2022-06-07T17:43:47Z",
          "last_comment_author": "mstange"
        },
        {
          "number": 1756,
          "created_at": "2022-04-05T16:37:15Z",
          "last_comment_at": "2023-12-18T10:21:26Z",
          "last_comment_author": "julienw"
        },
        {
          "number": 1777,
          "created_at": "2022-04-28T14:17:04Z",
          "last_comment_at": "2026-04-29T21:32:18Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1820,
          "created_at": "2022-07-23T09:29:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1857,
          "created_at": "2022-10-17T18:21:03Z",
          "last_comment_at": "2022-10-18T10:02:06Z",
          "last_comment_author": "canova"
        },
        {
          "number": 1903,
          "created_at": "2023-02-15T14:17:04Z",
          "last_comment_at": "2023-02-17T20:32:24Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1910,
          "created_at": "2023-03-08T14:42:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1962,
          "created_at": "2023-06-20T13:22:36Z",
          "last_comment_at": "2023-06-21T12:00:02Z",
          "last_comment_author": "gmierz"
        },
        {
          "number": 1983,
          "created_at": "2023-08-18T20:35:14Z",
          "last_comment_at": "2023-12-18T14:53:05Z",
          "last_comment_author": "jordan-angold-sophos"
        },
        {
          "number": 1985,
          "created_at": "2023-09-02T07:33:38Z",
          "last_comment_at": "2023-12-17T13:12:46Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2000,
          "created_at": "2023-10-17T05:45:59Z",
          "last_comment_at": "2026-04-29T21:33:26Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2001,
          "created_at": "2023-10-17T05:47:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sitespeedio/browsertime",
    "host": "github.com",
    "name": "browsertime",
    "owner": "sitespeedio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 73,
      "inputs": {
        "security": 54,
        "vitality": 86,
        "community": 76,
        "governance": 68,
        "engineering": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 271,
              "human_commit_share": 0.96,
              "days_since_last_push": 0,
              "active_weeks_last_year": 28
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "28/52 weeks with commits",
                "points": 19.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 28
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "271 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 271
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v28.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 8.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~8.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 8.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 76,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "forks": 141,
              "stars": 649,
              "watchers": 20,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "649 stars",
                "points": 45.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 649
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "141 forks",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 141
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "20 watchers",
                "points": 7.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "packages": [
                "browsertime"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 23233
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "23,233 downloads/month across npm",
                "points": 58.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 23233,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 68,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 54,
              "top_contributor_share": 0.814
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 81% of commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "54 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 1742,
              "open_issues": 35,
              "closed_issues": 594,
              "issue_closed_ratio": 0.944,
              "closed_unmerged_prs": 155
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 44.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1742/1897 decided PRs merged",
                "points": 35.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1742,
                      "decided": 1897
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "followers": 112,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "sitespeedio",
              "public_repos": 45,
              "account_age_days": 4666
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "112 followers of sitespeedio",
                "points": 14.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 112,
                      "login": "sitespeedio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "45 public repos, account ~12 yr old",
                "points": 24.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 45
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "browsertime"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "720 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 720
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 76,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "14 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".eslintrc, .eslintrc.json, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc, .eslintrc.json, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [
                "javascript",
                "har",
                "chrome",
                "firefox",
                "speedindex",
                "video",
                "safari"
              ],
              "has_wiki": false,
              "homepage": "https://www.sitespeed.io/documentation/browsertime/",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.sitespeed.io/documentation/browsertime/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 54,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 3.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:browsertime@28.2.0 runtime dependency closure — what installing the published package pulls in — 187 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:browsertime@28.2.0",
                  "assessed": 187
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 83,
            "inputs": {
              "source": "osv",
              "advisories": 7,
              "affected_packages": 2,
              "assessed_packages": 187,
              "unassessed_packages": 0,
              "affected_by_severity": "high 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "2 affected: brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)",
                "points": 8.4,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 2,
                      "packages": "brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 187,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.771,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "74 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 74,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".eslintrc, .eslintrc.json, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc, .eslintrc.json, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 7,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 84345,
              "source_files_sampled": 380,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript with type-check config (tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "tsconfig.json",
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/380 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 380,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T10:09:05.558855Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sitespeedio/browsertime.svg",
  "full_name": "sitespeedio/browsertime",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.