Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-26 16:25 UTC

KidkArolis / space-router

Framework agnostic router for single page apps

TypeScriptISC★ 39 stars⑂ 4 forkssince Mar 2017View on GitHub ↗

KidkArolis/space-router holds a health index of 57 out of 100, placing it in the Moderate band. It scores highest on Vitality (77/100) and lowest on Community & Adoption (44/100). It was last updated 6 days ago. A single contributor accounts for most of its recent work.

57
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Karolis NarkeviciusPersonal account
117 followers143 public repossince Jul 2010Humaans

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmspace-router2.0.03,866296 days agobrowserroutersmallclientsideuniversalhistorylocationurl

Metrics by category

Vitality

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

77Good · 22% of overall
How it's scored
36/36Push recency — last push 6 days ago
7.6/36Commit cadence — 11/52 weeks with commits
15/18Commit volume — 46 commits in the last year
10/10OpenSSF Scorecard: Maintained — 25 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year46
human_commit_share1
days_since_last_push6
active_weeks_last_year11
How it's scored
16.2/27Ships releases — 30 version tags (no GitHub releases)
36/36Release recency — latest release 6 days ago
27/27Release cadence — a release every ~26.5 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count30
latest_release_tagv2.0.0
releases_from_tagsyes
days_since_latest_release6
mean_days_between_releases26.5
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

44At risk · 18% of overall
How it's scored
25.6/60Stars — 39 stars
4/25Forks — 4 forks
0/15Watchers — 1 watchers
Inputs used
forks4
stars39
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (ISC)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
47.8/80Monthly downloads — 3,866 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesspace-router
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,866
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

58Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.6/22.5Commit distribution — top contributor authored 97% of commits
2.7/13.5Contributor breadth — 2 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.974
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
25.5/38.3PR acceptance — 10/15 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/28 approved changesets -- score normalized to 0
Inputs used
merged_prs10
open_issues0
closed_issues8
issue_closed_ratio1
closed_unmerged_prs5
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
14.9/25Owner reach — 117 followers of KidkArolis
25/25Track record — 143 public repos, account ~16 yr old
Inputs used
followers117
owner_typeUser
is_verified
owner_loginKidkArolis
public_repos143
account_age_days5,864
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 6 days ago
20/20Version history — 29 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesspace-router
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Engineering Quality

Are baseline engineering and documentation practices in place?

54Moderate · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://kidkarolis.github.io/space-router/
10/10Repository description
10/10Topics — 6 topics
10/10Wiki
Inputs used
topicsbrowser, router, hash, pushstate, callback, react
has_wikiyes
homepagehttps://kidkarolis.github.io/space-router/
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

48At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/28 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 25 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate3.5
Excluded from scoring (no data or not applicable): dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories2
affected_packages2
assessed_packages259
unassessed_packages0
affected_by_severityhigh 1, moderate 1
direct_affected_packages0
Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 259 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.

AI Readiness

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

66Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md
0/15Machine-readable docs (llms.txt)
11.7/40Legible commit history — 22 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.22
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes1,527
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 19 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0.19
toolchain_manifests
dependency_bot_commit_share0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/14 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes49,988
source_files_sampled14
oversized_source_files0

Key facts

39GitHub stars
2contributors
46commits, last 12 months
6days since last push
30releases
1bus factor
0open issues
npmpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 4 ⇿
0Stars
4Forks
7Releases

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

1223344412017-102019-032020-09
Major 0Minor 4Patch 3

Each point covers 3 days.

OpenSSF Scorecard 3.5 / 10
3.5aggregate

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
n/aDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained25 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
8Vulnerabilities2 existing vulnerabilities detected
All dependencies 259

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

RegistryPackageVersionRelation
npm@bcoe/v8-coverage1.0.2indirect
npm@cto.af/wtf80.0.5indirect
npm@isaacs/fs-minipass4.0.1indirect
npm@istanbuljs/schema0.1.6indirect
npm@jridgewell/resolve-uri3.1.2indirect
npm@jridgewell/sourcemap-codec1.5.5indirect
npm@jridgewell/trace-mapping0.3.31indirect
npm@mapbox/node-pre-gyp2.0.3indirect
npm@nodelib/fs.scandir2.1.5indirect
npm@nodelib/fs.stat2.0.5indirect
npm@nodelib/fs.walk1.2.8indirect
npm@oxfmt/binding-android-arm-eabi0.59.0indirect
npm@oxfmt/binding-android-arm640.59.0indirect
npm@oxfmt/binding-darwin-arm640.59.0indirect
npm@oxfmt/binding-darwin-x640.59.0indirect
npm@oxfmt/binding-freebsd-x640.59.0indirect
npm@oxfmt/binding-linux-arm-gnueabihf0.59.0indirect
npm@oxfmt/binding-linux-arm-musleabihf0.59.0indirect
npm@oxfmt/binding-linux-arm64-gnu0.59.0indirect
npm@oxfmt/binding-linux-arm64-musl0.59.0indirect
npm@oxfmt/binding-linux-ppc64-gnu0.59.0indirect
npm@oxfmt/binding-linux-riscv64-gnu0.59.0indirect
npm@oxfmt/binding-linux-riscv64-musl0.59.0indirect
npm@oxfmt/binding-linux-s390x-gnu0.59.0indirect
npm@oxfmt/binding-linux-x64-gnu0.59.0indirect
npm@oxfmt/binding-linux-x64-musl0.59.0indirect
npm@oxfmt/binding-openharmony-arm640.59.0indirect
npm@oxfmt/binding-win32-arm64-msvc0.59.0indirect
npm@oxfmt/binding-win32-ia32-msvc0.59.0indirect
npm@oxfmt/binding-win32-x64-msvc0.59.0indirect
npm@oxlint/binding-android-arm-eabi1.74.0indirect
npm@oxlint/binding-android-arm641.74.0indirect
npm@oxlint/binding-darwin-arm641.74.0indirect
npm@oxlint/binding-darwin-x641.74.0indirect
npm@oxlint/binding-freebsd-x641.74.0indirect
npm@oxlint/binding-linux-arm-gnueabihf1.74.0indirect
npm@oxlint/binding-linux-arm-musleabihf1.74.0indirect
npm@oxlint/binding-linux-arm64-gnu1.74.0indirect
npm@oxlint/binding-linux-arm64-musl1.74.0indirect
npm@oxlint/binding-linux-ppc64-gnu1.74.0indirect
npm@oxlint/binding-linux-riscv64-gnu1.74.0indirect
npm@oxlint/binding-linux-riscv64-musl1.74.0indirect
npm@oxlint/binding-linux-s390x-gnu1.74.0indirect
npm@oxlint/binding-linux-x64-gnu1.74.0indirect
npm@oxlint/binding-linux-x64-musl1.74.0indirect
npm@oxlint/binding-openharmony-arm641.74.0indirect
npm@oxlint/binding-win32-arm64-msvc1.74.0indirect
npm@oxlint/binding-win32-ia32-msvc1.74.0indirect
npm@oxlint/binding-win32-x64-msvc1.74.0indirect
npm@rollup/pluginutils5.4.0indirect
npm@sindresorhus/merge-streams4.0.0indirect
npm@types/estree1.0.9indirect
npm@types/istanbul-lib-coverage2.0.6indirect
npm@typescript/typescript-aix-ppc647.0.2indirect
npm@typescript/typescript-darwin-arm647.0.2indirect
npm@typescript/typescript-darwin-x647.0.2indirect
npm@typescript/typescript-freebsd-arm647.0.2indirect
npm@typescript/typescript-freebsd-x647.0.2indirect
npm@typescript/typescript-linux-arm7.0.2indirect
npm@typescript/typescript-linux-arm647.0.2indirect
npm@typescript/typescript-linux-loong647.0.2indirect
npm@typescript/typescript-linux-mips64el7.0.2indirect
npm@typescript/typescript-linux-ppc647.0.2indirect
npm@typescript/typescript-linux-riscv647.0.2indirect
npm@typescript/typescript-linux-s390x7.0.2indirect
npm@typescript/typescript-linux-x647.0.2indirect
npm@typescript/typescript-netbsd-arm647.0.2indirect
npm@typescript/typescript-netbsd-x647.0.2indirect
npm@typescript/typescript-openbsd-arm647.0.2indirect
npm@typescript/typescript-openbsd-x647.0.2indirect
npm@typescript/typescript-sunos-x647.0.2indirect
npm@typescript/typescript-win32-arm647.0.2indirect
npm@typescript/typescript-win32-x647.0.2indirect
npm@vercel/nft1.10.2indirect
npmabbrev3.0.1indirect
npmacorn8.17.0indirect
npmacorn-import-attributes1.9.5indirect
npmacorn-walk8.3.5indirect
npmagent-base7.1.4indirect
npmansi-regex6.2.2indirect
npmansi-styles6.2.3indirect
npmargparse1.0.10indirect
npmarray-find-index1.0.2indirect
npmarray-union2.1.0indirect
npmarrgv1.0.2indirect
npmarrify3.0.0indirect
npmasync3.2.6indirect
npmasync-sema3.1.1indirect
npmava8.0.1indirect
npmbalanced-match4.0.4indirect
npmbindings1.5.0indirect
npmblueimp-md52.19.0indirect
npmbrace-expansion5.0.7indirect
npmbraces3.0.3indirect
npmc812.0.0indirect
npmcallsites4.2.0indirect
npmcbor22.3.0indirect
npmchalk5.6.2indirect
npmchownr3.0.0indirect
npmchunkd2.0.1indirect
npmci-info4.4.0indirect
npmci-parallel-vars1.0.1indirect
npmcli-truncate6.1.1indirect
npmcliui9.0.1indirect
npmcode-excerpt4.0.0indirect
npmcommander13.1.0indirect
npmcommon-path-prefix3.0.0indirect
npmcommondir1.0.1indirect
npmconcordance5.0.4indirect
npmconsola3.4.2indirect
npmconvert-source-map2.0.0indirect
npmconvert-to-spaces2.0.1indirect
npmcross-spawn7.0.6indirect
npmcurrently-unhandled0.4.1indirect
npmdate-time3.1.0indirect
npmdebug4.4.3indirect
npmdetect-libc2.1.2indirect
npmdir-glob3.0.1indirect
npmemail-addresses5.0.0indirect
npmemittery2.0.0indirect
npmemoji-regex10.6.0indirect
npmescalade3.2.0indirect
npmescape-string-regexp1.0.5indirect
npmescape-string-regexp2.0.0indirect
npmescape-string-regexp5.0.0indirect
npmesprima4.0.1indirect
npmestree-walker2.0.2indirect
npmesutils2.0.3indirect
npmfast-diff1.3.0indirect
npmfast-glob3.3.3indirect
npmfastq1.20.1indirect
npmfigures6.1.0indirect
npmfile-uri-to-path1.0.0indirect
npmfilename-reserved-regex2.0.0indirect
npmfilenamify4.3.0indirect
npmfill-range7.1.1indirect
npmfind-cache-dir3.3.2indirect
npmfind-up4.1.0indirect
npmfind-up5.0.0indirect
npmfind-up-simple1.0.1indirect
npmforeground-child3.3.1indirect
npmfs-extra11.3.6indirect
npmget-caller-file2.0.5indirect
npmget-east-asian-width1.6.0indirect
npmgh-pages6.3.0indirect
npmglob13.0.6indirect
npmglob-parent5.1.2indirect
npmglobby11.1.0indirect
npmglobby16.2.2indirect
npmgraceful-fs4.2.11indirect
npmhas-flag4.0.0indirect
npmhtml-escaper2.0.2indirect
npmhttps-proxy-agent7.0.6indirect
npmignore5.3.2indirect
npmignore7.0.6indirect
npmignore-by-default2.1.0indirect
npmindent-string5.0.0indirect
npmirregular-plurals4.2.0indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point5.1.0indirect
npmis-glob4.0.3indirect
npmis-number7.0.0indirect
npmis-path-inside4.0.0indirect
npmis-plain-object5.0.0indirect
npmis-promise4.0.0indirect
npmis-unicode-supported2.1.0indirect
npmisexe2.0.0indirect
npmistanbul-lib-coverage3.2.2indirect
npmistanbul-lib-report3.0.1indirect
npmistanbul-reports3.2.0indirect
npmjs-string-escape1.0.1indirect
npmjs-yaml3.15.0indirect
npmjsonfile6.2.1indirect
npmload-json-file7.0.1indirect
npmlocate-path5.0.0indirect
npmlocate-path6.0.0indirect
npmlodash4.18.1indirect
npmlru-cache11.5.2indirect
npmmake-dir3.1.0indirect
npmmake-dir4.0.0indirect
npmmatcher6.0.0indirect
npmmd5-hex3.0.1indirect
npmmemoize11.0.0indirect
npmmerge21.4.1indirect
npmmicromatch4.0.8indirect
npmmimic-function5.0.1indirect
npmminimatch10.2.5indirect
npmminipass7.1.3indirect
npmminizlib3.1.0indirect
npmms2.1.3indirect
npmnode-fetch2.7.0indirect
npmnode-gyp-build4.8.4indirect
npmnopt8.1.0indirect
npmoxfmt0.59.0indirect
npmoxlint1.74.0indirect
npmp-limit2.3.0indirect
npmp-limit3.1.0indirect
npmp-locate4.1.0indirect
npmp-locate5.0.0indirect
npmp-map7.0.5indirect
npmp-try2.2.0indirect
npmpackage-config5.0.0indirect
npmparse-ms4.0.0indirect
npmpath-exists4.0.0indirect
npmpath-key3.1.1indirect
npmpath-scurry2.0.2indirect
npmpath-type4.0.0indirect
npmpicomatch2.3.2indirect
npmpicomatch4.0.5indirect
npmpkg-dir4.2.0indirect
npmplur6.0.0indirect
npmpretty-ms9.3.0indirect
npmqueue-microtask1.2.3indirect
npmresolve-cwd3.0.0indirect
npmresolve-from5.0.0indirect
npmreusify1.1.0indirect
npmrun-parallel1.2.0indirect
npmsemver6.3.1indirect
npmsemver7.8.5indirect
npmserialize-error7.0.1indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmsignal-exit4.1.0indirect
npmslash3.0.0indirect
npmslash5.1.0indirect
npmslice-ansi9.0.0indirect
npmsprintf-js1.0.3indirect
npmstack-utils2.0.6indirect
npmstring-width7.2.0indirect
npmstring-width8.2.2indirect
npmstrip-ansi7.2.0indirect
npmstrip-outer1.0.1indirect
npmsupertap3.0.1indirect
npmsupports-color7.2.0indirect
npmtar7.5.20indirect
npmtemp-dir3.0.0indirect
npmtest-exclude8.0.0indirect
npmtime-zone1.0.0indirect
npmtinypool2.1.0indirect
npmto-regex-range5.0.1indirect
npmtr460.0.3indirect
npmtrim-repeated1.0.0indirect
npmtype-fest0.13.1indirect
npmtypescript7.0.2indirect
npmunicorn-magic0.4.0indirect
npmuniversalify2.0.1indirect
npmv8-to-istanbul9.3.0indirect
npmwebidl-conversions3.0.1indirect
npmwell-known-symbols2.0.0indirect
npmwhatwg-url5.0.0indirect
npmwhich2.0.2indirect
npmwrap-ansi9.0.2indirect
npmwrite-file-atomic7.0.1indirect
npmy18n5.0.8indirect
npmyallist5.0.0indirect
npmyargs18.0.0indirect
npmyargs-parser21.1.1indirect
npmyargs-parser22.0.0indirect
npmyocto-queue0.1.0indirect
Dependency advisories 2

This repository publishes no package the index resolves, so its own dependency graph was assessed — 259 packages, which also include development and test pins that never ship: 2 carry known advisories, of which 0 are direct.

PackageVersionRelationSeverityAdvisoriesFixed in
brace-expansion5.0.7indirecthigh15.0.8
tar7.5.20indirectmoderate17.5.21

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "browser",
        "router",
        "hash",
        "pushstate",
        "callback",
        "react"
      ],
      "is_fork": false,
      "size_kb": 4316,
      "has_wiki": true,
      "homepage": "https://kidkarolis.github.io/space-router/",
      "languages": {
        "TypeScript": 51547
      },
      "pushed_at": "2026-07-20T11:23:51Z",
      "created_at": "2017-03-12T15:06:54Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T11:24:35Z",
      "description": "Framework agnostic router for single page apps",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "ISC",
      "default_branch": "master",
      "license_spdx_raw": "ISC",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://humaans.io/",
      "name": "Karolis Narkevicius",
      "type": "User",
      "login": "KidkArolis",
      "company": "Humaans",
      "location": "London",
      "followers": 117,
      "avatar_url": "https://avatars.githubusercontent.com/u/324440?v=4",
      "created_at": "2010-07-06T16:22:58Z",
      "is_verified": null,
      "public_repos": 143,
      "account_age_days": 5864
    },
    "license": {
      "state": "standard",
      "spdx_id": "ISC",
      "raw_spdx": "ISC",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-07-20T11:16:43Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2026-07-19T10:48:55Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-19T00:01:33Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-18T23:40:51Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-07-07T18:03:32Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-07-06T19:58:45Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-06T17:53:48Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-04-25T11:11:44Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-02-23T21:43:24Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2025-11-23T18:55:56Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2024-05-01T11:18:51Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2023-11-05T10:48:09Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2023-04-12T09:51:16Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2023-04-11T21:54:48Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2022-04-05T22:20:32Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2021-11-13T22:19:05Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2021-11-13T21:49:01Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2021-11-05T23:20:51Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2021-11-05T15:17:21Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2021-10-26T21:56:01Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2018-09-12T09:38:56Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2018-09-11T12:52:56Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2018-08-28T21:59:01Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2018-03-29T08:25:46Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2017-12-06T17:20:09Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2017-12-06T17:15:34Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2017-10-17T22:28:01Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2017-03-16T11:20:15Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2017-03-15T10:28:18Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2017-03-13T23:10:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "15b30e674973478057ca66603860681ec69ce5c5",
          "body": null,
          "is_bot": false,
          "headline": "Improve doc styling",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-20T11:23:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a25c19e6400a84e8dcb5e1cb0ee9bc7b524fc993",
          "body": null,
          "is_bot": false,
          "headline": "2.0.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-20T11:16:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ed845617914fb906e33d4438dc64384473cf21e",
          "body": null,
          "is_bot": false,
          "headline": "Pin Hugo for docs builds",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-20T11:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e81f12fc2c36e6d05c7dd0944f1bfc1265b00c2",
          "body": null,
          "is_bot": false,
          "headline": "Add mode-aware hrefs and navigation metadata",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-20T11:14:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2beb56c6d9776a1c7b045bdef1feb06754970b9a",
          "body": null,
          "is_bot": false,
          "headline": "1.4.2",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-19T10:48:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dcd5bb2228a54a26e444aef00ce584bec225042",
          "body": "- href (and therefore navigate) now drops unfilled :name? and :name*\n  segments instead of leaving the literal pattern text in the url\n- ship declaration maps so go-to-definition lands in the published src\n- use git+https for the repository url in package.json\n- docs: clarify that listen's initial o\n[…]\nlivered via the\n  scheduler, not synchronously\n- flatten test fixture: /baz/* -> /baz/:rest* so the example teaches\n  the real wildcard spelling\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop unfilled optional and splat params in href, polish package edges",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-19T10:47:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58a2bef9e33c7635e21489632cf16b0dffbe00dd",
          "body": null,
          "is_bot": false,
          "headline": "1.4.1",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-19T00:01:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a736baf9256f06f59cad1ac1ead44e38a14340a4",
          "body": "Types-only: From is now { pathname?, params?, query?, hash?, pattern? }\ninstead of Partial<Route> | NavigateTarget. Routes, partial routes, and\nstored navigation targets all still satisfy it structurally, and merge()\ndrops both its type parameter and the 'in' narrowing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tighten From to the exact fields merge reads",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-18T23:59:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "74b3c14dd05e11585958624812f98bfbe6801c03",
          "body": null,
          "is_bot": false,
          "headline": "1.4.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-18T23:40:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ff27f2ee96575a0924913b4d362b71aca51a34a",
          "body": "Route metadata stays flat rather than nested under a meta field — the\nnesting was built and reverted before release. Record why, the accepted\nprice (the flatten casts, reserved field names), and the general bar for\nchanges, with a pointer comment at the casts themselves.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document the flat route metadata decision in AGENTS.md",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-18T23:40:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72521601bc76f8000b59ebf8ed2ffe6a62025cae",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-18T23:22:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f239a61ca7ca37c4ff514326376308cb2cb6bf37",
          "body": "…to, from)\n\n- history subscriptions get identity-owned, idempotent disposers: a stale\n  disposer can't remove a newer listener, disposal invalidates pending\n  emissions, failed initial delivery cleans up transactionally, and a\n  rejected second router listen no longer replaces the active matcher\n- m\n[…]\npt partial routes and\n  navigation targets via the new From type, matching runtime behavior\n- add a tsc --noEmit typecheck step to the test gate\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Harden history subscriptions, tolerate malformed urls, type navigate(…",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-18T23:21:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "190cebc42e427741c05edad1fb42ec91e2686d4a",
          "body": null,
          "is_bot": false,
          "headline": "1.3.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-07T18:03:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1920c9df0f22c08a25c00f562ca676633091b0e9",
          "body": "Replaces the current history entry without emitting a route change, for\ncallers that have already committed a route and only need the address\nbar to agree — e.g. after a pre-commit transform rewrote the url.\nBacked by a new history.replaceSilent, which uses replaceState in both\nhistory and hash modes (never location.replace, which fires hashchange\nand would emit) and overwrites the top of the stack in memory mode.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add router.replaceUrl for silent, mode-aware url replacement",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-07T17:57:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d07a06240e7a83a3bf65366f545372c9d91f8f3c",
          "body": null,
          "is_bot": false,
          "headline": "1.2.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T19:58:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13e2ae3eb1f4f5b256de6e827a7fbce5e6643f2a",
          "body": "createRouter and createHistory accept schedule(fire, info) to control\nhow url changes are delivered to the listener. info.traversal is true\nfor back/forward traversals (popstate/hashchange), false for\nprogrammatic navigations and the initial listen. sync: true is now\nshorthand for the immediate sche\n[…]\ne guard:\nsuperseded fires no-op and the surviving one reads the url at fire\ntime, so mixed schedules collapse to a single emit of the final url.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add a pluggable schedule option for emit delivery",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T19:58:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8c283eee6a2ffee1a50b84dd3f4b6894c4facfa",
          "body": null,
          "is_bot": false,
          "headline": "1.1.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:53:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb1636cda738c6e5663c43d91aba8f6703afb9cf",
          "body": "ava 8 requires the extensions option to be an array — the module\ntype now comes from the package's type field.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Upgrade dev dependencies",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:53:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d22662f0a2bb4f004024024b988df2b61ced37d",
          "body": "- memory mode getUrl returns '' instead of undefined before any\n  navigation, and replace on an empty stack creates the entry\n  explicitly instead of relying on out-of-bounds index assignment\n- flatten no longer emits unmatchable entries for pathless routes\n- document the sync option and createHistory\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tidy up API edges",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:47:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e1d832a7528861b12cd2d4965a312bc15910f25",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'codex/create-matcher-api'",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66c606460a2c7e89b48f1d4f4ca964929de16bb6",
          "body": "Add createMatcher API",
          "is_bot": false,
          "headline": "Merge pull request #23 from KidkArolis/codex/create-matcher-api",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ded1de50abb3c34772b29364cbd448f3f5e0cf9",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document createMatcher and route data path",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:35:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2918253738260f02c6c02d9f86503dbf3a176970",
          "body": "- match routes in a single pass in createMatcher, dropping the\n  data() pattern re-lookup and the now-unused match() helper\n- require path on RouteData so matched data segments expose it\n  as a plain string, while RouteDefinition keeps it optional\n- narrow Matcher.match to accept a string\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify matcher internals and tighten route data types",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-07-06T17:28:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e6e16169b610d30fe872e54daf2f50bfd437ec9",
          "body": null,
          "is_bot": false,
          "headline": "Simplify route data types",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-29T21:27:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "166b90944b5ff6f9ec192cf88cc34419c69d42b4",
          "body": null,
          "is_bot": false,
          "headline": "Add createMatcher API",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-28T22:50:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1aec7a01f2d1b0708cff26c761853d0de77a6845",
          "body": "Hugo removed the _internal/google_analytics_async.html template some\nversions ago, which broke `npm run release:docs`. There is no GA\nconfigured anyway, so the line was dead code. Also gitignore hugo's\nbuild lock file.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop deprecated google_analytics_async template from docs base layout",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T11:13:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59de521fe303eb18156f280af9f61005d4a64503",
          "body": null,
          "is_bot": false,
          "headline": "1.0.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T11:11:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66ca98d95bbf05fb01cc5f12da773e12a4828b98",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add 1.0.0 changelog entry",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T11:09:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e878f27ad694bfcfb715448ff10dc5bc1c659c7",
          "body": "- Document param flag suffixes (:name?, :name+, :name*, *) — these\n  have always been real features but were never written up.\n- Note that href encodes params so values round-trip through match\n  even with /, spaces and other special chars.\n- Document the navigate(to, curr) and href(to, curr) second\n[…]\n-loop cap (10 hops).\n- Advertise that TypeScript types ship out of the box.\n- Fix typos: \"applocation\", \"not not\", \"the to\", \"array of arrays\".\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refresh docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T11:07:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1e638f84d72f478dc504dc916033a5618d73859",
          "body": "Migrate to TypeScript, ship ESM-only, modernise build",
          "is_bot": false,
          "headline": "Merge pull request #21 from KidkArolis/chore/typescript-esm-only",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:56:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a52312a0161e039497f5725b1bdb7aa561090755",
          "body": "Brings hash mode in line with history mode for the \"navigate to the\ncurrent URL\" case. History mode already re-fires the listener\nbecause pushState is silent and we manually schedule. Hash mode\nrelied on the browser's hashchange event, which doesn't fire when\nthe URL is unchanged — so listeners sile\n[…]\nual hashchange land in different\nticks and produce two emits (both with the final URL). Niche;\nlisteners are typically idempotent against this.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make hash mode emit on same-URL navigation",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:55:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4633910768d2fb16d7bf0fcc01dac4181f909ca3",
          "body": "Drop requestAnimationFrame for the browser path. The router emit\ndoesn't need paint alignment — downstream frameworks already batch\nstate→render. queueMicrotask works in both browser and SSR, fires\nregardless of tab visibility, and removes the SSR/browser branch.\n\nCoalesce while we're here: a burst \n[…]\nsses (calls emit synchronously). Browser\npopstate/hashchange events also flow through the scheduler so rapid\nback/forward presses coalesce too.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use queueMicrotask everywhere and coalesce emits",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:46:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c8bb5d7de700a92ccc8a3e3a08017b31cd3d4c6e",
          "body": "- Source: src/*.js → src/*.ts with full type annotations. Generic Data\n  parameter on Route, Router, RouteDefinition so consumers get typed\n  metadata. Internal imports use .ts extensions and tsc rewrites them\n  to .js on emit (allowImportingTsExtensions + rewriteRelativeImport-\n  Extensions).\n- Out\n[…]\nns; modernise the flag\n    extraction to ?.[0] ?? ''.\n\nEngines bumped to >=18 for ESM. Published tarball: 51 files / 342 kB\n→ 18 files / 28 kB.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Migrate to TypeScript, ship ESM-only, modernise the build",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:40:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f55f72d59eeea6e8daa96f77385a720cf92f4b98",
          "body": "Migrated config via `oxfmt --migrate=prettier`. No source-file changes;\noxfmt produces identical formatting for the existing files.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Replace prettier with oxfmt",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:08:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "81c5b0622df1814ef6001e56a37885dad057183c",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix license SPDX identifier (ICS → ISC)",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:06:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2f52c361e70a78369264dcc991fdfea322d964dc",
          "body": "Fix correctness bugs in href/qs/redirects and add TypeScript types",
          "is_bot": false,
          "headline": "Merge pull request #20 from KidkArolis/fix/correctness-and-types",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:06:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a4e0b0198a015cc4cd81b224a451ac006b252da",
          "body": "…ypes\n\n- href: single regex pass over :name[+*?] placeholders. Encodes values,\n  strips flags, and avoids substring collisions when params share a\n  name prefix (e.g. :id inside :idName).\n- qs.parse: decode keys, keep everything after the first = in the value,\n  treat + as space, handle missing =. q\n[…]\nside the hash fragment.\n- Ship index.d.ts at the package root with a generic Data parameter on\n  routes/router so consumers get typed metadata.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix correctness bugs in href/qs/redirects/lifecycle, add TypeScript t…",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-25T10:05:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1971668ff32348e97249de2440fdb44a501f2cf",
          "body": null,
          "is_bot": false,
          "headline": "Update deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-04-07T19:53:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efa406c74d02a0073ed00983870d112a17cc1df8",
          "body": null,
          "is_bot": false,
          "headline": "Run npm update",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-03-05T11:35:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9107d3cc35c98d26638a8ccfcbbe11bac653513",
          "body": null,
          "is_bot": false,
          "headline": "0.9.5",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-02-23T21:43:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14daf90183d5a9ca310430e2bf8fd1dc84ccdd9d",
          "body": null,
          "is_bot": false,
          "headline": "Fix linting",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-02-23T21:42:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "953cb4c62724b9cfb101fcbb2ba11abf30397ea9",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-02-23T21:41:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e9d9d81fe5efb94d06dfab330599a6263abd53e",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-02-03T22:59:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8d5352dca22efc6426021a0c875f57b920683c0",
          "body": null,
          "is_bot": false,
          "headline": "Bump deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2026-01-19T14:01:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f8696d0e8e7f747ae543fb39be344e8e456b99a",
          "body": null,
          "is_bot": false,
          "headline": "0.9.4",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2025-11-23T18:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b4dab1d26ac8fd653ae06e2746d97dc7b7f63ed",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2025-11-23T18:55:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07a0733a5746ebf2d88b698ce7ae1c7b0d1561d0",
          "body": null,
          "is_bot": false,
          "headline": "0.9.3",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2024-05-01T11:18:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54d6c3abaa24a6f71f9167afa7a3595311150553",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2024-05-01T11:18:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13cee1020c7dc9107a1e861c3bd746d5942dee73",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2024-05-01T11:17:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61044308a8819f7d3ca14e7320a0585414f4e4a9",
          "body": null,
          "is_bot": false,
          "headline": "0.9.2",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-11-05T10:48:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48edc641173606b9a84b891419dae65c4aea629f",
          "body": null,
          "is_bot": false,
          "headline": "Add engines.node",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-11-05T10:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47fc61dffd4ee16db3f8887ce697ef5b57810969",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade all deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-11-05T10:46:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e023a3394d16f1ce4c99420c30e510e8684e6688",
          "body": null,
          "is_bot": false,
          "headline": "0.9.1",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-04-12T09:51:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15eb50feeed52c2c8a626117f39d4a2cbc72a0b3",
          "body": null,
          "is_bot": false,
          "headline": "Revert to cjs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-04-12T09:50:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3578eec8d0824f86e9d15e8daa24842eba79eb6",
          "body": null,
          "is_bot": false,
          "headline": "0.9.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-04-11T21:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ab84b9e039575b3b56967ec60281d38dd700e68",
          "body": null,
          "is_bot": false,
          "headline": "Check in dist files",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-04-11T21:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fda66c019c56c492caacc847e452735a56f9ef9",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade all deps, switch to swc",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2023-04-11T21:53:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6721e45261691edc60d5d63b53abdd2c564001c9",
          "body": null,
          "is_bot": false,
          "headline": "0.8.5",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2022-04-05T22:20:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d12d12db0cbb7cd1fe49c8c283dfec1c9a98469",
          "body": null,
          "is_bot": false,
          "headline": "Update dev deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2022-04-05T22:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a49eb62fba176a0b632141462497e6339820daa0",
          "body": null,
          "is_bot": false,
          "headline": "Improve docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2022-04-05T22:16:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d9ef1379834259fb645fe3d24e64f348c558672",
          "body": null,
          "is_bot": false,
          "headline": "Fix redirects and improve merge with curr context, improve docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-14T19:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f6defb5ba803cf565d6b14c7a7884a9fd914d95",
          "body": null,
          "is_bot": false,
          "headline": "Fix redirects when not in memory mode",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-14T11:36:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac06c44ba010a85e26c5846b6fdbf889ea6c99d8",
          "body": null,
          "is_bot": false,
          "headline": "0.8.4",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-13T22:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dda52b3d5cab4f9f5a70860da824c85a7e1eefe",
          "body": null,
          "is_bot": false,
          "headline": "Fix the navigate(str) implementation",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-13T22:18:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc245a31e673cb83b851942549e9574973a3335b",
          "body": null,
          "is_bot": false,
          "headline": "0.8.3",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-13T21:49:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08733c9c0775653601b2f9fa2e5a4f810db133b6",
          "body": null,
          "is_bot": false,
          "headline": "Re-add string navigation",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-13T21:48:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31f12e1d8ebdac5cec11d1a6b921f6df4f3262ca",
          "body": null,
          "is_bot": false,
          "headline": "Add --no-release-draft to np commands",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T23:22:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "298d7886de4b8c54826527fec964b7b18c9ff687",
          "body": null,
          "is_bot": false,
          "headline": "0.8.2",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T23:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7131426b2621d0d4f0a9cc8be2df200e9f410d24",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade deps",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T23:20:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16473bf305af13397746098e58b7e3cf7b2cbfc4",
          "body": null,
          "is_bot": false,
          "headline": "Fix an issue with webpack bundling caused by referencing setImmediate",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T23:18:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfe92775f377fdd31895a7f62001efa18cd34a91",
          "body": null,
          "is_bot": false,
          "headline": "0.8.1",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T15:17:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f1754dfefc21499b30b11c7ce222a15f92f91cb",
          "body": null,
          "is_bot": false,
          "headline": "Update docs and changelog with info about the new feature",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T15:16:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39edd97f1637528d5f1de3ee6ea99fecad41176e",
          "body": "Useful when used in async context where reading router URL is not safe",
          "is_bot": false,
          "headline": "Allow passing the current route to be merged instead of getUrl",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T15:14:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbcdb2a1c77bb275e8d07d703c2105a9ab7c47a9",
          "body": null,
          "is_bot": false,
          "headline": "Fix the docs site meta",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-11-05T15:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f873b6515f212e2eee326bb5548c0f3d3fd9b0e",
          "body": null,
          "is_bot": false,
          "headline": "0.8.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:56:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65bb227d1ada2106edbe78e1b8bb61aca8b877e2",
          "body": null,
          "is_bot": false,
          "headline": "Fix prettierignore",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:55:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45f62e38fd1a895b3cc40922005a1629f7c29e90",
          "body": null,
          "is_bot": false,
          "headline": "Add npmignore",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:53:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15eb51afd792ba84abc49a468a9c8155bff02d19",
          "body": null,
          "is_bot": false,
          "headline": "Fix docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44957fe6e12730dbae4bb8a8ccb9a63b64d85fcd",
          "body": "And wrt to async routes or react bindings - it just needs to be re-implemented in that context\nso that it works correctly there too",
          "is_bot": false,
          "headline": "Readd merge option to navigate - it's super useful",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:48:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51a16a12e4797ee5cc2e5d96d7faafd642c7007c",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-26T21:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de30ea0f0a8bdabedbd8b02b6264760d1a638d11",
          "body": null,
          "is_bot": false,
          "headline": "Improve test coverage, add redirect fn support",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-24T17:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b559a515834b7a6879d140e800753cf9b5a65d37",
          "body": null,
          "is_bot": false,
          "headline": "Fix linting",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-24T17:03:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "020737cc7de94f8cf331eaff5d5cb92d9c767933",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused images from the docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-24T17:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "504b58a7a0277562d9ff635fb04d8fd67dd518e9",
          "body": null,
          "is_bot": false,
          "headline": "Remove old examples",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-24T17:03:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b35f79aa9b0493ad9ddfafb0115c6fe5959fa5b2",
          "body": null,
          "is_bot": false,
          "headline": "Improve docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-24T09:30:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbc4ae81ab75e86c734e60cdcf4d2b1ac3ab8513",
          "body": null,
          "is_bot": false,
          "headline": "Fix the link in the README",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9aca03e738dc996dadbc6cbb76401673ab4dbab",
          "body": null,
          "is_bot": false,
          "headline": "Add image to the README",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:13:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eb837fdf6be01c1e7d1c1688237f32817b55832",
          "body": "Next clean",
          "is_bot": false,
          "headline": "Merge pull request #19 from KidkArolis/next-clean",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:11:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39ac72b56d59e13e1e3b3e1e69fa952abbbe8a89",
          "body": null,
          "is_bot": false,
          "headline": "Install gh-pages",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13380811eaabf26b20c8fc8eb9b29a81c8c83479",
          "body": null,
          "is_bot": false,
          "headline": "Update docs",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:09:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "469ed7ded193c84ac6ecf65813cb4bf79ea02e87",
          "body": null,
          "is_bot": false,
          "headline": "Add the build step",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T11:09:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "add75fb4270ea76f4e1ba0f7093337d76e544b9a",
          "body": null,
          "is_bot": false,
          "headline": "Add license",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-23T10:05:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365e26ec571f4623a9106894329f2aa429a378ef",
          "body": "True care, truth brings",
          "is_bot": false,
          "headline": "All the small things",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2021-10-19T21:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e68e768dbd00a1363dbc2d9800cf6827c2d4585e",
          "body": null,
          "is_bot": false,
          "headline": "Reformat code with prettier",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2019-03-25T21:03:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "353f93c83646a59e588ccd8d7c356415878ec228",
          "body": null,
          "is_bot": false,
          "headline": "Something something file permissions",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2019-01-19T10:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "892c49d77625823d35c2bb37cca08d08dea8a1fd",
          "body": null,
          "is_bot": false,
          "headline": "0.7.0",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2018-09-12T09:38:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22d4fe03bc013907bf93f8c9d8cbffe0cbefa1eb",
          "body": "Next",
          "is_bot": false,
          "headline": "Merge pull request #16 from KidkArolis/next",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2018-09-12T09:37:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d841271f66065933d73a9efea1514037231cf71d",
          "body": null,
          "is_bot": false,
          "headline": "Clarify the Changelog",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2018-09-12T09:36:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a18fcf25615fb0e7fbeb6bc148b40522bccae5f1",
          "body": null,
          "is_bot": false,
          "headline": "Remove superflous language",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2018-09-12T09:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dfdf9b7fc2260ac6f0f28874825e4171920a815",
          "body": null,
          "is_bot": false,
          "headline": "Simplify the README and add all the missing info",
          "author_name": "Karolis Narkevicius",
          "author_login": "KidkArolis",
          "committed_at": "2018-09-12T09:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 30,
      "commits_last_year": 46,
      "latest_release_at": "2026-07-20T11:16:43Z",
      "latest_release_tag": "v2.0.0",
      "releases_from_tags": true,
      "days_since_last_push": 6,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 26.5
    },
    "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": "space-router",
          "exists": true,
          "license": "ISC",
          "keywords": [
            "browser",
            "router",
            "small",
            "clientside",
            "universal",
            "history",
            "location",
            "url"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/space-router",
          "is_deprecated": false,
          "latest_version": "2.0.0",
          "repository_url": "https://github.com/KidkArolis/space-router",
          "versions_count": 29,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3866,
          "first_published_at": "2017-03-15T10:28:23.359000Z",
          "latest_published_at": "2026-07-20T11:16:55.179000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 4,
      "stars": 39,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2017-10-17",
            "count": 1
          },
          {
            "date": "2019-03-08",
            "count": 1
          },
          {
            "date": "2019-09-22",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_forks": 4
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "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": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 49988,
      "source_files_sampled": 14,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 1527
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "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.20",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-r292-9mhp-454m"
            ],
            "fixed_version": "7.5.21",
            "advisory_count": 1,
            "oldest_advisory_days": 1
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 2,
        "affected_count": 2,
        "assessed_count": 259,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@bcoe/v8-coverage",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@cto.af/wtf8",
            "direct": false,
            "version": "0.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/fs-minipass",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@istanbuljs/schema",
            "direct": false,
            "version": "0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@mapbox/node-pre-gyp",
            "direct": false,
            "version": "2.0.3",
            "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": "@oxfmt/binding-android-arm-eabi",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-android-arm64",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-darwin-arm64",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-darwin-x64",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-freebsd-x64",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-arm-musleabihf",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-arm64-gnu",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-arm64-musl",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-riscv64-gnu",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-riscv64-musl",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-s390x-gnu",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-x64-gnu",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-linux-x64-musl",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-openharmony-arm64",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-win32-arm64-msvc",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-win32-ia32-msvc",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxfmt/binding-win32-x64-msvc",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-android-arm-eabi",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-android-arm64",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-darwin-arm64",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-darwin-x64",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-freebsd-x64",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-arm-musleabihf",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-riscv64-gnu",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-riscv64-musl",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-linux-x64-musl",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-openharmony-arm64",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-win32-ia32-msvc",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@oxlint/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/pluginutils",
            "direct": false,
            "version": "5.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/merge-streams",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/istanbul-lib-coverage",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-aix-ppc64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-darwin-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-darwin-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-freebsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-freebsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-arm",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-loong64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-mips64el",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-ppc64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-riscv64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-s390x",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-netbsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-netbsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-openbsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-openbsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-sunos-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-win32-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-win32-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@vercel/nft",
            "direct": false,
            "version": "1.10.2",
            "ecosystem": "npm"
          },
          {
            "name": "abbrev",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-import-attributes",
            "direct": false,
            "version": "1.9.5",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-walk",
            "direct": false,
            "version": "8.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "agent-base",
            "direct": false,
            "version": "7.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "6.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "array-find-index",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "array-union",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arrgv",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arrify",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "async",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "async-sema",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ava",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "bindings",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "blueimp-md5",
            "direct": false,
            "version": "2.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "c8",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "cbor2",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "5.6.2",
            "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": "cli-truncate",
            "direct": false,
            "version": "6.1.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": "commander",
            "direct": false,
            "version": "13.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "common-path-prefix",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "commondir",
            "direct": false,
            "version": "1.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": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-to-spaces",
            "direct": false,
            "version": "2.0.1",
            "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": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "dir-glob",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "email-addresses",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emittery",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.6.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": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "esprima",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-diff",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-glob",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "fastq",
            "direct": false,
            "version": "1.20.1",
            "ecosystem": "npm"
          },
          {
            "name": "figures",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-uri-to-path",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "filename-reserved-regex",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "filenamify",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-cache-dir",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "4.1.0",
            "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": "foreground-child",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "fs-extra",
            "direct": false,
            "version": "11.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-east-asian-width",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "gh-pages",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "13.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "globby",
            "direct": false,
            "version": "11.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "globby",
            "direct": false,
            "version": "16.2.2",
            "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-escaper",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "https-proxy-agent",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "ignore-by-default",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "indent-string",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "irregular-plurals",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "5.1.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-path-inside",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-promise",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-unicode-supported",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-coverage",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-report",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-reports",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-string-escape",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "3.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsonfile",
            "direct": false,
            "version": "6.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "load-json-file",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "11.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "make-dir",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "make-dir",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "matcher",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "md5-hex",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "memoize",
            "direct": false,
            "version": "11.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": "mimic-function",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minipass",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "minizlib",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "node-fetch",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-gyp-build",
            "direct": false,
            "version": "4.8.4",
            "ecosystem": "npm"
          },
          {
            "name": "nopt",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "oxfmt",
            "direct": false,
            "version": "0.59.0",
            "ecosystem": "npm"
          },
          {
            "name": "oxlint",
            "direct": false,
            "version": "1.74.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-map",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "p-try",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "package-config",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse-ms",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-type",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "plur",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-ms",
            "direct": false,
            "version": "9.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "queue-microtask",
            "direct": false,
            "version": "1.2.3",
            "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": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.5",
            "ecosystem": "npm"
          },
          {
            "name": "serialize-error",
            "direct": false,
            "version": "7.0.1",
            "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": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "slash",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "slash",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "slice-ansi",
            "direct": false,
            "version": "9.0.0",
            "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": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "8.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-outer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "supertap",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "tar",
            "direct": false,
            "version": "7.5.20",
            "ecosystem": "npm"
          },
          {
            "name": "temp-dir",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "test-exclude",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "time-zone",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinypool",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "trim-repeated",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "unicorn-magic",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "universalify",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "v8-to-istanbul",
            "direct": false,
            "version": "9.3.0",
            "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": "wrap-ansi",
            "direct": false,
            "version": "9.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "write-file-atomic",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": false,
            "version": "18.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"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 259,
        "direct_count": 0,
        "indirect_count": 259
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 10,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 8,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "KidkArolis",
          "commits": 149,
          "avatar_url": "https://avatars.githubusercontent.com/u/324440?v=4"
        },
        {
          "type": "User",
          "login": "KwanMan",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/1779673?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.974
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 0,
            "reason": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
            "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/28 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "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": "25 commit(s) and 0 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": null,
            "reason": "no dependencies found",
            "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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "15b30e674973478057ca66603860681ec69ce5c5",
        "ran_at": "2026-07-26T16:25:01Z",
        "aggregate_score": 3.5,
        "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-20T11:23:48Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-06T17:38:02Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/KidkArolis/space-router",
    "host": "github.com",
    "name": "space-router",
    "owner": "KidkArolis"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 48,
        "vitality": 77,
        "community": 44,
        "governance": 58,
        "engineering": 54
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "commits_last_year": 46,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 11
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "46 commits in the last year",
                "points": 15,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "25 commit(s) and 0 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": "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": 88,
            "inputs": {
              "releases_count": 30,
              "latest_release_tag": "v2.0.0",
              "releases_from_tags": true,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 26.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "30 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 30
                    }
                  }
                ],
                "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 ~26.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 26.5
                    }
                  }
                ],
                "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": 6,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 6 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 44,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "forks": 4,
              "stars": 39,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "39 stars",
                "points": 25.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "4 forks",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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 (ISC)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "ISC"
                    }
                  }
                ],
                "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": "moderate",
            "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": 60,
            "inputs": {
              "packages": [
                "space-router"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3866
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,866 downloads/month across npm",
                "points": 47.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3866,
                      "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": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.974
            },
            "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 97% of commits",
                "points": 0.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "merged_prs": 10,
              "open_issues": 0,
              "closed_issues": 8,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "10/15 decided PRs merged",
                "points": 25.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 10,
                      "decided": 15
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "followers": 117,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "KidkArolis",
              "public_repos": 143,
              "account_age_days": 5864
            },
            "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": "117 followers of KidkArolis",
                "points": 14.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 117,
                      "login": "KidkArolis"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "143 public repos, account ~16 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 143
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "space-router"
              ],
              "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": "29 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "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": 54,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "browser",
                "router",
                "hash",
                "pushstate",
                "callback",
                "react"
              ],
              "has_wiki": true,
              "homepage": "https://kidkarolis.github.io/space-router/",
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://kidkarolis.github.io/space-router/",
                "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": "6 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 3.5
            },
            "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": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "25 commit(s) and 0 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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 259 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 259
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 2,
              "assessed_packages": 259,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, moderate 1",
              "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": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "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": 259,
              "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": 3
            },
            "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": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "moderate",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.22,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 1527
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "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": "22 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 11.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 22,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.19,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "19 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 19,
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 49988,
              "source_files_sampled": 14,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/14 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 14,
                      "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T16:25:08.702466Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/KidkArolis/space-router.svg",
  "full_name": "KidkArolis/space-router",
  "license_state": "standard",
  "license_spdx": "ISC"
}

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

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

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