Public record
Software health reportschema 0.31.0 · metrics 2.5.0 · 2026-08-05 17:52 UTC

gregkwaste / NMSMV

C#No license detected★ 47 stars⑂ 7 forkssince Aug 2020View on GitHub ↗
KindDesktop applicationLibraryhow this is determined

gregkwaste/NMSMV holds a health index of 21 out of 100, placing it in the At Risk band. It scores highest on AI Readiness (42/100) and lowest on Security (17/100). It was last updated 139 days ago. A single contributor accounts for most of its recent work.

21
overall / 100
At Risk

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean, calibrated against the distribution of the public record so bands carry percentile meaning; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At Risk ceiling of 34.

21
Exceptional93-100The record's top tier (≈ top 5%); essentially all checked criteria met
Excellent80-92Strong across the board; minor gaps
Good65-79Healthy; gaps are limited and manageable
Moderate50-64Acceptable with notable gaps; review recommended
Weak35-49Material weaknesses across several areas
At Risk20-34Significant weaknesses; adoption warrants caution
Critical1-19Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

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

The weighted overall 27 is calibrated to 21 on the published index scale (record calibration 2026-08-02).

Ownership

Greg KasapidisPersonal account
18 followers24 public repossince May 2014

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

Metrics by category

Vitality

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

30At Risk · 21% of overall
How it's scored
9.9/36Push recency — last push 139 days ago
0.7/36Commit cadence — 1/52 weeks with commits
2.7/18Commit volume — 1 commits in the last year
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Inputs used
commits_last_year1
human_commit_share1
days_since_last_push139
active_weeks_last_year1
How it's scored
27/27Ships releases — 13 releases published
16.2/36Release recency — latest release 350 days ago
12.6/27Release cadence — a release every ~145.5 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count13
latest_release_tagv0.93.1-pre
releases_from_tagsno
days_since_latest_release350
mean_days_between_releases145.5

Community & Adoption

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

32At Risk · 17% of overall
How it's scored
27/60Stars — 47 stars
6.5/25Forks — 7 forks
4.7/15Watchers — 8 watchers
Inputs used
forks7
stars47
watchers8
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
0/22.5License — no license file detected
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
readme_badges3
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_servicesshields.io
has_pull_request_templateno

Sustainability & Governance

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

35Weak · 23% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
28/42Issue resolution — 67% of issues closed
0/30PR acceptance — no decided pull requests or no data
0/13Newcomer PR acceptance — no first-time contributor's PR decided in 30d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
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
Excluded from scoring (no data or not applicable): PR acceptance, newcomer_pr_acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
9.2/25Owner reach — 18 followers of gregkwaste
22.2/25Track record — 24 public repos, account ~12 yr old
Inputs used
followers18
owner_typeUser
is_verified
owner_logingregkwaste
public_repos24
account_age_days4,473
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

17Critical · 19% of overall
How it's scored
0/24CI workflows
0/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_cino
has_testsno
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
0/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionno

Security

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

17Critical · 16% of overall
How it's scored
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 — no data
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 — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5License — 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 — no data
0/5Pinned-Dependencies — no data
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 — no data
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1.7
Excluded from scoring (no data or not applicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight (4%): agent tooling is a real maintenance signal, but a repository with none can still reach 100/100.

42Weak · 4% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
35.2/40Legible commit history — 66 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.66
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj (toolchain convention, no task runner)
0/22Automated tests
0/11Lint / format config
11/11Static type checking — C# (statically typed)
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsno
lockfiles
has_dockerfileno
typed_languageyes
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
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
45/45Type-checkable code — C# (statically typed)
54.3/55Manageable file sizes — 1/76 source files over 60KB
Inputs used
primary_languageC#
largest_source_bytes80,963
source_files_sampled76
oversized_source_files1

Key facts

47GitHub stars
1contributors
1commits, last 12 months
139days since last push
13releases
1bus factor
5open issues
NuGetpackage ecosystems

Data collection 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

More detail

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

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

1234567712021-042022-102024-05
Major 0Minor 1Patch 6

Each point covers 3 days.

OpenSSF Scorecard 1.7 / 10
1.7aggregate

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

7Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-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/aDangerous-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/aPackagingpackaging workflow not detected
n/aPinned-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/aToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 13
RegistryPackageVersion constraintManifest
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
All dependencies not collected

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

Raw JSON report machine-readable
{
  "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
}

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

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

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