Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 10:09 UTC

sitespeedio / browsertime

Measure and Optimize Web Performance

JavaScriptApache-2.0★ 649 estrellas⑂ 141 forksdesde ago 2013Ver en GitHub ↗

sitespeedio/browsertime tiene un índice de salud de 73 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (86/100) y la más baja, Security (54/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

73
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

73
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

sitespeed.ioOrganización
112 seguidores45 repositorios públicosdesde oct 2013

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
npmbrowsertime28.2.023.233720hace 6 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

86Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
19.4/36Cadencia de commits — 28/52 semanas con commits
18/18Volumen de commits — 271 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year271
human_commit_share0,96
days_since_last_push0
active_weeks_last_year28
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~8,5 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count100
latest_release_tagv28.2.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases8,5

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

76Bueno · 18% del índice global
Cómo se puntúa
45.6/60Estrellas — 649 estrellas
17.9/25Forks — 141 forks
7.1/15Observadores — 20 observadores
Datos de entrada utilizados
forks141
stars649
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_templateno
Cómo se puntúa
58.2/80Descargas mensuales — 23.233 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesbrowsertime
dependents
ecosystemsnpm
total_downloads
monthly_downloads23.233
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

68Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.2/22.5Distribución de commits — el principal contribuyente firma el 81% de los commits
13.5/13.5Amplitud de contribuyentes — 54 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 9 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled54
top_contributor_share0,814
Cómo se puntúa
44.1/46.8Resolución de issues — 94% de issues cerradas
35.1/38.3Aceptación de PR — 1742/1897 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs1742
open_issues35
closed_issues594
issue_closed_ratio0,944
closed_unmerged_prs155
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
14.8/25Alcance del propietario — 112 seguidores de sitespeedio
24.1/25Trayectoria — 45 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers112
owner_typeOrganization
is_verified
owner_loginsitespeedio
public_repos45
account_age_days4666
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 6 días
20/20Historial de versiones — 720 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesbrowsertime
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

76Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 14 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .eslintrc, .eslintrc.json, eslint.config.mjs
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

65Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://www.sitespeed.io/documentation/browsertime/
10/10Descripción del repositorio
10/10Topics — 7 topics
0/10Wiki
Datos de entrada utilizados
topicsjavascript, har, chrome, firefox, speedindex, video, safari
has_wikino
homepagehttps://www.sitespeed.io/documentation/browsertime/
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

54Moderado · 16% del índice global
Cómo se puntúa
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — sin datos
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,7
Excluidos de la puntuación (sin datos o no aplicable): branch_protection. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
8.4/25Dependencias indirectas libres de avisos conocidos — 2 afectados: brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories7
affected_packages2
assessed_packages187
unassessed_packages0
affected_by_severityhigh 2
direct_affected_packages0
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:browsertime@28.2.0 —lo que arrastra la instalación del paquete publicado—: 187 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 74 de 96 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,771
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .eslintrc, .eslintrc.json, eslint.config.mjs
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
7/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — JavaScript con configuración de verificación de tipos (tsconfig.json)
54.7/55Tamaños de archivo manejables — 2/380 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageJavaScript
largest_source_bytes84.345
source_files_sampled380
oversized_source_files2

Datos clave

649estrellas de GitHub
54contribuidores
271commits en los últimos 12 meses
0días desde el último push
100versiones publicadas
1factor bus
35issues abiertas
npm, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 141 ⇿
0Estrellas
141Forks
98Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

025507510012515013342015-012020-102026-07
Mayor 10Menor 46Parche 42

Cada punto abarca 11 días.

OpenSSF Scorecard 4.7 / 10
4.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-26 10:08 UTC

7Binary-Artifactsbinaries present in source code
n/dBranch-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
Dependencias directas 13
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 514

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 15 paquetes directos y 499 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Instalar npm:browsertime@28.2.0 arrastra 187 paquetes, directos y transitivos: 2 tienen avisos conocidos, de los cuales 0 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
brace-expansion1.1.16indirectaalta15.0.8
tar7.5.15indirectaalta67.5.21

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.