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"
}