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