Registro público
Informe de salud del softwareesquema 0.31.0 · métricas 2.5.0 · 2026-08-05 17:52 UTC

gregkwaste / NMSMV

C#Sin licencia detectada★ 47 estrellas⑂ 7 forksdesde ago 2020Ver en GitHub ↗
TipoAplicación de escritorioBibliotecacómo se determina

gregkwaste/NMSMV tiene un índice de salud de 21 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (42/100) y la más baja, Security (17/100). Se actualizó por última vez hace 139 días. Una sola persona concentra la mayor parte del trabajo reciente.

21
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

21
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 27 se calibra a 21 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

Greg KasapidisCuenta personal
18 seguidores24 repositorios públicosdesde may 2014

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Métricas por categoría

Vitalidad

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

30En riesgo · 21% del índice global
Cómo se puntúa
9.9/36Recencia de push — último push hace 139 días
0.7/36Cadencia de commits — 1/52 semanas con commits
2.7/18Volumen de commits — 1 commits en el último año
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year1
human_commit_share1
days_since_last_push139
active_weeks_last_year1
Cómo se puntúa
27/27Publica versiones — 13 versiones publicadas
16.2/36Recencia de las versiones — última versión hace 350 días
12.6/27Cadencia de publicación — una versión cada ~145,5 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count13
latest_release_tagv0.93.1-pre
releases_from_tagsno
days_since_latest_release350
mean_days_between_releases145,5

Comunidad y Adopción

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

32En riesgo · 17% del índice global
Cómo se puntúa
27/60Estrellas — 47 estrellas
6.5/25Forks — 7 forks
4.7/15Observadores — 8 observadores
Datos de entrada utilizados
forks7
stars47
watchers8
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
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_licenseno
readme_badges3
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_servicesshields.io
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?

35Débil · 23% 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
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
28/42Resolución de issues — 67% de issues cerradas
0/30Aceptación de PR — sin PR decididos o sin datos
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues5
closed_issues10
prs_merged_7d0
prs_decided_7d0
prs_merged_30d0
prs_decided_30d0
issue_closed_ratio0,667
closed_unmerged_prs0
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Excluidos de la puntuación (sin datos o no aplicable): Aceptación de PR, newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
9.2/25Alcance del propietario — 18 seguidores de gregkwaste
22.2/25Trayectoria — 24 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers18
owner_typeUser
is_verified
owner_logingregkwaste
public_repos24
account_age_days4473
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.

Calidad de Ingeniería

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

17Crítico · 19% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
0/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_testsno
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_descriptionno

Seguridad

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

17Crítico · 16% del índice global
Cómo se puntúa
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — license file not detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — no SAST tool detected
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 — sin datos
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

42Débil · 4% 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)
35.2/40Historial de commits legible — 66 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,66
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj (convención del toolchain, sin ejecutor de tareas)
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — C# (tipado estático)
0/10Entorno reproducible
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_testsno
lockfiles
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsSimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj, Viewer_Unit_Tests/Viewer_Unit_Tests.csproj, WPFModelViewer/WPFModelViewer.csproj
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — C# (tipado estático)
54.3/55Tamaños de archivo manejables — 1/76 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageC#
largest_source_bytes80.963
source_files_sampled76
oversized_source_files1

Datos clave

47estrellas de GitHub
1contribuidores
1commits en los últimos 12 meses
139días desde el último push
13versiones publicadas
1factor bus
5issues abiertas
NuGetecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 7 ⇿
0Estrellas
7Forks
8Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

1234567712021-042022-102024-05
Mayor 0Menor 1Parche 6

Cada punto abarca 3 días.

OpenSSF Scorecard 1.7 / 10
1.7agregado

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-08-05 17:52 UTC

7Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 13
RegistroPaqueteRestricción de versiónManifiesto
NuGetOpenTK3.1.0SimpleTextureRenderer/SimpleTextureRenderer.csproj
NuGetAssimpNet5.0.0-beta1WPFModelViewer/WPFModelViewer.csproj
NuGetCostura.Fody5.8.0-alpha0098WPFModelViewer/WPFModelViewer.csproj
NuGetFody6.8.1WPFModelViewer/WPFModelViewer.csproj
NuGetGameloop.Vdf0.6.2WPFModelViewer/WPFModelViewer.csproj
NuGetMathNet.Numerics5.0.0WPFModelViewer/WPFModelViewer.csproj
NuGetMicrosoft.CSharp4.7.0WPFModelViewer/WPFModelViewer.csproj
NuGetNewtonsoft.Json13.0.3WPFModelViewer/WPFModelViewer.csproj
NuGetNLog5.3.2WPFModelViewer/WPFModelViewer.csproj
NuGetOpenTK.GLWpfControl4.2.3WPFModelViewer/WPFModelViewer.csproj
NuGetOpenTK4.8.2WPFModelViewer/WPFModelViewer.csproj
NuGetSystem.Drawing.Common8.0.7WPFModelViewer/WPFModelViewer.csproj
NuGetWindowsAPICodePack8.0.4WPFModelViewer/WPFModelViewer.csproj
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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "icon": {
      "bytes": 380127,
      "width": 1024,
      "height": 1024,
      "rejected": [],
      "collected": true,
      "media_type": "image/png",
      "source_url": "https://i.imgur.com/hdBRZFL.png",
      "source_type": "readme",
      "content_hash": "eaafc27b903279daedd5056c96818d78e1b768292c75d93d4f946177d65611e5",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 11780,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C#": 840084,
        "GLSL": 71903,
        "Python": 1162
      },
      "pushed_at": "2026-03-18T22:56:14Z",
      "created_at": "2020-08-21T09:06:19Z",
      "owner_type": "User",
      "updated_at": "2026-03-26T16:11:57Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": null,
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Greg Kasapidis",
      "type": "User",
      "login": "gregkwaste",
      "company": null,
      "location": "United Kingdom",
      "followers": 18,
      "avatar_url": "https://avatars.githubusercontent.com/u/7515235?v=4",
      "created_at": "2014-05-07T17:44:51Z",
      "is_verified": null,
      "public_repos": 24,
      "account_age_days": 4473
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.93.1-pre",
          "kind": "prerelease",
          "published_at": "2025-08-20T08:14:37Z"
        },
        {
          "tag": "v0.91.3-pre",
          "kind": "prerelease",
          "published_at": "2024-08-01T23:57:27Z"
        },
        {
          "tag": "v0.91.2",
          "kind": "patch",
          "published_at": "2023-09-24T01:37:00Z"
        },
        {
          "tag": "v0.91.1",
          "kind": "patch",
          "published_at": "2022-12-01T17:53:54Z"
        },
        {
          "tag": "v0.91.0",
          "kind": "minor",
          "published_at": "2022-11-06T12:56:26Z"
        },
        {
          "tag": "v0.90.7-hotfix",
          "kind": "prerelease",
          "published_at": "2022-07-24T03:49:22Z"
        },
        {
          "tag": "v0.90.7",
          "kind": "patch",
          "published_at": "2022-07-23T15:04:19Z"
        },
        {
          "tag": "v0.90.6",
          "kind": "patch",
          "published_at": "2022-07-18T07:52:43Z"
        },
        {
          "tag": "v0.90.4",
          "kind": "patch",
          "published_at": "2022-02-23T14:19:16Z"
        },
        {
          "tag": "v0.90.3",
          "kind": "patch",
          "published_at": "2022-01-18T15:12:13Z"
        },
        {
          "tag": "v0.90.1",
          "kind": "patch",
          "published_at": "2021-01-13T13:43:31Z"
        },
        {
          "tag": "0.90.0",
          "kind": "minor",
          "published_at": "2020-08-29T16:07:27Z"
        },
        {
          "tag": "v0.89.4",
          "kind": "patch",
          "published_at": "2020-08-21T18:14:44Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ee2ed17e79ff82ec4cfd069f33fcd2234e443e03",
          "body": null,
          "is_bot": false,
          "headline": "Prerelease version update + libmbin v5.74",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2025-08-20T08:00:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d95401e097c7411214aa7788c0ffa98d9018d369",
          "body": "- Disabled reference loading. References now need to be manually loaded (Green nodes on the scenegraph represent Reference nodes)\n- Added support for new texture formats (ATI1)\n- Minor UI updates for better camera settings control",
          "is_bot": false,
          "headline": "Updated Codebase for NMS v5.7x",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2025-07-16T01:54:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd4c6fec336a818f73760744a4a64876f3f20bca",
          "body": "- Added support for NMS 5.0 geometry model formats\n- Added support for GROUP node types (interpreted as locator objects)\n- Added a very preliminary implementation of a scene exporter to EXML (only exports hierarchy information for now)\n- Repaired proc gen model generator\n- Upgraded project to Net 8",
          "is_bot": false,
          "headline": "NMS 5.0 update",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-08-01T23:20:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53ffee760cc1a79f28213f24c153ea34123331ba",
          "body": "- Fixed a small bug related to the incorrect interpolation between rotation quaternions\n- Added a dynamic NMS archive parsing mechanism. Archives are now locked only during the loading process\n- Repaired the procgen button. The tool is able to create random procedurally generated models (excluding pose customisation for now)",
          "is_bot": false,
          "headline": "BugFixes and ProcGen",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-07-30T23:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9006304c6d2c14fbb725e21e60ef3289794865e",
          "body": null,
          "is_bot": false,
          "headline": "Dependencies update + new Parser for NMS v5.0",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-07-29T18:58:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e96c9b4c107c55c68f7118bfc50af167e9ab57c9",
          "body": null,
          "is_bot": false,
          "headline": "Removed NMS template field from the model class",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-09-24T01:45:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fec012b25110cd5f1a99b25fc8d3a39da4099787",
          "body": "- Fixed issue with insufficient joint arrays\n- Fixed issue with duplicated mesh hashes",
          "is_bot": false,
          "headline": "Bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-09-24T01:10:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23a9076e2c5a00f2b1c1d2056447d45d467d1149",
          "body": null,
          "is_bot": false,
          "headline": "Bugfixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-07-31T20:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2ddfdb77501e95494e4c59a90aaf065dbe898be",
          "body": "Fixed an issue with wrong nms path detection when the game is installed in the default steam directory",
          "is_bot": false,
          "headline": "Fixed a bug with wrong nms path calculation",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-12-01T17:50:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a68e2e91b3d99a5b537d11614eb0c4033611bc0e",
          "body": null,
          "is_bot": false,
          "headline": "Added support for default Anims",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-26T16:05:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "375476049bc8b7a1a74130fa5dab42971db5e828",
          "body": "Camera movement is based on yaw/pitch. No interpolation hapenning, no polling thread. Seems much smoother.",
          "is_bot": false,
          "headline": "Addressed choppy camera movement.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-12T20:50:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1b73d6fba18b8f2308095969db538a4e1cff970",
          "body": "- UI and mouse capturing bug fixes.",
          "is_bot": false,
          "headline": "Removed WinForms Dependency",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T12:44:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b93cbc70661fcb633a49222cccba1b788dc8749",
          "body": null,
          "is_bot": false,
          "headline": "Fixed a bug on default browser invoke",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T06:19:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba0f2ed899ac804bd3566e35edece0165ea4c319",
          "body": null,
          "is_bot": false,
          "headline": "Updated Donation Link",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T06:13:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91957befea69f7dfaf74c7068e95911a5bb4db76",
          "body": "Bumped version to 0.91 and fixed libmbin updater to grab the net5.0 assembly",
          "is_bot": false,
          "headline": "Version update+",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T05:46:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e5c7f5b6123f43e4ad06aa7f50aac976359d99d",
          "body": "Upgraded OpenTK 3->4\nMigrated to Net6.0\nUsing net5.0 version of the libmbin",
          "is_bot": false,
          "headline": "Dependency Upgrade",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-05T20:08:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb051bbe9a827011b19a89a29b74e7ea7ab4456e",
          "body": "- Cleaned up rendering options control\n- Fixed issue with null skinning matrices\n- Fixed an issue with camera reset position",
          "is_bot": false,
          "headline": "Bugfixing",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-24T14:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69e136c780cc4aebfe11a76c1cbd300ecb91b141",
          "body": "- Set HDRExposure to 0.5 by default\n- Fixed issue with overriden user camera settings after a new import.\n- Added more error logging when libmbin fails to decompile a file",
          "is_bot": false,
          "headline": "Bug fix",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-23T22:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "402ff46119ff8137bc4d6d4f08d4dca6bf827e4c",
          "body": "- Updated libmbin version\n- Fixed an issue with new not yet supported samplers\n- Improved libmbin update mechanism\n- All viewport settings are saved in the settings.json file.",
          "is_bot": false,
          "headline": "Endurance update + Bug Fixes + QOL",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-23T14:57:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "233921162c0a685f4e3e259ec7d4af0a93ce87ed",
          "body": "- Updated several dependencies",
          "is_bot": false,
          "headline": "Fixed Steam library search",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-18T07:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4aa4d5d562e4961c8bb2186d5b8f9a8c8e0d9ea8",
          "body": null,
          "is_bot": false,
          "headline": "cleaned up readme file",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-16T15:32:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d96ce9e6f2cfcd13100625764f355148943fe37d",
          "body": "Also fixed an error regarding inconsistent input skinning data.",
          "is_bot": false,
          "headline": "New version. Settings NMS path request. Added new light attenuation type",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-16T15:23:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42dbc7c984a8fffd9851c4439d3396e7622878c5",
          "body": "The viewer now is logging EVERYTHING supposed to be printed out.\nCode was adapted to handle the modified physics component struct.",
          "is_bot": false,
          "headline": "Upgraded Logging, libMBIN upgrade",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-05-11T07:00:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1d538dfd14587159997b682da10d9428849cc4e",
          "body": "…UTOUT flag during rendering",
          "is_bot": false,
          "headline": "Added fixes for the VBSKINNED flag as well the handling of the ALPHAC…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-27T21:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fa024aed191ac54435e20c90f3c94a468c74a32",
          "body": null,
          "is_bot": false,
          "headline": "Cleared up some settings window descriptions",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T14:00:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8505384d7f7e9ea7b56205e73e2611a92ab88cb",
          "body": "… completely wrong.",
          "is_bot": false,
          "headline": "Proper fix for parsing the TkMeshMetaData class. The previous one was…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T13:34:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3738b5c225562c48b9faf22d5159e7af03de4cc6",
          "body": "…s that may contain spaces.",
          "is_bot": false,
          "headline": "Adapted code to Sentinel Update. Fixed a bug related to gamedata path…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T13:14:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5a91cfb71b000d7d8f27136ade56aba5d817816",
          "body": null,
          "is_bot": false,
          "headline": "Updated platform target to x64",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-01-18T15:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "464b94474b50118678883685868b7c5d04240e51",
          "body": "Also updated framework version and  app version\n* Latest libmbin is included.\n* Problematic shaders are fixed",
          "is_bot": false,
          "headline": "Updated to support Latest Mbin Version",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-01-18T14:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa07c5a58ce8bbf8ff857b95c4d45c2d2d3f6341",
          "body": "* Added UI components for testing that are enabled only in debug mode. they should not affect the tool's release version\n* Changed default exposure to 0.005 to kinda match the game's lighting environment\n* A lot of work on underlying systems to support game components such as ActionTriggers, Physics\n[…]\n Lod filtering to children of Lod meshes\n* Added error catchers during material shader compilation for debugging purposes\n* Included latest libMBIN and libPSARC libraries and updated version to 0.90.1",
          "is_bot": false,
          "headline": "Performance + Bug Fixes + New Features",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2021-01-13T12:56:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "281a4c911c90a0c4e56c8ac7daaa41131945deff",
          "body": "-We now got an engine object yaaaaay\n-Fixed a bug during animation interpolation\n-Fixed a bug during Camera interpolation\n-A bit of experimentation with poses.\n-Basic infrastructure for ECS systems is implemented.",
          "is_bot": false,
          "headline": "Action system Infrastructure + Code Organization",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-09-02T08:23:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdcdc89723c4d1b6a23872c02f8583564d2fd9b0",
          "body": "test options are added programmatically only on the debug version\nupdate changelog\nupdated version on tool and build tool\nremoved unecessary packages",
          "is_bot": false,
          "headline": "Big Fixes on Release version",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T15:57:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b89ad970ebd63f72d096613f5c0edd7bc1cda181",
          "body": null,
          "is_bot": false,
          "headline": "Removing old Imaging class",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T13:51:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5bed21f8269775e757cc2d7bd4ca9a603e97607",
          "body": "-Finished the greatest part of a custom SDF text renderer. Droid and Segoe fonts are now embedded as resources in the app. External references to QFont and SharpFont are completely removed.\n- Fixed a bug that prevented the settings form to be re-opened. \n- Core Engine code organization into separate\n[…]\ny smoother compared to the past\n- Fixed a bug related to repeated rendering of locator meshes\n- Migrated app to OpenGL 4.6 core profile. Rendering code as well as all the related shaders were updated.",
          "is_bot": false,
          "headline": "Bunch of updates and bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T13:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d9518ac676a5ed2cf0d9030522f1b1c9bf28a90",
          "body": "LOD filtering This option is enabled by default. Minor updates to the readme and a bit of code reorganization",
          "is_bot": false,
          "headline": "Brought Back LOD level filtering.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-23T18:29:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11dbd60d2fa6d06a1ac47c5fdd59d1c83bc839bd",
          "body": null,
          "is_bot": false,
          "headline": "Added build script",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-23T16:37:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae0b3e5fc0f6a6f673a7bd8ac725d9570aa18966",
          "body": "latest dll is fetched from github.",
          "is_bot": false,
          "headline": "Added libMBIN update functions",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T17:11:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "729bd71b5a9594876de4ae99f07c1695ddad23a6",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:20:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69c7fa0f1c6dd2baebc737679aa80f07de82102a",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:19:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11212e3ecba6bb1fd48ad955f3ad0119f4b0235b",
          "body": "Fixed links in about window. Improved readme and fixed the layout of the about window",
          "is_bot": false,
          "headline": "Reference updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:15:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "178d5089ff38951b6e3ab1f5a62bfeedccc9d4be",
          "body": null,
          "is_bot": false,
          "headline": "Deleted samples from project",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T20:04:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5359dde75ba5dc7ddc89f9adbde194b6294b75b",
          "body": null,
          "is_bot": false,
          "headline": "Reassigned references to match the new lib directory",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T20:03:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cea1d0ff72593cc195065c6c79dddb6317a3cb90",
          "body": "Moved lib and samples to the root of the project.\nTODO: I think samples are also not required.",
          "is_bot": false,
          "headline": "Removed old winforms project",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5faa9d4c9a00f3ab5bbab5be08c118303829583e",
          "body": null,
          "is_bot": false,
          "headline": "updated screenshot",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20f0b768c242ad3c7540dfe7296cf3f03466d378",
          "body": null,
          "is_bot": false,
          "headline": "Added a feature list to the readme",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adf492159e542ea0bdc60ccc3e3c1e1cd9afffbe",
          "body": null,
          "is_bot": false,
          "headline": "Updated badges in readme file",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T18:33:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0acf4b1366341f0183612a2db96386520d48433",
          "body": null,
          "is_bot": false,
          "headline": "Readme updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T09:13:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7156771f2ed615cb0180605739506e4c2b887921",
          "body": "packed hdrexposure into the cameraposition vector.\nremoved initial scene rotation when inititalizing the control.\nincluding changelog in the project",
          "is_bot": false,
          "headline": "Mini optimizations and fixes",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-20T23:09:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf1c502fe6100a78d51fd133cdea779f8ce98f67",
          "body": "reassigned Q/E keys to scene rotation and not camera rotation.\nFixed some issues related to frustum culling (it still needs improvements...)\nIncluded scene rotation to the light position update as well as in the frustum culling process.\nProperly implemented light rendering in the renderManager. lights are kept separately and rendered according to the flags.\nReworked shaders to fix bugs related to scene rotation.",
          "is_bot": false,
          "headline": "Bug Fixes",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-18T07:50:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca06e9751f8ba5046c5604e279039d66105371bb",
          "body": "Setup for translation gizmo with picking and movement. Fixes on lighting shaders. Added backend to facilitate model export using assimp.",
          "is_bot": false,
          "headline": "Updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-16T22:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c4693e94f21cd72508b8e358e0ca8114d904616",
          "body": "Fixed issue with MBIN, EXML export and reference objects. Also removed convexhull imports from the project files and added the latest libMBIN.dll",
          "is_bot": false,
          "headline": "Bug fix and more",
          "author_name": "Unknown",
          "author_login": null,
          "committed_at": "2020-08-09T18:54:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d938f4b7cebc625a79c595e7f04ed108ccb6543d",
          "body": null,
          "is_bot": false,
          "headline": "Bug Fixes + Error Reports + Work on gizmos",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-07T13:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3d7b82eb5073a4baa6511105979367892775100",
          "body": "After a shit ton of experiments with ray casting using the projection matrices, it just didn't work. I have no idea why that shit happens. But honestly I have absolutely no clue. Reverted to an alternative ray casting method even lighter that simply moves the camera front vector according to the mou\n[…]\ncolors.  This should also happen to a different fbo as well. Picking involves reading from both fbos, first for checking the selected object, then for checking if the gizmo was selected. This is a WIP",
          "is_bot": false,
          "headline": "Ray Casting attempt and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-28T12:57:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b422a2193bf28c1ed5a198ab00bca466eaaf7a48",
          "body": "MeshBufferManager manages data buffers per mesh. Dynamic memory allocatio regarding instance Data on both RAM and VRAM. SSBOs are used to replace per mesh UBOs, and offer much larger storage when required. \n\nRevamped gamepadcontroller class. New gamepad supports button and action mapping. First test\n[…]\ng a DS4 controller class which properly maps not by default supported DS4 v2 controlers. In the future I can add support for any controller :)\n\nAdded new function for calculating mipmap level in GLSL.",
          "is_bot": false,
          "headline": "MeshBufferManager, Revamped gamepad support, SSBOs and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-26T15:40:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a92370f1709a96b532348d5112b1a6256a1a133c",
          "body": "Basic implementation of WBOIT. Brought back support for deferred decals. Added the decal shader logic into the main material shader. Reorganized settings to make the app more robust and interactive.\n\nAdded support for exporting only visible objects to exml/mbin",
          "is_bot": false,
          "headline": "WBOIT + Deferred Decal Rendering  + Settings Reorganization",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-24T11:33:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5034818e825df3562de32bf6e5a533f621f82708",
          "body": "GLControl cleanup\nRenderOptions reorganization\nFixed some bugs related to material loading using PAK files.\nAdded routines for auto NMS installation folder identification. (Steam should work flawlessly, not sure about GOG)\nAdded Tone mapping shaders\nEmbedded default textures to the app\nReorganized f\n[…]\n related to loading childrens of reference objects\nShader cleanup\nMinor updates on about page\nAdded work dispatcher thread to handle cpu related tasks of the UI thread without interrupting UI updates.",
          "is_bot": false,
          "headline": "",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-21T00:40:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94b8053333d0b4603423c33af3e2600d9b39a444",
          "body": "Disabled animation loading before the animation is used, in order to save time during scene loading. Actual animation data are loaded only when the animation is enabled for playback\nMultiple shaders have been added to add support for bloom effect, gaussian blur and additive blending.\nAdded a shader \n[…]\npendency version updates\nAdded a very preliminary version of PBO buffers per texture for kinda asynchronous texture upload. Looks like its working good for now but I think there is still more into it.",
          "is_bot": false,
          "headline": "A LOT of stuff once again",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-14T19:25:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "115b3429e5292d765520fcc6e31b925fb603deaa",
          "body": "Removed locator and joint shaders\nAdded inverted look and projection matrices to the comonperframeUBO.\nIncluded inverse world matrices per instance and added support for decal rendering (decal normal maps are not accumulated atm)\nRemoved stored shader programs per model.\nNecessary update of UBO structs.\nAdded support for 2nd diffuse textures.",
          "is_bot": false,
          "headline": "Various",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-03T20:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e344d6dee48a3e8689242dd6e528a68e827eea6b",
          "body": "TBOs seem to be working smooth AF. There are still some issues with decal models and their clone calculations (not inheriting proper instanceIDs)\n\nI'm about to fix them and also get rid of all the shader programs that get cached to each model. I think its not required anymore.",
          "is_bot": false,
          "headline": "added support for instancedMeshSkinMats in TBOs",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-27T11:32:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "812ea040f202fc0ac62aff0d445e1fab7179f640",
          "body": "Implemented a proper (expensive but correct) way of calculating the distance from a point to  an AABB. Sorting results look decent for now.\n\nEncountered some problems regarding instanced data, spend the entire day trying to remember what the fuck was wrong. I finally remembered... skin matrices are \n[…]\nd all instance skin data, without having problems with high instance counts and limited UBO sizes. On the other hand the corresponding data from mesh UBOs can be removed so this is also an extra gain.",
          "is_bot": false,
          "headline": "AABB recalculation + checkpoint",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-26T20:31:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95ddf15e4a89a8dcf660d031f6b2799d2d7715d0",
          "body": "Brought back to life back to front rendering of transparent objects\nRemoved all the BULLSHIT flags that i had as triggers for the transparent objects. Transparents are the ones that have TRANSPARENCY or CUTOUT (still not sure about that) and transparent scalar.\nCleaned up the shaders a bit\n\n\nAlso fixed the AABB calculation of mesh objects (for now the input value from the mbin attributes are transferred to the actual object)",
          "is_bot": false,
          "headline": "Fixed (as much as I could for now)  transparent object rendering",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-25T19:43:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13ac0a6a5897b2a7314895db739db4a77c8efea1",
          "body": "Results are looking good. Also added some extra optimizations regarding mesh info updates.",
          "is_bot": false,
          "headline": "Added support for Diffuse2Maps.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-25T13:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "527cad348fe5d29b82a491c03930b7993da4266c",
          "body": "Probably a shit ton of performance fixes. For sure fixed the bug related to the calculation of the TBN matrix in the CPU side.\n\nReorganized completely the way that the scene is updated.\n\nlibmbin, opentk have been updated, model classes have been revisited and re-organized.\n\nOctree implementation has been added\n\nNew font has been added\n\nPlus a lot more that I can't even remember x.x",
          "is_bot": false,
          "headline": "I don't even remember what has changed since the last one",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-24T12:39:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6c734002dc92c1a8e14192e7ef0ae7806259279",
          "body": "Added a super simple texture renderer OpenTK Gamewindow class that helps me debug texture loading issues.",
          "is_bot": false,
          "headline": "Added the TextureRenderer  Project files",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-09T22:09:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd7910a1d5357de3bedd0f195550525d32dc9a60",
          "body": "Fixes on LOD  distance evaluation, brought back gUserData uniform on mesh objects, added tone mapping on the shaders, added support for the NORMAL_TILING material flag + UI fixes.\n\nThere are still some visible issues with toggling instances renderable. I think this is the next issue that has to be solved prior to release, but this require some thinking.",
          "is_bot": false,
          "headline": "Fixed Vertex Color attributes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-09T22:08:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8d19c2e19ccb585667ace55e517f669850c0238",
          "body": "Live shader recompilation is a bit broken on some special cases. I've also implemented support for UV scrolling effects and I'm working towards proper rendering of transparent objects.",
          "is_bot": false,
          "headline": "Reword the GLSL Preprocessor, Fixed lighting issues",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-08T17:44:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23ca493e4af2380d3a82bb215c64e33305b58a38",
          "body": "Primitive LOD filtering is now a thing, adopting properties of the entity files\nIn order to properly render transparent objects with whatever technique (sorted or unsorted) two things had to be implemented: 1) Output of the calculated light color to the gbuffer, therefore a new attachment was added.\n[…]\nanches of the same code. I am in the process of modifying shader source files to make this work back to normal. Then I'll test this with the deferred and forward lighting passes to see how this works.",
          "is_bot": false,
          "headline": "LOD Filtering, Overhaul of the GLSL preprocessing step and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-04T17:13:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d430dd2818f7bfd85082152bf98db5c3e8435704",
          "body": "Bounding spheres are calculated much more efficiently now\nAdded extra animation information in the UI\nRefactored the whole animation pipeline to use less resources, cache transformations to memory, removed animation timers, properly calculating and interpolating between frame data.\nI'm about to enter the instanced rendering territory",
          "is_bot": false,
          "headline": "Repaired Shaders, UI changes and Bug Fixing, Animation overhaul",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-01T10:37:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2a9ea5e0ba8934b4c3a5cdb030f1496f829e373",
          "body": "I don't even remember most of the bugs that I have fixed at this point. The most critical one dealt with invalid/duplicate hashes when fetching VAOs from the resource Manager. VAOs are now moved to their corresponding geometry object. Implemented a brand new PBR shader as well as a  blooming effect for  glowing objects.",
          "is_bot": false,
          "headline": "Lighting + Bug Fixing",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-30T02:25:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09d5bf7a919dd3447c70f13ce9e639d3bdb208da",
          "body": "…I can't get them organized into one place. They keep getting copied to the internal Resources folder of the Solution. Slight progress on animation caching.",
          "is_bot": false,
          "headline": "I have messed up completely with the shader resources. It seems like …",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-26T23:49:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac99e72fe14fb845f1484c58df6fb1d033ee09e6",
          "body": "Fixed a lot of issues related to animation playback\nAdded Some LOD related components in order to load LOD models properly\nOptimization fixes on light uploading\nNecessary preparation for shadow mapping\n\nTODO: Frustum culling still looking goofy. I need to make sure that its working properly in all cases.",
          "is_bot": false,
          "headline": "Beyond Updates + Rendering Optimizations + Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-26T02:09:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef0f30a18b337e8c6c1d2e11dc173d5855a8fd10",
          "body": "These are 3 month old changes. I need to remember where I fuck I was working on x.x",
          "is_bot": false,
          "headline": "Omnidirectional lighting progress + fixes for beyond",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-03T10:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2c974a65a003b1f4543c929415818f7dd856b34",
          "body": "…pping",
          "is_bot": false,
          "headline": "Moved Shader Folders and started working on omnidirectional shadow ma…",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-18T20:05:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8b215adef03b41e3386ea8b2e23cbc41db93878",
          "body": "Small bug fixes and extended error handling\n- Fixed shader lighting for adding support for the default lighting.",
          "is_bot": false,
          "headline": "Updating tool for Beyond + Fixes",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-17T10:20:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "274236c1aa8e81af43b2f625d470e48a17dd9f1d",
          "body": null,
          "is_bot": false,
          "headline": "First version of a multi light system",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-15T14:24:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "898e39af6082192972cde9cdf2cfb647d86de797",
          "body": "1) Worked a bit on the texture mixer and made it comply with the texture mixer class and stuff. I think that both the viewer and the mixer work exactly the same way so its a good tool for testing\n2) I think I improved the application of pose data even more. I'm sorting the pose matrices and keeping \n[…]\nf the same textures over and over in the program. Memory impact should be kinda less especially on some of the largest models that overuse the same textures.\n6) I have forgotten what else i have fixed",
          "is_bot": false,
          "headline": "Various Experiments and Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-20T20:52:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89246b74e11fb83dc6456793fb4b8f7ce06d53cb",
          "body": "I think the tool layout is much more cleaner this way.\nMaybe shit has to be reorganized a bit better but I'm keeping it this way for the time being...",
          "is_bot": false,
          "headline": "Layout Update",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-13T22:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf7f585c5438e8aafffcbeff4ac8cf01c3094628",
          "body": "#1 Added toggles for frustum culling and animations\n#2 Implemented a better way for handling pose information'\n#3 I forgot to use the nMat in the shader -.-\n#4 Some other minor shit i guess",
          "is_bot": false,
          "headline": "Various Updates",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-13T21:54:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed13487650b22da6d008247c8e684d675b4db648",
          "body": "Working towards a more complete lighting system. (I'm pissed because again the mesh part normals do not match with the meshes close to them...",
          "is_bot": false,
          "headline": "New Light system",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-08T09:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce24e50a224da90fbc6d2336e9ee433c198f5b90",
          "body": "Brought back RenderBoundHulls flag. Also implemented a UBO report function that tracks the GLSL shader and fetches the uniform offset so that I won't get lost next time that I have to implement a struct for that kind of shit.",
          "is_bot": false,
          "headline": "A bit of a cleanup",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-18T11:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7a17a91b6e97ec98b7bedd96b6130554e65dff3",
          "body": "The whole pursuit was about implementing a better light system. It soon ended up with organizing all shader uniforms into structs, using UBOs for common perframe and permesh parameters. Because of the GLSL mess with explicit uniform locations in uniforms within a struct, I ended up loading all the a\n[…]\nendously cleaner (although capturing the correct format of the C# structs to match the std140 GLSL versions was a nightmare), but performance seems pretty much the same, not to say it got a bit worse.",
          "is_bot": false,
          "headline": "Added UBO Support and organized the basic shaders",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-18T10:27:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5271a3ddc7c7dc41a843d9bbce0faa5070a8d576",
          "body": "All the color mismatches that occured mostly on proc gen models, occured due to false colorspace used for the textures. It seems like all diffuse textures use sRGB, and I'm forcing this atm. Actually due to lack of info, I'm forcing sRGB on all textures other than the RG normal textures.",
          "is_bot": false,
          "headline": "Added support for sRGB textures",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-17T10:26:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36bf02b416359966f8d4045f83f472b63b8cf77b",
          "body": "Need to rework a bit the animation loading part, as it now is loading only the first active animation and also possibly blend animations together. \nI need to make the generic animation toggle button to properly interact with the GLControl. Animations are working find though.",
          "is_bot": false,
          "headline": "Added Animations to the UI",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-16T23:32:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b5feb2fe3131b55f590716db3a0b1e89cc23244",
          "body": "I forgot that the InvBMatrix refers to global space while Bindmatrix as well as all the animation frame data are transforms RELATIVE to the parent...\n\nPose data is not calculated properly. Trying to use just animationframes for now...",
          "is_bot": false,
          "headline": "Fixed Pose Data Integration",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-16T10:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ae3f97c56aa6d080f057137979466895563491e",
          "body": "I ended up compiling my own version of the library. Probably there was a conflict with the target architecture of the released lib. Also fixed any reference issues with all the other projects of the solution (Mainly QuickFont). Currently working on separating the jointDictionary from a scene, and mo\n[…]\nTODO: I don't trust the cloning functions at all. I simplified them a bit, but I need to work on them again in order to make sure that everything gets uniquely copied when generating a proc gen model.",
          "is_bot": false,
          "headline": "Fixed XAML issues with LibMBIN",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-15T18:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed81e440c5742a9df6490e003b030e8729a4eb53",
          "body": "Started with entity parsing. For now one attachment is supported, we fetch it, then go through a component processing procedure. For now AnimPose and AnimData components are supported. AnimPose data has been exposed to the UI, I just need to update the pose on demand when the data changes. TODO: Do the same thing with the animations.",
          "is_bot": false,
          "headline": "libmbin 1.78 + AnimPose Classes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-14T00:07:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3242174c252cc39131d98d8633bee10e40307b8e",
          "body": "1) Added support for model poses. TODO: I need to properly handle locator attachments during object loading. Attachments contain animpose data, which I can use to procedurally generate a pose for a model\n2) Bound the Renderoptions as static resources to the UI.\n3) Added some animation controls on the UI (TODO: I need to make sure that key presses from the glcontrol are mapped to the UI buttons)",
          "is_bot": false,
          "headline": "Reworked Animation Controls",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-02T21:07:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315728763a0b57bd76fe2af7146ecdda3cb3f099",
          "body": "Implemented a new RenderManager class that tries to organize mesh objects and render them directly. For now I don't do any sorting. I just separate static and trransparent objects. Static meshes are loaded first, transparent meshes are rendered after the static with blend on and depthmask off. Works for now but its probably far from perfect.\n\nFixed some bugs regarding empty material loading, UI binding and probably some more shit.",
          "is_bot": false,
          "headline": "Implemented RenderManager class  + Transparency support",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-01T21:34:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d267cc84a655c183637932569f412f517a76c54d",
          "body": "1) Fixed the texture mixer (texture mixing ressembles as much as possible the original shader)\n2) Updated the gbuffer\n3) Revamped the material class to inherit the TkMaterialData\n4) Added more rendering stats",
          "is_bot": false,
          "headline": "Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-31T22:13:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "095d31c1ca9815b19f48f0080111640c36cd76f5",
          "body": "Replaced the custom GUI for querying object properties with XAML binding rules. Scene editing should work (hopefully) without many bugs. \n\nCompletely overhauled material parsing. Now texture parsing is done through the samplers. A texture resource manager is implemented and assigned per model. This way its scene model keeps its own textures.",
          "is_bot": false,
          "headline": "XAML updates + Material overhaul",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-30T17:14:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2363720b3ed6ff3058ad82cdd5fb0cc8a83b02f1",
          "body": "1) I fixed bugs related to capsule and cylinder collision loading. Should be working properly now\n2) Fixed collision mesh loading and rendering based on the bound hulls\n3) Added support for multitextures: This contains: a) converting all textures to 2darrays in order to minimize the changes on the s\n[…]\nrop support in the treeview, so that we can start visually manipulating the structure of the scene.\n6) Working towards adding uniform buffers for custom and common material flags.\n7) Should be more...",
          "is_bot": false,
          "headline": "A ton of updates , new features and optimizations",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-26T02:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c2d1dc3af15bd6d7b3b090b099141750a884dc0",
          "body": "Fixed a bug with capsule collision rendering. Also I think I got the capsule geometry to  calculate properly.\nOptimized some shader code a bit more\nReorganized the code again. Shader compilation is done by the CGLControl. The main file is super clean now.\nRemoved some unecessary classes",
          "is_bot": false,
          "headline": "Code Organization + even more optimizations + bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-23T15:48:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b38e4936edb3aada25c29af2c972ab2fce8b5e7",
          "body": "Optimized the rendering process of the meshmodels, trying to limit the calls to GL.UniformLocation as much as possible. Also tried to optimize text rendering process as well.\n\nAdded some more rendering thread request messages. Improved the GUI. Reorganized some of the GLControl code.\n\nAlso farewell to the initial model_viewer project. I removed it from the solution file :'(",
          "is_bot": false,
          "headline": "Optimizations + More Vol2",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-23T11:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ffdf96860507c6270f0adb6ecb90dd2bfd0b6ab",
          "body": "Added a model update method, which dramatically reduces the multiplications during object transform matrix calculations. Now transform attributes can be calculated on the fly during the update for a model and its children.\n\nReplaced my text renderer with QuickFont. Looks fine and much simpler.\n\nAdde\n[…]\nfficient rendering of joints\n\nAdded a new request type for handling scene update requests (should be executed from the rendering thread).\n\nOther optimizations, reorganizations and fixes here and there",
          "is_bot": false,
          "headline": "Optimizations + More",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-05T15:12:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65b6743b312a45ad20ce80823d59a6f1ffb08920",
          "body": "A lot of optimizations.\nI have removed the stupid numeric element from the interface which is much more smooth with textboxes.\nI'm preloading mipmaps from existing textures instead of generating them\nMigrated to OpenGL 4.2 as much as possible\nReorganization to the resource manager\nAdded a unit tests\n[…]\nthis update also adds support for live editing shaders that I had implemented months ago.\n\nThis is a backup commit cause I'll start testing math shit. I believe that OpenTK math library is utter SHIT.",
          "is_bot": false,
          "headline": "I have lost track of how many updates I have made",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-04T23:13:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6c531d031acf5d71458e44b93e98ad335f58cf4",
          "body": "Moved rendering to a separate thread to release the UI thread.\nBugfixing on animations\nAdded palette parsing from biome files (TODO: make sure this is user defined at some point)",
          "is_bot": false,
          "headline": "Updated code to the latest libMBIN library.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-26T23:59:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64df5a17928c373e52818277e03370994f2c522d",
          "body": "Fixed Recoloring shaders + code\nPreparing for threaded rendering in the GLControl",
          "is_bot": false,
          "headline": "Brought back the semi deferred renderer.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-26T02:40:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d147350abace0ac4a7a583fd19608cfb55999b48",
          "body": "Combined TextureMixer Project\nCreated a new WPF Project for the VIewer\nAdded a shared code projects for sharing code between all the projects\nA SHIT ton of optimizations  on the control as well as the rendering process and the shaders (I'm too tired to list them all now lol)",
          "is_bot": false,
          "headline": "Completely reorganized Solution.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-23T01:07:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbd2d16c09fef2ef1fa8abf80f645f547cb0e301",
          "body": null,
          "is_bot": false,
          "headline": "Added updated shaders",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-20T17:28:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6a7e5083e3c7074f5b95d2df44dc925d1c96040",
          "body": null,
          "is_bot": false,
          "headline": "Minor Updates",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-20T17:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 13,
      "commits_last_year": 1,
      "latest_release_at": "2025-08-20T08:14:37Z",
      "latest_release_tag": "v0.93.1-pre",
      "releases_from_tags": false,
      "days_since_last_push": 139,
      "active_weeks_last_year": 1,
      "days_since_latest_release": 350,
      "mean_days_between_releases": 145.5
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": "SimpleTextureRenderer",
          "path": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "tokens": [
            "nuget.output_type:exe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "TextureMixer",
          "path": "TextureMixer/TextureMixer.csproj",
          "tokens": [
            "nuget.output_type:winexe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "TextureRenderer",
          "path": "TextureRenderer/TextureRenderer.csproj",
          "tokens": [
            "nuget.output_type:exe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "Viewer_Unit_Tests",
          "path": "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
          "tokens": [
            "nuget.output_type:library"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "WPFModelViewer",
          "path": "WPFModelViewer/WPFModelViewer.csproj",
          "tokens": [
            "nuget.platform_tfm:windows8.0",
            "nuget.output_type:winexe"
          ],
          "ecosystem": "nuget"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "readme_badges": {
        "hosts": [
          "shields.io"
        ],
        "total": 3,
        "header": 3,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 14,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 7,
      "stars": 47,
      "watchers": 8,
      "fork_history": {
        "days": [
          {
            "date": "2021-04-04",
            "count": 1
          },
          {
            "date": "2021-06-27",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-05-26",
            "count": 1
          },
          {
            "date": "2023-03-20",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 7,
        "total_forks": 7
      },
      "star_history": null,
      "open_issues_and_prs": 5
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
        "TextureMixer/TextureMixer.csproj",
        "TextureRenderer/TextureRenderer.csproj",
        "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
        "WPFModelViewer/WPFModelViewer.csproj"
      ],
      "largest_source_bytes": 80963,
      "source_files_sampled": 76,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
        "TextureMixer/TextureMixer.csproj",
        "TextureRenderer/TextureRenderer.csproj",
        "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
        "WPFModelViewer/WPFModelViewer.csproj"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "nuget"
      ],
      "dependencies": [
        {
          "name": "OpenTK",
          "manifest": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.1.0"
        },
        {
          "name": "AssimpNet",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.0.0-beta1"
        },
        {
          "name": "Costura.Fody",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.8.0-alpha0098"
        },
        {
          "name": "Fody",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "6.8.1"
        },
        {
          "name": "Gameloop.Vdf",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "0.6.2"
        },
        {
          "name": "MathNet.Numerics",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.0.0"
        },
        {
          "name": "Microsoft.CSharp",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.7.0"
        },
        {
          "name": "Newtonsoft.Json",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "13.0.3"
        },
        {
          "name": "NLog",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.3.2"
        },
        {
          "name": "OpenTK.GLWpfControl",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.2.3"
        },
        {
          "name": "OpenTK",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.8.2"
        },
        {
          "name": "System.Drawing.Common",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.7"
        },
        {
          "name": "WindowsAPICodePack",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.4"
        }
      ],
      "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": 0,
        "open_issues": 5,
        "closed_ratio": 0.667,
        "closed_issues": 10,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "gregkwaste",
          "commits": 198,
          "avatar_url": "https://avatars.githubusercontent.com/u/7515235?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": false,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 7,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ee2ed17e79ff82ec4cfd069f33fcd2234e443e03",
        "ran_at": "2026-08-05T17:52:50Z",
        "aggregate_score": 1.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 0,
        "authors_30d": 0,
        "decided_30d": 0,
        "sample_size": 0,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 0,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2025-08-20T07:59:56Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 9,
          "created_at": "2024-09-02T01:54:10Z",
          "last_comment_at": "2024-10-08T23:02:36Z",
          "last_comment_author": "gregkwaste"
        },
        {
          "number": 11,
          "created_at": "2024-09-10T15:38:07Z",
          "last_comment_at": "2025-03-26T06:25:26Z",
          "last_comment_author": "kefiiiiir"
        },
        {
          "number": 13,
          "created_at": "2025-02-17T04:30:17Z",
          "last_comment_at": "2025-09-21T22:46:00Z",
          "last_comment_author": "jurassicjordan"
        },
        {
          "number": 14,
          "created_at": "2025-03-07T17:02:36Z",
          "last_comment_at": "2025-09-23T18:25:40Z",
          "last_comment_author": "davebastian"
        },
        {
          "number": 16,
          "created_at": "2026-01-22T18:32:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/gregkwaste/NMSMV",
    "host": "github.com",
    "name": "NMSMV",
    "owner": "gregkwaste"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": "The weighted overall 27 is calibrated to 21 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 27,
            "calibrated": 21,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 21,
      "inputs": {
        "security": 17,
        "vitality": 30,
        "community": 32,
        "governance": 35,
        "calibration": "2026-08-02",
        "engineering": 17,
        "ai_readiness": 42,
        "weighted_overall_raw": 27
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 30,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "commits_last_year": 1,
              "human_commit_share": 1,
              "days_since_last_push": 139,
              "active_weeks_last_year": 1
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 139 days ago",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 139
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "1/52 weeks with commits",
                "points": 0.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1 commits in the last year",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "releases_count": 13,
              "latest_release_tag": "v0.93.1-pre",
              "releases_from_tags": false,
              "days_since_latest_release": 350,
              "mean_days_between_releases": 145.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 350 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 350
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~145.5 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 145.5
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "dormant",
              "guards": [
                "recent_release"
              ],
              "signals": [
                "scorecard_unmaintained"
              ],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": 0,
              "unanswered_open_issues": 3,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 350,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "no human commit for 350 days, with nothing left unanswered; held at dormant by a release within the year",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_quiet",
                    "params": {
                      "days": 350
                    }
                  },
                  {
                    "code": "abandonment_guarded",
                    "params": {
                      "guards": "a release within the year"
                    }
                  }
                ],
                "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": 32,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "forks": 7,
              "stars": 47,
              "watchers": 8,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "47 stars",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "7 forks",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "8 watchers",
                "points": 4.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "readme_badges": 3,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "shields.io"
              ],
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "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": "weak",
        "name": "Sustainability & Governance",
        "value": 35,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "weak",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 5,
              "closed_issues": 10,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 0,
              "prs_decided_30d": 0,
              "issue_closed_ratio": 0.667,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "67% of issues closed",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 67
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "followers": 18,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "gregkwaste",
              "public_repos": 24,
              "account_age_days": 4473
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "18 followers of gregkwaste",
                "points": 9.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 18,
                      "login": "gregkwaste"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "24 public repos, account ~12 yr old",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 24
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "critical",
        "name": "Engineering Quality",
        "value": 17,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "has_ci": false,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "weak",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 17,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 17,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 1.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "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": "weak",
        "name": "AI Readiness",
        "value": 42,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.66,
              "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": "66 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.2,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 66,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
                "TextureMixer/TextureMixer.csproj",
                "TextureRenderer/TextureRenderer.csproj",
                "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
                "WPFModelViewer/WPFModelViewer.csproj"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 80963,
              "source_files_sampled": 76,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/76 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 76,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application"
      ],
      "labels": [
        "desktop",
        "library"
      ],
      "scores": {
        "desktop": 4.8,
        "library": 4.8,
        "application": 3
      },
      "primary": "desktop",
      "evidence": [
        {
          "tier": "declared",
          "label": "desktop",
          "source": "nuget.output_type:winexe",
          "weight": 4.8
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "nuget.output_type:library",
          "weight": 4.8
        },
        {
          "tier": "declared",
          "label": "application",
          "source": "nuget.output_type:exe",
          "weight": 3
        }
      ],
      "artifacts": [
        {
          "path": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "labels": [
            "application"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "TextureMixer/TextureMixer.csproj",
          "labels": [
            "desktop"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "TextureRenderer/TextureRenderer.csproj",
          "labels": [
            "application"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
          "labels": [
            "library"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "WPFModelViewer/WPFModelViewer.csproj",
          "labels": [
            "desktop"
          ],
          "ecosystem": "nuget"
        }
      ],
      "confidence": "high",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-05T17:52:55.143587Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/gregkwaste/NMSMV.svg",
  "full_name": "gregkwaste/NMSMV",
  "license_state": "absent",
  "license_spdx": null
}

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 v2.5.0, esquema v0.31.0 — metodología completa · wiki de métricas.

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