Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

opengeos/whitebox-wasm tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (71/100) y la más baja, Community & Adoption (30/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

56
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

3832 seguidores168 repositorios públicosdesde abr 2023

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
crates.iowbhdfapunta a otro repositorio; no se puntúa0.1.061hace 50 díasgishdf4hdf5geospatialremote-sensingsciencefilesystemparser-implementations
crates.iowblidarapunta a otro repositorio; no se puntúa0.1.2133hace 62 días
crates.iowbrasterapunta a otro repositorio; no se puntúa0.2.0457hace 62 díasgisgeospatialrastergridremote-sensingencodingfilesystemscience
crates.iowbvectorapunta a otro repositorio; no se puntúa0.1.520966hace 22 díasgisgeojsongeospatialshapefilegeopackageencoding
crates.iowbgeotiffapunta a otro repositorio; no se puntúa0.1.2863hace 76 díasgisrastercoggeotiffbigtiffscienceencodingfilesystem
crates.iowbtopologyapunta a otro repositorio; no se puntúa0.2.020524hace 62 díasgisgeometryspatialtopologyjtsalgorithms
crates.iokdtreeapunta a otro repositorio; no se puntúa0.8.0149.07214hace 263 díassearchtreegeonearestneighbor

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

68Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
2.8/36Cadencia de commits — 4/52 semanas con commits
14.2/18Volumen de commits — 37 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year37
human_commit_share1
days_since_last_push5
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 6 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~6,3 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count6
latest_release_tagv0.5.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases6,3

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

30En riesgo · 18% del índice global
Cómo se puntúa
12.6/60Estrellas — 7 estrellas
0/25Forks — 0 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks0
stars7
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

58Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 5 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
38.2/38.3Aceptación de PR — 9/9 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 2/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs9
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs0
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
25/25Alcance del propietario — 3832 seguidores de opengeos
19.6/25Trayectoria — 168 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers3832
owner_typeOrganization
is_verified
owner_loginopengeos
public_repos168
account_age_days1205

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 9 out of 9 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://opengeos.org/whitebox-wasm
10/10Descripción del repositorio
10/10Topics — 8 topics
10/10Wiki
Datos de entrada utilizados
topicscog, geospatial, geotiff, gis, rust, wasm, webassembly, whiteboxtools
has_wiki
homepagehttp://opengeos.org/whitebox-wasm
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

46En riesgo · 16% del índice global
Cómo se puntúa
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,3
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages30
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de crates:wbhdf@0.1.0 —lo que arrastra la instalación del paquete publicado—: 30 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

54Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 36 de 37 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,973
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, crates/kdtree-wasm/Cargo.toml, crates/wbcore/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 37
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock
has_dockerfileno
typed_language
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
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
48.5/55Tamaños de archivo manejables — 48/406 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes2.002.974
source_files_sampled406
oversized_source_files48
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

7estrellas de GitHub
1contribuidores
37commits en los últimos 12 meses
5días desde el último push
6versiones publicadas
1factor bus
0issues abiertas
crates.ioecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 3.3 / 10
3.3agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
Dependencias directas 101
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Avisos de dependencias 0

Instalar crates:wbhdf@0.1.0 arrastra 30 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadascrates.io.