Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 04:32 UTC

opengeos / whitebox-wasm

Pure-Rust geospatial toolkit compiled to WebAssembly. No GDAL, no PROJ, no native libraries, no server.

RustApache-2.0★ 7 stars⑂ 0 forkssince Jun 2026View on GitHub ↗

opengeos/whitebox-wasm holds a health index of 56 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (71/100) and lowest on Community & Adoption (30/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

56
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.

56
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

3,832 followers168 public repossince Apr 2023

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
crates.iowbhdfpoints to another repo — not scored0.1.06150 days agogishdf4hdf5geospatialremote-sensingsciencefilesystemparser-implementations
crates.iowblidarpoints to another repo — not scored0.1.213362 days ago
crates.iowbrasterpoints to another repo — not scored0.2.045762 days agogisgeospatialrastergridremote-sensingencodingfilesystemscience
crates.iowbvectorpoints to another repo — not scored0.1.52,096622 days agogisgeojsongeospatialshapefilegeopackageencoding
crates.iowbgeotiffpoints to another repo — not scored0.1.286376 days agogisrastercoggeotiffbigtiffscienceencodingfilesystem
crates.iowbtopologypoints to another repo — not scored0.2.02,052462 days agogisgeometryspatialtopologyjtsalgorithms
crates.iokdtreepoints to another repo — not scored0.8.0149,07214263 days agosearchtreegeonearestneighbor

Metrics by category

Vitality

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

68Moderate · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
2.8/36Commit cadence — 4/52 weeks with commits
14.2/18Commit volume — 37 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year37
human_commit_share1
days_since_last_push5
active_weeks_last_year4
How it's scored
27/27Ships releases — 6 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~6.3 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count6
latest_release_tagv0.5.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases6.3

Community & Adoption

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

30At risk · 18% of overall
How it's scored
12.6/60Stars — 7 stars
0/25Forks — 0 forks
0/15Watchers — 2 watchers
Inputs used
forks0
stars7
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
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

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/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
10/10OpenSSF Scorecard: Contributors — project has 5 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
38.2/38.3PR acceptance — 9/9 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 2/30 approved changesets -- score normalized to 0
Inputs used
merged_prs9
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs0
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
25/25Owner reach — 3,832 followers of opengeos
19.6/25Track record — 168 public repos, account ~3 yr old
Inputs used
followers3,832
owner_typeOrganization
is_verified
owner_loginopengeos
public_repos168
account_age_days1,205

Engineering Quality

Are baseline engineering and documentation practices in place?

71Good · 20% of overall
How it's scored
24/24CI workflows — 4 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — http://opengeos.org/whitebox-wasm
10/10Repository description
10/10Topics — 8 topics
10/10Wiki
Inputs used
topicscog, geospatial, geotiff, gis, rust, wasm, webassembly, whiteboxtools
has_wikiyes
homepagehttp://opengeos.org/whitebox-wasm
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

46At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 2/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 5 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.3
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages30
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:wbhdf@0.1.0 runtime dependency closure — what installing the published package pulls in — 30 packages. 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.

54Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 36 of 37 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.973
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — Cargo.toml, crates/kdtree-wasm/Cargo.toml, crates/wbcore/Cargo.toml (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Rust (statically typed)
10/10Reproducible environment — lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 37
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesCargo.lock
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, crates/kdtree-wasm/Cargo.toml, crates/wbcore/Cargo.toml, crates/wbgeotiff/Cargo.toml, crates/wbhdf/Cargo.toml, crates/wblidar/Cargo.toml, crates/wbprojection/Cargo.toml, crates/wbraster/Cargo.toml, crates/wbspatialstats/Cargo.toml, crates/wbtools_oss/Cargo.toml, crates/wbtopology/Cargo.toml, crates/wbvector/Cargo.toml, crates/whitebox-cli/Cargo.toml, crates/whitebox-wasm/Cargo.toml
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Rust (statically typed)
48.5/55Manageable file sizes — 48/406 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes2,002,974
source_files_sampled406
oversized_source_files48
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

7GitHub stars
1contributors
37commits, last 12 months
5days since last push
6releases
1bus factor
0open issues
crates.iopackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • crates package 'wbhdf' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • Could not fetch crates package 'wbcore' from its registry
  • crates package 'wblidar' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • crates package 'wbraster' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • crates package 'wbvector' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • crates package 'wbgeotiff' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • crates package 'wbtopology' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring
  • crates package 'kdtree' points at a different repository (https://github.com/mrhooray/kdtree-rs); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

OpenSSF Scorecard 3.3 / 10
3.3aggregate

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-23 04:32 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests9 out of 9 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 2/30 approved changesets -- score normalized to 0
10Contributorsproject has 5 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
3Vulnerabilities7 existing vulnerabilities detected
Direct dependencies 101
RegistryPackageVersion constraintManifest
crates.ionum-traits0.2crates/kdtree-wasm/Cargo.toml
crates.ioserde1.0crates/kdtree-wasm/Cargo.toml
crates.ioserde_derive1.0crates/kdtree-wasm/Cargo.toml
crates.iothiserror2.0crates/kdtree-wasm/Cargo.toml
crates.ioserdecrates/wbcore/Cargo.toml
crates.ioserde_jsoncrates/wbcore/Cargo.toml
crates.iothiserrorcrates/wbcore/Cargo.toml
crates.iothiserror1.0crates/wbgeotiff/Cargo.toml
crates.ioflate21crates/wbgeotiff/Cargo.toml
crates.iolz4_flex0.11crates/wbgeotiff/Cargo.toml
crates.ioweezl0.1crates/wbgeotiff/Cargo.toml
crates.iojpeg-encoder0.6crates/wbgeotiff/Cargo.toml
crates.iojpeg-decoder0.3crates/wbgeotiff/Cargo.toml
crates.iowebp-rust0.2.1crates/wbgeotiff/Cargo.toml
crates.iopng0.17crates/wbgeotiff/Cargo.toml
crates.iozune-core0.5crates/wbgeotiff/Cargo.toml
crates.iozune-jpegxl0.5crates/wbgeotiff/Cargo.toml
crates.iojxl-oxide0.12crates/wbgeotiff/Cargo.toml
crates.iorayon1crates/wbgeotiff/Cargo.toml
crates.iobyteorder1.5crates/wbhdf/Cargo.toml
crates.ioflate21crates/wbhdf/Cargo.toml
crates.iominiz_oxide0.8crates/wbhdf/Cargo.toml
crates.iothiserror1crates/wbhdf/Cargo.toml
crates.iowide1.2crates/wblidar/Cargo.toml
crates.iowbprojection0.3.0crates/wblidar/Cargo.toml
crates.iowbhdf0.1.0crates/wblidar/Cargo.toml
crates.ioreqwest0.12crates/wblidar/Cargo.toml
crates.iorayon1.10crates/wblidar/Cargo.toml
crates.iothiserror1.0crates/wbprojection/Cargo.toml
crates.iowide1.2crates/wbprojection/Cargo.toml
crates.iorayon1.10crates/wbprojection/Cargo.toml
crates.ioserde1.0crates/wbprojection/Cargo.toml
crates.ioserde1crates/wbraster/Cargo.toml
crates.ioserde_json1.0.149crates/wbraster/Cargo.toml
crates.ioflate21.1.9crates/wbraster/Cargo.toml
crates.iotar0.4.45crates/wbraster/Cargo.toml
crates.iozip8.5.1crates/wbraster/Cargo.toml
crates.ioruzstd0.8.2crates/wbraster/Cargo.toml
crates.iolz4_flex0.13.0crates/wbraster/Cargo.toml
crates.iojpeg-encoder0.7.0crates/wbraster/Cargo.toml
crates.iojpeg-decoder0.3.2crates/wbraster/Cargo.toml
crates.iopng0.18.1crates/wbraster/Cargo.toml
crates.iothiserror2.0.18crates/wbraster/Cargo.toml
crates.iorayon1.12.0crates/wbraster/Cargo.toml
crates.iowide1.3.0crates/wbraster/Cargo.toml
crates.iowbprojection0.3.0crates/wbraster/Cargo.toml
crates.iowbgeotiff0.1.2crates/wbraster/Cargo.toml
crates.iowbhdf0.1.0crates/wbraster/Cargo.toml
crates.ionalgebra0.34crates/wbspatialstats/Cargo.toml
crates.iondarray0.15crates/wbspatialstats/Cargo.toml
crates.iorayon1.7crates/wbspatialstats/Cargo.toml
crates.iorand0.8crates/wbspatialstats/Cargo.toml
crates.ioserde1.0crates/wbspatialstats/Cargo.toml
crates.ioserde_json1.0crates/wbspatialstats/Cargo.toml
crates.iothiserror1.0crates/wbspatialstats/Cargo.toml
crates.iolog0.4crates/wbspatialstats/Cargo.toml
crates.iowbcorecrates/wbtools_oss/Cargo.toml
crates.ioserdecrates/wbtools_oss/Cargo.toml
crates.ioserde_jsoncrates/wbtools_oss/Cargo.toml
crates.iowbrastercrates/wbtools_oss/Cargo.toml
crates.iowbgeotiffcrates/wbtools_oss/Cargo.toml
crates.iowbvectorcrates/wbtools_oss/Cargo.toml
crates.iowbprojectioncrates/wbtools_oss/Cargo.toml
crates.iowbtopologycrates/wbtools_oss/Cargo.toml
crates.iowblidarcrates/wbtools_oss/Cargo.toml
crates.iowbspatialstatscrates/wbtools_oss/Cargo.toml
crates.iorayon1crates/wbtools_oss/Cargo.toml
crates.iorand0.10.0crates/wbtools_oss/Cargo.toml
crates.iowide1.2.0crates/wbtools_oss/Cargo.toml
crates.iochrono0.4crates/wbtools_oss/Cargo.toml
crates.ioimage0.25crates/wbtools_oss/Cargo.toml
crates.iokdtree0.8.0crates/wbtools_oss/Cargo.toml
crates.ioevalexpr13.1.0crates/wbtools_oss/Cargo.toml
crates.ionalgebra0.34.1crates/wbtools_oss/Cargo.toml
crates.iosmartcore0.4.9crates/wbtools_oss/Cargo.toml
crates.iobincode2crates/wbtools_oss/Cargo.toml
crates.iorustfft6.2crates/wbtools_oss/Cargo.toml
crates.iotime0.3crates/wbtools_oss/Cargo.toml
crates.ioureq2.12.1crates/wbtools_oss/Cargo.toml
crates.iowbvector0.1.4crates/wbtopology/Cargo.toml
crates.iorayon1.10crates/wbtopology/Cargo.toml
crates.iorobust1.2.0crates/wbtopology/Cargo.toml
crates.iothiserror1crates/wbvector/Cargo.toml
crates.ioflatbuffers24.12.23crates/wbvector/Cargo.toml
crates.iowbprojection0.3.0crates/wbvector/Cargo.toml
crates.iozip0.6crates/wbvector/Cargo.toml
crates.ioosmpbfreader0.16crates/wbvector/Cargo.toml
crates.ioparquet58.3crates/wbvector/Cargo.toml
crates.ioserde_json1crates/wbvector/Cargo.toml
crates.iobytes1crates/wbvector/Cargo.toml
crates.iowbtools_osscrates/whitebox-cli/Cargo.toml
crates.iowbcorecrates/whitebox-cli/Cargo.toml
crates.ioserde_json1crates/whitebox-cli/Cargo.toml
crates.iowbgeotiffcrates/whitebox-wasm/Cargo.toml
crates.iowbprojectioncrates/whitebox-wasm/Cargo.toml
crates.iowbvectorcrates/whitebox-wasm/Cargo.toml
crates.iowblidarcrates/whitebox-wasm/Cargo.toml
crates.iowbtopologycrates/whitebox-wasm/Cargo.toml
crates.iowbspatialstatscrates/whitebox-wasm/Cargo.toml
crates.iowasm-bindgen0.2crates/whitebox-wasm/Cargo.toml
crates.ioconsole_error_panic_hook0.1crates/whitebox-wasm/Cargo.toml
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing crates:wbhdf@0.1.0 pulls in 30 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

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": [
        "cog",
        "geospatial",
        "geotiff",
        "gis",
        "rust",
        "wasm",
        "webassembly",
        "whiteboxtools"
      ],
      "is_fork": false,
      "size_kb": 2836,
      "has_wiki": true,
      "homepage": "http://opengeos.org/whitebox-wasm",
      "languages": {
        "Rust": 16687974,
        "JavaScript": 4646
      },
      "pushed_at": "2026-07-17T20:28:14Z",
      "created_at": "2026-06-16T13:06:58Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T08:35:37Z",
      "description": "Pure-Rust geospatial toolkit compiled to WebAssembly. No GDAL, no PROJ, no native libraries, no server.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://opengeos.org",
      "name": "Open Geospatial Solutions",
      "type": "Organization",
      "login": "opengeos",
      "company": null,
      "location": "United States of America",
      "followers": 3832,
      "avatar_url": "https://avatars.githubusercontent.com/u/129896036?v=4",
      "created_at": "2023-04-04T19:02:44Z",
      "is_verified": null,
      "public_repos": 168,
      "account_age_days": 1205
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-17T20:35:42Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-17T01:42:05Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-17T01:29:38Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-16T23:05:48Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-16T22:34:13Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-16T13:10:56Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8d2aa4e2990a28f84739f24a60ba62e8e440f5bf",
          "body": "Topology fixes: topology_validation_report no longer flags reader-normalized\nrings as unclosed (#7/#9); topology_rule_autofix gains cross-feature endpoint\nsnapping and dangle fixing, the endpoint-snap validate rule accepts exactly\nconnected endpoints, and the CLI surfaces progress messages including the\ndry-run default notice (#8/#10). Minor bump: the report's issue-type set and\nautofix behavior changed.",
          "is_bot": false,
          "headline": "chore(release): whitebox-wasm 0.5.0 (#11)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T20:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2b73194e5ced6f2dd8913dc77065b41b056980a",
          "body": "…angle violations (#10)\n\ntopology_rule_autofix advertised four fixable rules but only\npoint_must_be_covered_by_line ever changed anything:\n\n- the endpoint-snap fixer only snapped a line's own two endpoints to each\n  other (closing near-loops); it never looked at other features, so the\n  cross-featur\n[…]\nad of dropping them,\n  so 'no output was written' is visible instead of a bare OK\n- metadata/manifest now states polygon_must_not_have_gaps has no automatic\n  fix instead of implying it does\n\nFixes #8",
          "is_bot": false,
          "headline": "fix(topology): make topology_rule_autofix actually fix endpoint and d…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T20:22:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ac33ecc71b71ba36e48ddd2f2d5f7026fede381",
          "body": "…unclosed (#9)\n\nThe vector readers normalize ring storage (GeoJSON/Shapefile/FlatGeobuf strip\nthe closing vertex; OSM PBF keeps it), so ring closure is a storage convention,\nnot a data property - by the time polygon_topology_issues runs, an unclosed\nring in the source is indistinguishable from a nor\n[…]\nfinal vertex from the duplicate-vertex check when the ring\n  is actually stored closed; the hardcoded closed_ring=true skipped the last\n  real vertex of open rings, hiding genuine duplicates\n\nFixes #7",
          "is_bot": false,
          "headline": "fix(topology): stop flagging every reader-normalized polygon ring as …",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T20:15:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "337e6576b895539049692255f135aba7acf847b7",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): whitebox-wasm 0.4.1",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T01:35:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c30c82c21aacabec8ce306e628c2cf5840b6dfe5",
          "body": "…decode (#6)\n\n* fix(wbgeotiff): reverse TIFF horizontal/floating-point predictors on decode\n\nCOGs written with PREDICTOR=2 (horizontal differencing) or PREDICTOR=3\n(floating point) — the GDAL default for Deflate/LZW imagery such as NAIP\ntiles — decoded to garbage: the tile/strip decoders inflated th\n[…]\ntiff.js.)\n- CogLevel: make the new `predictor` field private (read only by the\n  decoder) so adding it is a non-breaking change for downstream code\n  that constructs or destructures the public struct.",
          "is_bot": false,
          "headline": "fix(wbgeotiff): reverse TIFF horizontal/floating-point predictors on …",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-17T01:32:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "926357467251dc2a71c9cddfbbcf042f87697bf5",
          "body": "Parameters whose name is an expression or statement (Field Calculator's\n`expression`, Extract By Attribute's and Filter Lidar's `statement`,\nRaster Calculator's `expression`) are free text the user types. Their\ndescriptions mention \"boolean\" (the value the expression evaluates to) or\n\"feature\"/\"rast\n[…]\nox or a dataset input, leaving no field\nto enter the expression.\n\nShort-circuit these to a string schema before the bool/enum/dataset\ninference. Adds a regression test with the real tool descriptions.",
          "is_bot": false,
          "headline": "fix(wbcore): infer expression/statement params as free-text strings (#5)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-06T13:32:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "75716ce0e2593ad461dad43d1a4994c35a7e5350",
          "body": "The GeoJSON FeatureCollection/Feature reader never assigned a source CRS,\nso reprojection tools (reproject_vector) failed with 'layer_to_epsg\nrequires source CRS metadata' on plain GeoJSON input. RFC 7946 defines\nGeoJSON coordinates as WGS 84, so default the layer CRS to EPSG:4326 and\nhonour a legacy GeoJSON 2008 named crs member (urn EPSG, EPSG:code, and\nOGC CRS84 forms) when present.",
          "is_bot": false,
          "headline": "fix(geojson): default reader source CRS to EPSG:4326 (RFC 7946) (#4)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-07-02T02:20:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77eb302e445cde1278e5d389fa85f0911389b383",
          "body": "…flow_accum_full_workflow (#3)\n\nStandalone D8/FD8 flow-routing tools (d8_pointer, d8_flow_accum,\nfd8_flow_accum, basins, subbasins, ...) trapped with a WASM `unreachable`\ninstruction on every input. Root cause: these tools fan work out with\n`std::thread::spawn`, which is unsupported on the wasm32 ta\n[…]\nir_output`), so consumers get\nthe accumulation raster and an ESRI-encodable pointer from the same\ninternal breach pass (`--esri_pntr`).\n\nFixes opengeos/geolibre-rust#28\nFixes opengeos/geolibre-rust#29",
          "is_bot": false,
          "headline": "fix(flow): avoid std::thread::spawn WASM trap; add output_pointer to …",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-24T21:35:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f723de68211334c280d96a2be7d01a04a73e0722",
          "body": "…ls, datasets) (#2)\n\nThe manifest emitter inferred each parameter's io_role/data_kind/schema from\nits name and description with plain substring matching, which mis-typed a large\nfraction of the ~700 tools and made host UIs render the wrong control:\n\n- \"strategy: first, last, count\" became a LiDAR fi\n[…]\nnd ~125 vector/raster file inputs, and removes the\nspurious LiDAR file pickers caused by the \"las\" substring match. Adds unit\ntests covering each signature, including the CSV-vs-enum and plural cases.",
          "is_bot": false,
          "headline": "fix(wbcore): word-aware manifest param inference (enums, scalars, boo…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-24T12:38:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ed146da9f664e7417e77a269a3b1eac41167092",
          "body": "* feat(geoparquet): emit bbox covering column and read via in-memory bytes\n\nAdd a GeoParquet 1.1 bbox covering column (struct<xmin,ymin,xmax,ymax>) next\nto the geometry, declared via the geometry column's \"covering\" metadata, so\nreaders can spatially prune without decoding geometries. Enabled by def\n[…]\nolumn as the covering when it is the nested struct (schema\npath length >= 2 / a Group row field), so a user-defined scalar attribute named\n\"bbox\" round-trips instead of being silently dropped on read.",
          "is_bot": false,
          "headline": "feat(geoparquet): bbox covering column + WASM-safe reader (#1)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-19T23:47:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be91a7836182a95cf75ca600111410f85c2f4140",
          "body": "A COPC LAZ (e.g. autzen-classified.copc.laz) crashed the module with an\n'unreachable' panic: the standard LazReader misreads COPC's variable-chunk\nstructure and over-allocates. Fixes:\n- wrapper: lidar_info now reads only the LAS header via LasReader (no chunk-table\n  decode -> no panic) for LAS and \n[…]\nsread count can't\n  capacity-overflow-panic (defense in depth).\n- demo: LiDAR tab shows COPC metadata + a note instead of erroring.\n- MAINTAINING.md: note the package now bundles the WASI tool runner.",
          "is_bot": false,
          "headline": "Fix LiDAR panic on COPC files (capacity overflow -> clean handling)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T01:22:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4e23f7ca916db3b3d4a6f106a9982b597301335",
          "body": "Bump to 0.4.0 and bundle the WASI tool runner into the package so wbtools_oss is\nusable from npm. New whitebox-wasm/tools subpath (tools.mjs + tools.d.ts) runs\nthe 733 path-based tools through an in-memory WASI filesystem via\n@bjorn3/browser_wasi_shim (declared dependency); raster outputs are COGs. \n[…]\ne. release.yml builds whitebox-cli, runs\nscripts/finalize-pkg.mjs to add it + the deps/exports, and also attaches it to\nthe GitHub Release. Verified: listTools()=733, slope->COG, convex_hull->GeoJSON.",
          "is_bot": false,
          "headline": "Include the WhiteboxTools suite in the npm package (whitebox-wasm/tools)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T01:14:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "586f84aeef705fb1099f1cdc663f35e27b7405f1",
          "body": "…oad links\n\n- wbraster: geotiff::write now defaults to COG (tiled + overviews + GDAL ghost)\n  with explicit Deflate compression, so every tool's raster output opens in\n  geotiff.js / GeoLibre / QGIS (fixes 'Tiff is not tiled'). Affects all tools.\n- demo Tools tab: add vector tools (minimum_convex_hu\n[…]\nhelp, raster + vector\n  examples, COG output, in-browser note). MAINTAINING.md: add the wbraster patch.\n\nVerified via the WASI shim: slope -> tiled Deflate COG; minimum_convex_hull ->\nGeoJSON polygon.",
          "is_bot": false,
          "headline": "Tools: COG+Deflate output, vector tool demos, README usage, fix downl…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T00:55:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ceb229aafd51a755dbffb66c9dbd489bdda8ccbf",
          "body": "The Pages demo now runs the real wbtools_oss algorithm suite client-side: a new\nTools tab loads whitebox-cli.wasm (the WASI binary) through a WASI shim with an\nin-memory filesystem, runs a tool (slope/aspect/hillshade/mean/gaussian) on a\nDEM, validates the output with the browser package, and offers it for download.\nPages workflow builds whitebox-cli for wasm32-wasip1 and ships it as\nwhitebox-cli.wasm. Verified end to end in Node via @bjorn3/browser_wasi_shim.",
          "is_bot": false,
          "headline": "demo: add Tools tab running WhiteboxTools (WASI) in the browser",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T00:09:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d30bdbd7d615f9c5d74dab6c60bf550d95069e05",
          "body": "Add the WASI CLI badge, split the overview into the two artifacts (browser/Node\nlibrary + WASI tool runner), add a 'Tools (WASI): 733 WhiteboxTools' bullet\nlinking to the run-on-files section, and point maintainers at MAINTAINING.md.",
          "is_bot": false,
          "headline": "docs: surface the WASI tool runner in the README intro",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-17T00:02:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3444e3a0275328a5398169dfa270e0f256c20616",
          "body": "Document every WASM compatibility issue and its fix (getrandom js feature,\nkdtree/criterion patch, ureq/networking, path-I/O -> WASI), the exact local\npatch set applied to vendored crates (6 source files + kdtree-wasm + workspace\nconfig) so it survives re-vendoring, and a step-by-step procedure for pulling\nupdates from upstream whitebox_next_gen. Link it from the README.",
          "is_bot": false,
          "headline": "docs: add MAINTAINING.md (WASM fixes + upstream re-sync guide)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:59:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a245d8ca6c99d3e19d5c91b785632fe2ef9dbbe5",
          "body": "The wbtools_oss algorithm suite is path-based (reads/writes rasters by file\npath), so it cannot run in the browser, but it runs under WASI where there is a\nreal filesystem. Vendor wbcore/wbraster/wbtools_oss + a patched kdtree (drops\nits criterion normal-dependency, the only WASI compile blocker) an\n[…]\nmtime: slope + mean_filter on a real 2880x1773 DEM\nproduce valid GeoTIFFs (slope 0-63.7 deg). These crates are a separate WASI\nartifact; the browser npm package does not include them. Add wasi.yml CI.",
          "is_bot": false,
          "headline": "Add WASI tool runner: run all 733 wbtools_oss tools on regular files",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:55:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c87074eabd3fa7c874f41a7a8a2c38d421847f4d",
          "body": "Add a 'Compiling other Whitebox crates to WASM' section: the getrandom js fix\nfor the vendored crates, and the three dependency blockers for wbtools_oss\n(getrandom 0.2/0.4, ureq->rustls->ring networking, kdtree's criterion packaging\nbug) with fixes, plus the path-based-I/O runtime caveat.",
          "is_bot": false,
          "headline": "docs: document WASM compilation of other crates + wbtools_oss blockers",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:40:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c3e074e5674fe6aac1933d24ded8e711a2147b0",
          "body": "Tabbed UI exercising all modules client-side: Raster (GeoTIFF info/stats),\nVector (read -> GeoJSON + metadata + reproject), LiDAR (LAS/LAZ/PLY header +\npoints), Analysis (convex hull + Moran's I with an SVG scatter/hull plot).\nBundle sample.geojson and sample.las; Pages workflow copies them into the site.",
          "is_bot": false,
          "headline": "Demo: add Vector, LiDAR, and Analysis tabs to the Pages demo",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:18:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "356291748a41a760a6bf6898772f04c6328a69a7",
          "body": "Adds all compilable Whitebox crates to the WASM package:\n- Vector (wbvector): read 8 formats -> GeoJSON, metadata, reprojection\n- LiDAR (wblidar): read LAS/LAZ/PLY -> xyz/classification/intensity\n- Analysis (wbtopology/wbspatialstats): convex hull, Moran's I\nBroaden package description/keywords/README to the full geospatial toolkit.",
          "is_bot": false,
          "headline": "Release v0.3.0: vector, LiDAR, and analysis modules",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:03:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49538dbb3f1c723236ab3184c16ee8abf116c31d",
          "body": "…tats)\n\nconvex_hull(points_xy) -> hull ring Float64Array.\nmorans_i(points_xy, values, distance_threshold) -> JSON global spatial\nautocorrelation (binary distance-band weights built in the wrapper).\nVerified: square+interior -> square ring; gradient field -> I=0.64, z=15.4.",
          "is_bot": false,
          "headline": "Add analysis module: convex hull (wbtopology) + Moran's I (wbspatials…",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T23:00:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09afd832eeb2bbd47f83ebeeb9667bbe1da0e0e4",
          "body": "Backed by wblidar (native LAS reader + LASzip decoder, no C). API:\nlidar_formats(), lidar_info(data, format) (header-only count/bounds/epsg for\nLAS/LAZ), lidar_read_xyz -> Float64Array, lidar_read_classification -> Uint8Array,\nlidar_read_intensity -> Uint16Array. Added LazReader::header() passthrough to the\nvendored crate. Verified on a 1000-point LAS fixture (bounds, xyz, attrs).",
          "is_bot": false,
          "headline": "Add lidar module: read LAS/LAZ/PLY point clouds in memory",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:57:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "766ac1ab1c284d7d6743525a54be0d52222fadae",
          "body": "Vendor wbhdf/wbvector/wblidar/wbtopology/wbspatialstats into the workspace\n(wbspatialstats gets getrandom's js feature on wasm). New vector API backed by\nwbvector: vector_formats(), vector_to_geojson(data, format),\nvector_to_geojson_reproject(data, format, dst_epsg, src_epsg), vector_info().\nReads G\n[…]\nN/TopoJSON/GML/GPX/KML (text) and FlatGeobuf/GeoPackage/KMZ (binary)\nclient-side; added geopackage::from_bytes to the vendored crate. Verified\nGeoJSON roundtrip, metadata, and 4326->3857 reprojection.",
          "is_bot": false,
          "headline": "Add vector module: read 8 formats in memory, GeoJSON out, reproject",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:52:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5be4afefd9ad74c816110dac8303bc09e9bc09b",
          "body": "GeoTiffReader/CogBuilder/CogStream classes, typed pixel reads, COG writing,\nHTTP range-request streaming, header-only metadata for gigapixel rasters,\nimage center + bbox (native CRS and WGS84 lon/lat with full EPSG and\nuser-defined projection support via vendored wbprojection).",
          "is_bot": false,
          "headline": "Release v0.2.0",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:32:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28f655414b09fa78b58084efcc1fa94e1d6ee050",
          "body": "checkout v4->v6, setup-node v4->v6, configure-pages v5->v6,\nupload-pages-artifact v3->v5, deploy-pages v4->v5, action-gh-release v2->v3.\nBump project Node 20->22 (LTS). Clears the Node 20 runtime deprecation\nwarnings. (Swatinem/rust-cache already on latest v2; dtolnay/rust-toolchain\n@stable is a moving ref.)",
          "is_bot": false,
          "headline": "ci: update all GitHub Actions to latest majors, Node 22",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:29:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f9dec967f5da50ff74c6cdbcb1705a717d7b94",
          "body": "- Vendor the pure-Rust wbprojection crate (no PROJ/C). lon/lat conversion now\n  works for any EPSG code (UTM, Albers 5070, Lambert, state plane, 3857, ...)\n  via Crs::from_epsg + transform_to, replacing the hardcoded 4326/3857 math.\n- wbgeotiff: GeoKeyDirectory::to_proj_string() builds a PROJ string\n[…]\ntive\n  fixture suite needing un-vendored data).\n\nVerified: NLCD Albers center -> (-96.87, 38.72); dem.tif 3857, UTM 32610,\nAlbers 5070 all correct. WASM size ~1.4MB -> ~3.5MB (embedded EPSG database).",
          "is_bot": false,
          "headline": "Vendor wbprojection for full EPSG + user-defined CRS lon/lat",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:27:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f04608632a2d965229d4024a6dcc364ec2c60c4",
          "body": "- wbgeotiff: GeoTiffMeta/peek_meta now carry the geo-transform.\n- geotiff_info JSON gains bbox, center, center_lonlat.\n- GeoTiffReader and CogStream: center(), center_lonlat(), bounds_lonlat()\n  (bounding_box() already present; added to CogStream too).\n- WGS84 conversion is exact for EPSG:4326 (with\n[…]\nreported as 4326, e.g. NLCD Albers, return empty\n  instead of garbage) and EPSG:3857 (closed-form). Native-CRS bbox/center always\n  available when georeferenced. Verified: dem.tif -> (-122.75, 44.40).",
          "is_bot": false,
          "headline": "Add image center and bbox coordinates (native CRS + WGS84 lon/lat)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T22:11:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1ee88306cf01e0647624bf28355d83d39aca04d3",
          "body": "- wbgeotiff: parse_cog_layout() parses the IFD chain (all overview levels) and\n  tile index from front-of-file header bytes only; CogLevel::decode_tile_f64()\n  decodes a single tile. Reuses read_all_ifds + the existing tile codec path.\n- wrapper: CogStream class for reading remote COGs via HTTP rang\n[…]\ny under a cell budget, shows metadata otherwise.\n- examples/cog-stream.mjs reads a 256x256 window fetching ~13% of a remote COG.\n  Verified: streamed window matches full decode exactly (0 mismatches).",
          "is_bot": false,
          "headline": "Add COG range-request streaming + guard against gigapixel OOM panics",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T14:19:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41cd0cc694b34daeb50bc78b181a51d33f4290b1",
          "body": "- GeoTiffReader class: parse once, then width/height/bands/epsg/nodata/\n  sample_format/compression/bigtiff, geo_transform/bounding_box/value_transform,\n  read_band_f64/read_all_f64/read_band_bytes and native typed reads\n  (u8/i8/u16/i16/u32/i32/f32), info_json/stats_json.\n- CogBuilder class: encode\n[…]\n Keep convenience fns (geotiff_info/stats/read_band_f64/version).\n- Docs: full API in both READMEs; add examples/read-from-url.mjs (reads a COG\n  from an HTTP URL, verified against a real public COG).",
          "is_bot": false,
          "headline": "Expose full GeoTIFF API: reader class, typed reads, COG writer",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T14:09:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b62902cbd5fefa52e3102c0095371ce97bc7a126",
          "body": "- wbgeotiff: GeoTiff::peek_meta() parses only the header (O(header) memory),\n  so geotiff_info now works on multi-GB rasters (e.g. NLCD CONUS 161190x104424)\n  that previously OOMed; from_bytes no longer triple-copies the input.\n- wrapper: geotiff_info reports bits/sample_format/compression/tiled/bigtiff;\n  new geotiff_read_band_f64(data, band) returns pixel values as a Float64Array.",
          "is_bot": false,
          "headline": "Add header-only metadata + pixel-data read API",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T14:00:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d2818964f1574dda03e64de4ae12cc14a067f78",
          "body": "Adding the panic hook changed the wasm import surface (0 -> 4 imports), so\nreturning visitors with a cached whitebox_wasm.js loaded the new .wasm and\nhit 'function import requires a callable'. Append ?v=<sha> to both the JS\nmodule import and the wasm URL, injected at deploy time, so the pair always\nupdates together.",
          "is_bot": false,
          "headline": "Cache-bust demo glue+wasm by commit SHA to prevent LinkError mismatch",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:48:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8a20e69f26a8d9f5503c526e0a4c5929623e389",
          "body": "A GDAL float DEM uses NaN as its nodata sentinel; geotiff_info emitted\n\"nodata\":NaN, which is not valid JSON, so JSON.parse threw and the demo\nhung at 'Decoding'. Serialize non-finite f64 as null (matching\nJSON.stringify), route stats min/max/mean through the same helper, add a\nconsole_error_panic_hook, and wrap the demo decode in try/catch so errors\nare shown instead of hanging.\n\nVerified against the real 2880x1773 float64 DEM.",
          "is_bot": false,
          "headline": "Fix invalid JSON for NaN/Infinity values (NaN nodata hung the demo)",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:44:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88618fb6810cf57c5762c0172b77f222138a12d1",
          "body": null,
          "is_bot": false,
          "headline": "Credit the original whitebox_next_gen project in both READMEs",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:39:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b09a99ff80906df483f9760d9c480cf87869f95c",
          "body": "Replace the NPM_TOKEN secret flow with OIDC-based Trusted Publishing:\nadd id-token: write permission, upgrade npm to >= 11.5.1, and publish\nwithout a token (provenance is attached automatically).",
          "is_bot": false,
          "headline": "Use npm Trusted Publishing (OIDC) in release workflow",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:37:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d30f02693acb1e7f18ed7bae31ae70c2c5ba0e35",
          "body": "wasm-pack only copies a README into pkg/ if one exists in the crate\ndirectory. Add crates/whitebox-wasm/README.md and set the readme field.",
          "is_bot": false,
          "headline": "Add crate-level README so npm renders package docs",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:29:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83f50f78bf479d258686be60c64a76f209b113e6",
          "body": "Drop the @opengeos scope from the wasm-pack build in CI/release/Pages\nworkflows and update the README install/import instructions.",
          "is_bot": false,
          "headline": "Publish npm package unscoped as whitebox-wasm",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49641858da05d6d7a344529f8065a397aa044867",
          "body": "Wraps the vendored, self-contained wbgeotiff crate (no GDAL/PROJ/HDF5) and\nexposes geotiff_info / geotiff_stats / version over wasm-bindgen.\n\n- crates/whitebox-wasm: wasm-bindgen wrapper, builds to @opengeos/whitebox-wasm\n- crates/wbgeotiff: vendored pure-Rust GeoTIFF engine (MIT OR Apache-2.0)\n- de\n[…]\nes/node-demo.mjs: runnable Node example and smoke test\n- CI: host tests + wasm-pack build + Node smoke\n- Release (on tag): npm publish + GitHub Release assets\n- Pages: live demo deploy on push to main",
          "is_bot": false,
          "headline": "Initial commit: pure-Rust GeoTIFF decoding in WebAssembly",
          "author_name": "Qiusheng Wu",
          "author_login": "giswqs",
          "committed_at": "2026-06-16T13:06:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 6,
      "commits_last_year": 37,
      "latest_release_at": "2026-07-17T20:35:42Z",
      "latest_release_tag": "v0.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 6.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "wbhdf",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "gis",
            "hdf4",
            "hdf5",
            "geospatial",
            "remote-sensing",
            "science",
            "filesystem",
            "parser-implementations"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wbhdf",
          "is_deprecated": false,
          "latest_version": "0.1.0",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 1,
          "total_downloads": 17,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 6,
          "first_published_at": "2026-06-03T02:24:16.183758Z",
          "latest_published_at": "2026-06-03T02:24:16.183758Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 50
        },
        {
          "name": "wblidar",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wblidar",
          "is_deprecated": false,
          "latest_version": "0.1.2",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 3,
          "total_downloads": 68,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 13,
          "first_published_at": "2026-03-31T10:19:44.185480Z",
          "latest_published_at": "2026-05-21T21:42:34.155809Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 62
        },
        {
          "name": "wbraster",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "gis",
            "geospatial",
            "raster",
            "grid",
            "remote-sensing",
            "encoding",
            "filesystem",
            "science"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wbraster",
          "is_deprecated": false,
          "latest_version": "0.2.0",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 7,
          "total_downloads": 179,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 45,
          "first_published_at": "2026-03-31T03:52:28.277924Z",
          "latest_published_at": "2026-05-21T21:42:42.290405Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 62
        },
        {
          "name": "wbvector",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "gis",
            "geojson",
            "geospatial",
            "shapefile",
            "geopackage",
            "encoding",
            "science::geo"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wbvector",
          "is_deprecated": false,
          "latest_version": "0.1.5",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 6,
          "total_downloads": 6320,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2096,
          "first_published_at": "2026-03-31T03:52:47.982233Z",
          "latest_published_at": "2026-06-30T19:36:39.794536Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 22
        },
        {
          "name": "wbgeotiff",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "gis",
            "raster",
            "cog",
            "geotiff",
            "bigtiff",
            "science",
            "encoding",
            "filesystem"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wbgeotiff",
          "is_deprecated": false,
          "latest_version": "0.1.2",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 3,
          "total_downloads": 341,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 86,
          "first_published_at": "2026-03-31T03:51:17.361478Z",
          "latest_published_at": "2026-05-07T21:21:45.793078Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 76
        },
        {
          "name": "wbtopology",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "gis",
            "geometry",
            "spatial",
            "topology",
            "jts",
            "algorithms",
            "science::geo"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/wbtopology",
          "is_deprecated": false,
          "latest_version": "0.2.0",
          "repository_url": "https://github.com/jblindsay/whitebox_next_gen",
          "versions_count": 4,
          "total_downloads": 6168,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2052,
          "first_published_at": "2026-03-31T03:53:08.434292Z",
          "latest_published_at": "2026-05-21T21:42:49.235647Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 62
        },
        {
          "name": "kdtree",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [
            "search",
            "tree",
            "geo",
            "nearest",
            "neighbor"
          ],
          "ecosystem": "crates",
          "matches_repo": false,
          "registry_url": "https://crates.io/crates/kdtree",
          "is_deprecated": false,
          "latest_version": "0.8.0",
          "repository_url": "https://github.com/mrhooray/kdtree-rs",
          "versions_count": 14,
          "total_downloads": 2440292,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 149072,
          "first_published_at": "2015-08-08T22:28:47.143276Z",
          "latest_published_at": "2025-11-02T01:38:01.361852Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 263
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 7,
      "watchers": 2,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/kdtree-wasm/Cargo.toml",
        "crates/wbcore/Cargo.toml",
        "crates/wbgeotiff/Cargo.toml",
        "crates/wbhdf/Cargo.toml",
        "crates/wblidar/Cargo.toml",
        "crates/wbprojection/Cargo.toml",
        "crates/wbraster/Cargo.toml",
        "crates/wbspatialstats/Cargo.toml",
        "crates/wbtools_oss/Cargo.toml",
        "crates/wbtopology/Cargo.toml",
        "crates/wbvector/Cargo.toml",
        "crates/whitebox-cli/Cargo.toml",
        "crates/whitebox-wasm/Cargo.toml"
      ],
      "largest_source_bytes": 2002974,
      "source_files_sampled": 406,
      "oversized_source_files": 48,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 30,
        "malicious_count": 0,
        "assessed_package": "crates:wbhdf@0.1.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "num-traits",
          "manifest": "crates/kdtree-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "serde",
          "manifest": "crates/kdtree-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_derive",
          "manifest": "crates/kdtree-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "thiserror",
          "manifest": "crates/kdtree-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0"
        },
        {
          "name": "serde",
          "manifest": "crates/wbcore/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/wbcore/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbcore/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "flate2",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "lz4_flex",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.11"
        },
        {
          "name": "weezl",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "jpeg-encoder",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "jpeg-decoder",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "webp-rust",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2.1"
        },
        {
          "name": "png",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.17"
        },
        {
          "name": "zune-core",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5"
        },
        {
          "name": "zune-jpegxl",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5"
        },
        {
          "name": "jxl-oxide",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "rayon",
          "manifest": "crates/wbgeotiff/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "byteorder",
          "manifest": "crates/wbhdf/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.5"
        },
        {
          "name": "flate2",
          "manifest": "crates/wbhdf/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "miniz_oxide",
          "manifest": "crates/wbhdf/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbhdf/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "wide",
          "manifest": "crates/wblidar/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.2"
        },
        {
          "name": "wbprojection",
          "manifest": "crates/wblidar/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3.0"
        },
        {
          "name": "wbhdf",
          "manifest": "crates/wblidar/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.0"
        },
        {
          "name": "reqwest",
          "manifest": "crates/wblidar/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "rayon",
          "manifest": "crates/wblidar/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.10"
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbprojection/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "wide",
          "manifest": "crates/wbprojection/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.2"
        },
        {
          "name": "rayon",
          "manifest": "crates/wbprojection/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.10"
        },
        {
          "name": "serde",
          "manifest": "crates/wbprojection/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0.149"
        },
        {
          "name": "flate2",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1.9"
        },
        {
          "name": "tar",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.45"
        },
        {
          "name": "zip",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "8.5.1"
        },
        {
          "name": "ruzstd",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8.2"
        },
        {
          "name": "lz4_flex",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13.0"
        },
        {
          "name": "jpeg-encoder",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7.0"
        },
        {
          "name": "jpeg-decoder",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3.2"
        },
        {
          "name": "png",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.18.1"
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0.18"
        },
        {
          "name": "rayon",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.12.0"
        },
        {
          "name": "wide",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.3.0"
        },
        {
          "name": "wbprojection",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3.0"
        },
        {
          "name": "wbgeotiff",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.2"
        },
        {
          "name": "wbhdf",
          "manifest": "crates/wbraster/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.0"
        },
        {
          "name": "nalgebra",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.34"
        },
        {
          "name": "ndarray",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.15"
        },
        {
          "name": "rayon",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.7"
        },
        {
          "name": "rand",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "serde",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_json",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "log",
          "manifest": "crates/wbspatialstats/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "wbcore",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbraster",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbgeotiff",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbvector",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbprojection",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbtopology",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wblidar",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbspatialstats",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "rayon",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "rand",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10.0"
        },
        {
          "name": "wide",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.2.0"
        },
        {
          "name": "chrono",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "image",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.25"
        },
        {
          "name": "kdtree",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8.0"
        },
        {
          "name": "evalexpr",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "13.1.0"
        },
        {
          "name": "nalgebra",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.34.1"
        },
        {
          "name": "smartcore",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.9"
        },
        {
          "name": "bincode",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "rustfft",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6.2"
        },
        {
          "name": "time",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "ureq",
          "manifest": "crates/wbtools_oss/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.12.1"
        },
        {
          "name": "wbvector",
          "manifest": "crates/wbtopology/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.4"
        },
        {
          "name": "rayon",
          "manifest": "crates/wbtopology/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.10"
        },
        {
          "name": "robust",
          "manifest": "crates/wbtopology/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.2.0"
        },
        {
          "name": "thiserror",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "flatbuffers",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "24.12.23"
        },
        {
          "name": "wbprojection",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3.0"
        },
        {
          "name": "zip",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "osmpbfreader",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.16"
        },
        {
          "name": "parquet",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "58.3"
        },
        {
          "name": "serde_json",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "bytes",
          "manifest": "crates/wbvector/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "wbtools_oss",
          "manifest": "crates/whitebox-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbcore",
          "manifest": "crates/whitebox-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "crates/whitebox-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "wbgeotiff",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbprojection",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbvector",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wblidar",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbtopology",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wbspatialstats",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "wasm-bindgen",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "console_error_panic_hook",
          "manifest": "crates/whitebox-wasm/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 9,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 2,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "giswqs",
          "commits": 37,
          "avatar_url": "https://avatars.githubusercontent.com/u/5016453?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "pages.yml",
        "release.yml",
        "wasi.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 2/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 5 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 3,
            "reason": "7 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8d2aa4e2990a28f84739f24a60ba62e8e440f5bf",
        "ran_at": "2026-07-23T04:32:37Z",
        "aggregate_score": 3.3,
        "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-17T20:35:51Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T20:28:12Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/opengeos/whitebox-wasm",
    "host": "github.com",
    "name": "whitebox-wasm",
    "owner": "opengeos"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 46,
        "vitality": 68,
        "community": 30,
        "governance": 58,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "commits_last_year": 37,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "37 commits in the last year",
                "points": 14.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 6,
              "latest_release_tag": "v0.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 6.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "6 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "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": 30,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "forks": 0,
              "stars": 7,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "7 stars",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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
              }
            ]
          }
        ],
        "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": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "merged_prs": 9,
              "open_issues": 0,
              "closed_issues": 2,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0
            },
            "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": "9/9 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 9,
                      "decided": 9
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "followers": 3832,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "opengeos",
              "public_repos": 168,
              "account_age_days": 1205
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3,832 followers of opengeos",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3832,
                      "login": "opengeos"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "168 public repos, account ~3 yr old",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 168
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "cog",
                "geospatial",
                "geotiff",
                "gis",
                "rust",
                "wasm",
                "webassembly",
                "whiteboxtools"
              ],
              "has_wiki": true,
              "homepage": "http://opengeos.org/whitebox-wasm",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://opengeos.org/whitebox-wasm",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.3
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "9 out of 9 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "7 existing vulnerabilities detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:wbhdf@0.1.0 runtime dependency closure — what installing the published package pulls in — 30 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "crates:wbhdf@0.1.0",
                  "assessed": 30
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 30,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "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": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "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": 30,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 54,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.973,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "36 of 37 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 36,
                      "sampled": 37
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/kdtree-wasm/Cargo.toml",
                "crates/wbcore/Cargo.toml",
                "crates/wbgeotiff/Cargo.toml",
                "crates/wbhdf/Cargo.toml",
                "crates/wblidar/Cargo.toml",
                "crates/wbprojection/Cargo.toml",
                "crates/wbraster/Cargo.toml",
                "crates/wbspatialstats/Cargo.toml",
                "crates/wbtools_oss/Cargo.toml",
                "crates/wbtopology/Cargo.toml",
                "crates/wbvector/Cargo.toml",
                "crates/whitebox-cli/Cargo.toml",
                "crates/whitebox-wasm/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, crates/kdtree-wasm/Cargo.toml, crates/wbcore/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, crates/kdtree-wasm/Cargo.toml, crates/wbcore/Cargo.toml"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "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": "no agent-authored commits among the last 37",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 37
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 2002974,
              "source_files_sampled": 406,
              "oversized_source_files": 48
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "48/406 source files over 60KB",
                "points": 48.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 406,
                      "oversized": 48
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "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",
    "crates package 'wbhdf' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "Could not fetch crates package 'wbcore' from its registry",
    "crates package 'wblidar' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "crates package 'wbraster' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "crates package 'wbvector' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "crates package 'wbgeotiff' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "crates package 'wbtopology' points at a different repository (https://github.com/jblindsay/whitebox_next_gen); excluded from ecosystem scoring",
    "crates package 'kdtree' points at a different repository (https://github.com/mrhooray/kdtree-rs); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T04:32:47.320629Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/opengeos/whitebox-wasm.svg",
  "full_name": "opengeos/whitebox-wasm",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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 statisticscrates.io.