Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 298,
"has_wiki": false,
"homepage": null,
"languages": {
"JavaScript": 79974
},
"pushed_at": "2026-07-09T04:47:04Z",
"created_at": "2011-07-27T02:22:26Z",
"owner_type": "User",
"updated_at": "2026-07-12T18:18:27Z",
"description": "IP address manipulation library in JavaScript",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "JavaScript",
"significant_languages": [
"JavaScript"
]
},
"owner": {
"blog": null,
"name": "Catherine",
"type": "User",
"login": "whitequark",
"company": "@SCISemi",
"location": "UK",
"followers": 2903,
"avatar_url": "https://avatars.githubusercontent.com/u/54771?v=4",
"created_at": "2009-02-15T18:56:56Z",
"is_verified": null,
"public_repos": 191,
"account_age_days": 6366
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v2.4.0",
"kind": "minor",
"published_at": "2026-05-03T18:21:55Z"
},
{
"tag": "v2.3.0",
"kind": "minor",
"published_at": "2025-11-28T14:09:48Z"
},
{
"tag": "v2.2.0",
"kind": "minor",
"published_at": "2024-04-20T01:36:11Z"
},
{
"tag": "v2.1.0",
"kind": "minor",
"published_at": "2023-05-23T12:29:43Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2021-06-09T16:45:29Z"
},
{
"tag": "v2.0.0",
"kind": "major",
"published_at": "2020-08-17T04:49:59Z"
},
{
"tag": "v1.9.1",
"kind": "patch",
"published_at": "2019-07-03T15:51:42Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2019-02-10T07:50:43Z"
},
{
"tag": "v1.8.1",
"kind": "patch",
"published_at": "2018-07-31T15:30:17Z"
},
{
"tag": "v1.8.0",
"kind": "minor",
"published_at": "2018-07-10T03:27:02Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2018-04-10T10:11:58Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2018-01-11T20:40:59Z"
},
{
"tag": "v1.5.4",
"kind": "patch",
"published_at": "2017-10-17T07:26:39Z"
},
{
"tag": "v1.5.3",
"kind": "patch",
"published_at": "2017-10-12T15:44:12Z"
},
{
"tag": "v1.5.2",
"kind": "patch",
"published_at": "2017-08-24T03:47:21Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2017-08-22T20:34:38Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2017-08-21T14:11:30Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2017-06-22T20:44:50Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2017-03-14T22:18:01Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2016-07-08T09:52:12Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2016-01-29T20:52:05Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2015-12-09T14:36:04Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2015-11-07T05:45:33Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2015-08-27T06:29:07Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2015-04-22T18:01:10Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2015-04-08T16:59:52Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2015-04-07T21:16:05Z"
},
{
"tag": "v0.1.9",
"kind": "patch",
"published_at": "2015-03-11T10:41:19Z"
},
{
"tag": "v0.1.8",
"kind": "patch",
"published_at": "2015-01-29T23:36:54Z"
},
{
"tag": "v0.1.7",
"kind": "patch",
"published_at": "2015-01-29T03:36:29Z"
},
{
"tag": "v0.1.6",
"kind": "patch",
"published_at": "2014-11-26T16:33:40Z"
},
{
"tag": "v0.1.5",
"kind": "patch",
"published_at": "2014-11-19T21:56:43Z"
},
{
"tag": "v0.1.4",
"kind": "patch",
"published_at": "2014-11-18T21:59:30Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2014-07-09T08:26:17Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2013-12-06T21:55:58Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2011-07-30T15:58:54Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2011-07-28T15:54:48Z"
}
],
"recent_commits": [
{
"oid": "3eedd4a9d3766ac14bd2587fa10453725c3067e0",
"body": "IPv6.parser returns null (not an object) when a string matches no IPv6 form,\nbut IPv6.parse guarded with `addr.parts === null` and the transitional branch\nof the parser dereferenced `addr.parts` on a null expandIPv6 result. Malformed\ninput such as 'foobar', '::ffff:999.1.1.1' or '1::2::3:1.2.3.4' th\n[…]\nead of the intended\nerror, unlike IPv4.parse which guards with `parts === null`.\n\nGuard against null so all malformed input throws the descriptive\n'string is not formatted like an IPv6 Address' error.",
"is_bot": false,
"headline": "fix: throw a descriptive error for malformed input in IPv6.parse",
"author_name": "Yarchik",
"author_login": "spokodev",
"committed_at": "2026-07-09T04:47:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b9adf677e110410be7d3d7f60a281624509ec96",
"body": "toRFC5952String ran its zero-run regex against toNormalizedString(), which\nappends the %zoneId suffix. The regex anchors a trailing zero group with $,\nso a zero run at the end of the address was left one group short whenever a\nzone identifier was present: fe80::%eth0 rendered as fe80::0%eth0.\n\nMatch against the address alone and re-attach the zone suffix afterwards, so\nthe final zero run is fully compressed per RFC 5952, 4.2.2. The zone\nidentifier (RFC 4007) is not part of the address.",
"is_bot": false,
"headline": "fix: compress trailing zero run in toString when a zoneIndex is present",
"author_name": "Yarchik",
"author_login": "spokodev",
"committed_at": "2026-07-09T04:46:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "821337466c4d7d38533fd68bf395a1c94bfce010",
"body": null,
"is_bot": false,
"headline": "fix: reject non-numeric prefix length in subnetMaskFromPrefixLength",
"author_name": "greymoth",
"author_login": "mahirhir",
"committed_at": "2026-07-04T01:19:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a180e7895555a9e149674e898c2f66e59c06354b",
"body": "… and hextets >4 hex digits (#206)\n\n* fix(ipaddr): reject :: with zero compression and hextets >4 hex digits\n\n* test(ipaddr): add tests for strict IPv6 validation\n\n* test(ipaddr): add IPv4-embedded v6 hextet check and 1-group compression regression guard",
"is_bot": false,
"headline": "fix(ipaddr): strict IPv6 validation — reject :: with zero compression…",
"author_name": "luo jiyin",
"author_login": "luojiyin1987",
"committed_at": "2026-06-27T14:39:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85dd468ad0602964172f9ca2ce0dc7833644262a",
"body": "`toRFC5952String` compared candidate zero runs by their matched string\nlength. A run that is not at the start of the address includes a leading\n\":\" in the match, so it looked one character longer than an equal-length\nrun at the start and won the comparison. An address like\n`0:0:1:0:0:1:0:0` was therefore rendered as `0:0:1::1:0:0` instead of\n`::1:0:0:1:0:0`.\n\nCompare by the number of zero groups instead, so the leftmost of\nequal-length runs is chosen, as RFC 5952, 4.2.3 requires.",
"is_bot": false,
"headline": "fix: compress the leftmost zero run in toString (RFC 5952, 4.2.3)",
"author_name": "Yarchik",
"author_login": "spokodev",
"committed_at": "2026-06-20T02:21:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c52a61374a8fcc573b99fcf618142c94de8c08b7",
"body": null,
"is_bot": false,
"headline": "doc(README): overhaul with TOC and filled in",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2026-05-08T19:34:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3dd474f91e2cfc51ec78c5022379c4f9d67f5a40",
"body": null,
"is_bot": false,
"headline": "test:coverage, add coverage report script",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2026-05-06T23:16:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4a3270d23af2a788352a41ead0af22f9211b7e4",
"body": "missing from a0825b6",
"is_bot": false,
"headline": "pj: remove ipaddr.min.js from files[]",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2026-05-06T23:08:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f76986445c18b6f52a127f404f4ac98e8218dd8c",
"body": "- ci: update GHA actions to latest\n- ci: add explicit minimal permissions",
"is_bot": false,
"headline": "lint: update eslint to v10",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2026-05-06T22:10:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0825b6f4b1290aa323cfb6dc906530ab41c43e2",
"body": null,
"is_bot": false,
"headline": "Remove bundling, rely on users to bundle",
"author_name": "Caleb Jasik",
"author_login": "jasikpark",
"committed_at": "2026-05-06T21:42:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31e667aa1f09fa70a5f40d92ae219ef78c3f5217",
"body": null,
"is_bot": false,
"headline": "Fix filename for .d.ts types",
"author_name": "Caleb Jasik",
"author_login": "jasikpark",
"committed_at": "2026-05-06T17:23:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c5698e84b8ed4041469d9b661b6d581a2c2389f",
"body": null,
"is_bot": false,
"headline": "Fix some package.json fields",
"author_name": "Caleb Jasik",
"author_login": "jasikpark",
"committed_at": "2026-05-06T13:19:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5430ff0f1767c4867bc781d77d42f231ad38627f",
"body": null,
"is_bot": false,
"headline": "Remove ipaddr.min.js",
"author_name": "Caleb Jasik",
"author_login": "jasikpark",
"committed_at": "2026-05-06T13:19:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61bd6dfd22a53c7d7c044aefe3acad4b0dd7f197",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2026-05-03T18:21:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f563e5c72766e1b264411f06c2c4612acded09a3",
"body": null,
"is_bot": false,
"headline": "Add RFC9637, RFC9602, RFC8215, RFC3879 reserved address ranges.",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2026-05-03T18:21:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9992db90a04039d52747bb22e39ac969ad6fd7d0",
"body": null,
"is_bot": false,
"headline": "Rename `2001:10::/28` from `deprecated` to `deprecatedOrchid`.",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2026-05-03T18:21:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5686480b6a001806d1a86155850f704f15689035",
"body": null,
"is_bot": false,
"headline": "Indicate which RFCs reserved some IPv6 ranges.",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2026-05-03T18:04:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9199d3f36a40afe7243038eb67296dd9742333fd",
"body": null,
"is_bot": false,
"headline": "Remove bower.json",
"author_name": "Caleb Jasik",
"author_login": "jasikpark",
"committed_at": "2026-05-03T17:55:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1915d222d66c1a9bfc7578fe7464f9bed4ccaac9",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: string",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85eb23c93975990e2113105509d32c5d7f1e41a8",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: javascript",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4222342344dedb03a352575b9088af39874b5a8b",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: ip v6",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1c76a352efb308264a6ea2aa20f0050d278b9fdb",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: hexadecimal",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82e4b6d86cc6dc945093e0a4f397bd9f117a05c2",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: addresses",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85bf06c4b5f93cd0155d76f3acda89df8540ed10",
"body": "Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>",
"is_bot": false,
"headline": "spelling: address",
"author_name": "Josh Soref",
"author_login": "jsoref",
"committed_at": "2026-02-06T17:35:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e373b4e42533872c8e2d539fc74f48fa684c6e0f",
"body": null,
"is_bot": false,
"headline": "Bump version to 2.3.0",
"author_name": "Fumiya Tokumasu",
"author_login": "toof-jp",
"committed_at": "2025-11-28T14:09:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d564b1d38c32ebcc03002c27fbd5641a8b1366cc",
"body": null,
"is_bot": false,
"headline": "Add IPv4 CIDR four-part decimal validator",
"author_name": "Fumiya Tokumasu",
"author_login": "toof-jp",
"committed_at": "2025-11-27T12:20:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "08c2cd41e2cb3400683cbd503f60421bfdf66921",
"body": "eslint 8 went EOL in 2024-10-05",
"is_bot": false,
"headline": "dep(eslint): upgrade to v9",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2025-02-02T19:50:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e6438fef80ebfa3e47e5e267380d10ed95d6af4d",
"body": "per https://docs.npmjs.com/cli/v10/configuring-npm/package-json#files",
"is_bot": false,
"headline": "remove LICENSE from files, redundant, always included",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2025-02-02T19:50:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0cba6a4e924b3286e85512f0949cdf7d6367a783",
"body": null,
"is_bot": false,
"headline": "Bump version to 2.2.0",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2024-04-20T01:36:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f523168e4c3eb0c0844fc37de8d7f88a96f85fde",
"body": null,
"is_bot": false,
"headline": "test: switch runner from mocha to node builtin",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2024-04-09T13:51:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "32c4f03d1f392ff8e6e5307c8131762881f9077c",
"body": null,
"is_bot": false,
"headline": "add isValidCIDR method",
"author_name": "Jeremy Nguyen",
"author_login": "jeremy-code",
"committed_at": "2024-02-27T07:39:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03a2b52dcba62433f48ad66099b8625e673f198d",
"body": "fixes #171",
"is_bot": false,
"headline": "fix parsing of some IPv4-embedded IPv6 adresses",
"author_name": "Johann150",
"author_login": "Johann150",
"committed_at": "2024-01-25T13:18:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96296ab7f07d8d8ce33613ed93385deb4034e094",
"body": "see respectively:\nhttps://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml\nhttps://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml",
"is_bot": false,
"headline": "add more reserved IP address ranges",
"author_name": "Johann150",
"author_login": "Johann150",
"committed_at": "2024-01-23T22:18:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb169615d04bb5f1c6042a07d85f9b09bef69af6",
"body": null,
"is_bot": false,
"headline": "Bump version to 2.1.0",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2023-05-23T12:29:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e1c5a81afb97ce3ecdfb3ad4585a7e7be893519",
"body": "add GitHub Actions for CI tests",
"is_bot": false,
"headline": "Merge pull request #148 from msimerson/travis-to-github-actions",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2022-03-18T16:48:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "604776a0af9e309b55ece5414741f0758a15ad83",
"body": "Fix IPv6 shortening",
"is_bot": false,
"headline": "Merge pull request #163 from Darkwa/master",
"author_name": "Catherine",
"author_login": "whitequark",
"committed_at": "2022-03-11T16:11:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c623ac07749097604e5914b374a1217fb9bb15e4",
"body": null,
"is_bot": false,
"headline": "Add toString tests for IPv4 CIDR and IPv6 CIDR",
"author_name": "Darkwa",
"author_login": null,
"committed_at": "2022-03-09T18:02:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdb3656489e2f4febd8a2ceca213a6aca760745a",
"body": null,
"is_bot": false,
"headline": "Fix IPv6 toString method",
"author_name": "Darkwa",
"author_login": null,
"committed_at": "2022-03-09T18:01:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dbd4c4f2f30aa82e166d0dfa25b2f5ccd3fc25be",
"body": "This block is used for benchmark testing of inter-network communications between two separate subnets.\r\nhttps://tools.ietf.org/html/rfc2544",
"is_bot": false,
"headline": "Add reserved block to SpecialRanges",
"author_name": "Alexandre1921",
"author_login": "alexandre1921",
"committed_at": "2021-09-23T08:23:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68300e6ed9f77f61d980a7446496cbb2858ecda6",
"body": null,
"is_bot": false,
"headline": "README: fix broken links",
"author_name": "Pierre Donias",
"author_login": "pdonias",
"committed_at": "2021-09-15T02:02:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0335c092866d68afe5038fa98477443512660eeb",
"body": null,
"is_bot": false,
"headline": "Add IANA reserved IPv6 addresses of 2001 space",
"author_name": "Stella Rouzi",
"author_login": "differentreality",
"committed_at": "2021-06-14T13:36:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5237e6d21d44ca1675adf881651a746cb3699d20",
"body": null,
"is_bot": false,
"headline": "Bump version in bower.json.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2021-06-09T16:45:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebd2bcae2272dfdb069e0a1e7f99078017fc37ef",
"body": null,
"is_bot": false,
"headline": "add Changes.md, bump version to 2.0.1",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2021-06-09T16:45:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12a49351a73f9f9c4300112ad94a6f8675b6b26a",
"body": null,
"is_bot": false,
"headline": "- added test for IPv6 subnetMaskFromPrefixLength",
"author_name": "Tox",
"author_login": null,
"committed_at": "2021-05-31T08:54:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "819eb1b37d94a99696e81ef17bdddd1b1d74ee1d",
"body": " * networkAddressFromCIDR\n * broadcastAddressFromCIDR\n * subnetMaskFromPrefixLength\nThis is an updated version of https://github.com/whitequark/ipaddr.js/pull/97/commits/99604e21a389ec8816ad1d1bcfe3a38ecbc6c912",
"is_bot": false,
"headline": "Implement missing methods for IPv6 addresses:",
"author_name": "Tox",
"author_login": null,
"committed_at": "2021-05-31T08:54:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e02bbaa855d801276bad0ad7cb2c5da2baeef25",
"body": null,
"is_bot": false,
"headline": "README: update badge URLs",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2021-01-06T04:48:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd1db465b233b6650dc6dccad311c7ebb5a597c7",
"body": null,
"is_bot": false,
"headline": "add GitHub Actions CI tests",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2021-01-06T04:32:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c18488416e20f2d624ab6f727638673018a2a46",
"body": "Signed-off-by: Kenneth Tran <kennethtran93@users.noreply.github.com>",
"is_bot": false,
"headline": "Update Typescript Definitions and reorganized main script.",
"author_name": "Kenneth Tran",
"author_login": "kennethtran93",
"committed_at": "2020-08-03T21:50:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d18780b1942acd1ca58ed021eee0a578cfc39e4e",
"body": "…sses.\n\nSigned-off-by: Kenneth Tran <kennethtran93@users.noreply.github.com>",
"is_bot": false,
"headline": "Add basic support for deprecated format of IPv4-compatible IPv6 addre…",
"author_name": "Kenneth Tran",
"author_login": "kennethtran93",
"committed_at": "2020-08-01T13:05:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5660c7c18c844e159daed123b5b13262f74db648",
"body": "Bump NodeJS version in README and package.json.\n\nSigned-off-by: Kenneth Tran <kennethtran93@users.noreply.github.com>",
"is_bot": false,
"headline": "Update travis to use nodejs 14 and remove nodejs 8.",
"author_name": "Kenneth Tran",
"author_login": "kennethtran93",
"committed_at": "2020-07-31T16:26:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e71aabb2dac2aada1053f619d7566b25fb2bbd4e",
"body": "Signed-off-by: Kenneth Tran <kennethtran93@users.noreply.github.com>",
"is_bot": false,
"headline": "Fix parseInt for decimal, octal, hex",
"author_name": "Kenneth Tran",
"author_login": "kennethtran93",
"committed_at": "2020-07-31T16:26:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a7aae3fdf2f117a4de31c7842f88b1ce4bc1059",
"body": "* Add test for classfull IPv4, valid and invalid\r\n\r\n* Add support for classfull IPv4\r\n\r\n* Add support for three bytes IPv4",
"is_bot": false,
"headline": "Add support for classful (2, 3 octet) IPv4.",
"author_name": "Taiki",
"author_login": "Taiki-San",
"committed_at": "2020-01-23T17:01:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4bd3d283b2dce91ce8785c04c3df841373b8578",
"body": null,
"is_bot": false,
"headline": "major version bump",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-14T04:05:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "20b575cd58113a70fbe44f820a2d7b0b11094880",
"body": null,
"is_bot": false,
"headline": "use es6 templates instead of concatenated strings",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-14T03:42:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5680c6b022f71db3228c5e558c2dea2eecabd4de",
"body": null,
"is_bot": false,
"headline": "Update TypeScript definitions.",
"author_name": "JungEon Kim",
"author_login": "jungeonkim",
"committed_at": "2019-10-14T01:55:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c58f31255ee415b5ad741f6154f973b8f7b8f8d",
"body": null,
"is_bot": false,
"headline": "lint: also update tests with no-var",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T20:12:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a74bed7a51afe26b64971f2d3178fedf18ed56ee",
"body": "- tell eslint that this is not an accidental use of conditional assignment",
"is_bot": false,
"headline": "lint: allow no-cond-assign with extra parens",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T20:12:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec9136ad94d2de39168770736bd75a4f50f5bcf7",
"body": null,
"is_bot": false,
"headline": "es6: replace var with const/let",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T20:12:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dfbf44c88911727048681d208625b276c7be7d5f",
"body": null,
"is_bot": false,
"headline": "lint: add eslint testing during CI",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T20:11:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b1401dd773f29dca350b8ccce1db6e70264bc69",
"body": "* use es6 syntax in examples\r\n\r\n* consistent use of quote chars",
"is_bot": false,
"headline": "README updates (#125)",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T19:26:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d53ac08e0eae959c11c0d9085d380c8438496434",
"body": null,
"is_bot": false,
"headline": "replace nodeunit with mocha",
"author_name": "Matt Simerson",
"author_login": "msimerson",
"committed_at": "2019-10-13T19:17:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ade7dbfa1d9713f0aabe002c9a0718c4cc6cb5e",
"body": "Closes #118 and closes #121.",
"is_bot": false,
"headline": "Rewrite in JavaScript; drop CoffeeScript.",
"author_name": "George Borisov",
"author_login": "borisovg",
"committed_at": "2019-07-31T04:49:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "760416b27a4b348e7a39fdacfccd6cb047026c98",
"body": "No API changes, LICENSE file included in published package.",
"is_bot": false,
"headline": "Update version to 1.9.1",
"author_name": "Markku Post (Uttula)",
"author_login": "DiscoNova",
"committed_at": "2019-07-03T15:51:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ffd9633a7097b0df2954352a5d38508f4a1719b2",
"body": "In order to appease corporate legal department, including\nthe file in the published package helps when automating the\ncollection of library licenses for inclusion in EULAs.",
"is_bot": false,
"headline": "Include LICENSE file in published package",
"author_name": "Markku Post (Uttula)",
"author_login": "DiscoNova",
"committed_at": "2019-07-03T15:51:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3a0bcc88243875883636c8ee29f9bd752dcda5b",
"body": null,
"is_bot": false,
"headline": "Update TypeScript definitions.",
"author_name": "Claas Ahlrichs",
"author_login": "claasahl",
"committed_at": "2019-06-25T17:56:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bd045f49f5b7695eea2c93e9706f4350e0bbaba",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2019-02-10T07:50:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b296eaaef4236d80b8e46920b83c9f84249e2e3a",
"body": null,
"is_bot": false,
"headline": "Update compiled files.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2019-02-10T07:49:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16ec0b25d3bc9b8d2d03b52ddfff52317a4e6a47",
"body": "Our implementation of .toString and .toNormalizedString sadly\r\ndoes not correctly implement RFC5952. This commit adds a correct\r\nimplementation.",
"is_bot": false,
"headline": "Add IPv6.toRFC5952String.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2019-02-10T07:21:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b091daf0efd8726d8eac0d898df895148baea2f2",
"body": null,
"is_bot": false,
"headline": "Deprecate non-compliant functions",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2019-02-10T07:21:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b8b1e2439d24e6c2290d39adbd0165894fb78726",
"body": "There are a few different ways to normalize x:0:y:0:z, and this has\r\nhistorically been a source of bugs. In fact, our implementation\r\ndoes not quite follow RFC5952. In cases like a database primary key,\r\nit is nicer to use a larger but clearly unambiguous representation,\r\nwhich is what's implemented here.",
"is_bot": false,
"headline": "Add IPv6.toFixedLengthString.",
"author_name": "Garrett",
"author_login": "cableray",
"committed_at": "2019-02-10T07:18:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d4034bce3825792fd2798f81b5cdd445aeae4fa",
"body": null,
"is_bot": false,
"headline": "Return RFC 5952 compliant string",
"author_name": "Garrett Motzner",
"author_login": null,
"committed_at": "2018-12-07T00:10:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f676ef505ae314f62925c1de3640e6d45b2e8c4",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2018-07-31T15:30:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff8ba7a670b73d540881ecb84bd1684f79c63ac5",
"body": null,
"is_bot": false,
"headline": "Update Typescript range definitions in include 'unicast'.",
"author_name": "Ben Anderson",
"author_login": "jammnrose",
"committed_at": "2018-07-24T05:58:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7f0a9bfea2888ea8b309b97d0eed1709e8c6ead",
"body": "Fixes #111.",
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2018-07-10T03:27:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34149be1e66cd9fb62b50e887fd3c1264c02e514",
"body": null,
"is_bot": false,
"headline": "CIDR array response reversed to properly deliminated string",
"author_name": "Fred Thomsen",
"author_login": "fredthomsen",
"committed_at": "2018-06-10T03:44:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e69afeb4053ee32447a101845f860848280eca5",
"body": null,
"is_bot": false,
"headline": "correct typescript definition for subnetMatch",
"author_name": "Rigel Kent",
"author_login": "rigelk",
"committed_at": "2018-05-17T08:47:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "845a4f22524ffc3585d7344aad2563296793c0cc",
"body": "Fixes #103",
"is_bot": false,
"headline": "Fix validation of IPv4 four-part decimals containing individual zeroes",
"author_name": "Ryan Grove",
"author_login": "rgrove",
"committed_at": "2018-05-11T04:21:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c645e0b0ac8646e2bc3f086399bb5c675d504dd8",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2018-04-10T10:11:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d591d47e0466b03a1b40e09d74bbc3fc0b0c1fdd",
"body": null,
"is_bot": false,
"headline": "Add support for IPv4 trailing and leading zeros",
"author_name": "johnfrades",
"author_login": "johnfrades",
"committed_at": "2018-04-06T10:16:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "29064298c2fe7b6b1917433e28e97d8ff4b4d83c",
"body": null,
"is_bot": false,
"headline": "Reduced npm package size by excluding tests, bower and CI files",
"author_name": "Michał Wadas",
"author_login": "Ginden",
"committed_at": "2018-01-14T01:46:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c81198c2540a1df41571623c0bcbdb9d9b73a925",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2018-01-11T20:40:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7b08edd17b5d46422979bb48a9a63cb551c8016",
"body": null,
"is_bot": false,
"headline": "add typescript definition file",
"author_name": "Lucas Lacroix",
"author_login": "raijinsetsu",
"committed_at": "2018-01-10T01:13:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d384881bd33cefda9c56eda74bc122350a31bd6a",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-10-17T07:26:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b56c0f5f49d71015fdf3edc2607d66955ab85f33",
"body": null,
"is_bot": false,
"headline": "Clarify Cakefile task names (again).",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-10-15T09:20:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90c75fdc9e4348f8da7d5084d2daa2779e960657",
"body": null,
"is_bot": false,
"headline": "Clarify Cakefile task names.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-10-15T09:10:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f692e6c8e1c720684e535285df1b4a2f555ac71",
"body": null,
"is_bot": false,
"headline": "Merge branch 'fix_for_84' of https://github.com/jamesmgreene/ipaddr.js",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-10-15T09:09:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4be129b1b6e423fbfd236336003582d8a3cfac7d",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-10-12T15:44:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97592fef0cf95799bbabedef1cbe5d4bbb95ea08",
"body": null,
"is_bot": false,
"headline": "Fix main to resolve to existing file",
"author_name": "spurreiter",
"author_login": "spurreiter",
"committed_at": "2017-10-11T09:08:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b96fa42269bc6ba7f1c8ad8f3c18f3847984acfc",
"body": "Fixes #84",
"is_bot": false,
"headline": "Simplified the `IPv6.prototype.toString` method",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-09-14T13:52:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f6e21058792cf6e38c6f461219fb25f0caecf27",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-08-24T03:47:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb99551e614743987c51e8c9f572ac215a07b832",
"body": "Fixes #82",
"is_bot": false,
"headline": "Fix parsing when zone index contains uppercase letters",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-08-24T03:35:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d677623f75bd4c23361ed661d6f8977f572ec18b",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-08-22T20:34:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6cb40890eca206be4ff9db95c09b85679721ae9e",
"body": "Fixes #79",
"is_bot": false,
"headline": "Fix zoneIndex parsing for IPv4-mapped IPv6 addresses",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-08-22T03:51:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a54ecebfee155b54a8f9c1296ea5b6110cdc0d9b",
"body": null,
"is_bot": false,
"headline": "Bump version.",
"author_name": "whitequark",
"author_login": "whitequark",
"committed_at": "2017-08-21T14:11:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7dcaf1830e9e8c30606316bd8b98b4e1ae0cc6d0",
"body": "Fixes #73\nFixes #64",
"is_bot": false,
"headline": "Allow `ipaddr.IPv4.subnetMaskFromPrefixLength(32)`",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-08-21T14:10:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c2bcc6fd1cdfc28e386d664f86472b7ca7cea5ed",
"body": "…thod\n\nFixes #67",
"is_bot": false,
"headline": "Add `IPv4.prototype.toNormalizedString` for symmetry with the IPv6 me…",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-08-20T20:00:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83174a9cb316b50ecc82043f5c53910998b9f58b",
"body": null,
"is_bot": false,
"headline": "Fix a minor bug in `subnetMatch` logic",
"author_name": "James M. Greene",
"author_login": "JamesMGreene",
"committed_at": "2017-08-20T15:27:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "99d2ae5aa60936d41f1f9180223417188c3ad866",
"body": "Fixes https://github.com/whitequark/ipaddr.js/issues/60",
"is_bot": false,
"headline": "Add IPv6 zone index support",
"author_name": "silverwind",
"author_login": "silverwind",
"committed_at": "2017-08-19T22:37:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a275c31fca43380e0a4e9a49597da2d75a02d5e",
"body": "Fixes #59",
"is_bot": false,
"headline": "add IPv6 prefixLengthFromSubnetMask",
"author_name": "silverwind",
"author_login": "silverwind",
"committed_at": "2017-07-04T17:44:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9e22317f20706525bb8485ec375c35cb12ba4880",
"body": "x",
"is_bot": false,
"headline": "Accept mixed IPv4/IPv6 range lists in ipaddr.subnetMatch.",
"author_name": "Bittrance",
"author_login": null,
"committed_at": "2017-06-26T04:49:20Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 37,
"commits_last_year": 26,
"latest_release_at": "2026-05-03T18:21:55Z",
"latest_release_tag": "v2.4.0",
"releases_from_tags": true,
"days_since_last_push": 13,
"active_weeks_last_year": 8,
"days_since_latest_release": 80,
"mean_days_between_releases": 317.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "ipaddr.js",
"exists": true,
"license": "MIT",
"keywords": [
"ip",
"ipv4",
"ipv6"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/ipaddr.js",
"is_deprecated": false,
"latest_version": "2.4.0",
"repository_url": "https://github.com/whitequark/ipaddr.js",
"versions_count": 37,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 473509889,
"first_published_at": "2011-07-28T15:57:38.697000Z",
"latest_published_at": "2026-05-03T18:27:02.625000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 80
}
]
},
"popularity": {
"forks": 105,
"stars": 649,
"watchers": 15,
"fork_history": {
"days": [
{
"date": "2012-05-25",
"count": 1
},
{
"date": "2014-01-31",
"count": 1
},
{
"date": "2014-11-25",
"count": 1
},
{
"date": "2015-03-02",
"count": 1
},
{
"date": "2015-04-22",
"count": 1
},
{
"date": "2015-06-22",
"count": 1
},
{
"date": "2015-06-27",
"count": 1
},
{
"date": "2015-10-21",
"count": 1
},
{
"date": "2015-11-20",
"count": 1
},
{
"date": "2015-12-04",
"count": 1
},
{
"date": "2016-01-11",
"count": 1
},
{
"date": "2016-01-12",
"count": 1
},
{
"date": "2016-01-14",
"count": 1
},
{
"date": "2016-01-29",
"count": 1
},
{
"date": "2016-04-15",
"count": 1
},
{
"date": "2016-05-16",
"count": 1
},
{
"date": "2016-05-24",
"count": 1
},
{
"date": "2016-07-01",
"count": 1
},
{
"date": "2016-07-15",
"count": 1
},
{
"date": "2016-08-03",
"count": 1
},
{
"date": "2016-12-23",
"count": 1
},
{
"date": "2017-01-04",
"count": 1
},
{
"date": "2017-04-13",
"count": 1
},
{
"date": "2017-05-02",
"count": 1
},
{
"date": "2017-05-10",
"count": 2
},
{
"date": "2017-06-03",
"count": 1
},
{
"date": "2017-06-07",
"count": 1
},
{
"date": "2017-06-09",
"count": 1
},
{
"date": "2017-07-04",
"count": 1
},
{
"date": "2017-07-05",
"count": 1
},
{
"date": "2017-10-23",
"count": 1
},
{
"date": "2017-10-25",
"count": 1
},
{
"date": "2017-11-29",
"count": 1
},
{
"date": "2018-01-03",
"count": 1
},
{
"date": "2018-01-17",
"count": 1
},
{
"date": "2018-03-18",
"count": 1
},
{
"date": "2018-04-01",
"count": 1
},
{
"date": "2018-04-06",
"count": 1
},
{
"date": "2018-05-11",
"count": 1
},
{
"date": "2018-05-17",
"count": 1
},
{
"date": "2018-06-01",
"count": 1
},
{
"date": "2018-07-23",
"count": 1
},
{
"date": "2018-11-02",
"count": 1
},
{
"date": "2018-11-26",
"count": 1
},
{
"date": "2018-12-06",
"count": 1
},
{
"date": "2019-02-14",
"count": 1
},
{
"date": "2019-02-24",
"count": 1
},
{
"date": "2019-04-24",
"count": 1
},
{
"date": "2019-05-10",
"count": 1
},
{
"date": "2019-06-23",
"count": 1
},
{
"date": "2019-06-25",
"count": 1
},
{
"date": "2019-07-13",
"count": 1
},
{
"date": "2019-10-13",
"count": 1
},
{
"date": "2019-10-14",
"count": 1
},
{
"date": "2019-11-07",
"count": 1
},
{
"date": "2019-11-13",
"count": 1
},
{
"date": "2020-02-28",
"count": 1
},
{
"date": "2020-05-13",
"count": 1
},
{
"date": "2020-06-02",
"count": 1
},
{
"date": "2020-06-09",
"count": 1
},
{
"date": "2020-07-31",
"count": 2
},
{
"date": "2020-08-13",
"count": 1
},
{
"date": "2020-12-07",
"count": 1
},
{
"date": "2020-12-21",
"count": 1
},
{
"date": "2021-02-05",
"count": 1
},
{
"date": "2021-03-16",
"count": 1
},
{
"date": "2021-04-15",
"count": 1
},
{
"date": "2021-05-26",
"count": 1
},
{
"date": "2021-06-10",
"count": 1
},
{
"date": "2021-06-14",
"count": 1
},
{
"date": "2021-08-25",
"count": 1
},
{
"date": "2021-08-28",
"count": 1
},
{
"date": "2021-09-14",
"count": 1
},
{
"date": "2021-09-22",
"count": 1
},
{
"date": "2021-11-24",
"count": 1
},
{
"date": "2022-04-20",
"count": 1
},
{
"date": "2022-06-29",
"count": 1
},
{
"date": "2022-08-19",
"count": 1
},
{
"date": "2022-11-04",
"count": 1
},
{
"date": "2023-05-26",
"count": 1
},
{
"date": "2023-06-02",
"count": 1
},
{
"date": "2023-06-07",
"count": 1
},
{
"date": "2023-09-18",
"count": 1
},
{
"date": "2023-12-05",
"count": 1
},
{
"date": "2024-01-30",
"count": 1
},
{
"date": "2025-03-30",
"count": 1
},
{
"date": "2025-07-17",
"count": 1
},
{
"date": "2025-09-09",
"count": 1
},
{
"date": "2025-10-03",
"count": 1
},
{
"date": "2025-11-16",
"count": 1
},
{
"date": "2025-11-27",
"count": 1
},
{
"date": "2025-12-04",
"count": 1
},
{
"date": "2025-12-27",
"count": 1
},
{
"date": "2026-01-30",
"count": 1
},
{
"date": "2026-02-06",
"count": 1
},
{
"date": "2026-04-08",
"count": 1
},
{
"date": "2026-05-11",
"count": 1
},
{
"date": "2026-05-26",
"count": 1
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-27",
"count": 1
}
],
"complete": true,
"collected": 102,
"total_forks": 105
},
"star_history": null,
"open_issues_and_prs": 10
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 41369,
"source_files_sampled": 4,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"package.json"
],
"advisories": {
"error": "No resolved dependencies carried a version and a supported ecosystem",
"scope": "repository_graph",
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 3,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "@eslint/js",
"direct": false,
"version": "^10.0.1",
"ecosystem": "npm"
},
{
"name": "eslint",
"direct": false,
"version": "^10.3.0",
"ecosystem": "npm"
},
{
"name": "globals",
"direct": false,
"version": "^17.6.0",
"ecosystem": "npm"
}
],
"collected": true,
"truncated": false,
"total_count": 3,
"direct_count": 0,
"indirect_count": 3
}
},
"maintainership": {
"issues": {
"open_prs": 4,
"merged_prs": 77,
"open_issues": 6,
"closed_ratio": 0.944,
"closed_issues": 102,
"closed_unmerged_prs": 20
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "whitequark",
"commits": 96,
"avatar_url": "https://avatars.githubusercontent.com/u/54771?v=4"
},
{
"type": "User",
"login": "msimerson",
"commits": 18,
"avatar_url": "https://avatars.githubusercontent.com/u/261635?v=4"
},
{
"type": "User",
"login": "axic",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/20340?v=4"
},
{
"type": "User",
"login": "feross",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/121766?v=4"
},
{
"type": "User",
"login": "JamesMGreene",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/417751?v=4"
},
{
"type": "User",
"login": "jsoref",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/2119212?v=4"
},
{
"type": "User",
"login": "jasikpark",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/10626596?v=4"
},
{
"type": "User",
"login": "kennethtran93",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/6724477?v=4"
},
{
"type": "User",
"login": "kika",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/207889?v=4"
},
{
"type": "User",
"login": "scop",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/109152?v=4"
}
],
"contributors_sampled": 38,
"top_contributor_share": 0.503
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci-test.yml",
"lint.yml"
],
"has_docs_dir": false,
"linter_configs": [
"eslint.config.mjs"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 8,
"reason": "15 out of 18 merged PRs checked by a CI test -- score normalized to 8",
"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": 7,
"reason": "Found 18/24 approved changesets -- score normalized to 7",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 61 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": 0,
"reason": "no 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": "18 commit(s) and 2 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": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"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": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "3eedd4a9d3766ac14bd2587fa10453725c3067e0",
"ran_at": "2026-07-22T22:06:49Z",
"aggregate_score": 5.6,
"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": null,
"oldest_open_prs": [
{
"number": 175,
"created_at": "2024-01-30T11:57:12Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 187,
"created_at": "2025-07-17T04:34:15Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 193,
"created_at": "2026-04-08T23:44:21Z",
"last_comment_at": "2026-05-05T22:37:55Z",
"last_comment_author": "jasikpark"
},
{
"number": 203,
"created_at": "2026-05-11T21:51:08Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-09T04:47:04Z",
"ci_last_conclusion": null,
"oldest_open_issues": [
{
"number": 144,
"created_at": "2020-07-31T22:57:02Z",
"last_comment_at": "2020-08-01T06:48:35Z",
"last_comment_author": "kennethtran93"
},
{
"number": 165,
"created_at": "2022-05-05T11:00:56Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 170,
"created_at": "2023-09-10T18:53:19Z",
"last_comment_at": "2023-09-10T19:04:12Z",
"last_comment_author": "Manouchehri"
},
{
"number": 185,
"created_at": "2025-07-15T14:29:13Z",
"last_comment_at": "2025-07-16T05:09:16Z",
"last_comment_author": "whitequark"
},
{
"number": 186,
"created_at": "2025-07-17T04:27:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 192,
"created_at": "2026-04-02T17:54:04Z",
"last_comment_at": "2026-04-08T22:32:51Z",
"last_comment_author": "jasikpark"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/whitequark/ipaddr.js",
"host": "github.com",
"name": "ipaddr.js",
"owner": "whitequark"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"security": 56,
"vitality": 63,
"community": 70,
"governance": 73,
"engineering": 64
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 63,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"commits_last_year": 26,
"human_commit_share": 1,
"days_since_last_push": 13,
"active_weeks_last_year": 8
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 13 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 13
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "8/52 weeks with commits",
"points": 5.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 8
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "26 commits in the last year",
"points": 12.9,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 26
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"releases_count": 37,
"latest_release_tag": "v2.4.0",
"releases_from_tags": true,
"days_since_latest_release": 80,
"mean_days_between_releases": 317.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "37 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 37
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 80 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 80
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~317.2 days",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 317.2
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": 13,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 13 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 13
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 70,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"forks": 105,
"stars": 649,
"watchers": 15,
"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": "105 forks",
"points": 16.8,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 105
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "15 watchers",
"points": 6.4,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 15
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"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 (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"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": "excellent",
"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": 100,
"inputs": {
"packages": [
"ipaddr.js"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 473509889
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "473,509,889 downloads/month across npm",
"points": 80,
"status": "met",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 473509889,
"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": "good",
"name": "Sustainability & Governance",
"value": 73,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 38,
"top_contributor_share": 0.503
},
"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 50% of commits",
"points": 11.2,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 50
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "38 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 38
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 61 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "excellent",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"merged_prs": 77,
"open_issues": 6,
"closed_issues": 102,
"issue_closed_ratio": 0.944,
"closed_unmerged_prs": 20
},
"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": "77/97 decided PRs merged",
"points": 30.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 77,
"decided": 97
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 18/24 approved changesets -- score normalized to 7",
"points": 10.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 75,
"inputs": {
"followers": 2903,
"owner_type": "User",
"is_verified": null,
"owner_login": "whitequark",
"public_repos": 191,
"account_age_days": 6366
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "2,903 followers of whitequark",
"points": 24.9,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 2903,
"login": "whitequark"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "191 public repos, account ~17 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 191
}
},
{
"code": "account_age_years",
"params": {
"years": 17
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"ipaddr.js"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 80
},
"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 80 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 80
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "37 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 37
}
}
],
"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": "moderate",
"name": "Engineering Quality",
"value": 64,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 80,
"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": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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": "eslint.config.mjs",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "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": "15 out of 18 merged PRs checked by a CI test -- score normalized to 8",
"points": 16,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"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": null,
"points": 0,
"status": "missed",
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": 56,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "15 out of 18 merged PRs checked by a CI test -- score normalized to 8",
"points": 2,
"status": "partial",
"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 18/24 approved changesets -- score normalized to 7",
"points": 5.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 61 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": "no update tool detected",
"points": 0,
"status": "missed",
"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": "18 commit(s) and 2 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 not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"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": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"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": 34
},
"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": "at_risk",
"name": "AI Readiness",
"value": 31,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "critical",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.3,
"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": "30 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 16,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 30,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 33,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"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": "eslint.config.mjs",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "JavaScript",
"largest_source_bytes": 41369,
"source_files_sampled": 4,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "JavaScript without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "JavaScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/4 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 4,
"oversized": 0
}
}
],
"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",
"No resolved dependencies carried a version and a supported ecosystem"
],
"report_type": "repository",
"generated_at": "2026-07-22T22:07:13.971937Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/whitequark/ipaddr.js.svg",
"full_name": "whitequark/ipaddr.js",
"license_state": "standard",
"license_spdx": "MIT"
}