Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-26 10:09 UTC

sitespeedio / browsertime

Measure and Optimize Web Performance

JavaScriptApache-2.0★ 649 зірок⑂ 141 форкз серп. 2013 р.Переглянути на GitHub ↗

sitespeedio/browsertime має індекс здоров’я 73 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (86/100), найнижчий — Security (54/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

73
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

73
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

sitespeed.ioОрганізація
112 підписників45 публічних репозиторіївз жовт. 2013 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
npmbrowsertime28.2.023 2337206 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
19.4/36Ритм комітів — 28/52 тижнів із комітами
18/18Обсяг комітів — 271 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year271
human_commit_share0,96
days_since_last_push0
active_weeks_last_year28
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 100 релізів
36/36Свіжість релізів — останній реліз 6 дн. тому
27/27Ритм релізів — реліз кожні ~8,5 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count100
latest_release_tagv28.2.0
releases_from_tagsні
days_since_latest_release6
mean_days_between_releases8,5

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

76Добрий · 18% загального індексу
Як обчислюється оцінка
45.6/60Зірки — 649 зірок
17.9/25Форки — 141 форків
7.1/15Спостерігачі — 20 спостерігачів
Використані вхідні дані
forks141
stars649
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
18/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductтак
has_pull_request_templateні
Як обчислюється оцінка
58.2/80Щомісячні завантаження — 23 233 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesbrowsertime
dependents
ecosystemsnpm
total_downloads
monthly_downloads23 233
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

68Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
4.2/22.5Розподіл комітів — головний контриб’ютор — автор 81% комітів
13.5/13.5Широта контриб’юторів — 54 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 9 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled54
top_contributor_share0,814
Як обчислюється оцінка
44.1/46.8Вирішення issue — закрито 94% issue
35.1/38.3Прийняття PR — злито 1 742/1 897 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs1 742
open_issues35
closed_issues594
issue_closed_ratio0,944
closed_unmerged_prs155
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
14.8/25Охоплення власника — 112 підписників у sitespeedio
24.1/25Послужний список — 45 публічних репозиторіїв, вік облікового запису ~12 р.
Використані вхідні дані
followers112
owner_typeOrganization
is_verified
owner_loginsitespeedio
public_repos45
account_age_days4 666

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 6 дн. тому
20/20Історія версій — 720 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesbrowsertime
ecosystemsnpm
any_deprecatedні
min_days_since_publish6

Інженерна якість

Чи наявні базові інженерні практики та документація?

76Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 14 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .eslintrc, .eslintrc.json, eslint.config.mjs
0/9.6Pre-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
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні

Документація

65Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
15/15Сайт документації / домашня сторінка — https://www.sitespeed.io/documentation/browsertime/
10/10Опис репозиторію
10/10Теми — 7 тем
0/10Wiki
Використані вхідні дані
topicsjavascript, har, chrome, firefox, speedindex, video, safari
has_wikiні
homepagehttps://www.sitespeed.io/documentation/browsertime/
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

54Помірний · 16% загального індексу

Стан безпеки

47У зоні ризику
Як обчислюється оцінка
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — немає даних
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.5Ліцензія — 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
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,7
Виключено з оцінювання (немає даних або не застосовно): branch_protection. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
8.4/25Непрямі залежності без відомих сповіщень — уражено 2: brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)
40/40Немає задавнених сповіщень — жодне сповіщення не є публічним довше за 90 дн.
Використані вхідні дані
sourceosv
advisories7
affected_packages2
assessed_packages187
unassessed_packages0
affected_by_severityhigh 2
direct_affected_packages0
Звірено з runtime-замиканням залежностей npm:browsertime@28.2.0 — тим, що тягне за собою встановлення опублікованого пакета, — 187 пакетів. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

57Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 74 з 96 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,771
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .eslintrc, .eslintrc.json, eslint.config.mjs
11/11Статична перевірка типів — tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
7/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileтак
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
27/45Типізований код — JavaScript з конфігурацією перевірки типів (tsconfig.json)
54.7/55Керовані розміри файлів — 2/380 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageJavaScript
largest_source_bytes84 345
source_files_sampled380
oversized_source_files2

Ключові факти

649зірок GitHub
54контриб'юторів
271комітів за останні 12 місяців
0днів від останнього пушу
100релізів
1бас-фактор
35відкритих issue
npm, PyPIпакетних екосистем

Попередження щодо збору даних

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

Докладніше

Історія зірок і форків 0 ★ / 141 ⇿
0Зірки
141Форки
98Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

025507510012515013342015-012020-102026-07
Мажорні 10Мінорні 46Патчі 42

Кожна точка охоплює 11 днів.

OpenSSF Scorecard 4.7 / 10
4.7сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-26 10:08 UTC

7Binary-Artifactsbinaries present in source code
н/дBranch-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
Прямі залежності 13
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 514

Повний розв'язаний набір залежностей із графа залежностей GitHub: 15 прямих і 499 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

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

Встановлення npm:browsertime@28.2.0 тягне 187 пакетів, прямих і транзитивних: 2 мають відомі сповіщення, з них 0 — прямі залежності.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
brace-expansion1.1.16непрямависока15.0.8
tar7.5.15непрямависока67.5.21

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаnpm.